DDS  ver. 3.4
IntercomServiceCore.h
Go to the documentation of this file.
1 // Copyright 2014 GSI, Inc. All rights reserved.
2 //
3 //
4 //
5 #ifndef DDS_INTERCOM_SERVICE_CORE_H
6 #define DDS_INTERCOM_SERVICE_CORE_H
7 // DDS
8 #include "AgentChannel.h"
9 #include "IntercomErrorCodes.h"
10 #include "SMAgentChannel.h"
11 // STD
12 #include <string>
13 #include <vector>
14 // BOOST
15 #include <boost/signals2/signal.hpp>
16 
17 namespace dds
18 {
19  namespace internal_api
20  {
21  // Key-value types
23  typedef boost::signals2::signal<void(
24  const std::string& /*_propertyName*/, const std::string& /*_value*/, uint64_t /*_senderTaskID*/)>
27  typedef boost::signals2::signal<void(uint64_t /*_taskID*/, uint32_t /*_exitCode*/)> keyValueTaskDoneSignal_t;
28 
29  // Custom command types
31  typedef boost::signals2::signal<void(
32  const std::string& /*_command*/, const std::string& /*_condition*/, uint64_t /*_senderID*/)>
34  typedef boost::signals2::signal<void(const std::string&)> customCmdReplySignal_t;
35 
36  typedef boost::signals2::connection connection_t;
37 
39  {
40  public:
41  using ptr_t = std::shared_ptr<CIntercomServiceCore>;
42 
43  public:
46 
47  // Disable copy constructors and assignment operators
52 
53  connection_t connectError(intercom_api::errorSignal_t::slot_function_type _subscriber);
54  connection_t connectCustomCmd(customCmdSignal_t::slot_function_type _subscriber);
55  connection_t connectCustomCmdReply(customCmdReplySignal_t::slot_function_type _subscriber);
56  connection_t connectKeyValue(keyValueSignal_t::slot_function_type _subscriber);
57  connection_t connectKeyValueTaskDone(keyValueTaskDoneSignal_t::slot_function_type _subscriber);
58  void disconnectCustomCmd();
59  void disconnectKeyValue();
60 
61  void sendCustomCmd(const std::string& _command, const std::string& _condition);
62  void putValue(const std::string& _key, const std::string& _value);
63 
64  // Remove shared memory
65  static void clean();
66 
67  void waitCondition();
68  void stopCondition();
69 
70  void start(const std::string& _sessionID);
71  void stop();
72 
73  private:
74  // Messages from TCP and shared memory channels
75  void on_cmdUPDATE_KEY_SM(
76  const protocol_api::SSenderInfo& _sender,
78  void on_cmdUSER_TASK_DONE_SM(
79  const protocol_api::SSenderInfo& _sender,
81  void on_cmdCUSTOM_CMD_SM(
82  const protocol_api::SSenderInfo& _sender,
84  void on_cmdSIMPLE_MSG_SM(
85  const protocol_api::SSenderInfo& _sender,
87 
88  void setupSMChannel();
89  void setupChannel(const std::string& _sessionID);
90 
91  template <class Signal_t, typename... Args>
92  void execUserSignal(Signal_t& _signal, Args&&... args)
93  {
94  try
95  {
96  _signal(args...);
97  }
98  catch (std::exception& _e)
99  {
100  std::string msg("Exception in user code: ");
101  msg += _e.what();
102  if (!std::is_same<Signal_t, intercom_api::errorSignal_t>::value)
103  {
104  execUserSignal(m_errorSignal, intercom_api::EErrorCode::UserCodeException, msg);
105  }
106  LOG(MiscCommon::error) << msg;
107  }
108  }
109 
110  private:
111  // Signals
112  intercom_api::errorSignal_t m_errorSignal;
113  keyValueSignal_t m_keyValueUpdateSignal;
114  keyValueTaskDoneSignal_t m_keyValueTaskDoneSignal;
115  customCmdSignal_t m_customCmdSignal;
116  customCmdReplySignal_t m_customCmdReplySignal;
117 
118  boost::asio::io_context m_io_context;
119  boost::thread_group m_workerThreads;
122  std::atomic<bool> m_started;
123 
129  std::mutex m_waitMutex;
130  std::condition_variable m_waitCondition;
131  };
132  } // namespace internal_api
133 } // namespace dds
134 
135 #endif
std::shared_ptr< CAgentChannel > connectionPtr_t
Definition: BaseChannelImpl.h:235
boost::signals2::signal< void(uint64_t, uint32_t)> keyValueTaskDoneSignal_t
Definition: IntercomServiceCore.h:27
Definition: BaseEventHandlersImpl.h:48
boost::signals2::signal< void(const std::string &, const std::string &, uint64_t)> customCmdSignal_t
Definition: IntercomServiceCore.h:33
boost::signals2::signal< void(const std::string &)> customCmdReplySignal_t
Definition: IntercomServiceCore.h:34
connection_t connectKeyValue(keyValueSignal_t::slot_function_type _subscriber)
Definition: IntercomServiceCore.cpp:243
connection_t connectKeyValueTaskDone(keyValueTaskDoneSignal_t::slot_function_type _subscriber)
Definition: IntercomServiceCore.cpp:248
void waitCondition()
Definition: IntercomServiceCore.cpp:406
std::shared_ptr< SEmptyCmd > ptr_t
Definition: CommandAttachmentImpl.h:64
~CIntercomServiceCore()
Definition: IntercomServiceCore.cpp:34
Exception in the user code.
Definition: IntercomErrorCodes.h:27
#define LOG(severity)
Definition: Logger.h:56
static void clean()
Definition: IntercomServiceCore.cpp:395
connection_t connectCustomCmd(customCmdSignal_t::slot_function_type _subscriber)
Definition: IntercomServiceCore.cpp:233
Definition: IntercomServiceCore.h:38
std::shared_ptr< CSMAgentChannel > connectionPtr_t
Definition: BaseSMChannelImpl.h:191
boost::signals2::signal< void(const std::string &, const std::string &, uint64_t)> keyValueSignal_t
Definition: IntercomServiceCore.h:25
Definition: AgentConnectionManager.h:13
CIntercomServiceCore()
Definition: IntercomServiceCore.cpp:20
void disconnectKeyValue()
Definition: IntercomServiceCore.cpp:262
std::shared_ptr< CIntercomServiceCore > ptr_t
Definition: IntercomServiceCore.h:41
void stopCondition()
Definition: IntercomServiceCore.cpp:417
void sendCustomCmd(const std::string &_command, const std::string &_condition)
Definition: IntercomServiceCore.cpp:323
void putValue(const std::string &_key, const std::string &_value)
Definition: IntercomServiceCore.cpp:364
boost::signals2::connection connection_t
Definition: IntercomServiceCore.h:36
void disconnectCustomCmd()
Definition: IntercomServiceCore.cpp:253
void stop()
Definition: IntercomServiceCore.cpp:204
Definition: def.h:152
connection_t connectError(intercom_api::errorSignal_t::slot_function_type _subscriber)
Definition: IntercomServiceCore.cpp:228
connection_t connectCustomCmdReply(customCmdReplySignal_t::slot_function_type _subscriber)
Definition: IntercomServiceCore.cpp:238
boost::signals2::signal< void(EErrorCode, const std::string &)> errorSignal_t
Definition: IntercomErrorCodes.h:30
CIntercomServiceCore & operator=(const CIntercomServiceCore &)=delete
void start(const std::string &_sessionID)
Definition: IntercomServiceCore.cpp:38