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
|