Blame view

src/serverstate.h 3.66 KB
51becbde   Peter M. Groen   Committed the ent...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
  #ifndef OSDEV_COMPONENTS_MQTT_SERVERSTATE_H
  #define OSDEV_COMPONENTS_MQTT_SERVERSTATE_H
  
  // std
  #include <atomic>
  #include <map>
  
  // boost
  #include <boost/signals2/connection.hpp>
  
  // osdev::components::mqtt
  #include "istatecallback.h"
  
  namespace osdev {
  namespace components {
  namespace mqtt {
  
  /*!
   *  \brief  Class for administrating ServerState callbacks.
   *          ServiceClientBase uses this object to notify the server state listeners
   *          of changes in the serverstate of the server that the client is connected to.
   */
  class ServerState
  {
  public:
      /*!
       *  \brief Constructs a ServerState object. This object has a one to one relation with an IStateCallback object.
       *  \param stateCallbackIf identification of the interface that generates the signal.
       */
      explicit ServerState(const IStateCallback* stateCallbackIf);
  
      /*!
       *  \brief Destroy the ServerState.
       *         Calls clearAllStateChangeCallbacks() to unregister itself from the listeners.
       */
      virtual ~ServerState();
  
      // non copyable, non movable
      ServerState(const ServerState&)         = delete;
      ServerState& operator=(ServerState&)    = delete;
      ServerState(ServerState&&)              = delete;
      ServerState& operator=(ServerState&&)   = delete;
  
      /*!
       *  \brief  Registers a statechange callback method.
       *  \param  cb  - The callback method.
       *  \return handle that identifies the callback method.
       */
      StateChangeCallbackHandle registerStateChangeCallback(const IStateCallback::SlotStateChange& cb);
  
      /*!
       *  \brief  Unregisters a state change callback method.
       *  \param  handle Handle that identifies the callback method.
       */
      void unregisterStateChangeCallback(StateChangeCallbackHandle handle);
  
      /*!
       *  \brief  Removes all callback methods.
       *          An Unregister state is signalled to the listeners.
       */
      void clearAllStateChangeCallbacks();
  
      /*!
       *  \brief  Emit the State changed signal.
       *  \param  newState - The new state.
       */
      void emitStateChanged(StateEnum newState);
  
      /*!
       *  \brief  Return the last state received from server.
       *  \return state of server
       */
      StateEnum state() const;
  
      /*!
       *  \brief Returns the handle that will be given to the next callback that is registered.
       */
      static StateChangeCallbackHandle nextHandle()
      {
          return s_nextServerStateCallbackHandle;
      }
  
  private:
      /*!
       *  Type for holding connections to server state callback functions.
       */
      using ServerStateCallbackMap = std::map<StateChangeCallbackHandle, boost::signals2::scoped_connection>;
  
      IStateCallback::SigStateChange sig_serverStateChanged;                          ///< Signal emitted when server state has changed.
  
      const IStateCallback* m_stateCallbackIf;                                        ///< Identification of the the interface that generates the signal (not owned)
      ServerStateCallbackMap m_serverStateCallbackMap;                                ///< Map with serverstate callback connections.
  
      static std::atomic<StateChangeCallbackHandle> s_nextServerStateCallbackHandle;  ///< Handle given to next serverstate callback registration (0 is not valid).
  
      StateEnum m_state;                                                              ///< Store the last state received from the server.
  
      /*!
       *  \return The clientId of the IStateCallback interface, or "null" if it is nullptr.
       */
      std::string stateCallbackClientId() const;
  
      static const std::string s_identifier;
  };
  
  }       // End namespace mqtt
  }       // End namespace components
  }       // End namespace osdev
  
  #endif  // OSDEV_COMPONENTS_MQTT_SERVERSTATE_H