summaryrefslogtreecommitdiff
path: root/source4/pidl/lib/Parse/Pidl/Samba4/SWIG.pm
blob: d42960be28163763672d1b670d406a1d9cae8039 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
###################################################
# Samba4 parser generator for swig wrappers
# Copyright tpot@samba.org 2004,2005
# Copyright jelmer@samba.org 2006
# released under the GNU GPL

package Parse::Pidl::Samba4::SWIG;

use vars qw($VERSION);
$VERSION = '0.01';

use strict;

my $ret = "";
my $tabs = "";

sub pidl($)
{
	my $p = shift;
	$ret .= $tabs. $p . "\n";
}

sub indent() { $tabs.="\t"; }
sub deindent() { $tabs = substr($tabs,0,-1); }

sub ParseInterface($)
{
	my $if = shift;

	pidl "\%{";
	pidl "struct $if->{NAME} {";
	indent;
	pidl "struct dcerpc_pipe *pipe;";
	deindent;
	pidl "};";
	pidl "%}";
	pidl "";

	# FIXME: Generate ignores for all manual functions
		
	pidl "\%extend $if->{NAME} {";
	indent();
	pidl "struct $if->{NAME} *$if->{NAME} (const char *binding, struct cli_credentials *cred = NULL, TALLOC_CTX *mem_ctx = NULL, struct event_context *event = NULL)";
	pidl "{";
	indent;
	pidl "struct $if->{NAME} *ret = talloc(mem_ctx, struct $if->{NAME});";
	pidl "NTSTATUS status;";
	pidl "";
	pidl "status = dcerpc_pipe_connect(mem_ctx, &ret->pipe, &dcerpc_table_$if->{NAME}, cred, event);";
	pidl "if (NT_STATUS_IS_ERR(status)) {";
	pidl "\tsamba_nt_status_exception(status);";
	pidl "\treturn NULL;";
	pidl "}";
	pidl "";
	pidl "return ret;";
	deindent;
	pidl "}";
	pidl "";
	pidl "~$if->{NAME}() {";
	pidl "\ttalloc_free(self);";
	pidl "}";
	pidl "";

	foreach (@{$if->{FUNCTIONS}}) {
		pidl "/* $_->{NAME} */";
	}

	deindent();
	pidl "}";
	pidl "";

	foreach (@{$if->{TYPES}}) {
		pidl "/* $_->{NAME} */";	
	}
	
	pidl "";
}

sub Parse($$$$)
{
    my($ndr,$basename,$header,$gen_header) = @_;

	$ret = "";

	pidl "/* This file is autogenerated by pidl. DO NOT EDIT */";

	pidl "\%module $basename";
	
	pidl "";

	pidl "\%{";
	pidl "#include \"includes.h\"";
	pidl "#include \"$header\"";
	pidl "%}";
	pidl "\%include \"samba.i\"";
	pidl "\%include \"$gen_header\"";

	pidl "";

	foreach (@$ndr) {
		ParseInterface($_) if ($_->{TYPE} eq "INTERFACE");
	}
	#FIXME: Foreach ref pointer, set NONNULL
	#FIXME: Foreach unique/full pointer, set MAYBENULL
	#FIXME: Foreach [out] parameter, set OUTPARAM
	#
	return $ret;
}

1;