private function encode($name, array $args, stdClass $context) { $stream = new BytesIO(Tags::TagCall); $writer = new Writer($stream, $context->simple); $writer->writeString($name); if (count($args) > 0 || $context->byref) { $writer->reset(); $writer->writeArray($args); if ($context->byref) { $writer->writeBoolean(true); } } $stream->write(Tags::TagEnd); $request = $stream->toString(); $stream->close(); return $request; }
private function doOutput($name, &$args, $byref, $simple, $context) { if ($simple === null) { $simple = $this->simple; } $stream = new BytesIO(Tags::TagCall); $writer = new Writer($stream, $simple); $writer->writeString($name); if (count($args) > 0 || $byref) { $writer->reset(); $writer->writeArray($args); if ($byref) { $writer->writeBoolean(true); } } $stream->write(Tags::TagEnd); $request = $stream->toString(); $count = count($this->filters); for ($i = 0; $i < $count; $i++) { $request = $this->filters[$i]->outputFilter($request, $context); } $stream->close(); return $request; }
public function afterInvoke($name, $args, $byref, $mode, $simple, $context, $result, $output, $async) { if ($this->onAfterInvoke !== null) { $afterInvoke = $this->onAfterInvoke; call_user_func_array($afterInvoke, array($name, &$args, $byref, &$result, $context)); } if ($mode == ResultMode::RawWithEndTag) { return $this->outputFilter($result, $context); } elseif ($mode == ResultMode::Raw) { $output->write($result); } else { $writer = new Writer($output, $simple); $output->write(Tags::TagResult); if ($mode == ResultMode::Serialized) { $output->write($result); } else { $writer->reset(); $writer->serialize($result); } if ($byref) { $output->write(Tags::TagArgument); $writer->reset(); $writer->writeArray($args); } } if ($async) { $output->write(Tags::TagEnd); return $this->outputFilter($output->toString(), $context); } return null; }
protected function doInvoke($input, $context) { $output = new BytesIO(); $reader = new Reader($input); do { $reader->reset(); $name = $reader->readString(); $alias = strtolower($name); if (isset($this->calls[$alias])) { $call = $this->calls[$alias]; } elseif (isset($this->calls['*'])) { $call = $this->calls['*']; } else { throw new \Exception("Can't find this function " . $name . "()."); } $mode = $call->mode; $simple = $call->simple; if ($simple === null) { $simple = $this->simple; } $args = array(); $byref = false; $tag = $input->getc(); if ($tag == Tags::TagList) { $reader->reset(); $args = $reader->readListWithoutTag(); $tag = $input->getc(); if ($tag == Tags::TagTrue) { $byref = true; $tag = $input->getc(); } if ($call->byref) { $_args = array(); foreach ($args as $i => &$arg) { if ($call->params[$i]->isPassedByReference()) { $_args[] =& $arg; } else { $_args[] = $arg; } } $args = $_args; } } if ($tag != Tags::TagEnd && $tag != Tags::TagCall) { throw new \Exception('Unknown tag: ' . $tag . "\r\n" . 'with following data: ' . $input->toString()); } if ($this->onBeforeInvoke !== null) { $beforeInvoke = $this->onBeforeInvoke; $beforeInvoke($name, $args, $byref, $context); } if (array_key_exists('*', $this->calls) && $call === $this->calls['*']) { $args = array($name, $args); } $result = call_user_func_array($call->func, $args); if ($this->onAfterInvoke !== null) { $afterInvoke = $this->onAfterInvoke; $afterInvoke($name, $args, $byref, $result, $context); } if ($mode == ResultMode::RawWithEndTag) { return $this->outputFilter($result, $context); } elseif ($mode == ResultMode::Raw) { $output->write($result); } else { $writer = new Writer($output, $simple); $output->write(Tags::TagResult); if ($mode == ResultMode::Serialized) { $output->write($result); } else { $writer->reset(); $writer->serialize($result); } if ($byref) { $output->write(Tags::TagArgument); $writer->reset(); $writer->writeArray($args); } } } while ($tag == Tags::TagCall); $output->write(Tags::TagEnd); return $this->outputFilter($output->toString(), $context); }
function doOutput(array $args, stdClass $context, $result) { $mode = $context->mode; $simple = $context->simple; if ($simple === null) { $simple = $this->simple; } if ($mode === ResultMode::RawWithEndTag || $mode == ResultMode::Raw) { return $result; } $stream = new BytesIO(); $writer = new Writer($stream, $simple); $stream->write(Tags::TagResult); if ($mode === ResultMode::Serialized) { $stream->write($result); } else { $writer->reset(); $writer->serialize($result); } if ($context->byref) { $stream->write(Tags::TagArgument); $writer->reset(); $writer->writeArray($args); } $data = $stream->toString(); $stream->close(); return $data; }