@@ -119,7 +119,7 @@ class ROSCPP_DECL Subscription : public boost::enable_shared_from_this<Subscript
119119 uint32_t getNumCallbacks () const { return callbacks_.size (); }
120120 uint32_t getNumPublishers ();
121121
122- // We'll keep a list of these objects, representing in-progress XMLRPC
122+ // We'll keep a list of these objects, representing in-progress XMLRPC
123123 // connections to other nodes.
124124 class ROSCPP_DECL PendingConnection : public ASyncXMLRPCConnection
125125 {
@@ -131,13 +131,24 @@ class ROSCPP_DECL Subscription : public boost::enable_shared_from_this<Subscript
131131 , remote_uri_(remote_uri)
132132 {}
133133
134+ PendingConnection (XmlRpc::XmlRpcClient* client, TransportUDPPtr udp_transport, TransportUDSDatagramPtr uds_datagram_transport, const SubscriptionWPtr& parent, const std::string& remote_uri)
135+ : client_(client)
136+ , udp_transport_(udp_transport)
137+ , uds_datagram_transport_(uds_datagram_transport)
138+ , parent_(parent)
139+ , remote_uri_(remote_uri)
140+ {}
141+
134142 ~PendingConnection ()
135143 {
136144 delete client_;
137145 }
138146
139147 XmlRpc::XmlRpcClient* getClient () const { return client_; }
140148 TransportUDPPtr getUDPTransport () const { return udp_transport_; }
149+ TransportUDSDatagramPtr getUDSDatagramTransport () const { return uds_datagram_transport_; }
150+ const std::string& getUDSPath () const { return uds_path_; }
151+ void setUDSPath (const std::string& uds_path) { uds_path_ = uds_path; }
141152
142153 virtual void addToDispatch (XmlRpc::XmlRpcDispatch* disp)
143154 {
@@ -172,11 +183,77 @@ class ROSCPP_DECL Subscription : public boost::enable_shared_from_this<Subscript
172183 private:
173184 XmlRpc::XmlRpcClient* client_;
174185 TransportUDPPtr udp_transport_;
186+ TransportUDSDatagramPtr uds_datagram_transport_;
187+ std::string uds_path_;
175188 SubscriptionWPtr parent_;
176189 std::string remote_uri_;
177190 };
178191 typedef boost::shared_ptr<PendingConnection> PendingConnectionPtr;
179192
193+ class ROSCPP_DECL PendingConnectionUDS : public ASyncXMLRPCConnection
194+ {
195+ public:
196+ PendingConnectionUDS (XmlRpc::XmlRpcClient* client, const SubscriptionWPtr& parent, const std::string& remote_uri, PendingConnectionPtr pending_connection)
197+ : client_(client)
198+ , parent_(parent)
199+ , remote_uri_(remote_uri)
200+ , pending_connection_(pending_connection)
201+ {}
202+
203+ ~PendingConnectionUDS ()
204+ {
205+ delete client_;
206+ }
207+
208+ virtual void addToDispatch (XmlRpc::XmlRpcDispatch* disp)
209+ {
210+ disp->addSource (client_, XmlRpc::XmlRpcDispatch::WritableEvent | XmlRpc::XmlRpcDispatch::Exception);
211+ }
212+
213+ virtual void removeFromDispatch (XmlRpc::XmlRpcDispatch* disp)
214+ {
215+ disp->removeSource (client_);
216+ }
217+
218+ virtual bool check ()
219+ {
220+ SubscriptionPtr parent = parent_.lock ();
221+ if (!parent)
222+ {
223+ return true ;
224+ }
225+
226+ XmlRpc::XmlRpcValue result;
227+ if (client_->executeCheckDone (result))
228+ {
229+
230+ XmlRpc::XmlRpcValue proto;
231+ // validate the requestTopicUds response data
232+ if (XMLRPCManager::instance ()->validateXmlrpcResponse (" requestTopicUds" , result, proto)) {
233+ // protocol data contains (TCPROS, uds_path) or (UDPROS, uds_path, ...)
234+ std::string proto_name = proto[0 ];
235+ if (proto_name == std::string (" TCPROS" ) ||
236+ proto_name == std::string (" UDPROS" )) {
237+ std::string uds_path = std::string (proto[1 ]);
238+ pending_connection_->setUDSPath (uds_path);
239+ }
240+ }
241+
242+ XMLRPCManager::instance ()->addASyncConnection (pending_connection_);
243+ return true ;
244+ }
245+
246+ return false ;
247+ }
248+
249+ private:
250+ XmlRpc::XmlRpcClient* client_;
251+ SubscriptionWPtr parent_;
252+ std::string remote_uri_;
253+ PendingConnectionPtr pending_connection_;
254+ };
255+ typedef boost::shared_ptr<PendingConnectionUDS> PendingConnectionUDSPtr;
256+
180257 void pendingConnectionDone (const PendingConnectionPtr& pending_conn, XmlRpc::XmlRpcValue& result);
181258
182259 void getPublishTypes (bool & ser, bool & nocopy, const std::type_info& ti);
0 commit comments