ifw  0.0.1-dev
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
MsgReplier.hpp
Go to the documentation of this file.
1 
9 #ifndef RAD_MSG_REPLIER_HPP
10 #define RAD_MSG_REPLIER_HPP
11 
12 #include <rad/MsgHandler.hpp>
13 #include <rad/Logger.hpp>
14 #include <rad/Assert.hpp>
15 
16 #include <azmq/socket.hpp>
17 #include <azmq/message.hpp>
18 
19 #include <boost/asio.hpp>
20 
21 #include <map>
22 
23 
24 namespace rad {
25 
29 class MsgReplier {
30 
31 public:
32  using MsgHandler_t = std::function<void (const std::string&, const std::string&, const void*, size_t)>;
33  using MsgHandlerMap_t = std::unordered_map<std::string, MsgHandler_t>;
34 
35  MsgReplier(const std::string& endpoint,
36  boost::asio::io_service& ios,
37  std::unique_ptr<MsgHandler>&& fallbackHandler);
38  virtual ~MsgReplier();
39  MsgReplier(MsgReplier&&) = default;
40 
41  void Start();
42  void Stop();
43 
44  void AddMsgHandler(const std::string& requestName, MsgHandler_t handler);
45 
46  size_t Send(const std::string& identity,
47  const std::string& replyType,
48  const std::string& replyPayload);
49 
50  template<typename REPLY>
51  size_t Send(const std::string& identity, const REPLY& replyPayload);
52 
53  MsgReplier(const MsgReplier&) = delete;
54  MsgReplier& operator= (const MsgReplier&) = delete;
55 
56 private:
57  std::string mEndpoint;
58  boost::asio::io_service& mIOS;
59  azmq::router_socket mSocket;
60  std::unique_ptr<MsgHandler> mFallbackHandler;
61  MsgHandlerMap_t mHandlersMap;
62 
63  void Register();
64  void Callback(boost::system::error_code const& errorCode, azmq::message& msg, size_t nbytes);
65 };
66 
67 template<typename TYPEREP>
68 size_t MsgReplier::Send(const std::string& identity, const TYPEREP& replyPayload)
69 {
70  RAD_LOG_TRACE();
71 
72  RAD_ASSERTPTR(replyPayload.GetDescriptor());
73  std::string replyType = replyPayload.GetDescriptor()->full_name();
74 
75  std::string str;
76  if (replyPayload.SerializeToString(&str) == false) {
77  RAD_LOG_ERROR() << "Failed serializing to string payload type <" << replyType << ">";
78  return 0;
79  }
80 
81  return Send(identity, replyType, str);
82 }
83 
84 } // namespace rad
85 
86 #endif
void Start()
Definition: MsgReplier.cpp:82
Definition: MsgReplier.hpp:29
#define RAD_ASSERTPTR(a)
Definition: Assert.hpp:16
#define RAD_LOG_ERROR()
Definition: Logger.hpp:266
std::unordered_map< std::string, MsgHandler_t > MsgHandlerMap_t
Definition: MsgReplier.hpp:33
std::function< void(const std::string &, const std::string &, const void *, size_t)> MsgHandler_t
Definition: MsgReplier.hpp:32
void Stop()
Definition: MsgReplier.cpp:93
optional string msg
Definition: topics.proto:7
MsgReplier & operator=(const MsgReplier &)=delete
virtual ~MsgReplier()
Definition: MsgReplier.cpp:47
size_t Send(const std::string &identity, const std::string &replyType, const std::string &replyPayload)
Definition: MsgReplier.cpp:61
def handler
Definition: test_dispatcher.py:11
void AddMsgHandler(const std::string &requestName, MsgHandler_t handler)
Definition: MsgReplier.cpp:108
#define RAD_LOG_TRACE()
Definition: Logger.hpp:319
optional int32 error_code
Definition: topics.proto:14
MsgReplier(const std::string &endpoint, boost::asio::io_service &ios, std::unique_ptr< MsgHandler > &&fallbackHandler)
Definition: MsgReplier.cpp:26