Ignition Transport

API Reference

4.0.0
NodeShared.hh
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Open Source Robotics Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16 */
17 
18 #ifndef IGN_TRANSPORT_NODESHARED_HH_
19 #define IGN_TRANSPORT_NODESHARED_HH_
20 
21 #ifdef _MSC_VER
22 #pragma warning(push, 0)
23 #endif
24 #include <google/protobuf/message.h>
25 #ifdef _MSC_VER
26 #pragma warning(pop)
27 #endif
28 
29 #include <memory>
30 #include <mutex>
31 #include <string>
32 #include <thread>
33 #include <vector>
34 #include <map>
35 
36 #include "ignition/transport/Export.hh"
45 
46 namespace ignition
47 {
48  namespace transport
49  {
50  class Node;
51  class NodePrivate;
52 
54  class NodeSharedPrivate;
55 
59  class IGNITION_TRANSPORT_VISIBLE NodeShared
60  {
64  public: static NodeShared *Instance();
65 
67  public: void RunReceptionTask();
68 
80  public: bool Publish(const std::string &_topic,
81  char *_data,
82  const size_t _dataSize,
83  DeallocFunc *_ffn,
84  const std::string &_msgType);
85 
87  public: void RecvMsgUpdate();
88 
93  public: struct HandlerInfo
94  {
99 
104 
106  public: bool haveLocal;
107 
109  public: bool haveRaw;
110 
111  // Friendship. This allows HandlerInfo to be created by
112  // CheckHandlerInfo()
113  friend class NodeShared;
114 
115  // TODO(sloretz) private default constructor (visual studio 2017?)
116  };
117 
124  HandlerInfo CheckHandlerInfo(const std::string &_topic) const;
125 
134  public: struct SubscriberInfo : public HandlerInfo
135  {
137  public: bool haveRemote;
138 
139  // Friendship declaration
140  friend class NodeShared;
141 
142  // TODO(sloretz) private default constructor (visual studio 2017?)
143  };
144 
153  SubscriberInfo CheckSubscriberInfo(
154  const std::string &_topic,
155  const std::string &_msgType) const;
156 
164  public: void TriggerSubscriberCallbacks(
165  const std::string &_topic,
166  const std::string &_msgData,
167  const std::string &_msgType,
168  const HandlerInfo &_handlerInfo);
169 
172  public: void RecvControlUpdate();
173 
175  public: void RecvSrvRequest();
176 
178  public: void RecvSrvResponse();
179 
185  public: void SendPendingRemoteReqs(const std::string &_topic,
186  const std::string &_reqType,
187  const std::string &_repType);
188 
191  public: void OnNewConnection(const MessagePublisher &_pub);
192 
195  public: void OnNewDisconnection(const MessagePublisher &_pub);
196 
199  public: void OnNewSrvConnection(const ServicePublisher &_pub);
200 
203  public: void OnNewSrvDisconnection(const ServicePublisher &_pub);
204 
210  // there is at least one publisher.
213  public: bool TopicPublishers(const std::string &_topic,
214  SrvAddresses_M &_publishers) const;
215 
222  public: bool DiscoverService(const std::string &_topic) const;
223 
229  public: bool AdvertisePublisher(const ServicePublisher &_publisher);
230 
232  protected: NodeShared();
233 
235  protected: virtual ~NodeShared();
236 
240  private: bool InitializeSockets();
241 
245 
248 
250  public: Uuid replierId;
251 
254 
257 
259  public: mutable std::recursive_mutex mutex;
260 
262  private: const int kMsgDiscPort = 11317;
263 
265  private: const int kSrvDiscPort = 11318;
266 
268  private: TopicStorage<MessagePublisher> connections;
269 
271  private: std::vector<std::string> srvConnections;
272 
275 
281  {
288  public: bool HasSubscriber(
289  const std::string &_fullyQualifiedTopic,
290  const std::string &_msgType) const;
291 
297  public: bool HasSubscriber(
298  const std::string &_fullyQualifiedTopic) const;
299 
307  public: std::vector<std::string> NodeUuids(
308  const std::string &_fullyQualifiedTopic,
309  const std::string &_msgTypeName) const;
310 
318  public: bool RemoveHandlersForNode(
319  const std::string &_fullyQualifiedTopic,
320  const std::string &_nUuid);
321 
324 
329  };
330 
332 
335 
338 
340  public: int verbose;
341 
344 
347 
350 
353 
356 
358  private: std::unique_ptr<NodeSharedPrivate> dataPtr;
359 
360  private: friend Node;
361  private: friend NodePrivate;
362  };
363  }
364 }
365 #endif
Node(const NodeOptions &_options=NodeOptions())
Constructor.
bool haveRaw
True iff there are any raw local subscribers.
Definition: NodeShared.hh:109
std::map< std::string, ISubscriptionHandler_M > localHandlers
This is a map of the standard local callback handlers. The key is the topic name, and the value is an...
Definition: NodeShared.hh:98
bool haveLocal
True iff there are any standard local subscribers.
Definition: NodeShared.hh:106
bool haveRemote
True iff this Publisher has any remote subscribers.
Definition: NodeShared.hh:137
TopicStorage< MessagePublisher > remoteSubscribers
Remote subscribers.
Definition: NodeShared.hh:274
HandlerStorage< RawSubscriptionHandler > raw
Raw local subscriptions. Keeping these separate from localSubscriptions allows us to avoid an unneces...
Definition: NodeShared.hh:328
std::string myControlAddress
My pub/sub control address.
Definition: NodeShared.hh:346
HandlerInfo contains information about callback handlers which is useful for local publishers and mes...
Definition: NodeShared.hh:93
Uuid replierId
Replier socket identity.
Definition: NodeShared.hh:250
HandlerWrapper localSubscribers
Definition: NodeShared.hh:331
HandlerStorage< ISubscriptionHandler > normal
Normal local subscriptions.
Definition: NodeShared.hh:323
STL class.
HandlerStorage< IRepHandler > repliers
Service call repliers.
Definition: NodeShared.hh:334
STL class.
Class to store and manage service call handlers.
Definition: HandlerStorage.hh:33
std::string myReplierAddress
My replier service call address.
Definition: NodeShared.hh:352
Private data for the Node class. This class should not be directly used. You should use the Node clas...
Definition: NodeShared.hh:59
int verbose
Print activity to stdout.
Definition: NodeShared.hh:340
std::string pUuid
Process UUID.
Definition: NodeShared.hh:253
A portable class for representing a Universally Unique Identifier.
Definition: Uuid.hh:41
Uuid responseReceiverId
Response receiver socket identity.
Definition: NodeShared.hh:247
std::string hostAddr
IP address of this host.
Definition: NodeShared.hh:355
This struct wraps up the two different types of subscription handlers: normal (deserialized) and raw ...
Definition: NodeShared.hh:280
void(void *_data, void *_hint) DeallocFunc
Definition: TransportTypes.hh:167
*brief Advertise a new service without any output parameter *In this version the callback is a free function *param [in] _topic Topic name associated to the service *param [in] _cb Callback to handle the service request with the *following void(*) const AdvertiseServiceOptions ReplyT const std::string _topic)
Definition: Node.hh:528
This class stores all the information about a message publisher.
Definition: Publisher.hh:198
This class stores all the information about a service publisher.
Definition: Publisher.hh:314
std::recursive_mutex mutex
Mutex to guarantee exclusive access between all threads.
Definition: NodeShared.hh:259
std::thread threadReception
thread in charge of receiving and handling incoming messages.
Definition: NodeShared.hh:256
std::string myRequesterAddress
My requester service call address.
Definition: NodeShared.hh:349
Definition: AdvertiseOptions.hh:27
Store address information about topics and provide convenient methods for adding new topics,...
Definition: TopicStorage.hh:37
std::map< std::string, RawSubscriptionHandler_M > rawHandlers
This is a map of the raw local callback handlers. The key is the topic name, and the value is another...
Definition: NodeShared.hh:103
STL class.
This struct provides information about the Subscribers of a Publisher. It should only be retrieved us...
Definition: NodeShared.hh:134
HandlerStorage< IReqHandler > requests
Pending service call requests.
Definition: NodeShared.hh:337
std::string myAddress
My pub/sub address.
Definition: NodeShared.hh:343