summaryrefslogtreecommitdiff
path: root/source4/build/pidl/parser.pm
diff options
context:
space:
mode:
Diffstat (limited to 'source4/build/pidl/parser.pm')
-rw-r--r--source4/build/pidl/parser.pm117
1 files changed, 113 insertions, 4 deletions
diff --git a/source4/build/pidl/parser.pm b/source4/build/pidl/parser.pm
index c55b47dc59..00d48270de 100644
--- a/source4/build/pidl/parser.pm
+++ b/source4/build/pidl/parser.pm
@@ -468,13 +468,18 @@ sub ParseElementPullSwitch($$$$)
if (!defined $utype ||
!util::has_property($utype, "nodiscriminant")) {
my $e2 = find_sibling($e, $switch);
+ my $type_decl = $e2->{TYPE};
+ my $type_fn = $e2->{TYPE};
pidl "\tif (($ndr_flags) & NDR_SCALARS) {\n";
if (util::is_enum($e2->{TYPE})) {
- pidl "\t\t enum $e2->{TYPE} _level;\n";
- } else {
- pidl "\t\t $e2->{TYPE} _level;\n";
+ $type_decl = util::enum_type_decl($e2);
+ $type_fn = util::enum_type_fn($e2);
+ } elsif (util::is_bitmap($e2->{TYPE})) {
+ $type_decl = util::bitmap_type_decl($e2);
+ $type_fn = util::bitmap_type_fn($e2);
}
- pidl "\t\tNDR_CHECK(ndr_pull_$e2->{TYPE}(ndr, &_level));\n";
+ pidl "\t\t$type_decl _level;\n";
+ pidl "\t\tNDR_CHECK(ndr_pull_$type_fn(ndr, &_level));\n";
if ($switch_var =~ /r->in/) {
pidl "\t\tif (!(ndr->flags & LIBNDR_FLAG_REF_ALLOC) && _level != $switch_var) {\n";
} else {
@@ -863,6 +868,78 @@ sub ParseEnumPrint($)
}
+#####################################################################
+# generate a push function for a bitmap
+sub ParseBitmapPush($)
+{
+ my($bitmap) = shift;
+ my($type_decl) = util::bitmap_type_decl($bitmap);
+ my($type_fn) = util::bitmap_type_fn($bitmap);
+
+ start_flags($bitmap);
+
+ pidl "\tNDR_CHECK(ndr_push_$type_fn(ndr, r));\n";
+
+ end_flags($bitmap);
+}
+
+#####################################################################
+# generate a pull function for an bitmap
+sub ParseBitmapPull($)
+{
+ my($bitmap) = shift;
+ my($type_decl) = util::bitmap_type_decl($bitmap);
+ my($type_fn) = util::bitmap_type_fn($bitmap);
+
+ start_flags($bitmap);
+
+ pidl "\t$type_decl v;\n";
+ pidl "\tNDR_CHECK(ndr_pull_$type_fn(ndr, &v));\n";
+ pidl "\t*r = v;\n";
+
+ end_flags($bitmap);
+}
+
+#####################################################################
+# generate a print function for an bitmap
+sub ParseBintmapPrintElement($$)
+{
+ my($e) = shift;
+ my($bitmap) = shift;
+ my($type_decl) = util::bitmap_type_decl($bitmap);
+ my($type_fn) = util::bitmap_type_fn($bitmap);
+ my($name) = $bitmap->{PARENT}->{NAME};
+ my($flag);
+
+ if ($e =~ /^(\w+) .*$/) {
+ $flag = "$1";
+ } else {
+ die "Bitmap: \"$name\" invalid Flag: \"$e\"";
+ }
+
+ pidl "\tndr_print_bitmap_flag(ndr, sizeof($type_decl), \"$flag\", $flag, r);\n";
+}
+
+#####################################################################
+# generate a print function for an bitmap
+sub ParseBitmapPrint($)
+{
+ my($bitmap) = shift;
+ my($type_decl) = util::bitmap_type_decl($bitmap);
+ my($type_fn) = util::bitmap_type_fn($bitmap);
+
+ start_flags($bitmap);
+
+ pidl "\tndr_print_$type_fn(ndr, name, r);\n";
+
+ pidl "\tndr->depth++;\n";
+ foreach my $e (@{$bitmap->{ELEMENTS}}) {
+ ParseBintmapPrintElement($e, $bitmap);
+ }
+ pidl "\tndr->depth--;\n";
+
+ end_flags($bitmap);
+}
#####################################################################
# generate a struct print function
@@ -1139,6 +1216,8 @@ sub ParseTypePush($)
ParseUnionPush($data);
($data->{TYPE} eq "ENUM") &&
ParseEnumPush($data);
+ ($data->{TYPE} eq "BITMAP") &&
+ ParseBitmapPush($data);
}
}
@@ -1155,6 +1234,8 @@ sub ParseTypePrint($)
ParseUnionPrint($data);
($data->{TYPE} eq "ENUM") &&
ParseEnumPrint($data);
+ ($data->{TYPE} eq "BITMAP") &&
+ ParseBitmapPrint($data);
}
}
@@ -1171,6 +1252,8 @@ sub ParseTypePull($)
ParseUnionPull($data);
($data->{TYPE} eq "ENUM") &&
ParseEnumPull($data);
+ ($data->{TYPE} eq "BITMAP") &&
+ ParseBitmapPull($data);
}
}
@@ -1213,6 +1296,15 @@ sub ParseTypedefPush($)
pidl "\treturn NT_STATUS_OK;\n";
pidl "}\n\n";
}
+
+ if ($e->{DATA}->{TYPE} eq "BITMAP") {
+ my $type_decl = util::bitmap_type_fn($e->{DATA});
+ pidl $static . "NTSTATUS ndr_push_$e->{NAME}(struct ndr_push *ndr, $type_decl r)";
+ pidl "\n{\n";
+ ParseTypePush($e->{DATA});
+ pidl "\treturn NT_STATUS_OK;\n";
+ pidl "}\n\n";
+ }
}
@@ -1255,6 +1347,15 @@ sub ParseTypedefPull($)
pidl "\treturn NT_STATUS_OK;\n";
pidl "}\n\n";
}
+
+ if ($e->{DATA}->{TYPE} eq "BITMAP") {
+ my $type_decl = util::bitmap_type_fn($e->{DATA});
+ pidl $static . "NTSTATUS ndr_pull_$e->{NAME}(struct ndr_pull *ndr, $type_decl *r)";
+ pidl "\n{\n";
+ ParseTypePull($e->{DATA});
+ pidl "\treturn NT_STATUS_OK;\n";
+ pidl "}\n\n";
+ }
}
@@ -1290,6 +1391,14 @@ sub ParseTypedefPrint($)
ParseTypePrint($e->{DATA});
pidl "}\n\n";
}
+
+ if ($e->{DATA}->{TYPE} eq "BITMAP") {
+ my $type_decl = util::bitmap_type_fn($e->{DATA});
+ pidl "void ndr_print_$e->{NAME}(struct ndr_print *ndr, const char *name, $type_decl r)";
+ pidl "\n{\n";
+ ParseTypePrint($e->{DATA});
+ pidl "}\n\n";
+ }
}
#####################################################################