indent() << "oprot.writeStructBegin(struct);" << endl;
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
+ bool null_allowed = type_can_be_null((*f_iter)->get_type());
+ if (null_allowed) {
+ out <<
+ indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << endl;
+ indent_up();
+ }
+
out <<
indent() << "field.name = \"" << (*f_iter)->get_name() << "\";" << endl <<
indent() << "field.type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl <<
// Write field closer
indent(out) <<
"oprot.writeFieldEnd();" << endl;
+
+ if (null_allowed) {
+ indent_down();
+ indent(out) << "}" << endl;
+ }
}
// Write the struct map
out <<
"(this.__isset." << (*f_iter)->get_name() << ") {" << endl;
indent_up();
+ bool null_allowed = type_can_be_null((*f_iter)->get_type());
+ if (null_allowed) {
+ out <<
+ indent() << "if (this." << (*f_iter)->get_name() << " != null) {" << endl;
+ indent_up();
+ }
+
out <<
indent() << "field.name = \"" << (*f_iter)->get_name() << "\";" << endl <<
indent() << "field.type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl <<
indent(out) <<
"oprot.writeFieldEnd();" << endl;
+ if (null_allowed) {
+ indent_down();
+ indent(out) << "}" << endl;
+ }
+
indent_down();
indent(out) << "}";
}
std::string argument_list(t_struct* tstruct);
std::string type_to_enum(t_type* ttype);
+ bool type_can_be_null(t_type* ttype) {
+ while (ttype->is_typedef()) {
+ ttype = ((t_typedef*)ttype)->get_type();
+ }
+
+ return
+ ttype->is_container() ||
+ ttype->is_struct() ||
+ ttype->is_xception() ||
+ (ttype->is_base_type() && (((t_base_type*)ttype)->get_base() == t_base_type::TYPE_STRING));
+ }
+
+
private:
/**