blob: 4c10babd631a7609050d78d6364c58bb29a0a61f [file] [log] [blame]
#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);
}