"import java.util.HashMap;\n" +
"import java.util.HashSet;\n" +
"import com.facebook.thrift.*;\n" +
- "import com.facebook.thrift.types.*;\n" +
"import com.facebook.thrift.protocol.TString;\n\n";
}
f_enum <<
autogen_comment() <<
- java_package() <<
- "import com.facebook.thrift.types.Int32;" << endl << endl;
+ java_package() << endl;
f_enum <<
"public class " << tenum->get_name() << " ";
}
indent(f_enum) <<
- "public static final Int32 " << (*c_iter)->get_name() <<
- " = new Int32(" << value << ");" << endl;
+ "public static final int " << (*c_iter)->get_name() <<
+ " = " << value << ";" << endl;
}
scope_down(f_enum);
indent(f_service_) <<
"public " << function_signature(*f_iter) << " throws TException" << endl;
scope_up(f_service_);
+ indent(f_service_) <<
+ "send_" << funname << "(";
+
+ // Get the struct of function call params
+ t_struct* arg_struct = (*f_iter)->get_arglist();
+
+ // Declare the function arguments
+ const vector<t_field*>& fields = arg_struct->get_members();
+ vector<t_field*>::const_iterator fld_iter;
+ bool first = true;
+ for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
+ if (first) {
+ first = false;
+ } else {
+ f_service_ << ", ";
+ }
+ f_service_ << (*fld_iter)->get_name();
+ }
+ f_service_ << ");" << endl;
+
+ if (!(*f_iter)->is_async()) {
+ f_service_ << indent();
+ if (!(*f_iter)->get_returntype()->is_void()) {
+ f_service_ << "return ";
+ }
+ f_service_ <<
+ "recv_" << funname << "();" << endl;
+ }
+ scope_down(f_service_);
+ f_service_ << endl;
+
+ t_function send_function(g_program->get_void_type(),
+ string("send_") + (*f_iter)->get_name(),
+ (*f_iter)->get_arglist());
+
+ // Open function
+ indent(f_service_) <<
+ "public " << function_signature(&send_function) << " throws TException" << endl;
+ scope_up(f_service_);
// Serialize the request
f_service_ <<
"new TField(\"name\", TType.STRING, 0));" << endl <<
indent() <<
"_oprot.writeString(_otrans, " <<
- "new TString(\"" << funname << "\"));" << endl <<
+ "\"" << funname << "\");" << endl <<
indent() <<
"_oprot.writeFieldEnd(_otrans);" << endl <<
indent() <<
indent(f_service_) <<
"_otrans.flush();" << endl;
- // Read the response
- t_struct result_struct((*f_iter)->get_name() + "_result");
- t_field result_field((*f_iter)->get_returntype(), "_result");
-
- // Add a field to the return struct if non void
- if (!(*f_iter)->get_returntype()->is_void()) {
- indent(f_service_) <<
- declare_field(&result_field, true) << endl;
- result_struct.append(&result_field);
- }
-
- // Deserialize response struct
- generate_deserialize_struct(&result_struct);
+ scope_down(f_service_);
+ f_service_ << endl;
- // Careful, only return _result if not a void function
- if (!(*f_iter)->get_returntype()->is_void()) {
+ if (!(*f_iter)->is_async()) {
+ t_struct noargs;
+ t_function recv_function((*f_iter)->get_returntype(),
+ string("recv_") + (*f_iter)->get_name(),
+ &noargs);
+ // Open function
indent(f_service_) <<
- "return _result;" << endl;
- } else {
- indent(f_service_) <<
- "return;" << endl;
+ "public " << function_signature(&recv_function) << " throws TException" << endl;
+ scope_up(f_service_);
+
+ // Read the response
+ t_struct result_struct((*f_iter)->get_name() + "_result");
+ t_field result_field((*f_iter)->get_returntype(), "_result");
+
+ // Add a field to the return struct if non void
+ if (!(*f_iter)->get_returntype()->is_void()) {
+ indent(f_service_) <<
+ declare_field(&result_field, true) << endl;
+ result_struct.append(&result_field);
+ }
+
+ // Deserialize response struct
+ generate_deserialize_struct(&result_struct);
+
+ // Careful, only return _result if not a void function
+ if (!(*f_iter)->get_returntype()->is_void()) {
+ indent(f_service_) <<
+ "return _result;" << endl;
+ } else {
+ indent(f_service_) <<
+ "return;" << endl;
+ }
+
+ // Close function
+ scope_down(f_service_);
+ f_service_ << endl;
}
-
- // Close function
- scope_down(f_service_);
- f_service_ << endl;
}
indent_down();
f_service_ <<
indent() <<
- "TString _fname = new TString();" << endl <<
+ "String _fname;" << endl <<
indent() <<
- "TStruct _struct = new TStruct();" << endl <<
+ "TStruct _struct;" << endl <<
indent() <<
- "TField _field = new TField();" << endl <<
+ "TField _field;" << endl <<
indent() <<
- "_iprot.readStructBegin(_itrans, _struct);" << endl <<
+ "_struct = _iprot.readStructBegin(_itrans);" << endl <<
indent() <<
- "_iprot.readFieldBegin(_itrans, _field);" << endl <<
+ "_field = _iprot.readFieldBegin(_itrans);" << endl <<
indent() <<
- "_iprot.readString(_itrans, _fname);" << endl <<
+ "_fname = _iprot.readString(_itrans);" << endl <<
indent() <<
"_iprot.readFieldEnd(_itrans);" << endl <<
indent() <<
- "_iprot.readFieldBegin(_itrans, _field);" << endl;
+ "_field = _iprot.readFieldBegin(_itrans);" << endl;
bool first = true;
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
first = false;
}
f_service_ <<
- "if (_fname.value.equals(\"" << (*f_iter)->get_name() <<"\")) {" << endl;
+ "if (_fname.equals(\"" << (*f_iter)->get_name() <<"\")) {" << endl;
indent_up();
indent(f_service_) <<
"process_" << (*f_iter)->get_name() <<
indent() <<
"_iprot.readFieldEnd(_itrans);" << endl <<
indent() <<
- "_iprot.readFieldBegin(_itrans, _field);" << endl <<
+ "_field = _iprot.readFieldBegin(_itrans);" << endl <<
indent() <<
"_iprot.readStructEnd(_itrans);" << endl <<
indent() <<
} else if (type->is_base_type() || type->is_enum()) {
indent(f_service_) <<
- "_iprot.";
+ name << " = _iprot.";
if (type->is_base_type()) {
t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
name;
break;
case t_base_type::TYPE_STRING:
- f_service_ << "readString(_itrans, " << name << ");";
+ f_service_ << "readString(_itrans);";
break;
case t_base_type::TYPE_BYTE:
- f_service_ << "readByte(_itrans, " << name << ");";
+ f_service_ << "readByte(_itrans);";
break;
case t_base_type::TYPE_I32:
- f_service_ << "readI32(_itrans, " << name << ");";
+ f_service_ << "readI32(_itrans);";
break;
case t_base_type::TYPE_U32:
- f_service_ << "readU32(_itrans, " << name << ");";
+ f_service_ << "readU32(_itrans);";
break;
case t_base_type::TYPE_I64:
- f_service_ << "readI64(_itrans, " << name << ");";
+ f_service_ << "readI64(_itrans);";
break;
case t_base_type::TYPE_U64:
- f_service_ << "readU64(_itrans, " << name << ");";
+ f_service_ << "readU64(_itrans);";
break;
default:
throw "compiler error: no C++ name for base type " + tbase;
}
} else if (type->is_enum()) {
- f_service_ << "readI32(_itrans, " << name << ");";
+ f_service_ << "readI32(_itrans);";
}
f_service_ <<
endl;
// Declare stack tmp variables
f_service_ <<
- indent() << "TStruct " << _struct << " = new TStruct();" << endl <<
- indent() << "TField " << _field << " = new TField();" << endl <<
- indent() << "_iprot.readStructBegin(_itrans, " << _struct << ");" << endl;
+ indent() << "TField " << _field << ";" << endl <<
+ indent() << "TStruct " << _struct << " = _iprot.readStructBegin(_itrans);" << endl;
// Loop over reading in fields
indent(f_service_) <<
// Read beginning field marker
indent(f_service_) <<
- "_iprot.readFieldBegin(_itrans, " << _field << ");" << endl;
+ _field << " = _iprot.readFieldBegin(_itrans);" << endl;
// Check for field STOP marker and break
indent(f_service_) <<
- "if (" << _field << ".type.equals(TType.STOP)) { " << endl;
+ "if (" << _field << ".type == TType.STOP) { " << endl;
indent_up();
indent(f_service_) <<
"break;" << endl;
// Switch statement on the field we are reading
indent(f_service_) <<
- "switch ((int)" << _field << ".id.get())" << endl;
+ "switch ((int)" << _field << ".id)" << endl;
scope_up(f_service_);
// Declare variables, read header
if (ttype->is_map()) {
f_service_ <<
- indent() << "TMap " << obj << " = new TMap();" << endl <<
- indent() << "_iprot.readMapBegin(_itrans, " << obj << ");" << endl;
+ indent() << "TMap " << obj << " = _iprot.readMapBegin(_itrans);" << endl;
} else if (ttype->is_set()) {
f_service_ <<
- indent() << "TSet " << obj << " = new TSet();" << endl <<
- indent() << "_iprot.readSetBegin(_itrans, " << obj << ");" << endl;
+ indent() << "TSet " << obj << " = _iprot.readSetBegin(_itrans);" << endl;
} else if (ttype->is_list()) {
f_service_ <<
- indent() << "TList " << obj << " = new TList();" << endl <<
- indent() << "_iprot.readListBegin(_itrans, " << obj << ");" << endl;
+ indent() << "TList " << obj << " = _iprot.readListBegin(_itrans);" << endl;
}
string i = tmp("_i");
indent(f_service_) <<
"for (int " << i << " = 0; " <<
- i << " < " << obj << ".size.get()" << "; " <<
+ i << " < " << obj << ".size" << "; " <<
"++" << i << ")" << endl;
scope_up(f_service_);
indent() <<
_field << ".type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl <<
indent() <<
- _field << ".id.set(" << (*f_iter)->get_key() << ");" << endl <<
+ _field << ".id = " << (*f_iter)->get_key() << ";" << endl <<
indent() <<
"_oprot.writeFieldBegin(_otrans, " << _field << ");" << endl;
// Write field contents
* Returns a Java type name
*
* @param ttype The type
+ * @param container Is the type going inside a container?
*/
-string t_java_generator::type_name(t_type* ttype) {
+string t_java_generator::type_name(t_type* ttype, bool in_container) {
// In Java typedefs are just resolved to their real type
while (ttype->is_typedef()) {
ttype = ((t_typedef*)ttype)->get_type();
}
if (ttype->is_base_type()) {
- return base_type_name(((t_base_type*)ttype)->get_base());
+ return base_type_name(((t_base_type*)ttype)->get_base(), in_container);
} else if (ttype->is_enum()) {
- return "Int32";
+ return (in_container ? "Integer" : "int");
} else if (ttype->is_map()) {
t_map* tmap = (t_map*) ttype;
return "HashMap<" +
- type_name(tmap->get_key_type()) + "," +
- type_name(tmap->get_val_type()) + ">";
+ type_name(tmap->get_key_type(), true) + "," +
+ type_name(tmap->get_val_type(), true) + ">";
} else if (ttype->is_set()) {
t_set* tset = (t_set*) ttype;
- return "HashSet<" + type_name(tset->get_elem_type()) + ">";
+ return "HashSet<" + type_name(tset->get_elem_type(), true) + ">";
} else if (ttype->is_list()) {
t_list* tlist = (t_list*) ttype;
- return "ArrayList<" + type_name(tlist->get_elem_type()) + ">";
+ return "ArrayList<" + type_name(tlist->get_elem_type(), true) + ">";
} else {
return ttype->get_name();
}
* Returns the C++ type that corresponds to the thrift type.
*
* @param tbase The base type
+ * @param container Is it going in a Java container?
*/
-string t_java_generator::base_type_name(t_base_type::t_base tbase) {
+string t_java_generator::base_type_name(t_base_type::t_base tbase,
+ bool in_container) {
switch (tbase) {
case t_base_type::TYPE_VOID:
return "void";
case t_base_type::TYPE_STRING:
- return "TString";
+ return "String";
case t_base_type::TYPE_BYTE:
- return "UInt8";
+ return "byte";
case t_base_type::TYPE_I32:
- return "Int32";
case t_base_type::TYPE_U32:
- return "UInt32";
+ return (in_container ? "Integer" : "int");
case t_base_type::TYPE_I64:
- return "Int64";
case t_base_type::TYPE_U64:
- return "UInt64";
+ return (in_container ? "Long" : "long");
default:
throw "compiler error: no C++ name for base type " + tbase;
}
// TODO(mcslee): do we ever need to initialize the field?
string result = type_name(tfield->get_type()) + " " + tfield->get_name();
if (init) {
- result += " = new " + type_name(tfield->get_type()) + "()";
+ t_type* ttype = tfield->get_type();
+ while (ttype->is_typedef()) {
+ ttype = ((t_typedef*)ttype)->get_type();
+ }
+ if (ttype->is_base_type()) {
+ t_base_type::t_base tbase = ((t_base_type*)ttype)->get_base();
+ switch (tbase) {
+ case t_base_type::TYPE_VOID:
+ throw "NO T_VOID CONSTRUCT";
+ case t_base_type::TYPE_STRING:
+ result += " = \"\"";
+ break;
+ case t_base_type::TYPE_BYTE:
+ case t_base_type::TYPE_I32:
+ case t_base_type::TYPE_U32:
+ case t_base_type::TYPE_I64:
+ case t_base_type::TYPE_U64:
+ result += " = 0";
+ break;
+ }
+
+ } else if (ttype->is_enum()) {
+ result += " = 0";
+ } else {
+ result += " = new " + type_name(tfield->get_type()) + "()";
+ }
}
return result + ";";
}
php_includes();
f_service_ <<
- "require_once '" << service_name_ << "Types.php';" << endl << endl;
+ "require_once dirname(__FILE__).'/" << service_name_ << "Types.php';" << endl << endl;
// Generate the three main parts of the service (well, two for now in PHP)
generate_service_interface(tservice);
// Private members
f_service_ <<
indent() << "private $_itrans = null;" << endl <<
- indent() << "private $_otrans = null;" << endl <<
- indent() << "private $_iprot = null;" << endl <<
- indent() << "private $_oprot = null;" << endl << endl;
+ indent() << "private $_otrans = null;" << endl << endl;
+
+ if (!binary_inline_) {
+ f_service_ <<
+ indent() << "private $_iprot = null;" << endl <<
+ indent() << "private $_oprot = null;" << endl << endl;
+ }
// Constructor function
f_service_ <<
indent() << "public function __construct() {" << endl <<
indent() << " $argv = func_get_args();" << endl <<
- indent() << " $argc = count($argv);" << endl <<
- indent() << " if ($argc == 2) {" << endl <<
- indent() << " $this->_itrans = $this->_otrans = $argv[0];" << endl <<
- indent() << " $this->_iprot = $this->_oprot = $argv[1];" << endl <<
- indent() << " } else if ($argc == 4) {" << endl <<
- indent() << " $this->_itrans = $argv[0];" << endl <<
- indent() << " $this->_otrans = $argv[1];" << endl <<
- indent() << " $this->_iprot = $argv[2];" << endl <<
- indent() << " $this->_oprot = $argv[3];" << endl <<
- indent() << " }" << endl <<
+ indent() << " $argc = count($argv);" << endl;
+
+ if (binary_inline_) {
+ f_service_ <<
+ indent() << " if ($argc == 1) {" << endl <<
+ indent() << " $this->_itrans = $this->_otrans = $argv[0];" << endl <<
+ indent() << " } else if ($argc == 2) {" << endl <<
+ indent() << " $this->_itrans = $argv[0];" << endl <<
+ indent() << " $this->_otrans = $argv[1];" << endl <<
+ indent() << " }" << endl;
+ } else {
+ f_service_ <<
+ indent() << " if ($argc == 2) {" << endl <<
+ indent() << " $this->_itrans = $this->_otrans = $argv[0];" << endl <<
+ indent() << " $this->_iprot = $this->_oprot = $argv[1];" << endl <<
+ indent() << " } else if ($argc == 4) {" << endl <<
+ indent() << " $this->_itrans = $argv[0];" << endl <<
+ indent() << " $this->_otrans = $argv[1];" << endl <<
+ indent() << " $this->_iprot = $argv[2];" << endl <<
+ indent() << " $this->_oprot = $argv[3];" << endl <<
+ indent() << " }" << endl;
+ }
+ f_service_ <<
indent() << "}" << endl << endl;
// Generate client method implementations
"public function " << function_signature(*f_iter) << endl;
scope_up(f_service_);
- // Serialize the request
- f_service_ <<
- indent() <<
- "$this->_oprot->writeStructBegin($this->_otrans, 'function');" << endl <<
- indent() <<
- "$this->_oprot->writeFieldBegin($this->_otrans, 'name', TType::STRING, 0);" << endl <<
- indent() <<
- "$this->_oprot->writeString($this->_otrans, '" << funname << "');" << endl <<
- indent() <<
- "$this->_oprot->writeFieldEnd($this->_otrans);" << endl <<
- indent() <<
- "$this->_oprot->writeFieldBegin($this->_otrans, 'args', TType::STRUCT, 1);" << endl;
+ // Serialize the request header
+ if (binary_inline_) {
+ f_service_ <<
+ indent() << "$_output = '';" << endl <<
+ indent() << "$_output .= pack('c', TType::STRING);" << endl <<
+ indent() << "$_output .= strrev(pack('l', 0));" << endl <<
+ indent() << "$_output .= strrev(pack('l', strlen('" << funname << "')));" << endl <<
+ indent() << "$_output .= '" << funname << "';" << endl <<
+ indent() << "$_output .= pack('c', TType::STRUCT);" << endl <<
+ indent() << "$_output .= strrev(pack('l', 1));" << endl;
+ } else {
+ f_service_ <<
+ indent() << "$this->_oprot->writeStructBegin($this->_otrans, 'function');" << endl <<
+ indent() << "$this->_oprot->writeFieldBegin($this->_otrans, 'name', TType::STRING, 0);" << endl <<
+ indent() << "$this->_oprot->writeString($this->_otrans, '" << funname << "');" << endl <<
+ indent() << "$this->_oprot->writeFieldEnd($this->_otrans);" << endl <<
+ indent() << "$this->_oprot->writeFieldBegin($this->_otrans, 'args', TType::STRUCT, 1);" << endl;
+ }
+
+ // Serialize request arguments
generate_serialize_struct((*f_iter)->get_arglist());
- f_service_ <<
- indent() <<
- "$this->_oprot->writeFieldEnd($this->_otrans);" << endl <<
- indent() <<
- "$this->_oprot->writeFieldStop($this->_otrans);" << endl <<
- indent() <<
- "$this->_oprot->writeStructEnd($this->_otrans);" << endl;
-
+
+ // Write to the stream
+ if (binary_inline_) {
+ f_service_ <<
+ indent() << "$_output .= pack('c', TType::STOP);" << endl <<
+ indent() << "$this->_otrans->write($_output);" << endl;
+ } else {
+ f_service_ <<
+ indent() << "$this->_oprot->writeFieldEnd($this->_otrans);" << endl <<
+ indent() << "$this->_oprot->writeFieldStop($this->_otrans);" << endl <<
+ indent() << "$this->_oprot->writeStructEnd($this->_otrans);" << endl;
+ }
+
// Flush the request
indent(f_service_) <<
"$this->_otrans->flush();" << endl;
generate_deserialize_container(tfield->get_type(), name);
} else if (type->is_base_type() || type->is_enum()) {
- indent(f_service_) <<
- "$this->_iprot->";
-
- if (type->is_base_type()) {
- t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
- switch (tbase) {
- case t_base_type::TYPE_VOID:
- throw "compiler error: cannot serialize void field in a struct: " +
- name;
- break;
- case t_base_type::TYPE_STRING:
- f_service_ << "readString($this->_itrans, $" << name << ");";
- break;
- case t_base_type::TYPE_BYTE:
- f_service_ << "readByte($this->_itrans, $" << name << ");";
- break;
- case t_base_type::TYPE_I32:
+ if (binary_inline_) {
+ if (type->is_base_type()) {
+ t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
+ switch (tbase) {
+ case t_base_type::TYPE_VOID:
+ throw "compiler error: cannot serialize void field in a struct: " +
+ name;
+ break;
+ case t_base_type::TYPE_STRING:
+ f_service_ <<
+ indent() << "$_len = unpack('l', strrev($this->_itrans->readAll(4)));" << endl <<
+ indent() << "$_len = $_len[1];" << endl <<
+ indent() << "$" << name << " = $this->_itrans->readAll($_len);" << endl;
+ break;
+ case t_base_type::TYPE_BYTE:
+ f_service_ <<
+ indent() << "$" << name << " = unpack('c', $this->_itrans->readAll(1));" << endl <<
+ indent() << "$" << name << " = $" << name << "[1];" << endl;
+ break;
+ case t_base_type::TYPE_I32:
+ f_service_ <<
+ indent() << "$" << name << " = unpack('l', strrev($this->_itrans->readAll(4)));" << endl <<
+ indent() << "$" << name << " = $" << name << "[1];" << endl;
+ break;
+ case t_base_type::TYPE_U32:
+ f_service_ << "readU32($this->_itrans, $" << name << ");";
+ break;
+ case t_base_type::TYPE_I64:
+ f_service_ <<
+ indent() << "$_arr = unpack('N2', $this->_itrans->readAll(8));" << endl <<
+ indent() << "if ($_arr[1] & 0x80000000) {" << endl <<
+ indent() << " $_arr[1] = $_arr[1] ^ 0xFFFFFFFF;" << endl <<
+ indent() << " $_arr[2] = $_arr[2] ^ 0xFFFFFFFF;" << endl <<
+ indent() << " $" << name << " = 0 - $_arr[1]*4294967296 - $_arr[2] - 1;" << endl <<
+ indent() << "} else {" << endl <<
+ indent() << " $" << name << " = $_arr[1]*4294967296 + $_arr[2];" << endl <<
+ indent() << "}" << endl;
+ break;
+ case t_base_type::TYPE_U64:
+ f_service_ << "readU64($this->_itrans, $" << name << ");";
+ break;
+ default:
+ throw "compiler error: no C++ name for base type " + tbase;
+ }
+ } else if (type->is_enum()) {
+ f_service_ <<
+ indent() << "$" << name << " = unpack('l', strrev($this->_itrans->readAll(4)));" << endl <<
+ indent() << "$" << name << " = $" << name << "[1];" << endl;
+ }
+
+ } else {
+
+ indent(f_service_) <<
+ "$this->_iprot->";
+
+ if (type->is_base_type()) {
+ t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
+ switch (tbase) {
+ case t_base_type::TYPE_VOID:
+ throw "compiler error: cannot serialize void field in a struct: " +
+ name;
+ break;
+ case t_base_type::TYPE_STRING:
+ f_service_ << "readString($this->_itrans, $" << name << ");";
+ break;
+ case t_base_type::TYPE_BYTE:
+ f_service_ << "readByte($this->_itrans, $" << name << ");";
+ break;
+ case t_base_type::TYPE_I32:
+ f_service_ << "readI32($this->_itrans, $" << name << ");";
+ break;
+ case t_base_type::TYPE_U32:
+ f_service_ << "readU32($this->_itrans, $" << name << ");";
+ break;
+ case t_base_type::TYPE_I64:
+ f_service_ << "readI64($this->_itrans, $" << name << ");";
+ break;
+ case t_base_type::TYPE_U64:
+ f_service_ << "readU64($this->_itrans, $" << name << ");";
+ break;
+ default:
+ throw "compiler error: no C++ name for base type " + tbase;
+ }
+ } else if (type->is_enum()) {
f_service_ << "readI32($this->_itrans, $" << name << ");";
- break;
- case t_base_type::TYPE_U32:
- f_service_ << "readU32($this->_itrans, $" << name << ");";
- break;
- case t_base_type::TYPE_I64:
- f_service_ << "readI64($this->_itrans, $" << name << ");";
- break;
- case t_base_type::TYPE_U64:
- f_service_ << "readU64($this->_itrans, $" << name << ");";
- break;
- default:
- throw "compiler error: no C++ name for base type " + tbase;
}
- } else if (type->is_enum()) {
- f_service_ << "readI32($this->_itrans, $" << name << ");";
+ f_service_ << endl;
}
- f_service_ <<
- endl;
+
} else {
printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
tfield->get_name().c_str(), type_name(type).c_str());
- }
+ }
}
/**
string ftype = tmp("_ftype");
string fname = tmp("_name");
- // Declare stack tmp variables
+ t_field ffid(g_program->get_i32_type(), fid);
+ t_field fftype(g_program->get_byte_type(), ftype);
+
f_service_ <<
indent() << "$" << fname << " = null;" << endl <<
indent() << "$" << ftype << " = null;" << endl <<
- indent() << "$" << fid << " = 0;" << endl <<
- indent() << "$this->_iprot->readStructBegin($this->_itrans, $" << fname << ");" << endl;
-
+ indent() << "$" << fid << " = 0;" << endl;
+
+ // Declare stack tmp variables
+ if (!binary_inline_) {
+ f_service_ <<
+ indent() << "$this->_iprot->readStructBegin($this->_itrans, $" << fname << ");" << endl;
+ }
+
// Loop over reading in fields
indent(f_service_) <<
"while (true)" << endl;
scope_up(f_service_);
// Read beginning field marker
- indent(f_service_) <<
- "$this->_iprot->readFieldBegin($this->_itrans, " <<
- "$" << fname << ", $" << ftype << ", $" << fid << ");" << endl;
-
- // Check for field STOP marker and break
- indent(f_service_) <<
- "if ($" << ftype << " == TType::STOP) { " << endl;
- indent_up();
- indent(f_service_) <<
- "break;" << endl;
- indent_down();
- indent(f_service_) <<
- "}" << endl;
+ if (binary_inline_) {
+ generate_deserialize_field(&fftype);
+ f_service_ <<
+ indent() << "if ($" << ftype << " == TType::STOP) {" << endl <<
+ indent() << " break;" << endl <<
+ indent() << "}" << endl;
+ generate_deserialize_field(&ffid);
+ } else {
+ indent(f_service_) <<
+ "$this->_iprot->readFieldBegin($this->_itrans, " <<
+ "$" << fname << ", $" << ftype << ", $" << fid << ");" << endl;
+
+ // Check for field STOP marker and break
+ indent(f_service_) <<
+ "if ($" << ftype << " == TType::STOP) {" << endl;
+ indent_up();
+ indent(f_service_) <<
+ "break;" << endl;
+ indent_down();
+ indent(f_service_) <<
+ "}" << endl;
+ }
+
// Switch statement on the field we are reading
indent(f_service_) <<
"switch ($" << fid << ")" << endl;
indent() << " break;" << endl;
scope_down(f_service_);
-
- // Read field end marker
- indent(f_service_) <<
- "$this->_iprot->readFieldEnd($this->_itrans);" << endl;
+
+ if (!binary_inline_) {
+ // Read field end marker
+ indent(f_service_) <<
+ "$this->_iprot->readFieldEnd($this->_itrans);" << endl;
+ }
scope_down(f_service_);
-
- indent(f_service_) <<
- "$this->_iprot->readStructEnd($this->_itrans);" << endl;
+
+ if (!binary_inline_) {
+ indent(f_service_) <<
+ "$this->_iprot->readStructEnd($this->_itrans);" << endl;
+ }
scope_down(f_service_);
}
string vtype = tmp("_vtype");
string etype = tmp("_etype");
+ t_field fsize(g_program->get_i32_type(), size);
+ t_field fktype(g_program->get_byte_type(), ktype);
+ t_field fvtype(g_program->get_byte_type(), vtype);
+ t_field fetype(g_program->get_byte_type(), etype);
+
indent(f_service_) <<
"$" << size << " = 0;" << endl;
if (ttype->is_map()) {
f_service_ <<
indent() << "$" << ktype << " = 0;" << endl <<
- indent() << "$" << vtype << " = 0;" << endl <<
- indent() << "$this->_iprot->readMapBegin($this->_itrans, " <<
- "$" << ktype << ", $" << vtype << ", $" << size << ");" << endl;
+ indent() << "$" << vtype << " = 0;" << endl;
+ if (binary_inline_) {
+ generate_deserialize_field(&fktype);
+ generate_deserialize_field(&fvtype);
+ generate_deserialize_field(&fsize);
+ } else {
+ f_service_ <<
+ indent() << "$this->_iprot->readMapBegin($this->_itrans, " <<
+ "$" << ktype << ", $" << vtype << ", $" << size << ");" << endl;
+ }
} else if (ttype->is_set()) {
- f_service_ <<
- indent() << "$" << etype << " = 0;" << endl <<
- indent() << "$this->_iprot->readSetBegin($this->_itrans, " <<
- "$" << etype << ", $" << size << ");" << endl;
+ if (binary_inline_) {
+ generate_deserialize_field(&fetype);
+ generate_deserialize_field(&fsize);
+ } else {
+ f_service_ <<
+ indent() << "$" << etype << " = 0;" << endl <<
+ indent() << "$this->_iprot->readSetBegin($this->_itrans, " <<
+ "$" << etype << ", $" << size << ");" << endl;
+ }
} else if (ttype->is_list()) {
- f_service_ <<
- indent() << "$" << etype << " = 0;" << endl <<
- indent() << "$this->_iprot->readListBegin($this->_itrans, " <<
- "$" << etype << ", $" << size << ");" << endl;
+ if (binary_inline_) {
+ generate_deserialize_field(&fetype);
+ generate_deserialize_field(&fsize);
+ } else {
+ f_service_ <<
+ indent() << "$" << etype << " = 0;" << endl <<
+ indent() << "$this->_iprot->readListBegin($this->_itrans, " <<
+ "$" << etype << ", $" << size << ");" << endl;
+ }
}
// For loop iterates over elements
scope_down(f_service_);
- // Read container end
- if (ttype->is_map()) {
- indent(f_service_) << "$this->_iprot->readMapEnd($this->_itrans);" << endl;
- } else if (ttype->is_set()) {
- indent(f_service_) << "$this->_iprot->readSetEnd($this->_itrans);" << endl;
- } else if (ttype->is_list()) {
- indent(f_service_) << "$this->_iprot->readListEnd($this->_itrans);" << endl;
+ if (!binary_inline_) {
+ // Read container end
+ if (ttype->is_map()) {
+ indent(f_service_) << "$this->_iprot->readMapEnd($this->_itrans);" << endl;
+ } else if (ttype->is_set()) {
+ indent(f_service_) << "$this->_iprot->readSetEnd($this->_itrans);" << endl;
+ } else if (ttype->is_list()) {
+ indent(f_service_) << "$this->_iprot->readListEnd($this->_itrans);" << endl;
+ }
}
scope_down(f_service_);
} else if (type->is_base_type() || type->is_enum()) {
string name = prefix + tfield->get_name();
- indent(f_service_) <<
- "$this->_oprot->";
-
- if (type->is_base_type()) {
- t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
- switch (tbase) {
- case t_base_type::TYPE_VOID:
- throw
- "compiler error: cannot serialize void field in a struct: " + name;
- break;
- case t_base_type::TYPE_STRING:
- f_service_ << "writeString($this->_otrans, $" << name << ");";
- break;
- case t_base_type::TYPE_BYTE:
- f_service_ << "writeByte($this->_otrans, $" << name << ");";
- break;
- case t_base_type::TYPE_I32:
+
+ if (binary_inline_) {
+ if (type->is_base_type()) {
+ t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
+ switch (tbase) {
+ case t_base_type::TYPE_VOID:
+ throw
+ "compiler error: cannot serialize void field in a struct: " + name;
+ break;
+ case t_base_type::TYPE_STRING:
+ f_service_ <<
+ indent() << "$_output .= strrev(pack('l', strlen($" << name << ")));" << endl <<
+ indent() << "$_output .= $" << name << ";" << endl;
+ break;
+ case t_base_type::TYPE_BYTE:
+ f_service_ <<
+ indent() << "$_output .= pack('c', $" << name << ");" << endl;
+ break;
+ case t_base_type::TYPE_I32:
+ f_service_ <<
+ indent() << "$_output .= strrev(pack('l', $" << name << "));" << endl;
+ break;
+ case t_base_type::TYPE_U32:
+ f_service_ <<
+ indent() << "writeU32($this->_otrans, $" << name << ");" << endl;
+ break;
+ case t_base_type::TYPE_I64:
+ f_service_ <<
+ indent() << "$_output .= pack('N2', $" << name << " >> 32, $" << name << " & 0xFFFFFFFF);" << endl;
+ break;
+ case t_base_type::TYPE_U64:
+ f_service_ << "writeU64($this->_otrans, $" << name << ");";
+ break;
+ default:
+ throw "compiler error: no C++ name for base type " + tbase;
+ }
+ } else if (type->is_enum()) {
+ f_service_ <<
+ indent() << "$_output .= strrev(pack('l', $" << name << "));" << endl;
+ }
+ } else {
+
+ indent(f_service_) <<
+ "$this->_oprot->";
+
+ if (type->is_base_type()) {
+ t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
+ switch (tbase) {
+ case t_base_type::TYPE_VOID:
+ throw
+ "compiler error: cannot serialize void field in a struct: " + name;
+ break;
+ case t_base_type::TYPE_STRING:
+ f_service_ << "writeString($this->_otrans, $" << name << ");";
+ break;
+ case t_base_type::TYPE_BYTE:
+ f_service_ << "writeByte($this->_otrans, $" << name << ");";
+ break;
+ case t_base_type::TYPE_I32:
+ f_service_ << "writeI32($this->_otrans, $" << name << ");";
+ break;
+ case t_base_type::TYPE_U32:
+ f_service_ << "writeU32($this->_otrans, $" << name << ");";
+ break;
+ case t_base_type::TYPE_I64:
+ f_service_ << "writeI64($this->_otrans, $" << name << ");";
+ break;
+ case t_base_type::TYPE_U64:
+ f_service_ << "writeU64($this->_otrans, $" << name << ");";
+ break;
+ default:
+ throw "compiler error: no C++ name for base type " + tbase;
+ }
+ } else if (type->is_enum()) {
f_service_ << "writeI32($this->_otrans, $" << name << ");";
- break;
- case t_base_type::TYPE_U32:
- f_service_ << "writeU32($this->_otrans, $" << name << ");";
- break;
- case t_base_type::TYPE_I64:
- f_service_ << "writeI64($this->_otrans, $" << name << ");";
- break;
- case t_base_type::TYPE_U64:
- f_service_ << "writeU64($this->_otrans, $" << name << ");";
- break;
- default:
- throw "compiler error: no C++ name for base type " + tbase;
}
- } else if (type->is_enum()) {
- f_service_ << "writeI32($this->_otrans, $" << name << ");";
+ f_service_ << endl;
}
- f_service_ << endl;
} else {
printf("DO NOT KNOW HOW TO SERIALIZE FIELD '%s%s' TYPE '%s'\n",
prefix.c_str(),
vector<t_field*>::const_iterator f_iter;
scope_up(f_service_);
- indent(f_service_) <<
- "$this->_oprot->writeStructBegin($this->_otrans, '" << name << "');" << endl;
+
+ if (!binary_inline_) {
+ indent(f_service_) <<
+ "$this->_oprot->writeStructBegin($this->_otrans, '" << name << "');" << endl;
+ }
+
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
// Write field header
- indent(f_service_) <<
- "$this->_oprot->writeFieldBegin($this->_otrans, " <<
- "'" << (*f_iter)->get_name() << "', " <<
- type_to_enum((*f_iter)->get_type()) << ", " <<
- (*f_iter)->get_key() << ");" << endl;
+ if (binary_inline_) {
+ f_service_ <<
+ indent() << "$_output .= pack('c', " << type_to_enum((*f_iter)->get_type()) << ");" << endl <<
+ indent() << "$_output .= strrev(pack('l', " << (*f_iter)->get_key() << "));" << endl;
+ } else {
+ indent(f_service_) <<
+ "$this->_oprot->writeFieldBegin($this->_otrans, " <<
+ "'" << (*f_iter)->get_name() << "', " <<
+ type_to_enum((*f_iter)->get_type()) << ", " <<
+ (*f_iter)->get_key() << ");" << endl;
+ }
+
// Write field contents
generate_serialize_field(*f_iter, prefix);
+
// Write field closer
- indent(f_service_) <<
- "$this->_oprot->writeFieldEnd($this->_otrans);" << endl;
+ if (binary_inline_) {
+ } else {
+ indent(f_service_) <<
+ "$this->_oprot->writeFieldEnd($this->_otrans);" << endl;
+ }
+ }
+
+ if (binary_inline_) {
+ f_service_ <<
+ indent() << "$_output .= pack('c', TType::STOP);" << endl;
+ } else {
+ // Write the struct map
+ f_service_ <<
+ indent() << "$this->_oprot->writeFieldStop($this->_otrans);" << endl <<
+ indent() << "$this->_oprot->writeStructEnd($this->_otrans);" << endl;
}
- // Write the struct map
- f_service_ <<
- indent() << "$this->_oprot->writeFieldStop($this->_otrans);" << endl <<
- indent() << "$this->_oprot->writeStructEnd($this->_otrans);" << endl;
scope_down(f_service_);
}
scope_up(f_service_);
if (ttype->is_map()) {
- indent(f_service_) <<
- "$this->_oprot->writeMapBegin($this->_otrans, " <<
- type_to_enum(((t_map*)ttype)->get_key_type()) << ", " <<
- type_to_enum(((t_map*)ttype)->get_val_type()) << ", " <<
- "count($" << prefix << "));" << endl;
+ if (binary_inline_) {
+ f_service_ <<
+ indent() << "$_output .= pack('c', " << type_to_enum(((t_map*)ttype)->get_key_type()) << ");" << endl <<
+ indent() << "$_output .= pack('c', " << type_to_enum(((t_map*)ttype)->get_val_type()) << ");" << endl <<
+ indent() << "$_output .= strrev(pack('l', count($" << prefix << ")));" << endl;
+ } else {
+ indent(f_service_) <<
+ "$this->_oprot->writeMapBegin($this->_otrans, " <<
+ type_to_enum(((t_map*)ttype)->get_key_type()) << ", " <<
+ type_to_enum(((t_map*)ttype)->get_val_type()) << ", " <<
+ "count($" << prefix << "));" << endl;
+ }
} else if (ttype->is_set()) {
- indent(f_service_) <<
- "$this->_oprot->writeSetBegin($this->_otrans, " <<
- type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " <<
- "count($" << prefix << "));" << endl;
+ if (binary_inline_) {
+ f_service_ <<
+ indent() << "$_output .= pack('c', " << type_to_enum(((t_set*)ttype)->get_elem_type()) << ");" << endl <<
+ indent() << "$_output .= strrev(pack('l', count($" << prefix << ")));" << endl;
+
+ } else {
+ indent(f_service_) <<
+ "$this->_oprot->writeSetBegin($this->_otrans, " <<
+ type_to_enum(((t_set*)ttype)->get_elem_type()) << ", " <<
+ "count($" << prefix << "));" << endl;
+ }
} else if (ttype->is_list()) {
- indent(f_service_) <<
- "$this->_oprot->writeListBegin($this->_otrans, " <<
- type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " <<
- "count($" << prefix << "));" << endl;
+ if (binary_inline_) {
+ f_service_ <<
+ indent() << "$_output .= pack('c', " << type_to_enum(((t_list*)ttype)->get_elem_type()) << ");" << endl <<
+ indent() << "$_output .= strrev(pack('l', count($" << prefix << ")));" << endl;
+
+ } else {
+ indent(f_service_) <<
+ "$this->_oprot->writeListBegin($this->_otrans, " <<
+ type_to_enum(((t_list*)ttype)->get_elem_type()) << ", " <<
+ "count($" << prefix << "));" << endl;
+ }
}
scope_up(f_service_);
scope_down(f_service_);
}
+
+ scope_down(f_service_);
+
+ if (!binary_inline_) {
if (ttype->is_map()) {
indent(f_service_) <<
"$this->_oprot->writeMapEnd($this->_otrans);" << endl;
indent(f_service_) <<
"$this->_oprot->writeListEnd($this->_otrans);" << endl;
}
-
- scope_down(f_service_);
+ }
scope_down(f_service_);
}