Add iconv_convenience argument to size functions.
[metze/samba/wip.git] / pidl / lib / Parse / Pidl / Samba4 / NDR / Parser.pm
index fb73075f1ad218f07880989860eeb86c85627f83..0a4e44ef0ec256301403c4b768a9c32b76e638e0 100644 (file)
@@ -16,7 +16,7 @@ use Parse::Pidl::Typelist qw(hasType getType mapTypeName typeHasBody);
 use Parse::Pidl::Util qw(has_property ParseExpr ParseExprExt print_uuid unmake_str);
 use Parse::Pidl::CUtil qw(get_pointer_to get_value_of get_array_element);
 use Parse::Pidl::NDR qw(GetPrevLevel GetNextLevel ContainsDeferred is_charset_array);
-use Parse::Pidl::Samba4 qw(is_intree choose_header);
+use Parse::Pidl::Samba4 qw(is_intree choose_header ArrayDynamicallyAllocated);
 use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv GenerateFunctionOutEnv EnvSubstituteValue GenerateStructEnv);
 use Parse::Pidl qw(warning);
 
@@ -376,7 +376,7 @@ sub ParseArrayPullHeader($$$$$$)
                $self->defer("}");
        }
 
-       if (not $l->{IS_FIXED} and not is_charset_array($e, $l)) {
+       if (ArrayDynamicallyAllocated($e,$l) and not is_charset_array($e,$l)) {
                $self->AllocateArrayLevel($e,$l,$ndr,$var_name,$size);
        }
 
@@ -917,7 +917,7 @@ sub ParseMemCtxPullFlags($$$$)
 
        return undef unless ($l->{TYPE} eq "POINTER" or $l->{TYPE} eq "ARRAY");
 
-       return undef if ($l->{TYPE} eq "ARRAY" and $l->{IS_FIXED});
+       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);
 
@@ -1558,7 +1558,7 @@ sub ParseStructNdrSize($$$$)
        if (my $flags = has_property($t, "flag")) {
                $self->pidl("flags |= $flags;");
        }
-       $self->pidl("return ndr_size_struct($varname, flags, (ndr_push_flags_fn_t)ndr_push_$name);");
+       $self->pidl("return ndr_size_struct($varname, flags, (ndr_push_flags_fn_t)ndr_push_$name, ic);");
 }
 
 sub DeclStruct($$$$)
@@ -1570,7 +1570,7 @@ sub DeclStruct($$$$)
 sub ArgsStructNdrSize($$$)
 {
        my ($d, $name, $varname) = @_;
-       return "const struct $name *$varname, int flags";
+       return "const struct $name *$varname, struct smb_iconv_convenience *ic, int flags";
 }
 
 $typefamily{STRUCT} = {
@@ -1593,7 +1593,7 @@ sub ParseUnionNdrSize($$$)
                $self->pidl("flags |= $flags;");
        }
 
-       $self->pidl("return ndr_size_union($varname, flags, level, (ndr_push_flags_fn_t)ndr_push_$name);");
+       $self->pidl("return ndr_size_union($varname, flags, level, (ndr_push_flags_fn_t)ndr_push_$name, ic);");
 }
 
 sub ParseUnionPushPrimitives($$$$)
@@ -1873,7 +1873,7 @@ sub DeclUnion($$$$)
 sub ArgsUnionNdrSize($$)
 {
        my ($d,$name) = @_;
-       return "const union $name *r, uint32_t level, int flags";
+       return "const union $name *r, uint32_t level, struct smb_iconv_convenience *ic, int flags";
 }
 
 $typefamily{UNION} = {
@@ -2165,7 +2165,7 @@ sub ParseFunctionPull($$)
                        if (grep(/in/, @{$e->{DIRECTION}})) {
                                $self->pidl("memcpy(r->out.$e->{NAME}, r->in.$e->{NAME}, ($size) * sizeof(*r->in.$e->{NAME}));");
                        } else {
-                               $self->pidl("memset(r->out.$e->{NAME}, 0, ($size) * sizeof(*r->out.$e->{NAME}));");
+                               $self->pidl("memset(CONST_DISCARD(struct $fn->{NAME} *,r->out.$e->{NAME}), 0, ($size) * sizeof(*r->out.$e->{NAME}));");
                        }
                } else {
                        $self->pidl("NDR_PULL_ALLOC($ndr, r->out.$e->{NAME});");