bool Protocol::open(const std::string& name) { if (name == "") { return false; } Route r = getRoute(); r.setToName(name); setRoute(r); // We are not the initiator of the connection, so we // expect to receive a header (carrier-dependent). bool ok = expectHeader(); if (!ok) return false; // Respond to header (carrier-dependent). return respondToHeader(); }
bool TcpRosCarrier::expectReplyToHeader(ConnectionState& proto) { RosHeader header; char mlen[4]; Bytes mlen_buf(mlen,4); int res = proto.is().readFull(mlen_buf); if (res<4) { printf("Fail %s %d\n", __FILE__, __LINE__); return false; } int len = NetType::netInt(mlen_buf); dbg_printf("Len %d\n", len); if (len>10000) { printf("not ready for serious messages\n"); return false; } ManagedBytes m(len); res = proto.is().readFull(m.bytes()); if (res!=len) { printf("Fail %s %d\n", __FILE__, __LINE__); return false; } header.readHeader(string(m.get(),m.length())); dbg_printf("Message header: %s\n", header.toString().c_str()); std::string rosname; if (header.data.find("type")!=header.data.end()) { rosname = header.data["type"]; } dbg_printf("<incoming> Type of data is [%s]s\n", rosname.c_str()); if (header.data.find("callerid")!=header.data.end()) { string name = header.data["callerid"]; dbg_printf("<incoming> callerid is %s\n", name.c_str()); dbg_printf("Route was %s\n", proto.getRoute().toString().c_str()); Route route = proto.getRoute(); route.setToName(name); proto.setRoute(route); dbg_printf("Route is now %s\n", proto.getRoute().toString().c_str()); } if (!isService) { isService = (header.data.find("request_type")!=header.data.end()); } if (rosname!="" && (user_type != wire_type || user_type == "")) { kind = TcpRosStream::rosToKind(rosname.c_str()); TcpRosStream::configureTwiddler(twiddler,kind.c_str(),rosname.c_str(),false,false); translate = TCPROS_TRANSLATE_TWIDDLER; } else { rosname = ""; } dbg_printf("tcpros %s mode\n", isService?"service":"topic"); // we may be a pull stream sender = isService; processRosHeader(header); auto* stream = new TcpRosStream(proto.giveStreams(), sender, sender, isService, raw, rosname.c_str()); if (stream==nullptr) { return false; } dbg_printf("Getting ready to hand off streams...\n"); proto.takeStreams(stream); return proto.is().isOk(); }