1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
13:
14: 15: 16: 17: 18: 19: 20:
21: class TPhpStream extends TTransport {
22:
23: const MODE_R = 1;
24: const MODE_W = 2;
25:
26: private $inStream_ = null;
27:
28: private $outStream_ = null;
29:
30: private $read_ = false;
31:
32: private $write_ = false;
33:
34: public function __construct($mode) {
35: $this->read_ = $mode & self::MODE_R;
36: $this->write_ = $mode & self::MODE_W;
37: }
38:
39: public function open() {
40: if ($this->read_) {
41: $this->inStream_ = @fopen('php://input', 'r');
42: if (!is_resource($this->inStream_)) {
43: throw new TException('TPhpStream: Could not open php://input');
44: }
45: }
46: if ($this->write_) {
47: $this->outStream_ = @fopen('php://output', 'w');
48: if (!is_resource($this->outStream_)) {
49: throw new TException('TPhpStream: Could not open php://output');
50: }
51: }
52: }
53:
54: public function close() {
55: if ($this->read_) {
56: @fclose($this->inStream_);
57: $this->inStream_ = null;
58: }
59: if ($this->write_) {
60: @fclose($this->outStream_);
61: $this->outStream_ = null;
62: }
63: }
64:
65: public function isOpen() {
66: return
67: (!$this->read_ || is_resource($this->inStream_)) &&
68: (!$this->write_ || is_resource($this->outStream_));
69: }
70:
71: public function read($len) {
72: $data = @fread($this->inStream_, $len);
73: if ($data === FALSE || $data === '') {
74: throw new TException('TPhpStream: Could not read '.$len.' bytes');
75: }
76: return $data;
77: }
78:
79: public function write($buf) {
80: while (strlen($buf) > 0) {
81: $got = @fwrite($this->outStream_, $buf);
82: if ($got === 0 || $got === FALSE) {
83: throw new TException('TPhpStream: Could not write '.strlen($buf).' bytes');
84: }
85: $buf = substr($buf, $got);
86: }
87: }
88:
89: public function flush() {
90: @fflush($this->outStream_);
91: }
92:
93: }
94:
95: ?>
96: