Created
January 21, 2018 13:05
-
-
Save SilverRainZ/cfd5b96b995d4d69e10b44f1fce61f07 to your computer and use it in GitHub Desktop.
Srain connection state machine
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
SrnRet server_state_machine(Server *srv, ServerAction act){ | |
ServerState cur_state; | |
ServerState next_state; | |
cur_state = srv->stat; | |
next_state = SERVER_STATE_UNKNOWN; | |
/* State machine starts */ | |
switch (srv->stat) { | |
case SERVER_STATE_UNKNOWN: | |
switch (act) { | |
case SERVER_ACTION_INIT: | |
srv->negotiated = FALSE; | |
srv->registered = FALSE; | |
srv->loggedin = FALSE; | |
srv->reconn_interval = 0; | |
next_state = SERVER_STATE_DISCONNECTED; | |
break; | |
default: | |
g_warn_if_reached(); | |
} | |
break; | |
case SERVER_STATE_DISCONNECTED: | |
switch (act) { | |
case SERVER_ACTION_CONNECT: | |
sirc_connect(srv->irc, srv->prefs->host, srv->prefs->host); | |
next_state = SERVER_STATE_CONNECTING; | |
break; | |
default: | |
g_warn_if_reached(); | |
} | |
break; | |
case SERVER_STATE_CONNECTING: | |
switch (act) { | |
case SERVER_ACTION_CONNECT_FINISH: | |
// srv->ping_timer = server_period_ping | |
next_state = SERVER_STATE_CONNECTED; | |
break; | |
case SERVER_ACTION_LOCAL_CLOSE: | |
sirc_cancel_connect(srv->irc); | |
next_state = SERVER_STATE_CONNECTING; | |
break; | |
case SERVER_ACTION_CONNECT_FAIL: | |
srv->reconn_interval += SERVER_RECONN_STEP; | |
srv->reconn_timer = g_timeout_add(srv->reconn_interval, | |
server_reconnect, srv); | |
next_state = SERVER_STATE_RECONNECTING; | |
break; | |
default: | |
g_warn_if_reached(); | |
} | |
break; | |
case SERVER_STATE_CONNECTED: | |
switch (act) { | |
case SERVER_ACTION_LOCAL_CLOSE: | |
sirc_cancel_connect(srv->irc); | |
next_state = SERVER_STATE_DISCONNECTING; | |
break; | |
default: | |
g_warn_if_reached(); | |
} | |
break; | |
case SERVER_STATE_DISCONNECTING: | |
switch (act) { | |
default: | |
g_warn_if_reached(); | |
} | |
break; | |
case SERVER_STATE_RECONNECTING: | |
switch (act) { | |
case SERVER_ACTION_CONNECT: | |
sirc_connect(srv->irc); | |
next_state = SERVER_STATE_CONNECTING; | |
break; | |
case SERVER_ACTION_LOCAL_CLOSE: | |
g_source_remove(srv->reconn_timer); | |
srv->reconn_timer = 0; | |
next_state = SERVER_STATE_DISCONNECTED; | |
break; | |
default: | |
g_warn_if_reached(); | |
} | |
break; | |
default: | |
g_warn_if_reached(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment