You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
349 lines
10 KiB
PHTML
349 lines
10 KiB
PHTML
5 years ago
|
<?php
|
||
|
/**********************************************************\
|
||
|
| |
|
||
|
| hprose |
|
||
|
| |
|
||
|
| Official WebSite: http://www.hprose.com/ |
|
||
|
| http://www.hprose.net/ |
|
||
|
| http://www.hprose.org/ |
|
||
|
| |
|
||
|
\**********************************************************/
|
||
|
|
||
|
/**********************************************************\
|
||
|
* *
|
||
|
* HproseIOStream.php *
|
||
|
* *
|
||
|
* hprose io stream library for php5. *
|
||
|
* *
|
||
|
* LastModified: Nov 12, 2013 *
|
||
|
* Author: Ma Bingyao <andot@hprfc.com> *
|
||
|
* *
|
||
|
\**********************************************************/
|
||
|
|
||
|
abstract class HproseAbstractStream {
|
||
|
public abstract function close();
|
||
|
public abstract function getc();
|
||
|
public abstract function read($length);
|
||
|
public abstract function readuntil($char);
|
||
|
public abstract function seek($offset, $whence = SEEK_SET);
|
||
|
public abstract function mark();
|
||
|
public abstract function unmark();
|
||
|
public abstract function reset();
|
||
|
public abstract function skip($n);
|
||
|
public abstract function eof();
|
||
|
public abstract function write($string, $length = -1);
|
||
|
}
|
||
|
|
||
|
class HproseStringStream extends HproseAbstractStream {
|
||
|
protected $buffer;
|
||
|
protected $pos;
|
||
|
protected $mark;
|
||
|
protected $length;
|
||
|
public function __construct($string = '') {
|
||
|
$this->buffer = $string;
|
||
|
$this->pos = 0;
|
||
|
$this->mark = -1;
|
||
|
$this->length = strlen($string);
|
||
|
}
|
||
|
public function close() {
|
||
|
$this->buffer = NULL;
|
||
|
$this->pos = 0;
|
||
|
$this->mark = -1;
|
||
|
$this->length = 0;
|
||
|
}
|
||
|
public function length() {
|
||
|
return $this->length;
|
||
|
}
|
||
|
public function getc() {
|
||
|
return $this->buffer{$this->pos++};
|
||
|
}
|
||
|
public function read($length) {
|
||
|
$s = substr($this->buffer, $this->pos, $length);
|
||
|
$this->skip($length);
|
||
|
return $s;
|
||
|
}
|
||
|
public function readuntil($tag) {
|
||
|
$pos = strpos($this->buffer, $tag, $this->pos);
|
||
|
if ($pos !== false) {
|
||
|
$s = substr($this->buffer, $this->pos, $pos - $this->pos);
|
||
|
$this->pos = $pos + strlen($tag);
|
||
|
}
|
||
|
else {
|
||
|
$s = substr($this->buffer, $this->pos);
|
||
|
$this->pos = $this->length;
|
||
|
}
|
||
|
return $s;
|
||
|
}
|
||
|
public function seek($offset, $whence = SEEK_SET) {
|
||
|
switch ($whence) {
|
||
|
case SEEK_SET:
|
||
|
$this->pos = $offset;
|
||
|
break;
|
||
|
case SEEK_CUR:
|
||
|
$this->pos += $offset;
|
||
|
break;
|
||
|
case SEEK_END:
|
||
|
$this->pos = $this->length + $offset;
|
||
|
break;
|
||
|
}
|
||
|
$this->mark = -1;
|
||
|
return 0;
|
||
|
}
|
||
|
public function mark() {
|
||
|
$this->mark = $this->pos;
|
||
|
}
|
||
|
public function unmark() {
|
||
|
$this->mark = -1;
|
||
|
}
|
||
|
public function reset() {
|
||
|
if ($this->mark != -1) {
|
||
|
$this->pos = $this->mark;
|
||
|
}
|
||
|
}
|
||
|
public function skip($n) {
|
||
|
$this->pos += $n;
|
||
|
}
|
||
|
public function eof() {
|
||
|
return ($this->pos >= $this->length);
|
||
|
}
|
||
|
public function write($string, $length = -1) {
|
||
|
if ($length == -1) {
|
||
|
$this->buffer .= $string;
|
||
|
$length = strlen($string);
|
||
|
}
|
||
|
else {
|
||
|
$this->buffer .= substr($string, 0, $length);
|
||
|
}
|
||
|
$this->length += $length;
|
||
|
}
|
||
|
public function toString() {
|
||
|
return $this->buffer;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class HproseFileStream extends HproseAbstractStream {
|
||
|
protected $fp;
|
||
|
protected $buf;
|
||
|
protected $unmark;
|
||
|
protected $pos;
|
||
|
protected $length;
|
||
|
public function __construct($fp) {
|
||
|
$this->fp = $fp;
|
||
|
$this->buf = "";
|
||
|
$this->unmark = true;
|
||
|
$this->pos = -1;
|
||
|
$this->length = 0;
|
||
|
}
|
||
|
public function close() {
|
||
|
return fclose($this->fp);
|
||
|
}
|
||
|
public function getc() {
|
||
|
if ($this->pos == -1) {
|
||
|
return fgetc($this->fp);
|
||
|
}
|
||
|
elseif ($this->pos < $this->length) {
|
||
|
return $this->buf{$this->pos++};
|
||
|
}
|
||
|
elseif ($this->unmark) {
|
||
|
$this->buf = "";
|
||
|
$this->pos = -1;
|
||
|
$this->length = 0;
|
||
|
return fgetc($this->fp);
|
||
|
}
|
||
|
elseif (($c = fgetc($this->fp)) !== false) {
|
||
|
$this->buf .= $c;
|
||
|
$this->pos++;
|
||
|
$this->length++;
|
||
|
}
|
||
|
return $c;
|
||
|
}
|
||
|
public function read($length) {
|
||
|
if ($this->pos == -1) {
|
||
|
return fread($this->fp, $length);
|
||
|
}
|
||
|
elseif ($this->pos < $this->length) {
|
||
|
$len = $this->length - $this->pos;
|
||
|
if ($len < $length) {
|
||
|
$s = fread($this->fp, $length - $len);
|
||
|
$this->buf .= $s;
|
||
|
$this->length += strlen($s);
|
||
|
}
|
||
|
$s = substr($this->buf, $this->pos, $length);
|
||
|
$this->pos += strlen($s);
|
||
|
}
|
||
|
elseif ($this->unmark) {
|
||
|
$this->buf = "";
|
||
|
$this->pos = -1;
|
||
|
$this->length = 0;
|
||
|
return fread($this->fp, $length);
|
||
|
}
|
||
|
elseif (($s = fread($this->fp, $length)) !== "") {
|
||
|
$this->buf .= $s;
|
||
|
$len = strlen($s);
|
||
|
$this->pos += $len;
|
||
|
$this->length += $len;
|
||
|
}
|
||
|
return $s;
|
||
|
}
|
||
|
public function readuntil($char) {
|
||
|
$s = '';
|
||
|
while ((($c = $this->getc()) != $char) && $c !== false) $s .= $c;
|
||
|
return $s;
|
||
|
}
|
||
|
public function seek($offset, $whence = SEEK_SET) {
|
||
|
if (fseek($this->fp, $offset, $whence) == 0) {
|
||
|
$this->buf = "";
|
||
|
$this->unmark = true;
|
||
|
$this->pos = -1;
|
||
|
$this->length = 0;
|
||
|
return 0;
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
public function mark() {
|
||
|
$this->unmark = false;
|
||
|
if ($this->pos == -1) {
|
||
|
$this->buf = "";
|
||
|
$this->pos = 0;
|
||
|
$this->length = 0;
|
||
|
}
|
||
|
elseif ($this->pos > 0) {
|
||
|
$this->buf = substr($this->buf, $this->pos);
|
||
|
$this->length -= $this->pos;
|
||
|
$this->pos = 0;
|
||
|
}
|
||
|
}
|
||
|
public function unmark() {
|
||
|
$this->unmark = true;
|
||
|
}
|
||
|
public function reset() {
|
||
|
$this->pos = 0;
|
||
|
}
|
||
|
public function skip($n) {
|
||
|
$this->read($n);
|
||
|
}
|
||
|
public function eof() {
|
||
|
if (($this->pos != -1) && ($this->pos < $this->length)) return false;
|
||
|
return feof($this->fp);
|
||
|
}
|
||
|
public function write($string, $length = -1) {
|
||
|
if ($length == -1) $length = strlen($string);
|
||
|
return fwrite($this->fp, $string, $length);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class HproseProcStream extends HproseAbstractStream {
|
||
|
protected $process;
|
||
|
protected $pipes;
|
||
|
protected $buf;
|
||
|
protected $unmark;
|
||
|
protected $pos;
|
||
|
protected $length;
|
||
|
public function __construct($process, $pipes) {
|
||
|
$this->process = $process;
|
||
|
$this->pipes = $pipes;
|
||
|
$this->buf = "";
|
||
|
$this->unmark = true;
|
||
|
$this->pos = -1;
|
||
|
$this->length = 0;
|
||
|
}
|
||
|
public function close() {
|
||
|
fclose($this->pipes[0]);
|
||
|
fclose($this->pipes[1]);
|
||
|
proc_close($this->process);
|
||
|
}
|
||
|
public function getc() {
|
||
|
if ($this->pos == -1) {
|
||
|
return fgetc($this->pipes[1]);
|
||
|
}
|
||
|
elseif ($this->pos < $this->length) {
|
||
|
return $this->buf{$this->pos++};
|
||
|
}
|
||
|
elseif ($this->unmark) {
|
||
|
$this->buf = "";
|
||
|
$this->pos = -1;
|
||
|
$this->length = 0;
|
||
|
return fgetc($this->pipes[1]);
|
||
|
}
|
||
|
elseif (($c = fgetc($this->pipes[1])) !== false) {
|
||
|
$this->buf .= $c;
|
||
|
$this->pos++;
|
||
|
$this->length++;
|
||
|
}
|
||
|
return $c;
|
||
|
}
|
||
|
public function read($length) {
|
||
|
if ($this->pos == -1) {
|
||
|
return fread($this->pipes[1], $length);
|
||
|
}
|
||
|
elseif ($this->pos < $this->length) {
|
||
|
$len = $this->length - $this->pos;
|
||
|
if ($len < $length) {
|
||
|
$s = fread($this->pipes[1], $length - $len);
|
||
|
$this->buf .= $s;
|
||
|
$this->length += strlen($s);
|
||
|
}
|
||
|
$s = substr($this->buf, $this->pos, $length);
|
||
|
$this->pos += strlen($s);
|
||
|
}
|
||
|
elseif ($this->unmark) {
|
||
|
$this->buf = "";
|
||
|
$this->pos = -1;
|
||
|
$this->length = 0;
|
||
|
return fread($this->pipes[1], $length);
|
||
|
}
|
||
|
elseif (($s = fread($this->pipes[1], $length)) !== "") {
|
||
|
$this->buf .= $s;
|
||
|
$len = strlen($s);
|
||
|
$this->pos += $len;
|
||
|
$this->length += $len;
|
||
|
}
|
||
|
return $s;
|
||
|
}
|
||
|
public function readuntil($char) {
|
||
|
$s = '';
|
||
|
while ((($c = $this->getc()) != $char) && $c !== false) $s .= $c;
|
||
|
return $s;
|
||
|
}
|
||
|
public function seek($offset, $whence = SEEK_SET) {
|
||
|
if (fseek($this->pipes[1], $offset, $whence) == 0) {
|
||
|
$this->buf = "";
|
||
|
$this->unmark = true;
|
||
|
$this->pos = -1;
|
||
|
$this->length = 0;
|
||
|
return 0;
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
public function mark() {
|
||
|
$this->unmark = false;
|
||
|
if ($this->pos == -1) {
|
||
|
$this->buf = "";
|
||
|
$this->pos = 0;
|
||
|
$this->length = 0;
|
||
|
}
|
||
|
elseif ($this->pos > 0) {
|
||
|
$this->buf = substr($this->buf, $this->pos);
|
||
|
$this->length -= $this->pos;
|
||
|
$this->pos = 0;
|
||
|
}
|
||
|
}
|
||
|
public function unmark() {
|
||
|
$this->unmark = true;
|
||
|
}
|
||
|
public function reset() {
|
||
|
$this->pos = 0;
|
||
|
}
|
||
|
public function skip($n) {
|
||
|
$this->read($n);
|
||
|
}
|
||
|
public function eof() {
|
||
|
if (($this->pos != -1) && ($this->pos < $this->length)) return false;
|
||
|
return feof($this->pipes[1]);
|
||
|
}
|
||
|
public function write($string, $length = -1) {
|
||
|
if ($length == -1) $length = strlen($string);
|
||
|
return fwrite($this->pipes[0], $string, $length);
|
||
|
}
|
||
|
}
|
||
|
?>
|