DDS  ver. 2.0
DDSIntercomGuard.h
Go to the documentation of this file.
1 // Copyright 2014 GSI, Inc. All rights reserved.
2 //
3 //
4 //
5 #ifndef DDSINTERCOMGUARD_H
6 #define DDSINTERCOMGUARD_H
7 // DDS
9 #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& /*_propertyID*/, const std::string& /*_key*/, const std::string& /*_value*/)>
27  typedef boost::signals2::signal<void(const std::string& /*_propertyID*/, const std::string& /*_key*/)>
29 
30  // Custom command typeŃ‹
32  typedef boost::signals2::signal<void(
33  const std::string& /*_command*/, const std::string& /*_condition*/, uint64_t /*_senderID*/)>
35  typedef boost::signals2::signal<void(const std::string&)> customCmdReplySignal_t;
36 
37  typedef boost::signals2::connection connection_t;
38 
40  {
41  // key -> SUpdateKeyCmd::version_t command
42  typedef std::map<std::string, protocol_api::SUpdateKeyCmd::version_t> updateKeyCache_t;
43 
44  // key -> value
45  typedef std::map<std::string, std::string> putValueCache_t;
46 
47  private:
50 
51  public:
52  static CDDSIntercomGuard& instance();
53 
54  connection_t connectError(intercom_api::errorSignal_t::slot_function_type _subscriber);
55  connection_t connectCustomCmd(customCmdSignal_t::slot_function_type _subscriber);
56  connection_t connectCustomCmdReply(customCmdReplySignal_t::slot_function_type _subscriber);
57  connection_t connectKeyValue(keyValueSignal_t::slot_function_type _subscriber);
58  connection_t connectKeyValueDelete(keyValueDeleteSignal_t::slot_function_type _subscriber);
59  void disconnectCustomCmd();
60  void disconnectKeyValue();
61 
63 
64  // Messages from shared memory
66  const protocol_api::SSenderInfo& _sender,
69  const protocol_api::SSenderInfo& _sender,
72  const protocol_api::SSenderInfo& _sender,
75  const protocol_api::SSenderInfo& _sender,
78  const protocol_api::SSenderInfo& _sender,
80 
81  void sendCustomCmd(const std::string& _command, const std::string& _condition);
82  void putValue(const std::string& _key, const std::string& _value);
83 
84  // Remove shared memory
85  static void clean();
86 
87  void waitCondition();
88  void stopCondition();
89 
90  void start(const std::string& _sessionID);
91  void stop();
92 
93  void initAgentConnection();
94 
95  public:
96  // Signals for subscriptions
101  customCmdReplySignal_t m_customCmdReplySignal;
102 
103  private:
104  template <class Signal_t, typename... Args>
105  void execUserSignal(Signal_t& _signal, Args&&... args)
106  {
107  try
108  {
109  _signal(args...);
110  }
111  catch (std::exception& _e)
112  {
113  std::string msg("Exception in user code: ");
114  msg += _e.what();
115  if (!std::is_same<Signal_t, intercom_api::errorSignal_t>::value)
116  {
117  execUserSignal(m_errorSignal, intercom_api::EErrorCode::UserCodeException, msg);
118  }
119  LOG(MiscCommon::error) << msg;
120  }
121  }
122 
123  private:
124  boost::asio::io_service m_io_service;
125  boost::thread_group m_workerThreads;
126 
127  CAgentConnectionManager::ptr_t m_agentConnectionMng;
128  std::mutex m_initAgentConnectionMutex;
129 
130  updateKeyCache_t m_updateKeyCache;
131  std::mutex m_updateKeyCacheMutex;
132 
133  putValueCache_t m_putValueCache;
134  std::mutex m_putValueCacheMutex;
135 
137 
138  bool m_useSMTransport;
139  bool m_started;
140  };
141  }
142 }
143 
144 #endif
void on_cmdUPDATE_KEY_ERROR_SM(const protocol_api::SSenderInfo &_sender, protocol_api::SCommandAttachmentImpl< protocol_api::cmdUPDATE_KEY_ERROR >::ptr_t _attachment)
Definition: DDSIntercomGuard.cpp:278
void on_cmdSIMPLE_MSG_SM(const protocol_api::SSenderInfo &_sender, protocol_api::SCommandAttachmentImpl< protocol_api::cmdSIMPLE_MSG >::ptr_t _attachment)
Definition: DDSIntercomGuard.cpp:330
Definition: BaseEventHandlersImpl.h:48
Definition: UpdateKeyCmd.h:14
boost::signals2::signal< void(const std::string &, const std::string &, uint64_t)> customCmdSignal_t
Definition: DDSIntercomGuard.h:34
boost::signals2::signal< void(const std::string &)> customCmdReplySignal_t
Definition: DDSIntercomGuard.h:35
boost::signals2::signal< void(const std::string &, const std::string &)> keyValueDeleteSignal_t
Definition: DDSIntercomGuard.h:28
void stopCondition()
Definition: DDSIntercomGuard.cpp:474
void on_cmdDELETE_KEY_SM(const protocol_api::SSenderInfo &_sender, protocol_api::SCommandAttachmentImpl< protocol_api::cmdDELETE_KEY >::ptr_t _attachment)
Definition: DDSIntercomGuard.cpp:310
connection_t connectKeyValue(keyValueSignal_t::slot_function_type _subscriber)
Definition: DDSIntercomGuard.cpp:208
std::shared_ptr< SEmptyCmd > ptr_t
Definition: CommandAttachmentImpl.h:66
intercom_api::errorSignal_t m_errorSignal
Definition: DDSIntercomGuard.h:97
keyValueDeleteSignal_t m_keyValueDeleteSignal
Definition: DDSIntercomGuard.h:99
Exception in the user code.
Definition: dds_intercom_error_codes.h:26
#define LOG(severity)
Definition: Logger.h:54
customCmdReplySignal_t m_customCmdReplySignal
Definition: DDSIntercomGuard.h:101
void disconnectCustomCmd()
Definition: DDSIntercomGuard.cpp:218
void on_cmdCUSTOM_CMD_SM(const protocol_api::SSenderInfo &_sender, protocol_api::SCommandAttachmentImpl< protocol_api::cmdCUSTOM_CMD >::ptr_t _attachment)
Definition: DDSIntercomGuard.cpp:323
void on_cmdUPDATE_KEY_SM(const protocol_api::SSenderInfo &_sender, protocol_api::SCommandAttachmentImpl< protocol_api::cmdUPDATE_KEY >::ptr_t _attachment)
Definition: DDSIntercomGuard.cpp:259
std::shared_ptr< CSMAgentChannel > connectionPtr_t
Definition: BaseSMChannelImpl.h:162
void start(const std::string &_sessionID)
Definition: DDSIntercomGuard.cpp:58
connection_t connectError(intercom_api::errorSignal_t::slot_function_type _subscriber)
Definition: DDSIntercomGuard.cpp:193
Definition: dds-agent/src/AgentConnectionManager.h:18
Definition: DDSIntercomGuard.h:39
customCmdSignal_t m_customCmdSignal
Definition: DDSIntercomGuard.h:100
boost::signals2::signal< void(const std::string &, const std::string &, const std::string &)> keyValueSignal_t
Definition: DDSIntercomGuard.h:25
static void clean()
Definition: DDSIntercomGuard.cpp:452
void disconnectKeyValue()
Definition: DDSIntercomGuard.cpp:227
boost::signals2::connection connection_t
Definition: DDSIntercomGuard.h:37
void waitCondition()
Definition: DDSIntercomGuard.cpp:462
static CDDSIntercomGuard & instance()
Definition: DDSIntercomGuard.cpp:52
Definition: def.h:152
bool updateCacheIfNeeded(const protocol_api::SUpdateKeyCmd &_cmd)
Definition: DDSIntercomGuard.cpp:235
void sendCustomCmd(const std::string &_command, const std::string &_condition)
Definition: DDSIntercomGuard.cpp:356
std::shared_ptr< CAgentConnectionManager > ptr_t
Definition: dds-intercom-lib/src/AgentConnectionManager.h:23
connection_t connectCustomCmdReply(customCmdReplySignal_t::slot_function_type _subscriber)
Definition: DDSIntercomGuard.cpp:203
void putValue(const std::string &_key, const std::string &_value)
Definition: DDSIntercomGuard.cpp:406
connection_t connectCustomCmd(customCmdSignal_t::slot_function_type _subscriber)
Definition: DDSIntercomGuard.cpp:198
keyValueSignal_t m_keyValueUpdateSignal
Definition: DDSIntercomGuard.h:98
void stop()
Definition: DDSIntercomGuard.cpp:174
boost::signals2::signal< void(EErrorCode, const std::string &)> errorSignal_t
Definition: dds_intercom_error_codes.h:29
connection_t connectKeyValueDelete(keyValueDeleteSignal_t::slot_function_type _subscriber)
Definition: DDSIntercomGuard.cpp:213