pidl:Samba4/NDR/Parser: set LIBNDR_FLAG_WITHIN_PIPE
[metze/samba/wip.git] / pidl / lib / Parse / Pidl / Samba4 / NDR / Parser.pm
index 94f4855dd6e4af288d995ecd95ddaa9e3f27ec30..1788c4ea1b4116a09aaccbaef81d0e96785d39db 100644 (file)
@@ -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;
 }
@@ -636,7 +637,11 @@ sub ParseElementPushLevel
 
                        # Allow speedups for arrays of scalar types
                        if (is_charset_array($e,$l)) {
-                               $self->pidl("NDR_CHECK(ndr_push_charset($ndr, $ndr_flags, $var_name, $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));");
+                               if ($l->{IS_TO_NULL}) {
+                                       $self->pidl("NDR_CHECK(ndr_push_charset_to_null($ndr, $ndr_flags, $var_name, $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));");
+                               } else {
+                                       $self->pidl("NDR_CHECK(ndr_push_charset($ndr, $ndr_flags, $var_name, $length, sizeof(" . mapTypeName($nl->{DATA_TYPE}) . "), CH_$e->{PROPERTIES}->{charset}));");
+                               }
                                return;
                        } elsif (has_fast_array($e,$l)) {
                                $self->pidl("NDR_CHECK(ndr_push_array_$nl->{DATA_TYPE}($ndr, $ndr_flags, $var_name, $length));");
@@ -717,6 +722,11 @@ sub ParseElementPush($$$$$$)
 
        my $var_name = $env->{$e->{NAME}};
 
+       if (has_property($e, "skip") or has_property($e, "skip_noinit")) {
+               $self->pidl("/* [skip] '$var_name' */");
+               return;
+       }
+
        return if ContainsPipe($e, $e->{LEVELS}[0]);
 
        return unless $primitives or ($deferred and ContainsDeferred($e, $e->{LEVELS}[0]));
@@ -839,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;
        }
 
@@ -935,6 +947,8 @@ sub ParseElementPrint($$$$$)
                        $self->pidl("$ndr->depth--;");
                }
        }
+
+       $self->end_flags($e, $ndr);
 }
 
 #####################################################################
@@ -979,11 +993,7 @@ sub ParseDataPull($$$$$$$)
 
                $var_name = get_pointer_to($var_name);
 
-               if (has_property($e, "skip")) {
-                       $self->pidl("/* [skip] '$var_name' */");
-               } else {
-                       $self->pidl("NDR_CHECK(".TypeFunctionName("ndr_pull", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
-               }
+               $self->pidl("NDR_CHECK(".TypeFunctionName("ndr_pull", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
 
                my $pl = GetPrevLevel($e, $l);
 
@@ -1021,11 +1031,7 @@ sub ParseDataPush($$$$$$$)
                        $var_name = get_pointer_to($var_name);
                }
 
-               if (has_property($e, "skip")) {
-                       $self->pidl("/* [skip] '$var_name' */");
-               } else {
-                       $self->pidl("NDR_CHECK(".TypeFunctionName("ndr_push", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
-               }
+               $self->pidl("NDR_CHECK(".TypeFunctionName("ndr_push", $l->{DATA_TYPE})."($ndr, $ndr_flags, $var_name));");
        } else {
                $self->ParseTypePush($l->{DATA_TYPE}, $ndr, $var_name, $primitives, $deferred);
        }
@@ -1125,6 +1131,14 @@ sub ParseElementPullLevel
        my $ndr_flags = CalcNdrFlags($l, $primitives, $deferred);
        my $array_length = undef;
 
+       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;
+       }
+
        if ($l->{TYPE} eq "ARRAY" and ($l->{IS_VARYING} or $l->{IS_CONFORMANT})) {
                $var_name = get_pointer_to($var_name);
        }
@@ -1648,6 +1662,11 @@ sub ParseStructPrint($$$$$)
 sub DeclarePtrVariables($$)
 {
        my ($self,$e) = @_;
+
+       if (has_property($e, "skip") or has_property($e, "skip_noinit")) {
+               return;
+       }
+
        foreach my $l (@{$e->{LEVELS}}) {
                my $size = 32;
                if ($l->{TYPE} eq "POINTER" and 
@@ -1665,6 +1684,10 @@ sub DeclareArrayVariables($$;$)
 {
        my ($self,$e,$pull) = @_;
 
+       if (has_property($e, "skip") or has_property($e, "skip_noinit")) {
+               return;
+       }
+
        foreach my $l (@{$e->{LEVELS}}) {
                next if ($l->{TYPE} ne "ARRAY");
                if (defined($pull)) {
@@ -1683,6 +1706,10 @@ sub DeclareArrayVariablesNoZero($$$)
 {
        my ($self,$e,$env) = @_;
 
+       if (has_property($e, "skip") or has_property($e, "skip_noinit")) {
+               return;
+       }
+
        foreach my $l (@{$e->{LEVELS}}) {
                next if ($l->{TYPE} ne "ARRAY");
                next if has_fast_array($e,$l);
@@ -1699,6 +1726,11 @@ sub DeclareArrayVariablesNoZero($$$)
 sub DeclareMemCtxVariables($$)
 {
        my ($self,$e) = @_;
+
+       if (has_property($e, "skip") or has_property($e, "skip_noinit")) {
+               return;
+       }
+
        foreach my $l (@{$e->{LEVELS}}) {
                my $mem_flags = $self->ParseMemCtxPullFlags($e, $l);
 
@@ -2247,6 +2279,8 @@ sub ParsePipePushChunk($$)
 
        $self->pidl("{");
        $self->indent;
+       $self->pidl("uint64_t _flags_save = $ndr->flags;");
+       $self->pidl("ndr_set_flags(&$ndr->flags, LIBNDR_FLAG_WITHIN_PIPE);");
 
        $self->ParseStructPush($struct, $ndr, $varname);
        $self->pidl("");
@@ -2254,6 +2288,7 @@ sub ParsePipePushChunk($$)
        $self->pidl("NDR_CHECK(ndr_push_pipe_chunk_trailer(ndr, ndr_flags, $varname->count));");
        $self->pidl("");
 
+       $self->pidl("$ndr->flags = _flags_save;");
        $self->pidl("return NDR_ERR_SUCCESS;");
        $self->deindent;
        $self->pidl("}");
@@ -2280,6 +2315,8 @@ sub ParsePipePullChunk($$)
 
        $self->pidl("{");
        $self->indent;
+       $self->pidl("uint64_t _flags_save = $ndr->flags;");
+       $self->pidl("ndr_set_flags(&$ndr->flags, LIBNDR_FLAG_WITHIN_PIPE);");
 
        $self->ParseStructPull($struct, $ndr, $varname);
        $self->pidl("");
@@ -2287,6 +2324,7 @@ sub ParsePipePullChunk($$)
        $self->pidl("NDR_CHECK(ndr_check_pipe_chunk_trailer($ndr, ndr_flags, $varname->count));");
        $self->pidl("");
 
+       $self->pidl("$ndr->flags = _flags_save;");
        $self->pidl("return NDR_ERR_SUCCESS;");
        $self->deindent;
        $self->pidl("}");
@@ -2314,7 +2352,10 @@ sub ParsePipePrintChunk($$)
        $self->pidl("_PUBLIC_ void ndr_print_$name(struct ndr_print *$ndr, const char *name, $args)");
        $self->pidl("{");
        $self->indent;
+       $self->pidl("uint64_t _flags_save = $ndr->flags;");
+       $self->pidl("ndr_set_flags(&$ndr->flags, LIBNDR_FLAG_WITHIN_PIPE);");
        $self->ParseTypePrint($struct, $ndr, $varname);
+       $self->pidl("$ndr->flags = _flags_save;");
        $self->deindent;
        $self->pidl("}");
        $self->pidl("");
@@ -2519,7 +2560,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;
        }
@@ -2568,7 +2609,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});");
                        }
                }
        }
@@ -2644,7 +2685,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("");
@@ -2740,7 +2781,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("");