blob: 5272d06d008b75f74029e8378d24b845a29dc0b4 [file] [log] [blame]
Mark Slee6e536442006-06-30 18:28:50 +00001<?php
2
Mark Slee99e2b262006-10-10 01:42:29 +00003/**
Mark Slee4902c052007-03-01 00:31:30 +00004 * Copyright (c) 2006- Facebook
5 * Distributed under the Thrift Software License
6 *
7 * See accompanying file LICENSE or visit the Thrift site at:
8 * http://developers.facebook.com/thrift/
9 *
10 * @package thrift
Mark Slee4902c052007-03-01 00:31:30 +000011 */
12
13/**
Mark Slee1ecb1b02007-02-22 01:01:10 +000014 * Data types that can be sent via Thrift
Mark Slee99e2b262006-10-10 01:42:29 +000015 */
Mark Slee1ecb1b02007-02-22 01:01:10 +000016class TType {
17 const STOP = 0;
18 const VOID = 1;
19 const BOOL = 2;
20 const BYTE = 3;
21 const I08 = 3;
22 const DOUBLE = 4;
23 const I16 = 6;
24 const I32 = 8;
25 const I64 = 10;
26 const STRING = 11;
27 const UTF7 = 11;
28 const STRUCT = 12;
29 const MAP = 13;
30 const SET = 14;
31 const LST = 15; // N.B. cannot use LIST keyword in PHP!
32 const UTF8 = 16;
33 const UTF16 = 17;
Mark Sleecfc01932006-09-01 22:18:16 +000034}
Mark Slee1ecb1b02007-02-22 01:01:10 +000035
36/**
37 * Message types for RPC
38 */
39class TMessageType {
40 const CALL = 1;
41 const REPLY = 2;
Mark Sleed395d572007-02-27 01:16:55 +000042 const EXCEPTION = 3;
Mark Slee1ecb1b02007-02-22 01:01:10 +000043}
Mark Slee6e536442006-06-30 18:28:50 +000044
Mark Slee5b743072007-11-13 04:00:29 +000045/**
46 * NOTE(mcslee): This currently contains a ton of duplicated code from TBase
47 * because we need to save CPU cycles and this is not yet in an extension.
48 * Ideally we'd multiply-inherit TException from both Exception and Base, but
49 * that's not possible in PHP and there are no modules either, so for now we
50 * apologetically take a trip to HackTown.
51 *
52 * Can be called with standard Exception constructor (message, code) or with
53 * Thrift Base object constructor (spec, vals).
54 *
55 * @param mixed $p1 Message (string) or type-spec (array)
56 * @param mixed $p2 Code (integer) or values (array)
57 */
Mark Sleedac78562007-02-21 07:35:03 +000058class TException extends Exception {
Mark Slee5b743072007-11-13 04:00:29 +000059 function __construct($p1=null, $p2=0) {
60 if (is_array($p1) && is_array($p2)) {
61 $spec = $p1;
62 $vals = $p2;
63 foreach ($spec as $fid => $fspec) {
64 $var = $fspec['var'];
65 if (isset($vals[$var])) {
66 $this->$var = $vals[$var];
67 }
68 }
69 } else {
70 parent::__construct($p1, $p2);
71 }
72 }
73
74 static $tmethod = array(TType::BOOL => 'Bool',
75 TType::BYTE => 'Byte',
76 TType::I16 => 'I16',
77 TType::I32 => 'I32',
78 TType::I64 => 'I64',
79 TType::DOUBLE => 'Double',
80 TType::STRING => 'String');
81
82 private function _readMap(&$var, $spec, $input) {
83 $xfer = 0;
84 $ktype = $spec['ktype'];
85 $vtype = $spec['vtype'];
86 $kread = $vread = null;
87 if (isset(TBase::$tmethod[$ktype])) {
88 $kread = 'read'.TBase::$tmethod[$ktype];
89 } else {
90 $kspec = $spec['key'];
91 }
92 if (isset(TBase::$tmethod[$vtype])) {
93 $vread = 'read'.TBase::$tmethod[$vtype];
94 } else {
95 $vspec = $spec['val'];
96 }
97 $var = array();
98 $_ktype = $_vtype = $size = 0;
99 $xfer += $input->readMapBegin($_ktype, $_vtype, $size);
100 for ($i = 0; $i < $size; ++$i) {
101 $key = $val = null;
102 if ($kread !== null) {
103 $xfer += $input->$kread($key);
104 } else {
105 switch ($ktype) {
106 case TType::STRUCT:
107 $class = $kspec['class'];
108 $key = new $class();
109 $xfer += $key->read($input);
110 break;
111 case TType::MAP:
112 $xfer += $this->_readMap($key, $kspec, $input);
113 break;
114 case TType::LST:
115 $xfer += $this->_readList($key, $kspec, $input, false);
116 break;
117 case TType::SET:
118 $xfer += $this->_readList($key, $kspec, $input, true);
119 break;
120 }
121 }
122 if ($vread !== null) {
123 $xfer += $input->$vread($val);
124 } else {
125 switch ($vtype) {
126 case TType::STRUCT:
127 $class = $vspec['class'];
128 $val = new $class();
129 $xfer += $val->read($input);
130 break;
131 case TType::MAP:
132 $xfer += $this->_readMap($val, $vspec, $input);
133 break;
134 case TType::LST:
135 $xfer += $this->_readList($val, $vspec, $input, false);
136 break;
137 case TType::SET:
138 $xfer += $this->_readList($val, $vspec, $input, true);
139 break;
140 }
141 }
142 $var[$key] = $val;
143 }
144 $xfer += $input->readMapEnd();
145 return $xfer;
146 }
147
148 private function _readList(&$var, $spec, $input, $set=false) {
149 $xfer = 0;
150 $etype = $spec['etype'];
151 $eread = $vread = null;
152 if (isset(TBase::$tmethod[$etype])) {
153 $eread = 'read'.TBase::$tmethod[$etype];
154 } else {
155 $espec = $spec['elem'];
156 }
157 $var = array();
158 $_etype = $size = 0;
159 if ($set) {
160 $xfer += $input->readSetBegin($_etype, $size);
161 } else {
162 $xfer += $input->readListBegin($_etype, $size);
163 }
164 for ($i = 0; $i < $size; ++$i) {
165 $elem = null;
166 if ($eread !== null) {
167 $xfer += $input->$eread($elem);
168 } else {
169 $espec = $spec['elem'];
170 switch ($etype) {
171 case TType::STRUCT:
172 $class = $espec['class'];
173 $elem = new $class();
174 $xfer += $elem->read($input);
175 break;
176 case TType::MAP:
David Reiss465ccc02007-11-13 21:41:29 +0000177 $xfer += $this->_readMap($elem, $espec, $input);
Mark Slee5b743072007-11-13 04:00:29 +0000178 break;
179 case TType::LST:
David Reiss465ccc02007-11-13 21:41:29 +0000180 $xfer += $this->_readList($elem, $espec, $input, false);
Mark Slee5b743072007-11-13 04:00:29 +0000181 break;
182 case TType::SET:
David Reiss465ccc02007-11-13 21:41:29 +0000183 $xfer += $this->_readList($elem, $espec, $input, true);
Mark Slee5b743072007-11-13 04:00:29 +0000184 break;
185 }
186 }
187 if ($set) {
188 $var[$elem] = true;
189 } else {
190 $var []= $elem;
191 }
192 }
193 if ($set) {
194 $xfer += $input->readSetEnd();
195 } else {
196 $xfer += $input->readListEnd();
197 }
198 return $xfer;
199 }
200
201 protected function _read($class, $spec, $input) {
202 $xfer = 0;
203 $fname = null;
204 $ftype = 0;
205 $fid = 0;
206 $xfer += $input->readStructBegin($fname);
Mark Slee5b743072007-11-13 04:00:29 +0000207 while (true) {
208 $xfer += $input->readFieldBegin($fname, $ftype, $fid);
209 if ($ftype == TType::STOP) {
210 break;
211 }
212 if (isset($spec[$fid])) {
213 $fspec = $spec[$fid];
214 $var = $fspec['var'];
215 if ($ftype == $fspec['type']) {
216 $xfer = 0;
Mark Slee645ecea2007-11-28 02:46:24 +0000217 if (isset(TBase::$tmethod[$ftype])) {
218 $func = 'read'.TBase::$tmethod[$ftype];
219 $xfer += $input->$func($this->$var);
Mark Slee5b743072007-11-13 04:00:29 +0000220 } else {
Mark Slee645ecea2007-11-28 02:46:24 +0000221 switch ($ftype) {
222 case TType::STRUCT:
223 $class = $fspec['class'];
224 $this->$var = new $class();
225 $xfer += $this->$var->read($input);
226 break;
227 case TType::MAP:
228 $xfer += $this->_readMap($this->$var, $fspec, $input);
229 break;
230 case TType::LST:
231 $xfer += $this->_readList($this->$var, $fspec, $input, false);
232 break;
233 case TType::SET:
234 $xfer += $this->_readList($this->$var, $fspec, $input, true);
235 break;
Mark Slee5b743072007-11-13 04:00:29 +0000236 }
237 }
238 } else {
239 $xfer += $input->skip($ftype);
240 }
241 } else {
242 $xfer += $input->skip($ftype);
243 }
244 $xfer += $input->readFieldEnd();
245 }
246 $xfer += $input->readStructEnd();
247 return $xfer;
248 }
249
250 private function _writeMap($var, $spec, $output) {
251 $xfer = 0;
252 $ktype = $spec['ktype'];
253 $vtype = $spec['vtype'];
254 $kwrite = $vwrite = null;
255 if (isset(TBase::$tmethod[$ktype])) {
256 $kwrite = 'write'.TBase::$tmethod[$ktype];
257 } else {
258 $kspec = $spec['key'];
259 }
260 if (isset(TBase::$tmethod[$vtype])) {
261 $vwrite = 'write'.TBase::$tmethod[$vtype];
262 } else {
263 $vspec = $spec['val'];
264 }
265 $xfer += $output->writeMapBegin($ktype, $vtype, count($var));
266 foreach ($var as $key => $val) {
267 if (isset($kwrite)) {
268 $xfer += $output->$kwrite($key);
269 } else {
270 switch ($ktype) {
271 case TType::STRUCT:
272 $xfer += $key->write($output);
273 break;
274 case TType::MAP:
275 $xfer += $this->_writeMap($key, $kspec, $output);
276 break;
277 case TType::LST:
278 $xfer += $this->_writeList($key, $kspec, $output, false);
279 break;
280 case TType::SET:
281 $xfer += $this->_writeList($key, $kspec, $output, true);
282 break;
283 }
284 }
285 if (isset($vwrite)) {
286 $xfer += $output->$vwrite($val);
287 } else {
288 switch ($vtype) {
289 case TType::STRUCT:
290 $xfer += $val->write($output);
291 break;
292 case TType::MAP:
293 $xfer += $this->_writeMap($val, $vspec, $output);
294 break;
295 case TType::LST:
296 $xfer += $this->_writeList($val, $vspec, $output, false);
297 break;
298 case TType::SET:
299 $xfer += $this->_writeList($val, $vspec, $output, true);
300 break;
301 }
302 }
303 }
304 $xfer += $output->writeMapEnd();
305 return $xfer;
306 }
307
308 private function _writeList($var, $spec, $output, $set=false) {
309 $xfer = 0;
310 $etype = $spec['etype'];
311 $ewrite = null;
312 if (isset(TBase::$tmethod[$etype])) {
313 $ewrite = 'write'.TBase::$tmethod[$etype];
314 } else {
315 $espec = $spec['elem'];
316 }
317 if ($set) {
318 $xfer += $output->writeSetBegin($etype, count($var));
319 } else {
320 $xfer += $output->writeListBegin($etype, count($var));
321 }
322 foreach ($var as $key => $val) {
323 $elem = $set ? $key : $val;
324 if (isset($ewrite)) {
325 $xfer += $output->$ewrite($elem);
326 } else {
327 switch ($etype) {
328 case TType::STRUCT:
329 $xfer += $elem->write($output);
330 break;
331 case TType::MAP:
332 $xfer += $this->_writeMap($elem, $espec, $output);
333 break;
334 case TType::LST:
335 $xfer += $this->_writeList($elem, $espec, $output, false);
336 break;
337 case TType::SET:
338 $xfer += $this->_writeList($elem, $espec, $output, true);
339 break;
340 }
341 }
342 }
343 if ($set) {
344 $xfer += $output->writeSetEnd();
345 } else {
346 $xfer += $output->writeListEnd();
347 }
348 return $xfer;
349 }
350
351 protected function _write($class, $spec, $output) {
352 $xfer = 0;
353 $xfer += $output->writeStructBegin($class);
354 foreach ($spec as $fid => $fspec) {
355 $var = $fspec['var'];
356 if ($this->$var !== null) {
357 $ftype = $fspec['type'];
358 $xfer += $output->writeFieldBegin($var, $ftype, $fid);
359 if (isset(TBase::$tmethod[$ftype])) {
360 $func = 'write'.TBase::$tmethod[$ftype];
Mark Slee2b786222007-11-13 05:35:34 +0000361 $xfer += $output->$func($this->$var);
Mark Slee5b743072007-11-13 04:00:29 +0000362 } else {
363 switch ($ftype) {
364 case TType::STRUCT:
365 $xfer += $this->$var->write($output);
366 break;
367 case TType::MAP:
368 $xfer += $this->_writeMap($this->$var, $fspec, $output);
369 break;
370 case TType::LST:
371 $xfer += $this->_writeList($this->$var, $fspec, $output, false);
372 break;
373 case TType::SET:
374 $xfer += $this->_writeList($this->$var, $fspec, $output, true);
375 break;
376 }
377 }
378 $xfer += $output->writeFieldEnd();
379 }
380 }
381 $xfer += $output->writeFieldStop();
382 $xfer += $output->writeStructEnd();
383 return $xfer;
384 }
385
386}
387
388/**
389 * Base class from which other Thrift structs extend. This is so that we can
390 * cut back on the size of the generated code which is turning out to have a
391 * nontrivial cost just to load thanks to the wondrously abysmal implementation
392 * of PHP. Note that code is intentionally duplicated in here to avoid making
393 * function calls for every field or member of a container..
394 */
395abstract class TBase {
396
397 static $tmethod = array(TType::BOOL => 'Bool',
398 TType::BYTE => 'Byte',
399 TType::I16 => 'I16',
400 TType::I32 => 'I32',
401 TType::I64 => 'I64',
402 TType::DOUBLE => 'Double',
403 TType::STRING => 'String');
404
405 abstract function read($input);
406
407 abstract function write($output);
408
409 public function __construct($spec=null, $vals=null) {
410 if (is_array($spec) && is_array($vals)) {
411 foreach ($spec as $fid => $fspec) {
412 $var = $fspec['var'];
413 if (isset($vals[$var])) {
414 $this->$var = $vals[$var];
415 }
416 }
417 }
418 }
419
420 private function _readMap(&$var, $spec, $input) {
421 $xfer = 0;
422 $ktype = $spec['ktype'];
423 $vtype = $spec['vtype'];
424 $kread = $vread = null;
425 if (isset(TBase::$tmethod[$ktype])) {
426 $kread = 'read'.TBase::$tmethod[$ktype];
427 } else {
428 $kspec = $spec['key'];
429 }
430 if (isset(TBase::$tmethod[$vtype])) {
431 $vread = 'read'.TBase::$tmethod[$vtype];
432 } else {
433 $vspec = $spec['val'];
434 }
435 $var = array();
436 $_ktype = $_vtype = $size = 0;
437 $xfer += $input->readMapBegin($_ktype, $_vtype, $size);
438 for ($i = 0; $i < $size; ++$i) {
439 $key = $val = null;
440 if ($kread !== null) {
441 $xfer += $input->$kread($key);
442 } else {
443 switch ($ktype) {
444 case TType::STRUCT:
445 $class = $kspec['class'];
446 $key = new $class();
447 $xfer += $key->read($input);
448 break;
449 case TType::MAP:
David Reissbef54c02007-11-28 20:15:11 +0000450 $xfer += $this->_readMap($key, $kspec, $input);
Mark Slee5b743072007-11-13 04:00:29 +0000451 break;
452 case TType::LST:
David Reissbef54c02007-11-28 20:15:11 +0000453 $xfer += $this->_readList($key, $kspec, $input, false);
Mark Slee5b743072007-11-13 04:00:29 +0000454 break;
455 case TType::SET:
David Reissbef54c02007-11-28 20:15:11 +0000456 $xfer += $this->_readList($key, $kspec, $input, true);
Mark Slee5b743072007-11-13 04:00:29 +0000457 break;
458 }
459 }
460 if ($vread !== null) {
461 $xfer += $input->$vread($val);
462 } else {
463 switch ($vtype) {
464 case TType::STRUCT:
465 $class = $vspec['class'];
466 $val = new $class();
467 $xfer += $val->read($input);
468 break;
469 case TType::MAP:
470 $xfer += $this->_readMap($val, $vspec, $input);
471 break;
472 case TType::LST:
473 $xfer += $this->_readList($val, $vspec, $input, false);
474 break;
475 case TType::SET:
476 $xfer += $this->_readList($val, $vspec, $input, true);
477 break;
478 }
479 }
480 $var[$key] = $val;
481 }
482 $xfer += $input->readMapEnd();
483 return $xfer;
484 }
485
486 private function _readList(&$var, $spec, $input, $set=false) {
487 $xfer = 0;
488 $etype = $spec['etype'];
489 $eread = $vread = null;
490 if (isset(TBase::$tmethod[$etype])) {
491 $eread = 'read'.TBase::$tmethod[$etype];
492 } else {
493 $espec = $spec['elem'];
494 }
495 $var = array();
496 $_etype = $size = 0;
497 if ($set) {
498 $xfer += $input->readSetBegin($_etype, $size);
499 } else {
500 $xfer += $input->readListBegin($_etype, $size);
501 }
502 for ($i = 0; $i < $size; ++$i) {
503 $elem = null;
504 if ($eread !== null) {
505 $xfer += $input->$eread($elem);
506 } else {
507 $espec = $spec['elem'];
508 switch ($etype) {
509 case TType::STRUCT:
510 $class = $espec['class'];
511 $elem = new $class();
512 $xfer += $elem->read($input);
513 break;
514 case TType::MAP:
David Reissbef54c02007-11-28 20:15:11 +0000515 $xfer += $this->_readMap($elem, $espec, $input);
Mark Slee5b743072007-11-13 04:00:29 +0000516 break;
517 case TType::LST:
David Reissbef54c02007-11-28 20:15:11 +0000518 $xfer += $this->_readList($elem, $espec, $input, false);
Mark Slee5b743072007-11-13 04:00:29 +0000519 break;
520 case TType::SET:
David Reissbef54c02007-11-28 20:15:11 +0000521 $xfer += $this->_readList($elem, $espec, $input, true);
Mark Slee5b743072007-11-13 04:00:29 +0000522 break;
523 }
524 }
525 if ($set) {
526 $var[$elem] = true;
527 } else {
528 $var []= $elem;
529 }
530 }
531 if ($set) {
532 $xfer += $input->readSetEnd();
533 } else {
534 $xfer += $input->readListEnd();
535 }
536 return $xfer;
537 }
538
539 protected function _read($class, $spec, $input) {
540 $xfer = 0;
541 $fname = null;
542 $ftype = 0;
543 $fid = 0;
544 $xfer += $input->readStructBegin($fname);
Mark Slee5b743072007-11-13 04:00:29 +0000545 while (true) {
546 $xfer += $input->readFieldBegin($fname, $ftype, $fid);
547 if ($ftype == TType::STOP) {
548 break;
549 }
550 if (isset($spec[$fid])) {
551 $fspec = $spec[$fid];
552 $var = $fspec['var'];
553 if ($ftype == $fspec['type']) {
554 $xfer = 0;
Mark Slee645ecea2007-11-28 02:46:24 +0000555 if (isset(TBase::$tmethod[$ftype])) {
556 $func = 'read'.TBase::$tmethod[$ftype];
557 $xfer += $input->$func($this->$var);
Mark Slee5b743072007-11-13 04:00:29 +0000558 } else {
Mark Slee645ecea2007-11-28 02:46:24 +0000559 switch ($ftype) {
560 case TType::STRUCT:
561 $class = $fspec['class'];
562 $this->$var = new $class();
563 $xfer += $this->$var->read($input);
564 break;
565 case TType::MAP:
566 $xfer += $this->_readMap($this->$var, $fspec, $input);
567 break;
568 case TType::LST:
569 $xfer += $this->_readList($this->$var, $fspec, $input, false);
570 break;
571 case TType::SET:
572 $xfer += $this->_readList($this->$var, $fspec, $input, true);
573 break;
Mark Slee5b743072007-11-13 04:00:29 +0000574 }
575 }
576 } else {
577 $xfer += $input->skip($ftype);
578 }
579 } else {
580 $xfer += $input->skip($ftype);
581 }
582 $xfer += $input->readFieldEnd();
583 }
584 $xfer += $input->readStructEnd();
585 return $xfer;
586 }
587
588 private function _writeMap($var, $spec, $output) {
589 $xfer = 0;
590 $ktype = $spec['ktype'];
591 $vtype = $spec['vtype'];
592 $kwrite = $vwrite = null;
593 if (isset(TBase::$tmethod[$ktype])) {
594 $kwrite = 'write'.TBase::$tmethod[$ktype];
595 } else {
596 $kspec = $spec['key'];
597 }
598 if (isset(TBase::$tmethod[$vtype])) {
599 $vwrite = 'write'.TBase::$tmethod[$vtype];
600 } else {
601 $vspec = $spec['val'];
602 }
603 $xfer += $output->writeMapBegin($ktype, $vtype, count($var));
604 foreach ($var as $key => $val) {
605 if (isset($kwrite)) {
606 $xfer += $output->$kwrite($key);
607 } else {
608 switch ($ktype) {
609 case TType::STRUCT:
610 $xfer += $key->write($output);
611 break;
612 case TType::MAP:
613 $xfer += $this->_writeMap($key, $kspec, $output);
614 break;
615 case TType::LST:
616 $xfer += $this->_writeList($key, $kspec, $output, false);
617 break;
618 case TType::SET:
619 $xfer += $this->_writeList($key, $kspec, $output, true);
620 break;
621 }
622 }
623 if (isset($vwrite)) {
624 $xfer += $output->$vwrite($val);
625 } else {
626 switch ($vtype) {
627 case TType::STRUCT:
628 $xfer += $val->write($output);
629 break;
630 case TType::MAP:
631 $xfer += $this->_writeMap($val, $vspec, $output);
632 break;
633 case TType::LST:
634 $xfer += $this->_writeList($val, $vspec, $output, false);
635 break;
636 case TType::SET:
637 $xfer += $this->_writeList($val, $vspec, $output, true);
638 break;
639 }
640 }
641 }
642 $xfer += $output->writeMapEnd();
643 return $xfer;
644 }
645
646 private function _writeList($var, $spec, $output, $set=false) {
647 $xfer = 0;
648 $etype = $spec['etype'];
649 $ewrite = null;
650 if (isset(TBase::$tmethod[$etype])) {
651 $ewrite = 'write'.TBase::$tmethod[$etype];
652 } else {
653 $espec = $spec['elem'];
654 }
655 if ($set) {
656 $xfer += $output->writeSetBegin($etype, count($var));
657 } else {
658 $xfer += $output->writeListBegin($etype, count($var));
659 }
660 foreach ($var as $key => $val) {
661 $elem = $set ? $key : $val;
662 if (isset($ewrite)) {
663 $xfer += $output->$ewrite($elem);
664 } else {
665 switch ($etype) {
666 case TType::STRUCT:
667 $xfer += $elem->write($output);
668 break;
669 case TType::MAP:
670 $xfer += $this->_writeMap($elem, $espec, $output);
671 break;
672 case TType::LST:
673 $xfer += $this->_writeList($elem, $espec, $output, false);
674 break;
675 case TType::SET:
676 $xfer += $this->_writeList($elem, $espec, $output, true);
677 break;
678 }
679 }
680 }
681 if ($set) {
682 $xfer += $output->writeSetEnd();
683 } else {
684 $xfer += $output->writeListEnd();
685 }
686 return $xfer;
687 }
688
689 protected function _write($class, $spec, $output) {
690 $xfer = 0;
691 $xfer += $output->writeStructBegin($class);
692 foreach ($spec as $fid => $fspec) {
693 $var = $fspec['var'];
694 if ($this->$var !== null) {
695 $ftype = $fspec['type'];
696 $xfer += $output->writeFieldBegin($var, $ftype, $fid);
697 if (isset(TBase::$tmethod[$ftype])) {
698 $func = 'write'.TBase::$tmethod[$ftype];
Mark Slee2b786222007-11-13 05:35:34 +0000699 $xfer += $output->$func($this->$var);
Mark Slee5b743072007-11-13 04:00:29 +0000700 } else {
701 switch ($ftype) {
702 case TType::STRUCT:
703 $xfer += $this->$var->write($output);
704 break;
705 case TType::MAP:
706 $xfer += $this->_writeMap($this->$var, $fspec, $output);
707 break;
708 case TType::LST:
709 $xfer += $this->_writeList($this->$var, $fspec, $output, false);
710 break;
711 case TType::SET:
712 $xfer += $this->_writeList($this->$var, $fspec, $output, true);
713 break;
714 }
715 }
716 $xfer += $output->writeFieldEnd();
717 }
718 }
719 $xfer += $output->writeFieldStop();
720 $xfer += $output->writeStructEnd();
721 return $xfer;
Mark Sleedac78562007-02-21 07:35:03 +0000722 }
723}
724
725class TApplicationException extends TException {
Mark Slee5b743072007-11-13 04:00:29 +0000726 static $_TSPEC =
727 array(1 => array('var' => 'message',
728 'type' => TType::STRING),
729 2 => array('var' => 'code',
730 'type' => TType::I32));
731
Mark Sleedac78562007-02-21 07:35:03 +0000732 const UNKNOWN = 0;
733 const UNKNOWN_METHOD = 1;
734 const INVALID_MESSAGE_TYPE = 2;
735 const WRONG_METHOD_NAME = 3;
736 const BAD_SEQUENCE_ID = 4;
737 const MISSING_RESULT = 5;
738
739 function __construct($message=null, $code=0) {
740 parent::__construct($message, $code);
741 }
742
Mark Slee5b743072007-11-13 04:00:29 +0000743 public function read($output) {
744 return $this->_read('TApplicationException', self::$_TSPEC, $output);
Mark Sleedac78562007-02-21 07:35:03 +0000745 }
746
747 public function write($output) {
748 $xfer = 0;
749 $xfer += $output->writeStructBegin('TApplicationException');
Mark Slee5b743072007-11-13 04:00:29 +0000750 if ($message = $this->getMessage()) {
Mark Sleedac78562007-02-21 07:35:03 +0000751 $xfer += $output->writeFieldBegin('message', TType::STRING, 1);
Mark Slee5b743072007-11-13 04:00:29 +0000752 $xfer += $output->writeString($message);
Mark Sleedac78562007-02-21 07:35:03 +0000753 $xfer += $output->writeFieldEnd();
754 }
Mark Slee5b743072007-11-13 04:00:29 +0000755 if ($code = $this->getCode()) {
Mark Sleedac78562007-02-21 07:35:03 +0000756 $xfer += $output->writeFieldBegin('type', TType::I32, 2);
Mark Slee5b743072007-11-13 04:00:29 +0000757 $xfer += $output->writeI32($code);
Mark Sleedac78562007-02-21 07:35:03 +0000758 $xfer += $output->writeFieldEnd();
759 }
760 $xfer += $output->writeFieldStop();
761 $xfer += $output->writeStructEnd();
762 return $xfer;
763 }
764}
765
Mark Slee1ecb1b02007-02-22 01:01:10 +0000766/**
767 * Set global THRIFT ROOT automatically via inclusion here
768 */
769if (!isset($GLOBALS['THRIFT_ROOT'])) {
770 $GLOBALS['THRIFT_ROOT'] = dirname(__FILE__);
771}
772include_once $GLOBALS['THRIFT_ROOT'].'/protocol/TProtocol.php';
773include_once $GLOBALS['THRIFT_ROOT'].'/transport/TTransport.php';
Mark Sleedac78562007-02-21 07:35:03 +0000774
Mark Slee6e536442006-06-30 18:28:50 +0000775?>