TODO: pidl fix frstrans_Update...
[metze/samba/wip.git] / pidl / lib / Parse / Pidl / Samba4 / NDR / Parser.pm
index a32e9eb4a0dfb0f352d0dff5a69eda253a95fcd0..91c62930ccce8d202fce40b36d3d0e1c0d2f99d1 100644 (file)
@@ -449,7 +449,7 @@ sub ParseArrayPullHeader($$$$$$)
                $self->defer("}");
        }
 
-       if ($l->{IS_VARYING} and (defined($l->{LENGTH_IS}) or not $l->{IS_ZERO_TERMINATED})) {
+       if ($l->{IS_CONFORMANT} and $l->{IS_VARYING} and (defined($l->{LENGTH_IS}) or not $l->{IS_ZERO_TERMINATED})) {
                $self->defer("if ($var_name) {");
                $self->defer_indent;
                my $length = ParseExprExt($l->{LENGTH_IS}, $env, $e->{ORIGINAL}, 
@@ -525,11 +525,12 @@ sub ParseCompressionPullStart($$$$$)
        my $comndr = "$ndr\_compressed";
        my $alg = compression_alg($e, $l);
        my $dlen = compression_dlen($e, $l, $env);
+       my $clen = compression_clen($e, $l, $env);
 
        $self->pidl("{");
        $self->indent;
        $self->pidl("struct ndr_pull *$comndr;");
-       $self->pidl("NDR_CHECK(ndr_pull_compression_start($ndr, &$comndr, $alg, $dlen));");
+       $self->pidl("NDR_CHECK(ndr_pull_compression_start($ndr, &$comndr, $alg, $dlen, $clen));");
 
        return $comndr;
 }
@@ -848,8 +849,10 @@ sub ParseElementPrint($$$$$)
        my $cur_depth = 0;
        my $ignore_depth = 0xFFFF;
 
+       $self->start_flags($e, $ndr);
        if ($e->{REPRESENTATION_TYPE} ne $e->{TYPE}) {
                $self->pidl("ndr_print_$e->{REPRESENTATION_TYPE}($ndr, \"$e->{NAME}\", $var_name);");
+               $self->end_flags($e, $ndr);
                return;
        }
 
@@ -944,6 +947,8 @@ sub ParseElementPrint($$$$$)
                        $self->pidl("$ndr->depth--;");
                }
        }
+
+       $self->end_flags($e, $ndr);
 }
 
 #####################################################################
@@ -1061,12 +1066,26 @@ sub ParseMemCtxPullFlags($$$$)
 {
        my ($self, $e, $l) = @_;
 
+       my $alloc_array = 0;
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $alloc_array = 1;
+       }
+
        return undef unless ($l->{TYPE} eq "POINTER" or $l->{TYPE} eq "ARRAY");
        return undef if (($l->{TYPE} eq "POINTER") and ($l->{POINTER_TYPE} eq "ignore"));
 
        return undef unless ($l->{TYPE} ne "ARRAY" or ArrayDynamicallyAllocated($e,$l));
        return undef if has_fast_array($e, $l);
-       return undef if is_charset_array($e, $l);
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $self->pidl("/* METZE: $e->{NAME} ParseMemCtxPullFlags */");
+       }
+       return undef if is_charset_array($e, $l) and not $alloc_array;
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $self->pidl("/* METZE: $e->{NAME} ParseMemCtxPullFlags */");
+       }
 
        my $mem_flags = "0";
 
@@ -1092,8 +1111,16 @@ sub ParseMemCtxPullStart($$$$$)
        my $mem_c_ctx = $ptr_name;
        my $mem_c_flags = $self->ParseMemCtxPullFlags($e, $l);
 
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $self->pidl("/* METZE: $e->{NAME} ParseMemCtxPullStart ".defined($mem_c_flags)."*/");
+       }
        return unless defined($mem_c_flags);
 
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $self->pidl("/* METZE: $e->{NAME} ParseMemCtxPullStart ".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);");
 }
@@ -1128,9 +1155,33 @@ sub ParseElementPullLevel
 
        if (has_property($e, "skip") or has_property($e, "skip_noinit")) {
                $self->pidl("/* [skip] '$var_name' */");
+               if (not has_property($e, "skip_noinit")) {
+                       $self->pidl("NDR_ZERO_STRUCT($var_name);");
+               }
                return;
        }
 
+#'LEVELS' => [
+#              {
+#                'LEVEL_INDEX' => 0,
+#                'IS_VARYING' => 1,
+#                'IS_CONFORMANT' => 0,
+#                'SIZE_IS' => '261',
+#                'TYPE' => 'ARRAY',
+#                'IS_TO_NULL' => 0,
+#                'IS_FIXED' => 0,
+#                'IS_ZERO_TERMINATED' => 1,
+#                'IS_DEFERRED' => 0,
+#                'LENGTH_IS' => '261',
+#                'IS_INLINE' => 0,
+#                'IS_SURROUNDING' => 0
+#              },
+
+       if ($l->{TYPE} eq "ARRAY" and $l->{IS_VARYING} and not $l->{IS_CONFORMANT}
+           and defined($l->{SIZE_IS}) and defined($l->{LENGTH_IS})) {
+               $self->pidl("/* METZE: $e->{NAME} ParseElementPullLevel*/");
+       }
+
        if ($l->{TYPE} eq "ARRAY" and ($l->{IS_VARYING} or $l->{IS_CONFORMANT})) {
                $var_name = get_pointer_to($var_name);
        }
@@ -1144,10 +1195,12 @@ sub ParseElementPullLevel
                } elsif ($l->{TYPE} eq "ARRAY") {
                        my $length = $self->ParseArrayPullHeader($e, $l, $ndr, $var_name, $env);
                        $array_length = $length;
+                       my $array_name = $var_name;
 
                        my $nl = GetNextLevel($e, $l);
 
                        if (is_charset_array($e,$l)) {
+                               $self->ParseMemCtxPullStart($e, $l, $ndr, $array_name);
                                if ($l->{IS_ZERO_TERMINATED}) {
                                        $self->CheckStringTerminator($ndr, $e, $l, $length);
                                }
@@ -1156,12 +1209,16 @@ sub ParseElementPullLevel
                                } else {
                                        $self->pidl("NDR_CHECK(ndr_pull_charset($ndr, $ndr_flags, ".get_pointer_to($var_name).", $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));");
                                }
+                               $self->ParseMemCtxPullEnd($e, $l, $ndr);
                                return;
                        } elsif (has_fast_array($e, $l)) {
+                               $self->ParseMemCtxPullStart($e, $l, $ndr, $array_name);
+
                                if ($l->{IS_ZERO_TERMINATED}) {
                                        $self->CheckStringTerminator($ndr,$e,$l,$length);
                                }
                                $self->pidl("NDR_CHECK(ndr_pull_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));");
+                               $self->ParseMemCtxPullEnd($e, $l, $ndr);
                                return;
                        }
                } elsif ($l->{TYPE} eq "POINTER") {
@@ -2543,7 +2600,7 @@ sub ParseFunctionPull($$)
        # out to be too tricky (tridge)
        foreach my $e (@{$fn->{ELEMENTS}}) {
                next unless grep(/out/, @{$e->{DIRECTION}});
-               $self->pidl("ZERO_STRUCT(r->out);");
+               $self->pidl("NDR_ZERO_STRUCT(r->out);");
                $self->pidl("");
                last;
        }
@@ -2592,7 +2649,7 @@ sub ParseFunctionPull($$)
                        if (grep(/in/, @{$e->{DIRECTION}})) {
                                $self->pidl("*r->out.$e->{NAME} = *r->in.$e->{NAME};");
                        } else {
-                               $self->pidl("ZERO_STRUCTP(r->out.$e->{NAME});");
+                               $self->pidl("NDR_ZERO_STRUCTP(r->out.$e->{NAME});");
                        }
                }
        }
@@ -2668,7 +2725,7 @@ sub ParseGeneratePipeArray($$$)
                $self->deindent;
                $self->pidl("},");
        }
-       $self->pidl("{ NULL, NULL, 0, NULL, NULL, NULL }");
+       $self->pidl("{ .name = NULL }");
        $self->deindent;
        $self->pidl("};");
        $self->pidl("");
@@ -2764,7 +2821,7 @@ sub FunctionTable($$)
        foreach my $d (@{$interface->{INHERITED_FUNCTIONS}},@{$interface->{FUNCTIONS}}) {
                $count += $self->FunctionCallEntry($d);
        }
-       $self->pidl("\t{ NULL, 0, NULL, NULL, NULL }");
+       $self->pidl("\t{ .name = NULL }");
        $self->pidl("};");
        $self->pidl("");