$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},
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;
}
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;
}
$self->pidl("$ndr->depth--;");
}
}
+
+ $self->end_flags($e, $ndr);
}
#####################################################################
{
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";
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);");
}
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);
}
} 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);
}
} 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") {
# 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;
}
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});");
}
}
}
$self->deindent;
$self->pidl("},");
}
- $self->pidl("{ NULL, NULL, 0, NULL, NULL, NULL }");
+ $self->pidl("{ .name = NULL }");
$self->deindent;
$self->pidl("};");
$self->pidl("");
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("");