1 ###################################################
3 # Copyright jelmer@samba.org 2003
4 # released under the GNU GPL
14 my $interface = shift;
18 $res .="\tstruct dcom_$interface->{NAME}_vtable $name = {";
20 if (defined($interface->{BASE})) {
24 my $data = $interface->{DATA};
26 foreach my $d (@{$data}) {
27 if ($d->{TYPE} eq "FUNCTION") {
28 $res .= "\n\t\tdcom_proxy_$interface->{NAME}_$d->{NAME}";
38 my $interface = shift;
40 $res .= "static NTSTATUS dcom_$interface->{NAME}_init(void)
42 struct dcom_interface iface;
45 ParseVTable($interface, "proxy");
47 if (defined($interface->{BASE})) {
49 const void *base_vtable;
51 GUID_from_string(DCERPC_" . (uc $interface->{BASE}) . "_UUID, &iface.base_iid);
53 base_vtable = dcom_proxy_vtable_by_iid(&iface.base_iid);
54 if (base_vtable == NULL) {
55 return NT_STATUS_FOOBAR;
58 proxy.base = *((const struct dcom_$interface->{BASE}_vtable *)base_vtable);
61 $res .= "\tZERO_STRUCT(iface.base_iid);\n";
65 iface.num_methods = DCERPC_" . (uc $interface->{NAME}) . "_CALL_COUNT;
66 GUID_from_string(DCERPC_" . (uc $interface->{NAME}) . "_UUID, &iface.iid);
67 iface.proxy_vtable = talloc_memdup(NULL, &proxy, sizeof(struct dcom_$interface->{NAME}_vtable));
69 return dcom_register_interface(&iface);
73 #####################################################################
77 my $interface = shift;
79 my $name = $fn->{NAME};
82 if (util::has_property($fn, "local")) {
84 static NTSTATUS dcom_proxy_$interface->{NAME}_$name(struct dcom_interface_p *d, TALLOC_CTX *mem_ctx, struct $name *r)
87 return NT_STATUS_NOT_SUPPORTED;
91 static struct rpc_request *dcom_proxy_$interface->{NAME}_$name\_send(struct dcom_interface_p *d, TALLOC_CTX *mem_ctx, struct $name *r)
93 struct dcerpc_pipe *p;
94 NTSTATUS status = dcom_get_pipe(d, &p);
96 if (NT_STATUS_IS_ERR(status)) {
100 ZERO_STRUCT(r->in.ORPCthis);
101 r->in.ORPCthis.version.MajorVersion = COM_MAJOR_VERSION;
102 r->in.ORPCthis.version.MinorVersion = COM_MINOR_VERSION;
104 if (p->flags & DCERPC_DEBUG_PRINT_IN) {
105 NDR_PRINT_IN_DEBUG($name, r);
108 return dcerpc_ndr_request_send(p, &d->ipid, &dcerpc_table_$interface->{NAME}, DCERPC_$uname, mem_ctx, r);
111 static NTSTATUS dcom_proxy_$interface->{NAME}_$name(struct dcom_interface_p *d, TALLOC_CTX *mem_ctx, struct $name *r)
113 struct dcerpc_pipe *p;
114 NTSTATUS status = dcom_get_pipe(d, &p);
115 struct rpc_request *req;
117 if (NT_STATUS_IS_ERR(status)) {
121 req = dcom_proxy_$interface->{NAME}_$name\_send(d, mem_ctx, r);
122 if (req == NULL) return NT_STATUS_NO_MEMORY;
124 status = dcerpc_ndr_request_recv(req);
126 if (NT_STATUS_IS_OK(status) && (p->flags & DCERPC_DEBUG_PRINT_OUT)) {
127 NDR_PRINT_OUT_DEBUG($name, r);
130 if ($fn->{RETURN_TYPE} eq "NTSTATUS") {
131 $res .= "\tif (NT_STATUS_IS_OK(status)) status = r->out.result;\n";
140 NTSTATUS dcom_$interface->{NAME}_$name (struct dcom_interface_p *d, TALLOC_CTX *mem_ctx, struct $name *r)
142 return ((const struct dcom_$interface->{NAME}_vtable *)d->vtable)->$name (d, mem_ctx, r);
148 #####################################################################
149 # parse the interface definitions
150 sub ParseInterface($)
152 my($interface) = shift;
153 my($data) = $interface->{DATA};
154 $res = "/* DCOM stubs generated by pidl */\n\n";
155 foreach my $d (@{$data}) {
156 ($d->{TYPE} eq "FUNCTION") &&
157 ParseFunction($interface, $d);
160 ParseRegFunc($interface);
163 sub RegistrationFunction($$)
166 my $basename = shift;
168 my $res = "NTSTATUS dcom_$basename\_init(void)\n";
170 $res .="\tNTSTATUS status = NT_STATUS_OK;\n";
171 foreach my $interface (@{$idl}) {
172 next if $interface->{TYPE} ne "INTERFACE";
173 next if not util::has_property($interface, "object");
175 my $data = $interface->{INHERITED_DATA};
177 foreach my $d (@{$data}) {
178 if ($d->{TYPE} eq "FUNCTION") { $count++; }
181 next if ($count == 0);
183 $res .= "\tstatus = dcom_$interface->{NAME}_init();\n";
184 $res .= "\tif (NT_STATUS_IS_ERR(status)) {\n";
185 $res .= "\t\treturn status;\n";
188 $res .= "\treturn status;\n";