1be895208fea713de2d70bf7ecc0cd9a6f7950ed
[samba.git] / source4 / build / pidl / client.pm
1 ###################################################
2 # client calls generator
3 # Copyright tridge@samba.org 2003
4 # released under the GNU GPL
5
6 package IdlClient;
7
8 use strict;
9
10 my($res);
11
12 #####################################################################
13 # parse a function
14 sub ParseFunction($$)
15 {
16         my $interface = shift;
17         my $fn = shift;
18         my $name = $fn->{NAME};
19         my $uname = uc $name;
20
21         $res .= "
22 struct rpc_request *dcerpc_$name\_send(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r)
23 {
24         if (p->conn->flags & DCERPC_DEBUG_PRINT_IN) {
25                 NDR_PRINT_IN_DEBUG($name, r);
26         }
27         
28         return dcerpc_ndr_request_send(p, NULL, &dcerpc_table_$interface->{NAME}, DCERPC_$uname, mem_ctx, r);
29 }
30
31 NTSTATUS dcerpc_$name(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct $name *r)
32 {
33         struct rpc_request *req;
34         NTSTATUS status;
35         
36         req = dcerpc_$name\_send(p, mem_ctx, r);
37         if (req == NULL) return NT_STATUS_NO_MEMORY;
38
39         status = dcerpc_ndr_request_recv(req);
40
41         if (NT_STATUS_IS_OK(status) && (p->conn->flags & DCERPC_DEBUG_PRINT_OUT)) {
42                 NDR_PRINT_OUT_DEBUG($name, r);          
43         }
44 ";
45         if ($fn->{RETURN_TYPE} eq "NTSTATUS") {
46              $res .= "\tif (NT_STATUS_IS_OK(status)) status = r->out.result;\n";
47         }
48         $res .= 
49 "
50         return status;
51 }
52 ";
53 }
54
55
56 #####################################################################
57 # parse the interface definitions
58 sub ParseInterface($)
59 {
60         my($interface) = shift;
61         my($data) = $interface->{DATA};
62         $res = "/* Client functions generated by pidl */\n\n";
63         foreach my $d (@{$data}) {
64                 ($d->{TYPE} eq "FUNCTION") && 
65                     ParseFunction($interface, $d);
66         }
67         return $res;
68 }
69
70 1;