Changeset 587 for vendor/current/pidl
- Timestamp:
- Jun 29, 2011, 7:36:41 AM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/pidl/lib/Parse/Pidl/Samba3/ClientNDR.pm
r414 r587 16 16 use Parse::Pidl::Util qw(has_property ParseExpr); 17 17 use Parse::Pidl::Samba4 qw(DeclLong); 18 use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv );18 use Parse::Pidl::Samba4::Header qw(GenerateFunctionInEnv GenerateFunctionOutEnv); 19 19 20 20 use vars qw($VERSION); … … 72 72 } 73 73 74 sub ParseOutputArgument($$$;$$) 75 { 76 my ($self, $fn, $e, $r, $o) = @_; 74 sub ParseInvalidResponse($$) 75 { 76 my ($self, $type) = @_; 77 78 if ($type eq "sync") { 79 $self->pidl("return NT_STATUS_INVALID_NETWORK_RESPONSE;"); 80 } elsif ($type eq "async") { 81 $self->pidl("tevent_req_nterror(req, NT_STATUS_INVALID_NETWORK_RESPONSE);"); 82 $self->pidl("return;"); 83 } else { 84 die("ParseInvalidResponse($type)"); 85 } 86 } 87 88 sub ParseOutputArgument($$$;$$$) 89 { 90 my ($self, $fn, $e, $r, $o, $invalid_response_type) = @_; 77 91 my $level = 0; 78 92 $r = "r." unless defined($r); 79 93 $o = "" unless defined($o); 94 $invalid_response_type = "sync" unless defined($invalid_response_type); 80 95 81 96 if ($e->{LEVELS}[0]->{TYPE} ne "POINTER" and $e->{LEVELS}[0]->{TYPE} ne "ARRAY") { … … 98 113 # structure, the user should be able to know the size beforehand 99 114 # to allocate a structure of the right size. 100 my $env = GenerateFunctionInEnv($fn, $r); 115 my $in_env = GenerateFunctionInEnv($fn, $r); 116 my $out_env = GenerateFunctionOutEnv($fn, $r); 101 117 my $l = $e->{LEVELS}[$level]; 102 118 unless (defined($l->{SIZE_IS})) { 119 $self->pidl('#error No size known for [out] array `$e->{NAME}'); 103 120 error($e->{ORIGINAL}, "no size known for [out] array `$e->{NAME}'"); 104 $self->pidl('#error No size known for [out] array `$e->{NAME}');105 121 } else { 106 my $size_is = ParseExpr($l->{SIZE_IS}, $env, $e->{ORIGINAL}); 122 my $in_size_is = ParseExpr($l->{SIZE_IS}, $in_env, $e->{ORIGINAL}); 123 my $out_size_is = ParseExpr($l->{SIZE_IS}, $out_env, $e->{ORIGINAL}); 124 my $out_length_is = $out_size_is; 125 if (defined($l->{LENGTH_IS})) { 126 $out_length_is = ParseExpr($l->{LENGTH_IS}, $out_env, $e->{ORIGINAL}); 127 } 128 if ($out_size_is ne $in_size_is) { 129 $self->pidl("if (($out_size_is) > ($in_size_is)) {"); 130 $self->indent; 131 $self->ParseInvalidResponse($invalid_response_type); 132 $self->deindent; 133 $self->pidl("}"); 134 } 135 if ($out_length_is ne $out_size_is) { 136 $self->pidl("if (($out_length_is) > ($out_size_is)) {"); 137 $self->indent; 138 $self->ParseInvalidResponse($invalid_response_type); 139 $self->deindent; 140 $self->pidl("}"); 141 } 107 142 if (has_property($e, "charset")) { 108 $self->pidl("memcpy(discard_const_p(uint8_t *, $o$e->{NAME}), ${r}out.$e->{NAME}, ($ size_is) * sizeof(*$o$e->{NAME}));");143 $self->pidl("memcpy(discard_const_p(uint8_t *, $o$e->{NAME}), ${r}out.$e->{NAME}, ($out_length_is) * sizeof(*$o$e->{NAME}));"); 109 144 } else { 110 $self->pidl("memcpy($o$e->{NAME}, ${r}out.$e->{NAME}, ($ size_is) * sizeof(*$o$e->{NAME}));");145 $self->pidl("memcpy($o$e->{NAME}, ${r}out.$e->{NAME}, ($out_length_is) * sizeof(*$o$e->{NAME}));"); 111 146 } 112 147 } … … 282 317 next unless (grep(/out/, @{$e->{DIRECTION}})); 283 318 284 $self->ParseOutputArgument($fn, $e, "state->tmp.", "state->orig.out."); 319 $self->ParseOutputArgument($fn, $e, 320 "state->tmp.", 321 "state->orig.out.", 322 "async"); 285 323 } 286 324 $self->pidl("");
Note:
See TracChangeset
for help on using the changeset viewer.