blob: a3596ab8128f7bad69ebf015fb82a063ee177536 [file] [log] [blame]
Mark Slee6e536442006-06-30 18:28:50 +00001<?php
2
3/** Types */
Marc Slemkod97eb612006-08-24 23:37:36 +00004require_once PREFIX.'thrift/protocol/TType.php';
Mark Slee6e536442006-06-30 18:28:50 +00005
6/**
7 * Protocol module.
8 *
9 * @package thrift.protocol
10 * @author Mark Slee <mcslee@facebook.com>
11 */
12abstract class TProtocol {
13
Marc Slemkod97eb612006-08-24 23:37:36 +000014 /** Writes the message header
15
16 @param TTransport $out Output transport
17 @param name $name Function name
18 @param type $type message type TMessageType::CALL or TMessageType::REPLY
19 @parem seqid $seqid The sequence id of this message */
20
21 public abstract function writeMessageBegin($out, $name, $type, $seqid);
22
23 /** Close the message
24
25 @param TTransport $out Output transport */
26
27 public abstract function writeMessageEnd($out);
28
Mark Slee6e536442006-06-30 18:28:50 +000029 /**
30 * Writes a struct header.
31 *
32 * @param TTransport $out Output transport
33 * @param string $name Struct name
34 * @throws TException on write error
35 * @return int How many bytes written
36 */
37 public abstract function writeStructBegin($out, $name);
38
39
40 /**
41 * Close a struct.
42 *
43 * @param TTransport $out Output transport
44 * @throws TException on write error
45 * @return int How many bytes written
46 */
47 public abstract function writeStructEnd($out);
48
49 /*
50 * Starts a field.
51 *
52 * @param TTransport $out Output transport
53 * @param string $name Field name
54 * @param int $type Field type
55 * @param int $fid Field id
56 * @throws TException on write error
57 * @return int How many bytes written
58 */
59 public abstract function writeFieldBegin($out, $fieldName, $fieldType, $fieldId);
60
61 public abstract function writeFieldEnd($out);
62
63 public abstract function writeFieldStop($out);
64
65 public abstract function writeMapBegin($out, $keyType, $valType, $size);
66
67 public abstract function writeMapEnd($out);
68
69 public abstract function writeListBegin($out, $elemType, $size);
70
71 public abstract function writeListEnd($out);
72
73 public abstract function writeSetBegin($out, $elemType, $size);
74
75 public abstract function writeSetEnd($out);
76
77 public abstract function writeByte($out, $byte);
78
79 public abstract function writeI32($out, $i32);
80
81 public abstract function writeI64($out, $i64);
82
83 public abstract function writeString($out, $str);
84
85
Marc Slemkod97eb612006-08-24 23:37:36 +000086 /** Reads the message header
87
88 @param TTransport $out Output transport
89 @param name $name Function name
90 @param type $type message type TMessageType::CALL or TMessageType::REPLY
91 @parem seqid $seqid The sequence id of this message */
92
93 public abstract function readMessageBegin($out, &$name, &$type, &$seqid);
94
95 /** Read the close of message
96
97 @param TTransport $out Output transport */
98
99 public abstract function readMessageEnd($out);
100
Mark Slee6e536442006-06-30 18:28:50 +0000101 public abstract function readStructBegin($in, &$name);
102
103 public abstract function readStructEnd($in);
104
105 public abstract function readFieldBegin($in, &$name, &$fieldType, &$fieldId);
106
107 public abstract function readFieldEnd($in);
108
109 public abstract function readMapBegin($in, &$keyType, &$valType, &$size);
110
111 public abstract function readMapEnd($in);
112
113 public abstract function readListBegin($in, &$elemType, &$size);
114
115 public abstract function readListEnd($in);
116
117 public abstract function readSetBegin($in, &$elemType, &$size);
118
119 public abstract function readSetEnd($in);
120
121 public abstract function readByte($in, &$byte);
122
123 public abstract function readI32($in, &$i32);
124
125 public abstract function readI64($in, &$i64);
126
127 public abstract function readString($in, &$str);
128
129 public function skip($in, $type) {
130 switch ($type) {
131 case TType::BYTE:
132 return $this->readByte($in, $byte);
133 case TType::I32:
134 return $this->readI32($in, $i32);
135 case TType::I64:
136 return $this->readI64($in, $i64);
137 case TType::STRING:
138 return $this->readString($in, $str);
139 case TType::STRUCT:
140 {
141 $result = $this->readStructBegin($in, $name);
142 while (true) {
143 $result += $this->readFieldBegin($in, $name, $ftype, $fid);
144 if ($ftype == TType::STOP) {
145 break;
146 }
147 $result += $this->skip($in, $ftype);
148 $result += $this->readFieldEnd($in);
149 }
150 $result += $this->readStructEnd($in);
151 return $result;
152 }
153 case TType::MAP:
154 {
155 $result = $this->readMapBegin($in, $keyType, $valType, $size);
156 for ($i = 0; $i < $size; $i++) {
157 $result += $this->skip($in, $keyType);
158 $result += $this->skip($in, $valType);
159 }
160 $result += $this->readMapEnd($in);
161 return $result;
162 }
163 case TType::SET:
164 {
165 $result = $this->readSetBegin($in, $elemType, $size);
166 for ($i = 0; $i < $size; $i++) {
167 $result += $this->skip($in, $elemType);
168 }
169 $result += $this->readSetEnd($in);
170 return $result;
171 }
172 case TType::LST:
173 {
174 $result = $this->readListBegin($in, $elemType, $size);
175 for ($i = 0; $i < $size; $i++) {
176 $result += $this->skip($in, $elemType);
177 }
178 $result += $this->readListEnd($in);
179 return $result;
180 }
181 default:
182 return 0;
183 }
184 }
185}
186
187?>