FairMQ  1.4.14
C++ Message Queuing Library and Framework
Commands.h
1 /********************************************************************************
2  * Copyright (C) 2017 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
3  * *
4  * This software is distributed under the terms of the *
5  * GNU Lesser General Public Licence (LGPL) version 3, *
6  * copied verbatim in the file "LICENSE" *
7  ********************************************************************************/
8 
9 #ifndef FAIR_MQ_SDK_COMMANDFACTORY
10 #define FAIR_MQ_SDK_COMMANDFACTORY
11 
12 #include <fairmq/States.h>
13 #include <fairmq/tools/CppSTL.h>
14 
15 #include <vector>
16 #include <string>
17 #include <memory>
18 #include <type_traits>
19 #include <stdexcept>
20 
21 namespace fair
22 {
23 namespace mq
24 {
25 namespace sdk
26 {
27 namespace cmd
28 {
29 
30 enum class Format : int {
31  Binary,
32  JSON
33 };
34 
35 enum class Result : int {
36  Ok,
37  Failure
38 };
39 
40 enum class Type : int
41 {
42  check_state, // args: { }
43  change_state, // args: { transition }
44  dump_config, // args: { }
45  subscribe_to_state_change, // args: { }
46  unsubscribe_from_state_change, // args: { }
47  state_change_exiting_received, // args: { }
48  get_properties, // args: { request_id, property_query }
49  set_properties, // args: { request_id, properties }
50  subscription_heartbeat, // args: { interval }
51 
52  current_state, // args: { device_id, current_state }
53  transition_status, // args: { device_id, task_id, Result, transition }
54  config, // args: { device_id, config_string }
55  state_change_subscription, // args: { device_id, task_id, Result }
56  state_change_unsubscription, // args: { device_id, task_id, Result }
57  state_change, // args: { device_id, task_id, last_state, current_state }
58  properties, // args: { device_id, request_id, Result, properties }
59  properties_set // args: { device_id, request_id, Result }
60 };
61 
62 struct Cmd
63 {
64  explicit Cmd(const Type type) : fType(type) {}
65  virtual ~Cmd() = default;
66 
67  Type GetType() const { return fType; }
68 
69  private:
70  Type fType;
71 };
72 
73 struct CheckState : Cmd
74 {
75  explicit CheckState() : Cmd(Type::check_state) {}
76 };
77 
78 struct ChangeState : Cmd
79 {
80  explicit ChangeState(Transition transition)
81  : Cmd(Type::change_state)
82  , fTransition(transition)
83  {}
84 
85  Transition GetTransition() const { return fTransition; }
86  void SetTransition(Transition transition) { fTransition = transition; }
87 
88  private:
89  Transition fTransition;
90 };
91 
92 struct DumpConfig : Cmd
93 {
94  explicit DumpConfig() : Cmd(Type::dump_config) {}
95 };
96 
98 {
99  explicit SubscribeToStateChange(int64_t interval)
100  : Cmd(Type::subscribe_to_state_change)
101  , fInterval(interval)
102  {}
103 
104  int64_t GetInterval() const { return fInterval; }
105  void SetInterval(int64_t interval) { fInterval = interval; }
106 
107  private:
108  int64_t fInterval;
109 };
110 
112 {
113  explicit UnsubscribeFromStateChange() : Cmd(Type::unsubscribe_from_state_change) {}
114 };
115 
117 {
118  explicit StateChangeExitingReceived() : Cmd(Type::state_change_exiting_received) {}
119 };
120 
122 {
123  GetProperties(std::size_t request_id, std::string query)
124  : Cmd(Type::get_properties)
125  , fRequestId(request_id)
126  , fQuery(std::move(query))
127  {}
128 
129  auto GetRequestId() const -> std::size_t { return fRequestId; }
130  auto SetRequestId(std::size_t requestId) -> void { fRequestId = requestId; }
131  auto GetQuery() const -> std::string { return fQuery; }
132  auto SetQuery(std::string query) -> void { fQuery = std::move(query); }
133 
134  private:
135  std::size_t fRequestId;
136  std::string fQuery;
137 };
138 
140 {
141  SetProperties(std::size_t request_id, std::vector<std::pair<std::string, std::string>> properties)
142  : Cmd(Type::set_properties)
143  , fRequestId(request_id)
144  , fProperties(std::move(properties))
145  {}
146 
147  auto GetRequestId() const -> std::size_t { return fRequestId; }
148  auto SetRequestId(std::size_t requestId) -> void { fRequestId = requestId; }
149  auto GetProps() const -> std::vector<std::pair<std::string, std::string>> { return fProperties; }
150  auto SetProps(std::vector<std::pair<std::string, std::string>> properties) -> void { fProperties = std::move(properties); }
151 
152  private:
153  std::size_t fRequestId;
154  std::vector<std::pair<std::string, std::string>> fProperties;
155 };
156 
158 {
159  explicit SubscriptionHeartbeat(int64_t interval)
160  : Cmd(Type::subscription_heartbeat)
161  , fInterval(interval)
162  {}
163 
164  int64_t GetInterval() const { return fInterval; }
165  void SetInterval(int64_t interval) { fInterval = interval; }
166 
167  private:
168  int64_t fInterval;
169 };
170 
172 {
173  explicit CurrentState(const std::string& id, State currentState)
174  : Cmd(Type::current_state)
175  , fDeviceId(id)
176  , fCurrentState(currentState)
177  {}
178 
179  std::string GetDeviceId() const { return fDeviceId; }
180  void SetDeviceId(const std::string& deviceId) { fDeviceId = deviceId; }
181  fair::mq::State GetCurrentState() const { return fCurrentState; }
182  void SetCurrentState(fair::mq::State state) { fCurrentState = state; }
183 
184  private:
185  std::string fDeviceId;
186  fair::mq::State fCurrentState;
187 };
188 
190 {
191  explicit TransitionStatus(const std::string& deviceId, const uint64_t taskId, const Result result, const Transition transition)
192  : Cmd(Type::transition_status)
193  , fDeviceId(deviceId)
194  , fTaskId(taskId)
195  , fResult(result)
196  , fTransition(transition)
197  {}
198 
199  std::string GetDeviceId() const { return fDeviceId; }
200  void SetDeviceId(const std::string& deviceId) { fDeviceId = deviceId; }
201  uint64_t GetTaskId() const { return fTaskId; }
202  void SetTaskId(const uint64_t taskId) { fTaskId = taskId; }
203  Result GetResult() const { return fResult; }
204  void SetResult(const Result result) { fResult = result; }
205  Transition GetTransition() const { return fTransition; }
206  void SetTransition(const Transition transition) { fTransition = transition; }
207 
208  private:
209  std::string fDeviceId;
210  uint64_t fTaskId;
211  Result fResult;
212  Transition fTransition;
213 };
214 
215 struct Config : Cmd
216 {
217  explicit Config(const std::string& id, const std::string& config)
218  : Cmd(Type::config)
219  , fDeviceId(id)
220  , fConfig(config)
221  {}
222 
223  std::string GetDeviceId() const { return fDeviceId; }
224  void SetDeviceId(const std::string& deviceId) { fDeviceId = deviceId; }
225  std::string GetConfig() const { return fConfig; }
226  void SetConfig(const std::string& config) { fConfig = config; }
227 
228  private:
229  std::string fDeviceId;
230  std::string fConfig;
231 };
232 
234 {
235  explicit StateChangeSubscription(const std::string& id, const uint64_t taskId, const Result result)
236  : Cmd(Type::state_change_subscription)
237  , fDeviceId(id)
238  , fTaskId(taskId)
239  , fResult(result)
240  {}
241 
242  std::string GetDeviceId() const { return fDeviceId; }
243  void SetDeviceId(const std::string& deviceId) { fDeviceId = deviceId; }
244  uint64_t GetTaskId() const { return fTaskId; }
245  void SetTaskId(const uint64_t taskId) { fTaskId = taskId; }
246  Result GetResult() const { return fResult; }
247  void SetResult(const Result result) { fResult = result; }
248 
249  private:
250  std::string fDeviceId;
251  uint64_t fTaskId;
252  Result fResult;
253 };
254 
256 {
257  explicit StateChangeUnsubscription(const std::string& id, const uint64_t taskId, const Result result)
258  : Cmd(Type::state_change_unsubscription)
259  , fDeviceId(id)
260  , fTaskId(taskId)
261  , fResult(result)
262  {}
263 
264  std::string GetDeviceId() const { return fDeviceId; }
265  void SetDeviceId(const std::string& deviceId) { fDeviceId = deviceId; }
266  uint64_t GetTaskId() const { return fTaskId; }
267  void SetTaskId(const uint64_t taskId) { fTaskId = taskId; }
268  Result GetResult() const { return fResult; }
269  void SetResult(const Result result) { fResult = result; }
270 
271  private:
272  std::string fDeviceId;
273  uint64_t fTaskId;
274  Result fResult;
275 };
276 
277 struct StateChange : Cmd
278 {
279  explicit StateChange(const std::string& deviceId, const uint64_t taskId, const State lastState, const State currentState)
280  : Cmd(Type::state_change)
281  , fDeviceId(deviceId)
282  , fTaskId(taskId)
283  , fLastState(lastState)
284  , fCurrentState(currentState)
285  {}
286 
287  std::string GetDeviceId() const { return fDeviceId; }
288  void SetDeviceId(const std::string& deviceId) { fDeviceId = deviceId; }
289  uint64_t GetTaskId() const { return fTaskId; }
290  void SetTaskId(const uint64_t taskId) { fTaskId = taskId; }
291  fair::mq::State GetLastState() const { return fLastState; }
292  void SetLastState(const fair::mq::State state) { fLastState = state; }
293  fair::mq::State GetCurrentState() const { return fCurrentState; }
294  void SetCurrentState(const fair::mq::State state) { fCurrentState = state; }
295 
296  private:
297  std::string fDeviceId;
298  uint64_t fTaskId;
299  fair::mq::State fLastState;
300  fair::mq::State fCurrentState;
301 };
302 
303 struct Properties : Cmd
304 {
305  Properties(std::string deviceId, std::size_t requestId, const Result result, std::vector<std::pair<std::string, std::string>> properties)
306  : Cmd(Type::properties)
307  , fDeviceId(std::move(deviceId))
308  , fRequestId(requestId)
309  , fResult(result)
310  , fProperties(std::move(properties))
311  {}
312 
313  auto GetDeviceId() const -> std::string { return fDeviceId; }
314  auto SetDeviceId(std::string deviceId) -> void { fDeviceId = std::move(deviceId); }
315  auto GetRequestId() const -> std::size_t { return fRequestId; }
316  auto SetRequestId(std::size_t requestId) -> void { fRequestId = requestId; }
317  auto GetResult() const -> Result { return fResult; }
318  auto SetResult(Result result) -> void { fResult = result; }
319  auto GetProps() const -> std::vector<std::pair<std::string, std::string>> { return fProperties; }
320  auto SetProps(std::vector<std::pair<std::string, std::string>> properties) -> void { fProperties = std::move(properties); }
321 
322  private:
323  std::string fDeviceId;
324  std::size_t fRequestId;
325  Result fResult;
326  std::vector<std::pair<std::string, std::string>> fProperties;
327 };
328 
329 struct PropertiesSet : Cmd {
330  PropertiesSet(std::string deviceId, std::size_t requestId, Result result)
331  : Cmd(Type::properties_set)
332  , fDeviceId(std::move(deviceId))
333  , fRequestId(requestId)
334  , fResult(result)
335  {}
336 
337  auto GetDeviceId() const -> std::string { return fDeviceId; }
338  auto SetDeviceId(std::string deviceId) -> void { fDeviceId = std::move(deviceId); }
339  auto GetRequestId() const -> std::size_t { return fRequestId; }
340  auto SetRequestId(std::size_t requestId) -> void { fRequestId = requestId; }
341  auto GetResult() const -> Result { return fResult; }
342  auto SetResult(Result result) -> void { fResult = result; }
343 
344  private:
345  std::string fDeviceId;
346  std::size_t fRequestId;
347  Result fResult;
348 };
349 
350 template<typename C, typename... Args>
351 std::unique_ptr<Cmd> make(Args&&... args)
352 {
353  return fair::mq::tools::make_unique<C>(std::forward<Args>(args)...);
354 }
355 
356 struct Cmds
357 {
358  using container = std::vector<std::unique_ptr<Cmd>>;
359  struct CommandFormatError : std::runtime_error { using std::runtime_error::runtime_error; };
360 
361  explicit Cmds() {}
362 
363  template<typename... Rest>
364  explicit Cmds(std::unique_ptr<Cmd>&& first, Rest&&... rest)
365  {
366  Unpack(std::forward<std::unique_ptr<Cmd>&&>(first), std::forward<Rest>(rest)...);
367  }
368 
369  void Add(std::unique_ptr<Cmd>&& cmd) { fCmds.emplace_back(std::move(cmd)); }
370 
371  template<typename C, typename... Args>
372  void Add(Args&&... args)
373  {
374  static_assert(std::is_base_of<Cmd, C>::value, "Only types derived from fair::mq::cmd::Cmd are allowed");
375  Add(make<C>(std::forward<Args>(args)...));
376  }
377 
378  Cmd& At(size_t i) { return *(fCmds.at(i)); }
379 
380  size_t Size() const { return fCmds.size(); }
381  void Reset() { fCmds.clear(); }
382 
383  std::string Serialize(const Format type = Format::Binary) const;
384  void Deserialize(const std::string&, const Format type = Format::Binary);
385 
386  private:
387  container fCmds;
388 
389  void Unpack() {}
390 
391  template <class... Rest>
392  void Unpack(std::unique_ptr<Cmd>&& first, Rest&&... rest)
393  {
394  fCmds.emplace_back(std::move(first));
395  Unpack(std::forward<Rest>(rest)...);
396  }
397 
398  public:
399  using iterator = container::iterator;
400  using const_iterator = container::const_iterator;
401 
402  auto begin() -> decltype(fCmds.begin()) { return fCmds.begin(); }
403  auto end() -> decltype(fCmds.end()) { return fCmds.end(); }
404  auto cbegin() -> decltype(fCmds.cbegin()) { return fCmds.cbegin(); }
405  auto cend() -> decltype(fCmds.cend()) { return fCmds.cend(); }
406 };
407 
408 std::string GetResultName(const Result result);
409 std::string GetTypeName(const Type type);
410 
411 inline std::ostream& operator<<(std::ostream& os, const Result& result) { return os << GetResultName(result); }
412 inline std::ostream& operator<<(std::ostream& os, const Type& type) { return os << GetTypeName(type); }
413 
414 } /* namespace cmd */
415 } /* namespace sdk */
416 } /* namespace mq */
417 } /* namespace fair */
418 
419 #endif /* FAIR_MQ_SDK_COMMANDFACTORY */
Definition: Commands.h:189
Definition: Commands.h:303
Definition: Commands.h:215
Definition: Commands.h:171
Definition: Commands.h:73
Definition: Commands.h:329
Definition: Commands.h:78
Definition: Commands.h:62
Definition: Commands.h:356
Definition: Commands.h:139
Definition: Commands.h:277
Tools for interfacing containers to the transport via polymorphic allocators.
Definition: DeviceRunner.h:23
Definition: Commands.h:92
Definition: Commands.h:121

privacy