1 ###################################################
2 # Samba3 type-specific declarations / initialization / marshalling
3 # Copyright jelmer@samba.org 2005
4 # released under the GNU GPL
6 package Parse::Pidl::Samba3::Types;
10 @EXPORT_OK = qw(DeclShort DeclLong InitType DissectType AddType);
13 use Parse::Pidl::Util qw(has_property ParseExpr);
14 use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred);
16 use vars qw($VERSION);
19 # TODO: Find external types somehow?
21 sub warning($$) { my ($e,$s) = @_; print STDERR "$e->{FILE}:$e->{LINE}: $s\n"; }
25 my ($e,$l,$n,$v) = @_;
30 sub dissect_scalar($$$)
34 my $t = lc($e->{TYPE});
36 return "prs_$t(\"$e->{NAME}\", ps, depth, &$n)";
43 # FIXME: More intelligent code here - select between UNISTR2 and other
50 my ($e,$l,$n,$v) = @_;
52 return "init_unistr2(&$n, $v, UNI_FLAGS_NONE);";
55 sub dissect_string($$$)
59 return "prs_unistr2(True, \"$e->{NAME}\", ps, depth, &n)";
64 my ($e,$l,$n,$v) = @_;
73 return "smb_io_uuid(\"$e->{NAME}\", &$n, ps, depth)";
81 INIT => \&init_scalar,
82 DISSECT => \&dissect_scalar,
87 INIT => \&init_scalar,
88 DISSECT => \&dissect_scalar,
93 INIT => \&init_scalar,
94 DISSECT => \&dissect_scalar,
98 DECL => \&decl_string,
99 INIT => \&init_string,
100 DISSECT => \&dissect_string,
105 INIT => \&init_scalar,
106 DISSECT => \&dissect_scalar,
111 INIT => \&init_scalar,
112 DISSECT => \&dissect_scalar,
116 DECL => "struct uuid",
118 DISSECT => \&dissect_uuid,
126 warn("Reregistering type $t") if (defined($known_types->{$t}));
128 $known_types->{$t} = $d;
135 my $t = $known_types->{$e->{TYPE}};
138 warning($e, "Can't declare unknown type $e->{TYPE}");
142 # DECL can be a function
143 if (ref($t->{DECL}) eq "CODE") {
144 return $t->{DECL}->($e);
150 # Return type without special stuff, as used in
151 # struct declarations
157 return undef if not $t;
159 return "$t $e->{NAME}";
168 return undef if not $t;
172 foreach my $l (@{$e->{LEVELS}}) {
173 ($ptrs.="*") if ($l->{TYPE} eq "POINTER");
176 return "$t $ptrs$e->{NAME}";
181 my ($e, $l, $varname, $value) = @_;
183 my $t = $known_types->{$l->{DATA_TYPE}};
186 warning($e, "Don't know how to initialize type $l->{DATA_TYPE}");
190 # INIT can be a function
191 if (ref($t->{INIT}) eq "CODE") {
192 return $t->{INIT}->($e, $l, $varname, $value);
200 my ($e, $l, $varname) = @_;
202 my $t = $known_types->{$l->{DATA_TYPE}};
205 warning($e, "Don't know how to dissect type $l->{DATA_TYPE}");
209 # DISSECT can be a function
210 if (ref($t->{DISSECT}) eq "CODE") {
211 return $t->{DISSECT}->($e, $l, $varname);
213 return $t->{DISSECT};
220 foreach my $if (@{$ndr}) {
221 next unless ($if->{TYPE} eq "INTERFACE");
223 foreach my $td (@{$if->{TYPEDEFS}}) {
224 AddType($td->{NAME}, {
225 DECL => uc("$if->{NAME}_$td->{NAME}"),
227 my ($e,$l,$n,$v) = @_;
228 return "init_$td->{NAME}(&$n/*FIXME:OTHER ARGS*/);";
233 return "$if->{NAME}_io_$td->{NAME}(\"$e->{NAME}\", &$n, ps, depth)";