[SCM] Samba Shared Repository - branch v4-0-test updated - release-4-0-0alpha5-330-ge51c0cf

Stefan Metzmacher metze at samba.org
Wed Aug 20 13:28:02 GMT 2008


The branch, v4-0-test has been updated
       via  e51c0cf62c91f79f703b17bcf37c4a6fa8107ae0 (commit)
       via  6785684db3446c03d8061c8bb3d94889b443d7d5 (commit)
       via  f002f147d8a8a0b49389e30e611ff8b33dd077e1 (commit)
       via  bdff9728cc1c8b5fe5a29040e092a8e48603725b (commit)
       via  c3921c7b4e7a3b51b97a2afb688271a8ae403105 (commit)
       via  77571cd7c74dfaa93e58f047530df369ae293ffd (commit)
       via  ce83f4bb596fad23000acc1f6691669e2f2cfe1b (commit)
       via  b01d7457fa5b3572989b821f04e023fd9abd0d52 (commit)
       via  a143806364051141604ebb40eb5a4ef72958b55f (commit)
       via  71b0d64866eb1a4f6dc73eeb57b5f0fe5d8a5780 (commit)
       via  38c4b2a3e9b316f390651297854de033ede0d128 (commit)
       via  a1cf2289dd4ff9a3f9cf61da680223193235e35f (commit)
      from  e860fc171fd127d73df23336089c1479911953da (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v4-0-test


- Log -----------------------------------------------------------------
commit e51c0cf62c91f79f703b17bcf37c4a6fa8107ae0
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Aug 20 14:41:38 2008 +0200

    pidl/NDR::Parser: pass typedefs through the ParseElement*Level() functions
    
    metze

commit 6785684db3446c03d8061c8bb3d94889b443d7d5
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Aug 20 14:41:05 2008 +0200

    pidl/NDR: generate a LEVELS array for typedefs
    
    metze

commit f002f147d8a8a0b49389e30e611ff8b33dd077e1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Wed Aug 20 10:18:42 2008 +0200

    pidl/NDR: correctly check for valid properties
    
    grep($str, @array) returns the number of elements in @array!
    We need grep(/^$str$/, @array) to the only the amount of matches.
    
    Also fix unitialized vars for the error case.
    
    metze

commit bdff9728cc1c8b5fe5a29040e092a8e48603725b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 19 20:53:18 2008 +0200

    pidl/NDR::Parser: pass $ndr to ->start_flags() and ->end_flags()
    
    metze

commit c3921c7b4e7a3b51b97a2afb688271a8ae403105
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 19 20:51:27 2008 +0200

    pidl/NDR::Parser: pass $ndr to ParseMemCtxPull*()
    
    metze

commit 77571cd7c74dfaa93e58f047530df369ae293ffd
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 19 20:48:53 2008 +0200

    pidl/NDR::Parser: pass $ndr to ParsePtrPush()
    
    metze

commit ce83f4bb596fad23000acc1f6691669e2f2cfe1b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 19 20:34:00 2008 +0200

    pidl/NDR::Parser: use my $ndr = "ndr" in the remaining top functions
    
    metze

commit b01d7457fa5b3572989b821f04e023fd9abd0d52
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 19 20:27:15 2008 +0200

    pidl/NDR::Parser: pass down $ndr from the top functions
    
    metze

commit a143806364051141604ebb40eb5a4ef72958b55f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 19 20:12:03 2008 +0200

    pidl/NDR::Parser: pass $ndr to ->PRINT_FN_BLOB()
    
    metze

commit 71b0d64866eb1a4f6dc73eeb57b5f0fe5d8a5780
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 19 13:24:05 2008 +0200

    pidl/NDR::Parser: pass $ndr to ->PUSH_FN_BLOB()
    
    metze

commit 38c4b2a3e9b316f390651297854de033ede0d128
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 19 13:04:38 2008 +0200

    pidl/NDR::Parser: pass $ndr to ->PULL_FN_BODY()
    
    metze

commit a1cf2289dd4ff9a3f9cf61da680223193235e35f
Author: Stefan Metzmacher <metze at samba.org>
Date:   Tue Aug 19 12:34:49 2008 +0200

    pidl/NDR::Parser: use $ndr instead of "ndr"
    
    metze

-----------------------------------------------------------------------

Summary of changes:
 source/pidl/lib/Parse/Pidl/NDR.pm               |   75 +++--
 source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm |  506 ++++++++++++-----------
 source/pidl/tests/samba-ndr.pl                  |   13 +-
 3 files changed, 319 insertions(+), 275 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/pidl/lib/Parse/Pidl/NDR.pm b/source/pidl/lib/Parse/Pidl/NDR.pm
index 1e45047..10bd297 100644
--- a/source/pidl/lib/Parse/Pidl/NDR.pm
+++ b/source/pidl/lib/Parse/Pidl/NDR.pm
@@ -287,6 +287,22 @@ sub GetElementLevelTable($$)
 	return $order;
 }
 
+sub GetTypedefLevelTable($$$)
+{
+	my ($e, $data, $pointer_default) = @_;
+
+	my $order = [];
+
+	push (@$order, {
+		TYPE => "TYPEDEF"
+	});
+
+	my $i = 0;
+	foreach (@$order) { $_->{LEVEL_INDEX} = $i; $i+=1; }
+
+	return $order;
+}
+
 #####################################################################
 # see if a type contains any deferred data 
 sub can_contain_deferred($)
@@ -575,6 +591,7 @@ sub ParseTypedef($$)
 		NAME => $d->{NAME},
 		TYPE => $d->{TYPE},
 		PROPERTIES => $d->{PROPERTIES},
+		LEVELS => GetTypedefLevelTable($d, $data, $pointer_default),
 		DATA => $data,
 		ORIGINAL => $d
 	};
@@ -795,20 +812,21 @@ sub ContainsDeferred($$)
 sub el_name($)
 {
 	my $e = shift;
+	my $name = "<ANONYMOUS>";
 
-	if ($e->{PARENT} && $e->{PARENT}->{NAME}) {
-		return "$e->{PARENT}->{NAME}.$e->{NAME}";
-	}
+	$name = $e->{NAME} if defined($e->{NAME});
 
-	if ($e->{PARENT} && $e->{PARENT}->{PARENT}->{NAME}) {
-		return "$e->{PARENT}->{PARENT}->{NAME}.$e->{NAME}";
+	if (defined($e->{PARENT}) and defined($e->{PARENT}->{NAME})) {
+		return "$e->{PARENT}->{NAME}.$name";
 	}
 
-	if ($e->{PARENT}) {
-		return "$e->{PARENT}->{NAME}.$e->{NAME}";
+	if (defined($e->{PARENT}) and
+	    defined($e->{PARENT}->{PARENT}) and
+	    defined($e->{PARENT}->{PARENT}->{NAME})) {
+		return "$e->{PARENT}->{PARENT}->{NAME}.$name";
 	}
 
-	return $e->{NAME};
+	return $name;
 }
 
 ###################################
@@ -858,25 +876,25 @@ my %property_list = (
 	"unique"		=> ["ELEMENT"],
 	"ignore"		=> ["ELEMENT"],
 	"relative"		=> ["ELEMENT"],
-	"relative_base"		=> ["TYPEDEF"],
+	"relative_base"		=> ["TYPEDEF", "STRUCT", "UNION"],
 
-	"gensize"		=> ["TYPEDEF"],
+	"gensize"		=> ["TYPEDEF", "STRUCT", "UNION"],
 	"value"			=> ["ELEMENT"],
-	"flag"			=> ["ELEMENT", "TYPEDEF"],
+	"flag"			=> ["ELEMENT", "TYPEDEF", "STRUCT", "UNION", "ENUM", "BITMAP"],
 
 	# generic
-	"public"		=> ["FUNCTION", "TYPEDEF"],
-	"nopush"		=> ["FUNCTION", "TYPEDEF"],
-	"nopull"		=> ["FUNCTION", "TYPEDEF"],
-	"nosize"		=> ["FUNCTION", "TYPEDEF"],
-	"noprint"		=> ["FUNCTION", "TYPEDEF"],
-	"noejs"			=> ["FUNCTION", "TYPEDEF"],
+	"public"		=> ["FUNCTION", "TYPEDEF", "STRUCT", "UNION", "ENUM", "BITMAP"],
+	"nopush"		=> ["FUNCTION", "TYPEDEF", "STRUCT", "UNION", "ENUM", "BITMAP"],
+	"nopull"		=> ["FUNCTION", "TYPEDEF", "STRUCT", "UNION", "ENUM", "BITMAP"],
+	"nosize"		=> ["FUNCTION", "TYPEDEF", "STRUCT", "UNION", "ENUM", "BITMAP"],
+	"noprint"		=> ["FUNCTION", "TYPEDEF", "STRUCT", "UNION", "ENUM", "BITMAP", "ELEMENT"],
+	"noejs"			=> ["FUNCTION", "TYPEDEF", "STRUCT", "UNION", "ENUM", "BITMAP"],
 	"todo"			=> ["FUNCTION"],
 
 	# union
 	"switch_is"		=> ["ELEMENT"],
-	"switch_type"		=> ["ELEMENT", "TYPEDEF"],
-	"nodiscriminant"	=> ["TYPEDEF"],
+	"switch_type"		=> ["ELEMENT", "UNION"],
+	"nodiscriminant"	=> ["UNION"],
 	"case"			=> ["ELEMENT"],
 	"default"		=> ["ELEMENT"],
 
@@ -889,15 +907,15 @@ my %property_list = (
 	"compression"		=> ["ELEMENT"],
 
 	# enum
-	"enum8bit"		=> ["TYPEDEF"],
-	"enum16bit"		=> ["TYPEDEF"],
-	"v1_enum"		=> ["TYPEDEF"],
+	"enum8bit"		=> ["ENUM"],
+	"enum16bit"		=> ["ENUM"],
+	"v1_enum"		=> ["ENUM"],
 
 	# bitmap
-	"bitmap8bit"		=> ["TYPEDEF"],
-	"bitmap16bit"		=> ["TYPEDEF"],
-	"bitmap32bit"		=> ["TYPEDEF"],
-	"bitmap64bit"		=> ["TYPEDEF"],
+	"bitmap8bit"		=> ["BITMAP"],
+	"bitmap16bit"		=> ["BITMAP"],
+	"bitmap32bit"		=> ["BITMAP"],
+	"bitmap64bit"		=> ["BITMAP"],
 
 	# array
 	"range"			=> ["ELEMENT"],
@@ -921,7 +939,7 @@ sub ValidProperties($$)
 			unless defined($property_list{$key});
 
    		fatal($e, el_name($e) . ": property '$key' not allowed on '$t'")
-			unless grep($t, @{$property_list{$key}});
+			unless grep(/^$t$/, @{$property_list{$key}});
 	}
 }
 
@@ -1101,6 +1119,9 @@ sub ValidTypedef($)
 
 	$data->{PARENT} = $typedef;
 
+	$data->{FILE} = $typedef->{FILE} unless defined($data->{FILE});
+	$data->{LINE} = $typedef->{LINE} unless defined($data->{LINE});
+
 	ValidType($data) if (ref($data) eq "HASH");
 }
 
diff --git a/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm b/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
index a0de1f1..745777d 100644
--- a/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
+++ b/source/pidl/lib/Parse/Pidl/Samba4/NDR/Parser.pm
@@ -158,26 +158,26 @@ sub fn_declare($$$$)
 
 ###################################################################
 # setup any special flags for an element or structure
-sub start_flags($$)
+sub start_flags($$$)
 {
-	my ($self, $e) = @_;
+	my ($self, $e, $ndr) = @_;
 	my $flags = has_property($e, "flag");
 	if (defined $flags) {
 		$self->pidl("{");
 		$self->indent;
-		$self->pidl("uint32_t _flags_save_$e->{TYPE} = ndr->flags;");
-		$self->pidl("ndr_set_flags(&ndr->flags, $flags);");
+		$self->pidl("uint32_t _flags_save_$e->{TYPE} = $ndr->flags;");
+		$self->pidl("ndr_set_flags(&$ndr->flags, $flags);");
 	}
 }
 
 ###################################################################
 # end any special flags for an element or structure
-sub end_flags($$)
+sub end_flags($$$)
 {
-	my ($self, $e) = @_;
+	my ($self, $e, $ndr) = @_;
 	my $flags = has_property($e, "flag");
 	if (defined $flags) {
-		$self->pidl("ndr->flags = _flags_save_$e->{TYPE};");
+		$self->pidl("$ndr->flags = _flags_save_$e->{TYPE};");
 		$self->deindent;
 		$self->pidl("}");
 	}
@@ -331,12 +331,12 @@ sub ParseArrayPullHeader($$$$$$)
 	} else {
 		$length = $size = ParseExprExt($l->{SIZE_IS}, $env, $e->{ORIGINAL},
 			check_null_pointer($e, $env, sub { $self->pidl(shift); },
-					   "return ndr_pull_error(ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for size_is()\");"),
+					   "return ndr_pull_error($ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for size_is()\");"),
 			check_fully_dereferenced($e, $env));
 	}
 
 	if ((!$l->{IS_SURROUNDING}) and $l->{IS_CONFORMANT}) {
-		$self->pidl("NDR_CHECK(ndr_pull_array_size(ndr, " . get_pointer_to($var_name) . "));");
+		$self->pidl("NDR_CHECK(ndr_pull_array_size($ndr, " . get_pointer_to($var_name) . "));");
 	}
 
 	if ($l->{IS_VARYING}) {
@@ -357,9 +357,9 @@ sub ParseArrayPullHeader($$$$$$)
 		$self->defer_indent;
 		my $size = ParseExprExt($l->{SIZE_IS}, $env, $e->{ORIGINAL},
 			check_null_pointer($e, $env, sub { $self->defer(shift); },
-					   "return ndr_pull_error(ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for size_is()\");"),
+					   "return ndr_pull_error($ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for size_is()\");"),
 			check_fully_dereferenced($e, $env));
-		$self->defer("NDR_CHECK(ndr_check_array_size(ndr, (void*)" . get_pointer_to($var_name) . ", $size));");
+		$self->defer("NDR_CHECK(ndr_check_array_size($ndr, (void*)" . get_pointer_to($var_name) . ", $size));");
 		$self->defer_deindent;
 		$self->defer("}");
 	}
@@ -369,9 +369,9 @@ sub ParseArrayPullHeader($$$$$$)
 		$self->defer_indent;
 		my $length = ParseExprExt($l->{LENGTH_IS}, $env, $e->{ORIGINAL}, 
 			check_null_pointer($e, $env, sub { $self->defer(shift); },
-					   "return ndr_pull_error(ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for length_is()\");"),
+					   "return ndr_pull_error($ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for length_is()\");"),
 			check_fully_dereferenced($e, $env));
-		$self->defer("NDR_CHECK(ndr_check_array_length(ndr, (void*)" . get_pointer_to($var_name) . ", $length));");
+		$self->defer("NDR_CHECK(ndr_check_array_length($ndr, (void*)" . get_pointer_to($var_name) . ", $length));");
 		$self->defer_deindent;
 		$self->defer("}");
 	}
@@ -543,7 +543,7 @@ sub ParseElementPushLevel
 			$self->ParseElementPushLevel($e, GetNextLevel($e, $l), $subndr, $var_name, $env, 1, 1);
 			$self->ParseSubcontextPushEnd($e, $l, $ndr, $env);
 		} elsif ($l->{TYPE} eq "POINTER") {
-			$self->ParsePtrPush($e, $l, $var_name);
+			$self->ParsePtrPush($e, $l, $ndr, $var_name);
 		} elsif ($l->{TYPE} eq "ARRAY") {
 			my $length = $self->ParseArrayPushHeader($e, $l, $ndr, $var_name, $env); 
 
@@ -561,6 +561,8 @@ sub ParseElementPushLevel
 			$self->ParseSwitchPush($e, $l, $ndr, $var_name, $env);
 		} elsif ($l->{TYPE} eq "DATA") {
 			$self->ParseDataPush($e, $l, $ndr, $var_name, $primitives, $deferred);
+		} elsif ($l->{TYPE} eq "TYPEDEF") {
+			$typefamily{$e->{DATA}->{TYPE}}->{PUSH_FN_BODY}->($self, $e->{DATA}, $ndr, $var_name);
 		}
 	}
 
@@ -569,7 +571,7 @@ sub ParseElementPushLevel
 			$self->pidl("if ($var_name) {");
 			$self->indent;
 			if ($l->{POINTER_TYPE} eq "relative") {
-				$self->pidl("NDR_CHECK(ndr_push_relative_ptr2(ndr, $var_name));");
+				$self->pidl("NDR_CHECK(ndr_push_relative_ptr2($ndr, $var_name));");
 			}
 		}
 		$var_name = get_value_of($var_name);
@@ -629,7 +631,7 @@ sub ParseElementPush($$$$$$)
 
 	$var_name = append_prefix($e, $var_name);
 
-	$self->start_flags($e);
+	$self->start_flags($e, $ndr);
 
 	if (defined(my $value = has_property($e, "value"))) {
 		$var_name = ParseExpr($value, $env, $e->{ORIGINAL});
@@ -637,7 +639,7 @@ sub ParseElementPush($$$$$$)
 
 	$self->ParseElementPushLevel($e, $e->{LEVELS}[0], $ndr, $var_name, $env, $primitives, $deferred);
 
-	$self->end_flags($e);
+	$self->end_flags($e, $ndr);
 
 	if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) {
 		$self->deindent;
@@ -647,25 +649,25 @@ sub ParseElementPush($$$$$$)
 
 #####################################################################
 # parse a pointer in a struct element or function
-sub ParsePtrPush($$$$)
+sub ParsePtrPush($$$$$)
 {
-	my ($self,$e,$l,$var_name) = @_;
+	my ($self,$e,$l,$ndr,$var_name) = @_;
 
 	if ($l->{POINTER_TYPE} eq "ref") {
 		$self->pidl("if ($var_name == NULL) {");
 		$self->indent;
-		$self->pidl("return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, \"NULL [ref] pointer\");");
+		$self->pidl("return ndr_push_error($ndr, NDR_ERR_INVALID_POINTER, \"NULL [ref] pointer\");");
 		$self->deindent;
 		$self->pidl("}");
 		if ($l->{LEVEL} eq "EMBEDDED") {
 			$self->pidl("NDR_CHECK(ndr_push_ref_ptr(ndr));");
 		}
 	} elsif ($l->{POINTER_TYPE} eq "relative") {
-		$self->pidl("NDR_CHECK(ndr_push_relative_ptr1(ndr, $var_name));");
+		$self->pidl("NDR_CHECK(ndr_push_relative_ptr1($ndr, $var_name));");
 	} elsif ($l->{POINTER_TYPE} eq "unique") {
-		$self->pidl("NDR_CHECK(ndr_push_unique_ptr(ndr, $var_name));");
+		$self->pidl("NDR_CHECK(ndr_push_unique_ptr($ndr, $var_name));");
 	} elsif ($l->{POINTER_TYPE} eq "full") {
-		$self->pidl("NDR_CHECK(ndr_push_full_ptr(ndr, $var_name));");
+		$self->pidl("NDR_CHECK(ndr_push_full_ptr($ndr, $var_name));");
 	} else {
 		die("Unhandled pointer type $l->{POINTER_TYPE}");
 	}
@@ -702,45 +704,45 @@ sub need_pointer_to($$$)
 	return 0;
 }
 
-sub ParseDataPrint($$$$)
+sub ParseDataPrint($$$$$)
 {
-	my ($self, $e, $l, $var_name) = @_;
-	
+	my ($self, $e, $l, $ndr, $var_name) = @_;
+
 	if (not ref($l->{DATA_TYPE}) or defined($l->{DATA_TYPE}->{NAME})) {
 
 		if (need_pointer_to($e, $l, 1)) {
 			$var_name = get_pointer_to($var_name);
 		}
 
-		$self->pidl(TypeFunctionName("ndr_print", $l->{DATA_TYPE})."(ndr, \"$e->{NAME}\", $var_name);");
+		$self->pidl(TypeFunctionName("ndr_print", $l->{DATA_TYPE})."($ndr, \"$e->{NAME}\", $var_name);");
 	} else {
-		$self->ParseTypePrint($l->{DATA_TYPE}, $var_name);
+		$self->ParseTypePrint($l->{DATA_TYPE}, $ndr, $var_name);
 	}
 }
 
 #####################################################################
 # print scalars in a structure element
-sub ParseElementPrint($$$$)
+sub ParseElementPrint($$$$$)
 {
-	my($self, $e, $var_name, $env) = @_;
+	my($self, $e, $ndr, $var_name, $env) = @_;
 
 	return if (has_property($e, "noprint"));
 
 	if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) {
-		$self->pidl("ndr_print_$e->{REPRESENTATION_TYPE}(ndr, \"$e->{NAME}\", $var_name);");
+		$self->pidl("ndr_print_$e->{REPRESENTATION_TYPE}($ndr, \"$e->{NAME}\", $var_name);");
 		return;
 	}
 
 	$var_name = append_prefix($e, $var_name);
 
 	if (defined(my $value = has_property($e, "value"))) {
-		$var_name = "(ndr->flags & LIBNDR_PRINT_SET_VALUES)?" . ParseExpr($value,$env, $e->{ORIGINAL}) . ":$var_name";
+		$var_name = "($ndr->flags & LIBNDR_PRINT_SET_VALUES)?" . ParseExpr($value,$env, $e->{ORIGINAL}) . ":$var_name";
 	}
 
 	foreach my $l (@{$e->{LEVELS}}) {
 		if ($l->{TYPE} eq "POINTER") {
-			$self->pidl("ndr_print_ptr(ndr, \"$e->{NAME}\", $var_name);");
-			$self->pidl("ndr->depth++;");
+			$self->pidl("ndr_print_ptr($ndr, \"$e->{NAME}\", $var_name);");
+			$self->pidl("$ndr->depth++;");
 			if ($l->{POINTER_TYPE} ne "ref") {
 				$self->pidl("if ($var_name) {");
 				$self->indent;
@@ -761,17 +763,17 @@ sub ParseElementPrint($$$$)
 			}
 
 			if (is_charset_array($e,$l)) {
-				$self->pidl("ndr_print_string(ndr, \"$e->{NAME}\", $var_name);");
+				$self->pidl("ndr_print_string($ndr, \"$e->{NAME}\", $var_name);");
 				last;
 			} elsif (has_fast_array($e, $l)) {
 				my $nl = GetNextLevel($e, $l);
-				$self->pidl("ndr_print_array_$nl->{DATA_TYPE}(ndr, \"$e->{NAME}\", $var_name, $length);");
+				$self->pidl("ndr_print_array_$nl->{DATA_TYPE}($ndr, \"$e->{NAME}\", $var_name, $length);");
 				last;
 			} else {
 				my $counter = "cntr_$e->{NAME}_$l->{LEVEL_INDEX}";
 
-				$self->pidl("ndr->print(ndr, \"\%s: ARRAY(\%d)\", \"$e->{NAME}\", (int)$length);");
-				$self->pidl("ndr->depth++;");
+				$self->pidl("$ndr->print($ndr, \"\%s: ARRAY(\%d)\", \"$e->{NAME}\", (int)$length);");
+				$self->pidl("$ndr->depth++;");
 				$self->pidl("for ($counter=0;$counter<$length;$counter++) {");
 				$self->indent;
 				$self->pidl("char *idx_$l->{LEVEL_INDEX}=NULL;");
@@ -781,11 +783,11 @@ sub ParseElementPrint($$$$)
 				$var_name = get_array_element($var_name, $counter);
 			}
 		} elsif ($l->{TYPE} eq "DATA") {
-			$self->ParseDataPrint($e, $l, $var_name);
+			$self->ParseDataPrint($e, $l, $ndr, $var_name);
 		} elsif ($l->{TYPE} eq "SWITCH") {
 			my $switch_var = ParseExprExt($l->{SWITCH_IS}, $env, $e->{ORIGINAL}, 
 						check_null_pointer($e, $env, sub { $self->pidl(shift); }, "return;"), check_fully_dereferenced($e, $env));
-			$self->pidl("ndr_print_set_switch_value(ndr, " . get_pointer_to($var_name) . ", $switch_var);");
+			$self->pidl("ndr_print_set_switch_value($ndr, " . get_pointer_to($var_name) . ", $switch_var);");
 		} 
 	}
 
@@ -795,7 +797,7 @@ sub ParseElementPrint($$$$)
 				$self->deindent;
 				$self->pidl("}");
 			}
-			$self->pidl("ndr->depth--;");
+			$self->pidl("$ndr->depth--;");
 		} elsif (($l->{TYPE} eq "ARRAY")
 			and not is_charset_array($e,$l)
 			and not has_fast_array($e,$l)) {
@@ -804,7 +806,7 @@ sub ParseElementPrint($$$$)
 			$self->pidl("}");
 			$self->deindent;
 			$self->pidl("}");
-			$self->pidl("ndr->depth--;");
+			$self->pidl("$ndr->depth--;");
 		}
 	}
 }
@@ -816,7 +818,7 @@ sub ParseSwitchPull($$$$$$)
 	my($self,$e,$l,$ndr,$var_name,$env) = @_;
 	my $switch_var = ParseExprExt($l->{SWITCH_IS}, $env, $e->{ORIGINAL}, 
 		check_null_pointer($e, $env, sub { $self->pidl(shift); },
-				   "return ndr_pull_error(ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for switch_is()\");"),
+				   "return ndr_pull_error($ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for switch_is()\");"),
 		check_fully_dereferenced($e, $env));
 
 	$var_name = get_pointer_to($var_name);
@@ -830,7 +832,7 @@ sub ParseSwitchPush($$$$$$)
 	my($self,$e,$l,$ndr,$var_name,$env) = @_;
 	my $switch_var = ParseExprExt($l->{SWITCH_IS}, $env, $e->{ORIGINAL}, 
 		check_null_pointer($e, $env, sub { $self->pidl(shift); },
-				   "return ndr_push_error(ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for switch_is()\");"),
+				   "return ndr_push_error($ndr, NDR_ERR_INVALID_POINTER, \"NULL Pointer for switch_is()\");"),
 		check_fully_dereferenced($e, $env));
 
 	$var_name = get_pointer_to($var_name);
@@ -861,7 +863,7 @@ sub ParseDataPull($$$$$$$)
 			$self->pidl("}");
 		}
 	} else {
-		$self->ParseTypePull($l->{DATA_TYPE}, $var_name, $primitives, $deferred);
+		$self->ParseTypePull($l->{DATA_TYPE}, $ndr, $var_name, $primitives, $deferred);
 	}
 }
 
@@ -880,7 +882,7 @@ sub ParseDataPush($$$$$$$)
 
 		$self->pidl("NDR_CHECK(".TypeFunctionName("ndr_push", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
 	} else {
-		$self->ParseTypePush($l->{DATA_TYPE}, $var_name, $primitives, $deferred);
+		$self->ParseTypePush($l->{DATA_TYPE}, $ndr, $var_name, $primitives, $deferred);
 	}
 }
 
@@ -936,9 +938,9 @@ sub ParseMemCtxPullFlags($$$$)
 	return $mem_flags;
 }
 
-sub ParseMemCtxPullStart($$$$)
+sub ParseMemCtxPullStart($$$$$)
 {
-	my ($self, $e, $l, $ptr_name) = @_;
+	my ($self, $e, $l, $ndr, $ptr_name) = @_;
 
 	my $mem_r_ctx = "_mem_save_$e->{NAME}_$l->{LEVEL_INDEX}";
 	my $mem_c_ctx = $ptr_name;
@@ -946,20 +948,20 @@ sub ParseMemCtxPullStart($$$$)
 
 	return unless defined($mem_c_flags);
 
-	$self->pidl("$mem_r_ctx = NDR_PULL_GET_MEM_CTX(ndr);");
-	$self->pidl("NDR_PULL_SET_MEM_CTX(ndr, $mem_c_ctx, $mem_c_flags);");
+	$self->pidl("$mem_r_ctx = NDR_PULL_GET_MEM_CTX($ndr);");
+	$self->pidl("NDR_PULL_SET_MEM_CTX($ndr, $mem_c_ctx, $mem_c_flags);");
 }
 
-sub ParseMemCtxPullEnd($$$)
+sub ParseMemCtxPullEnd($$$$)
 {
-	my ($self, $e, $l) = @_;
+	my ($self, $e, $l, $ndr) = @_;
 
 	my $mem_r_ctx = "_mem_save_$e->{NAME}_$l->{LEVEL_INDEX}";
 	my $mem_r_flags = $self->ParseMemCtxPullFlags($e, $l);
 
 	return unless defined($mem_r_flags);
 
-	$self->pidl("NDR_PULL_SET_MEM_CTX(ndr, $mem_r_ctx, $mem_r_flags);");
+	$self->pidl("NDR_PULL_SET_MEM_CTX($ndr, $mem_r_ctx, $mem_r_flags);");
 }
 
 sub CheckStringTerminator($$$$$)
@@ -1011,6 +1013,8 @@ sub ParseElementPullLevel
 			$self->ParseSwitchPull($e, $l, $ndr, $var_name, $env);
 		} elsif ($l->{TYPE} eq "DATA") {
 			$self->ParseDataPull($e, $l, $ndr, $var_name, $primitives, $deferred);
+		} elsif ($l->{TYPE} eq "TYPEDEF") {
+			$typefamily{$e->{DATA}->{TYPE}}->{PULL_FN_BODY}->($self, $e->{DATA}, $ndr, $var_name);
 		}
 	}
 
@@ -1022,21 +1026,21 @@ sub ParseElementPullLevel
 
 			if ($l->{POINTER_TYPE} eq "relative") {
 				$self->pidl("uint32_t _relative_save_offset;");
-				$self->pidl("_relative_save_offset = ndr->offset;");
-				$self->pidl("NDR_CHECK(ndr_pull_relative_ptr2(ndr, $var_name));");
+				$self->pidl("_relative_save_offset = $ndr->offset;");
+				$self->pidl("NDR_CHECK(ndr_pull_relative_ptr2($ndr, $var_name));");


-- 
Samba Shared Repository


More information about the samba-cvs mailing list