public static function serialize($var, $simple = false) { $stream = new BytesIO(); $writer = new Writer($stream, $simple); $writer->serialize($var); return $stream->toString(); }
public static function unserialize($data, $simple = false) { $stream = new BytesIO($data); $reader = new Reader($stream, $simple); $result = $reader->unserialize(); $stream->close(); return $result; }
private function write_ref(BytesIO $stream, $index) { $stream->write(Tags::TagRef . $index . Tags::TagSemicolon); return true; }
private function readComplexRaw(BytesIO $ostream) { $s = $this->stream->readuntil(Tags::TagOpenbrace) . Tags::TagOpenbrace; $ostream->write($s); while (($tag = $this->stream->getc()) != Tags::TagClosebrace) { $this->privateReadRaw($ostream, $tag); } $ostream->write($tag); }
function decode($response, array &$args, stdClass $context) { if ($context->oneway) { return null; } if (empty($response)) { throw new Exception("EOF"); } if ($response[strlen($response) - 1] !== Tags::TagEnd) { throw new Exception("Wrong Response: \r\n{$response}"); } $mode = $context->mode; if ($mode === ResultMode::RawWithEndTag) { return $response; } elseif ($mode === ResultMode::Raw) { return substr($response, 0, -1); } $stream = new BytesIO($response); $reader = new Reader($stream); $result = null; $tag = $stream->getc(); if ($tag === Tags::TagResult) { if ($mode === ResultMode::Normal) { $result = $reader->unserialize(); } elseif ($mode === ResultMode::Serialized) { $result = $reader->readRaw()->toString(); } $tag = $stream->getc(); if ($tag === Tags::TagArgument) { $reader->reset(); $arguments = $reader->readList(); $n = min(count($arguments), count($args)); for ($i = 0; $i < $n; $i++) { $args[$i] = $arguments[$i]; } $tag = $stream->getc(); } } elseif ($tag === Tags::TagError) { $e = new Exception($reader->readString()); $stream->close(); throw $e; } if ($tag !== Tags::TagEnd) { $stream->close(); throw new Exception("Wrong Response: \r\n{$response}"); } $stream->close(); return $result; }
private function doInput($response, &$args, $mode, $context) { $count = count($this->filters); for ($i = $count - 1; $i >= 0; $i--) { $response = $this->filters[$i]->inputFilter($response, $context); } if ($mode == ResultMode::RawWithEndTag) { return $response; } if ($mode == ResultMode::Raw) { return substr($response, 0, -1); } $stream = new BytesIO($response); $reader = new Reader($stream); $result = null; while (($tag = $stream->getc()) !== Tags::TagEnd) { switch ($tag) { case Tags::TagResult: if ($mode == ResultMode::Serialized) { $result = $reader->readRaw()->toString(); } else { $reader->reset(); $result = $reader->unserialize(); } break; case Tags::TagArgument: $reader->reset(); $_args = $reader->readList(); $n = min(count($_args), count($args)); for ($i = 0; $i < $n; $i++) { $args[$i] = $_args[$i]; } break; case Tags::TagError: $reader->reset(); throw new \Exception($reader->readString()); break; default: throw new \Exception("Wrong Response: \r\n" . $response); break; } } return $result; }
public function defaultHandle($request, $context) { $input = new BytesIO($this->inputFilter($request, $context)); try { switch ($input->getc()) { case Tags::TagCall: return $this->doInvoke($input, $context); case Tags::TagEnd: return $this->doFunctionList($context); default: throw new \Exception("Wrong Request: \r\n" . $request); } } catch (\Exception $e) { $error = $e->getMessage(); if ($this->debug) { $error .= "\nfile: " . $e->getFile() . "\nline: " . $e->getLine() . "\ntrace: " . $e->getTraceAsString(); } return $this->sendError($error, $context); } }
function afterFilterHandler($request, stdClass $context) { $stream = new BytesIO($request); try { switch ($stream->getc()) { case Tags::TagCall: $data = $this->doInvoke($stream, $context); $stream->close(); return $data; case Tags::TagEnd: $stream->close(); return value($this->doFunctionList()); default: throw new Exception("Wrong Request: \r\n{$request}"); } } catch (Exception $e) { $stream->close(); return error($e); } }