Skip to content

Commit 06ae906

Browse files
splitting check() method into updateConnectionState() and updateCallback()
1 parent 8614db1 commit 06ae906

File tree

2 files changed

+54
-31
lines changed

2 files changed

+54
-31
lines changed

src/ConnectionHandlerInterface.cpp

+51-31
Original file line numberDiff line numberDiff line change
@@ -46,49 +46,69 @@ NetworkConnectionState ConnectionHandler::check()
4646
if((now - _lastConnectionTickTime) > connectionTickTimeInterval)
4747
{
4848
_lastConnectionTickTime = now;
49-
NetworkConnectionState next_net_connection_state = _current_net_connection_state;
5049

51-
/* While the state machine is implemented here, the concrete implementation of the
52-
* states is done in the derived connection handlers.
53-
*/
54-
switch (_current_net_connection_state)
55-
{
56-
case NetworkConnectionState::INIT: next_net_connection_state = update_handleInit (); break;
57-
case NetworkConnectionState::CONNECTING: next_net_connection_state = update_handleConnecting (); break;
58-
case NetworkConnectionState::CONNECTED: next_net_connection_state = update_handleConnected (); break;
59-
case NetworkConnectionState::DISCONNECTING: next_net_connection_state = update_handleDisconnecting(); break;
60-
case NetworkConnectionState::DISCONNECTED: next_net_connection_state = update_handleDisconnected (); break;
61-
case NetworkConnectionState::ERROR: break;
62-
case NetworkConnectionState::CLOSED: break;
63-
}
50+
NetworkConnectionState old_net_connection_state = _current_net_connection_state;
51+
NetworkConnectionState next_net_connection_state = updateConnectionState();
6452

6553
/* Here we are determining whether a state transition from one state to the next has
6654
* occurred - and if it has, we call eventually registered callbacks.
6755
*/
68-
if(next_net_connection_state != _current_net_connection_state)
69-
{
70-
/* Check the next state to determine the kind of state conversion which has occurred (and call the appropriate callback) */
71-
if(next_net_connection_state == NetworkConnectionState::CONNECTED)
72-
{
73-
if(_on_connect_event_callback) _on_connect_event_callback();
74-
}
75-
if(next_net_connection_state == NetworkConnectionState::DISCONNECTED)
76-
{
77-
if(_on_disconnect_event_callback) _on_disconnect_event_callback();
78-
}
79-
if(next_net_connection_state == NetworkConnectionState::ERROR)
80-
{
81-
if(_on_error_event_callback) _on_error_event_callback();
82-
}
83-
84-
/* Assign new state to the member variable holding the state */
56+
57+
if(old_net_connection_state != next_net_connection_state) {
58+
updateCallback(next_net_connection_state);
59+
60+
/* It may happen that the local _current_net_connection_state
61+
* is not updated by the updateConnectionState() call. This is the case for GenericConnection handler
62+
* where the call of updateConnectionState() is replaced by the inner ConnectionHandler call
63+
* that updates its state, but not the outer one. For this reason it is required to perform this call twice
64+
*/
8565
_current_net_connection_state = next_net_connection_state;
8666
}
8767
}
8868

8969
return _current_net_connection_state;
9070
}
9171

72+
NetworkConnectionState ConnectionHandler::updateConnectionState() {
73+
NetworkConnectionState next_net_connection_state = _current_net_connection_state;
74+
75+
/* While the state machine is implemented here, the concrete implementation of the
76+
* states is done in the derived connection handlers.
77+
*/
78+
switch (_current_net_connection_state)
79+
{
80+
case NetworkConnectionState::INIT: next_net_connection_state = update_handleInit (); break;
81+
case NetworkConnectionState::CONNECTING: next_net_connection_state = update_handleConnecting (); break;
82+
case NetworkConnectionState::CONNECTED: next_net_connection_state = update_handleConnected (); break;
83+
case NetworkConnectionState::DISCONNECTING: next_net_connection_state = update_handleDisconnecting(); break;
84+
case NetworkConnectionState::DISCONNECTED: next_net_connection_state = update_handleDisconnected (); break;
85+
case NetworkConnectionState::ERROR: break;
86+
case NetworkConnectionState::CLOSED: break;
87+
}
88+
89+
/* Assign new state to the member variable holding the state */
90+
_current_net_connection_state = next_net_connection_state;
91+
92+
return next_net_connection_state;
93+
}
94+
95+
void ConnectionHandler::updateCallback(NetworkConnectionState next_net_connection_state) {
96+
97+
/* Check the next state to determine the kind of state conversion which has occurred (and call the appropriate callback) */
98+
if(next_net_connection_state == NetworkConnectionState::CONNECTED)
99+
{
100+
if(_on_connect_event_callback) _on_connect_event_callback();
101+
}
102+
if(next_net_connection_state == NetworkConnectionState::DISCONNECTED)
103+
{
104+
if(_on_disconnect_event_callback) _on_disconnect_event_callback();
105+
}
106+
if(next_net_connection_state == NetworkConnectionState::ERROR)
107+
{
108+
if(_on_error_event_callback) _on_error_event_callback();
109+
}
110+
}
111+
92112
void ConnectionHandler::connect()
93113
{
94114
if (_current_net_connection_state != NetworkConnectionState::INIT && _current_net_connection_state != NetworkConnectionState::CONNECTING)

src/ConnectionHandlerInterface.h

+3
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ class ConnectionHandler {
102102

103103
protected:
104104

105+
virtual NetworkConnectionState updateConnectionState();
106+
virtual void updateCallback(NetworkConnectionState next_net_connection_state);
107+
105108
bool _keep_alive;
106109
NetworkAdapter _interface;
107110

0 commit comments

Comments
 (0)