diff options
Diffstat (limited to 'source4/build/pidl/clientfns.pm')
-rw-r--r-- | source4/build/pidl/clientfns.pm | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/source4/build/pidl/clientfns.pm b/source4/build/pidl/clientfns.pm new file mode 100644 index 0000000000..9f5f0ea883 --- /dev/null +++ b/source4/build/pidl/clientfns.pm @@ -0,0 +1,127 @@ +################################################### +# clientfs boilerplate generator +# Copyright tpot@samba.org 2004 +# released under the GNU GPL + +package IdlClientFns; + +use strict; + +my($res); + +sub pidl($) +{ + $res .= shift; +} + +use Data::Dumper; + +##################################################################### +# produce boilerplate code for a interface +sub Boilerplate_ClientFns($) +{ + my($interface) = shift; + my($data) = $interface->{DATA}; + my $name = $interface->{NAME}; + + foreach my $d (@{$data}) { + if ($d->{TYPE} eq "FUNCTION") { + + pidl "/*\n"; + pidl Dumper($d); + pidl "\n*/\n\n"; + + pidl "$d->{RETURN_TYPE} $d->{NAME}(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx"; + + my $count = 0, my $i = 0; + + foreach my $a (@{$d->{DATA}}) { + $count++; + } + + pidl ", ", if $count > 0; + + foreach my $a (@{$d->{DATA}}) { + + pidl "/* ["; + if ($a->{PROPERTIES}->{in}) { + pidl "in"; + if ($a->{PROPERTIES}->{out} or + $a->{PROPERTIES}->{ref}) { + pidl ","; + } + } + if ($a->{PROPERTIES}->{out}) { + pidl "out"; + if ($a->{PROPERTIES}->{ref}) { + pidl ","; + } + } + if ($a->{PROPERTIES}->{ref}) { + pidl "ref"; + } + pidl "] */ "; + + pidl "struct ", if $a->{TYPE} eq "policy_handle"; + + pidl "$a->{TYPE} "; + if ($a->{PROPERTIES}->{out}) { + pidl "*"; + } + + if (!$a->{PROPERTIES}->{ref}) { + pidl "*", if $a->{POINTERS}; + } + + pidl "$a->{NAME}"; + + $i++; + + pidl ", ", if $i < $count; + } + pidl ")\n"; + pidl "{\n"; + + pidl "\tstruct $d->{NAME} r;\n"; + pidl "\tNTSTATUS status;\n"; + pidl "\n"; + + foreach $a (@{$d->{DATA}}) { + if ($a->{PROPERTIES}->{in}) { + pidl "\tr.in.$a->{NAME} = $a->{NAME};\n"; + } + if ($a->{PROPERTIES}->{out}) { + pidl "\tr.out.$a->{NAME} = $a->{NAME};\n"; + } + } + pidl "\n"; + + pidl "\tstatus = dcerpc_$d->{NAME}(p, mem_ctx, &r);\n"; + pidl "\n"; + + pidl "\treturn NT_STATUS_OK;\n"; + + pidl "}\n\n"; + } + } +} + +##################################################################### +# parse a parsed IDL structure back into an IDL file +sub Parse($) +{ + my($idl) = shift; + $res = "/* dcerpc client functions generated by pidl */\n\n"; + + $res .= "#include \"includes.h\"\n\n"; + + foreach my $x (@{$idl}) { + if ($x->{TYPE} eq "INTERFACE") { + Boilerplate_ClientFns($x); + } + } + + return $res; +} + +1; |