|  | #include "protocol/TBinaryProtocol.h" | 
|  | using namespace std; | 
|  |  | 
|  | string TBinaryProtocol::readFunction(TBuf& buf) const { | 
|  | // Let readString increment the buffer position | 
|  | return readString(buf); | 
|  | } | 
|  |  | 
|  | string TBinaryProtocol::writeFunction(const string& name, | 
|  | const string& args) const{ | 
|  | return writeString(name) + args; | 
|  | } | 
|  |  | 
|  | map<uint32_t, TBuf> TBinaryProtocol::readStruct(TBuf& buf) const { | 
|  | map<uint32_t, TBuf> fieldMap; | 
|  |  | 
|  | if (buf.len < 4) { | 
|  | return fieldMap; | 
|  | } | 
|  | uint32_t total_size = readU32(buf); | 
|  | if (buf.len < total_size) { | 
|  | // Data looks corrupt, we don't have that much, we will try to read what | 
|  | // we can but be sure not to go over | 
|  | total_size = buf.len; | 
|  | } | 
|  |  | 
|  | // Field headers are 8 bytes, 4 byte fid + 4 byte length | 
|  | while (total_size > 0 && buf.len > 8) { | 
|  | uint32_t fid  = readU32(buf); | 
|  | uint32_t flen = readU32(buf); | 
|  | if (flen > buf.len) { | 
|  | // flen corrupt, there isn't that much data left | 
|  | break; | 
|  | } | 
|  | fieldMap.insert(make_pair(fid, TBuf(buf.data, flen))); | 
|  | buf.data += flen; | 
|  | buf.len  -= flen; | 
|  | total_size -= 8 + flen; | 
|  | } | 
|  |  | 
|  | return fieldMap; | 
|  | } | 
|  |  | 
|  | string TBinaryProtocol::writeStruct(const map<uint32_t,string>& s) const { | 
|  | string result = ""; | 
|  | map<uint32_t,string>::const_iterator s_iter; | 
|  | for (s_iter = s.begin(); s_iter != s.end(); ++s_iter) { | 
|  | result += writeU32(s_iter->first); | 
|  | result += writeU32(s_iter->second.size()); | 
|  | result += s_iter->second; | 
|  | } | 
|  | return writeU32(result.size()) + result; | 
|  | } | 
|  |  | 
|  | string TBinaryProtocol::readString(TBuf& buf) const { | 
|  | uint32_t len = readU32(buf); | 
|  | if (len == 0) { | 
|  | return ""; | 
|  | } | 
|  | string result((const char*)(buf.data), len); | 
|  | buf.data += len; | 
|  | buf.len  -= len; | 
|  | return result; | 
|  | } | 
|  |  | 
|  | uint8_t TBinaryProtocol::readByte(TBuf& buf) const { | 
|  | if (buf.len == 0) { | 
|  | return 0; | 
|  | } | 
|  | uint8_t result = (uint8_t)buf.data[0]; | 
|  | buf.data += 1; | 
|  | buf.len  -= 1; | 
|  | return result; | 
|  | } | 
|  |  | 
|  | uint32_t TBinaryProtocol::readU32(TBuf& buf) const { | 
|  | if (buf.len < 4) { | 
|  | return 0; | 
|  | } | 
|  | uint32_t result = *(uint32_t*)buf.data; | 
|  | buf.data += 4; | 
|  | buf.len  -= 4; | 
|  | return result; | 
|  | } | 
|  |  | 
|  | int32_t TBinaryProtocol::readI32(TBuf& buf) const { | 
|  | if (buf.len < 4) { | 
|  | return 0; | 
|  | } | 
|  | int32_t result = *(int32_t*)buf.data; | 
|  | buf.data += 4; | 
|  | buf.len  -= 4; | 
|  | return result; | 
|  | } | 
|  |  | 
|  | uint64_t TBinaryProtocol::readU64(TBuf& buf) const { | 
|  | if (buf.len < 8) { | 
|  | return 0; | 
|  | } | 
|  | uint64_t result = *(uint64_t*)buf.data; | 
|  | buf.data += 8; | 
|  | buf.len  -= 8; | 
|  | return result; | 
|  | } | 
|  |  | 
|  | int64_t TBinaryProtocol::readI64(TBuf& buf) const { | 
|  | if (buf.len < 8) { | 
|  | return 0; | 
|  | } | 
|  | int64_t result = *(int64_t*)buf.data; | 
|  | buf.data += 8; | 
|  | buf.len  -= 8; | 
|  | return result; | 
|  | } | 
|  |  | 
|  | string TBinaryProtocol::writeString(const string& str) const { | 
|  | uint32_t size = str.size(); | 
|  | string result = string((const char*)&size, 4); | 
|  | return result + str; | 
|  | } | 
|  |  | 
|  | string TBinaryProtocol::writeByte(const uint8_t byte) const { | 
|  | return string((const char*)&byte, 1); | 
|  | } | 
|  |  | 
|  | string TBinaryProtocol::writeU32(const uint32_t u32) const { | 
|  | return string((const char*)&u32, 4); | 
|  | } | 
|  |  | 
|  | string TBinaryProtocol::writeI32(int32_t i32) const { | 
|  | return string((const char*)&i32, 4); | 
|  | } | 
|  |  | 
|  | string TBinaryProtocol::writeU64(uint64_t u64) const { | 
|  | return string((const char*)&u64, 8); | 
|  | } | 
|  |  | 
|  | string TBinaryProtocol::writeI64(int64_t i64) const { | 
|  | return string((const char*)&i64, 8); | 
|  | } |