def send_list(a): lines = [] fname = a.name() m = a.member() if a.member().is_list(): print "Lists-of-lists are currently not implemented, sorry." sys.exit(1) tab = xorp_indent(1) tab2 = xorp_indent(2) lines.append("size_t sz_%s = %s.size();" % (fname, fname)) lines.append("nout += outp->writeListBegin(%s, sz_%s);" % \ (wire_type(m), fname)) lines.append("if (sz_%s > 0) {" % fname) lines.append(tab + "for (size_t i_%s = 1; i_%s <= sz_%s; i_%s++) {" % \ (fname, fname, fname, fname)) lines.append(tab2 + "const XrlAtom& xa = %s.get(i_%s);" % \ (fname, fname)) mfname = "xa_%s" % m.type() # member field name with XIF type lines.append(tab2 + "const %s& %s = xa.%s();" % \ (m.cpp_type(), mfname, m.accessor())) # now marshal out the member type, indented at this level correctly. for l in send_arg(m, mfname): lines.append(tab2 + l) lines.append(tab + "}") # close for lines.append("}") # close if lines.append("nout += outp->writeListEnd();") # close thrift list return lines
def recv_list(a, fname): lines = [] m = a.member() if a.member().is_list(): print "Lists-of-lists are currently not implemented, sorry." sys.exit(1) tab = xorp_indent(1) lines.append("uint32_t sz_%s;" % fname) lines.append("TType mt_%s;" % fname) lines.append("nin += inp->readListBegin(mt_%s, sz_%s);" % \ tuple([fname] * 2)) lines.append("for (uint32_t i_%s = 0; i_%s < sz_%s; i_%s++) {" % \ tuple([fname] * 4)) # Now read in base type. mfname = "tmp_%s" % fname lines.append(tab + "%s %s;" % (m.cpp_type(), mfname)) for l in recv_arg(m, mfname): lines.append(tab + l) # now convert to XrlAtom and append to our collection in local scope. lines.append(tab + ("%s.append(XrlAtom(tmp_%s));" % \ tuple([fname] * 2))) lines.append("}") lines.append("nin += inp->readListEnd();") return lines