blob: 867a8aa1afc499ec839855a668355d688db74e00 [file] [log] [blame]
<?php
/** For transport operations */
require_once THRIFT_ROOT.'/transport/TTransport.php';
/**
* Binary implementation of the Thrift protocol.
*
* @package thrift.protocol
* @author Mark Slee <mcslee@facebook.com>
*/
class TBinaryProtocol extends TProtocol {
public function writeStructBegin($out, $name) {
return 0;
}
public function writeStructEnd($out) {
return 0;
}
public function writeFieldBegin($out, $fieldName, $fieldType, $fieldId) {
return
$this->writeByte($out, $fieldType) +
$this->writeI32($out, $fieldId);
}
public function writeFieldEnd($out) {
return 0;
}
public function writeFieldStop($out) {
return
$this->writeByte($out, TType::STOP);
}
public function writeMapBegin($out, $keyType, $valType, $size) {
return
$this->writeByte($out, $keyType) +
$this->writeByte($out, $valType) +
$this->writeI32($out, $size);
}
public function writeMapEnd($out) {
return 0;
}
public function writeListBegin($out, $elemType, $size) {
return
$this->writeByte($out, $elemType) +
$this->writeI32($out, $size);
}
public function writeListEnd($out) {
return 0;
}
public function writeSetBegin($out, $elemType, $size) {
return
$this->writeByte($out, $elemType) +
$this->writeI32($out, $size);
}
public function writeSetEnd($out) {
return 0;
}
public function writeByte($out, $byte) {
$data = pack('c', $byte);
$out->write($data, 1);
return 1;
}
public function writeI32($out, $i32) {
$data = pack('l', $i32);
//if (!defined('BIG_ENDIAN')) {
$data = strrev($data);
//}
$out->write($data, 4);
return 4;
}
public function writeI64($out, $i64) {
$hi = $i64 >> 32;
$lo = $i64 & 0xFFFFFFFF;
if (!defined('BIG_ENDIAN')) {
$data = pack('N2', $hi, $lo);
} else {
$data = pack('N2', $lo, $hi);
}
$out->write($data, 8);
return 8;
}
public function writeString($out, $str) {
$len = strlen($str);
$result = $this->writeI32($out, $len);
$out->write($str, $len);
return $result + $len;
}
public function readStructBegin($in, &$name) {
$name = '';
return 0;
}
public function readStructEnd($in) {
return 0;
}
public function readFieldBegin($in, &$name, &$fieldType, &$fieldId) {
$result = $this->readByte($in, $fieldType);
if ($fieldType == TType::STOP) {
$fieldId = 0;
return $result;
}
$result += $this->readI32($in, $fieldId);
return $result;
}
public function readFieldEnd($in) {
return 0;
}
public function readMapBegin($in, &$keyType, &$valType, &$size) {
$result = $this->readByte($in, $keyType);
$result += $this->readByte($in, $valType);
$result += $this->readI32($in, $size);
return $result;
}
public function readMapEnd($in) {
return 0;
}
public function readListBegin($in, &$elemType, &$size) {
$result = $this->readByte($in, $elemType);
$result += $this->readI32($in, $size);
return $result;
}
public function readListEnd($in) {
return 0;
}
public function readSetBegin($in, &$elemType, &$size) {
$result = $this->readByte($in, $elemType);
$result += $this->readI32($in, $size);
return $result;
}
public function readSetEnd($in) {
return 0;
}
public function readByte($in, &$byte) {
$data = $in->readAll(1);
$arr = unpack('c', $data);
$byte = $arr[1];
return 1;
}
public function readI32($in, &$i32) {
$data = $in->readAll(4);
if (!defined('BIG_ENDIAN')) {
$data = strrev($data);
}
$arr = unpack('l', $data);
$i32 = $arr[1];
return 4;
}
public function readI64($in, &$i64) {
$data = $in->readAll(8);
$arr = unpack('N2', $data);
// Check for a negative
if ($arr[1] & 0x80000000) {
$arr[1] = $arr[1] ^ 0xFFFFFFFF;
$arr[2] = $arr[2] ^ 0xFFFFFFFF;
$i64 = 0 - $arr[1]*4294967296 - $arr[2] - 1;
} else {
$i64 = $arr[1]*4294967296 + $arr[2];
}
return 8;
}
public function readString($in, &$str) {
$result = $this->readI32($in, $len);
$str = $in->readAll($len);
return $result + $len;
}
}
?>