1 ###################################################
2 # Samba4 parser generator for swig wrappers
3 # Copyright tpot@samba.org 2004,2005
4 # Copyright jelmer@samba.org 2006
5 # released under the GNU GPL
7 package Parse::Pidl::Samba4::SWIG;
10 use Parse::Pidl::Samba4 qw(DeclLong);
11 use Parse::Pidl::Typelist qw(mapTypeName);
12 use Parse::Pidl::Util qw(has_property);
23 $ret .= $tabs. $p . "\n";
26 sub indent() { $tabs.="\t"; }
27 sub deindent() { $tabs = substr($tabs,0,-1); }
29 sub IgnoreInterface($$)
31 my ($basename,$if) = @_;
33 foreach (@{$if->{TYPES}}) {
34 next unless (has_property($_, "public"));
35 pidl "\%types($_->{NAME});";
39 sub ParseInterface($$)
41 my ($basename,$if) = @_;
44 pidl "struct $if->{NAME} { struct dcerpc_pipe *pipe; };";
47 pidl "\%extend $if->{NAME} {";
49 pidl "$if->{NAME} (const char *binding, struct cli_credentials *cred = NULL, TALLOC_CTX *mem_ctx = NULL, struct event_context *event = NULL)";
52 pidl "struct $if->{NAME} *ret = talloc(mem_ctx, struct $if->{NAME});";
53 pidl "NTSTATUS status;";
55 pidl "status = dcerpc_pipe_connect(mem_ctx, &ret->pipe, binding, &dcerpc_table_$if->{NAME}, cred, event);";
56 pidl "if (NT_STATUS_IS_ERR(status)) {";
57 pidl "\tntstatus_exception(status);";
58 pidl "\treturn NULL;";
65 pidl "~$if->{NAME}() {";
66 pidl "\ttalloc_free(self);";
70 foreach my $fn (@{$if->{FUNCTIONS}}) {
71 pidl "/* $fn->{NAME} */";
73 foreach (@{$fn->{ELEMENTS}}) {
74 $args .= DeclLong($_) . ", ";
76 my $name = $fn->{NAME};
77 $name =~ s/^$if->{NAME}_//g;
78 $name =~ s/^$basename\_//g;
79 $args .= "TALLOC_CTX *mem_ctx = NULL";
80 pidl mapTypeName($fn->{RETURN_TYPE}) . " $name($args)";
83 pidl "struct $fn->{NAME} r;";
84 pidl "NTSTATUS status;";
86 pidl "/* Fill r structure */";
88 foreach (@{$fn->{ELEMENTS}}) {
89 if (grep(/in/, @{$_->{DIRECTION}})) {
90 pidl "r.in.$_->{NAME} = $_->{NAME};";
95 pidl "status = dcerpc_$fn->{NAME}(self->pipe, mem_ctx, &r);";
96 pidl "if (NT_STATUS_IS_ERR(status)) {";
97 pidl "\tntstatus_exception(status);";
98 if (defined($fn->{RETURN_TYPE})) {
99 pidl "\treturn r.out.result;";
105 pidl "/* Set out arguments */";
106 foreach (@{$fn->{ELEMENTS}}) {
107 next unless (grep(/out/, @{$_->{DIRECTION}}));
109 pidl ("/* FIXME: $_->{NAME} [out] argument is not a pointer */") if ($_->{LEVELS}[0]->{TYPE} ne "POINTER");
111 pidl "*$_->{NAME} = *r.out.$_->{NAME};";
114 if (defined($fn->{RETURN_TYPE})) {
115 pidl "return r.out.result;";
126 foreach (@{$if->{TYPES}}) {
127 pidl "/* $_->{NAME} */";
135 my($ndr,$basename,$header,$gen_header) = @_;
139 pidl "/* This file is autogenerated by pidl. DO NOT EDIT */";
141 pidl "\%module $basename";
146 pidl "#include \"includes.h\"";
147 pidl "#include \"auth/credentials/credentials.h\"";
148 pidl "#include \"$header\"";
149 pidl "#include \"$gen_header\"";
151 pidl "\%import \"samba.i\"";
154 pidl "void ntstatus_exception(NTSTATUS status)";
156 pidl "\t/* FIXME */";
161 IgnoreInterface($basename, $_) if ($_->{TYPE} eq "INTERFACE");
168 ParseInterface($basename, $_) if ($_->{TYPE} eq "INTERFACE");
170 #FIXME: Foreach ref pointer, set NONNULL
171 #FIXME: Foreach unique/full pointer, set MAYBENULL
172 #FIXME: Foreach [out] parameter, set OUTPARAM