{
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);");
}
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") {