+ my $in_pipes = 0;
+ foreach my $e (@{$fn->{ELEMENTS}}) {
+ next unless grep(/in/, @{$e->{DIRECTION}});
+ next unless ContainsPipe($e, $e->{LEVELS}[0]);
+ $self->pidl("if (r->in.$e->{NAME} == NULL) {");
+ $self->indent;
+ $self->pidl("tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER_MIX);");
+ $self->pidl("return tevent_req_post(req, ev);");
+ $self->deindent;
+ $self->pidl("}");
+ $self->pidl("state->in_pipes[$in_pipes] = r->in.".$e->{NAME}."->pc;");
+ $in_pipes++;
+ }
+ my $out_pipes = 0;
+ foreach my $e (@{$fn->{ELEMENTS}}) {
+ next unless grep(/out/, @{$e->{DIRECTION}});
+ next unless ContainsPipe($e, $e->{LEVELS}[0]);
+ $self->pidl("if (r->out.$e->{NAME} == NULL) {");
+ $self->indent;
+ $self->pidl("tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER_MIX);");
+ $self->pidl("return tevent_req_post(req, ev);");
+ $self->deindent;
+ $self->pidl("}");
+ $self->pidl("state->out_pipes[$out_pipes] = r->out.".$e->{NAME}."->pc;");
+ $out_pipes++;
+ }
+
+ if ($in_pipes > 0 or $out_pipes > 0) {
+ $self->pidl("state->params.r_mem = $submem;");
+ $self->pidl("state->params.r_ptr = r;");
+ $self->pidl("state->params.in.num_pipes = $in_pipes;");
+ if ($in_pipes > 0) {
+ $self->pidl("state->params.in.pipes = state->in_pipes;");
+ } else {
+ $self->pidl("state->params.in.pipes = NULL;");
+ }
+ $self->pidl("state->params.out.num_pipes = $out_pipes;");
+ if ($out_pipes > 0) {
+ $self->pidl("state->params.out.pipes = state->out_pipes;");
+ } else {
+ $self->pidl("state->params.out.pipes = NULL;");
+ }
+ $self->pidl("");
+
+ $self->pidl("subreq = dcerpc_binding_handle_call_params_send(state, ev, h,");
+ $self->pidl("\t\tNULL, &ndr_table_$if->{NAME},");
+ $self->pidl("\t\tNDR_$uname, &state->params);");
+ } else {
+ $self->pidl("subreq = dcerpc_binding_handle_call_send(state, ev, h,");
+ $self->pidl("\t\tNULL, &ndr_table_$if->{NAME},");
+ $self->pidl("\t\tNDR_$uname, $submem, r);");
+ }