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;
|