summaryrefslogtreecommitdiff
path: root/source4/build/pidl/clientfns.pm
diff options
context:
space:
mode:
Diffstat (limited to 'source4/build/pidl/clientfns.pm')
-rw-r--r--source4/build/pidl/clientfns.pm127
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;