degesch: reset server info on disconnect

This commit is contained in:
Přemysl Eric Janouch 2015-06-20 22:42:38 +02:00
parent 974ce75a59
commit 193dd36112
1 changed files with 60 additions and 34 deletions

View File

@ -1020,6 +1020,12 @@ enum server_state
IRC_REGISTERED ///< We can chat now
};
/// Convert an IRC identifier character to lower-case
typedef int (*irc_tolower_fn) (int);
/// Key conversion function for hashmap lookups
typedef size_t (*irc_strxfrm_fn) (char *, const char *, size_t);
struct server
{
struct app_context *ctx; ///< Application context
@ -1064,11 +1070,8 @@ struct server
// Server-specific information (from RPL_ISUPPORT):
/// Convert an IRC identifier character to lower-case
int (*irc_tolower) (int);
/// Key conversion function for hashmap lookups
size_t (*irc_strxfrm) (char *, const char *, size_t);
irc_tolower_fn irc_tolower; ///< Server tolower()
irc_strxfrm_fn irc_strxfrm; ///< Server strxfrm()
char *irc_chantypes; ///< Channel types (name prefixes)
char *irc_idchan_prefixes; ///< Prefixes for "safe channels"
@ -1089,6 +1092,45 @@ static void on_irc_timeout (void *user_data);
static void on_irc_ping_timeout (void *user_data);
static void irc_initiate_connect (struct server *s);
static void
server_init_specifics (struct server *self)
{
// Defaults as per the RPL_ISUPPORT drafts, or RFC 1459
self->irc_tolower = irc_tolower;
self->irc_strxfrm = irc_strxfrm;
self->irc_chantypes = xstrdup ("#&");
self->irc_idchan_prefixes = xstrdup ("");
self->irc_statusmsg = xstrdup ("");
self->irc_chanmodes_list = xstrdup ("b");
self->irc_chanmodes_param_always = xstrdup ("k");
self->irc_chanmodes_param_when_set = xstrdup ("l");
self->irc_chanmodes_param_never = xstrdup ("imnpst");
self->irc_chanuser_prefixes = xstrdup ("@+");
self->irc_chanuser_modes = xstrdup ("ov");
self->irc_max_modes = 3;
}
static void
server_free_specifics (struct server *self)
{
free (self->irc_chantypes);
free (self->irc_idchan_prefixes);
free (self->irc_statusmsg);
free (self->irc_chanmodes_list);
free (self->irc_chanmodes_param_always);
free (self->irc_chanmodes_param_when_set);
free (self->irc_chanmodes_param_never);
free (self->irc_chanuser_prefixes);
free (self->irc_chanuser_modes);
}
static void
server_init (struct server *self, struct poller *poller)
{
@ -1119,23 +1161,8 @@ server_init (struct server *self, struct poller *poller)
str_init (&self->irc_user_mode);
// Defaults as per the RPL_ISUPPORT drafts, or RFC 1459
self->irc_tolower = irc_tolower;
self->irc_strxfrm = irc_strxfrm;
self->irc_chantypes = xstrdup ("#&");
self->irc_idchan_prefixes = xstrdup ("");
self->irc_statusmsg = xstrdup ("");
self->irc_chanmodes_list = xstrdup ("b");
self->irc_chanmodes_param_always = xstrdup ("k");
self->irc_chanmodes_param_when_set = xstrdup ("l");
self->irc_chanmodes_param_never = xstrdup ("imnpst");
self->irc_chanuser_prefixes = xstrdup ("@+");
self->irc_chanuser_modes = xstrdup ("ov");
self->irc_max_modes = 3;
server_free_specifics (self);
server_init_specifics (self);
}
static void
@ -1169,17 +1196,7 @@ server_free (struct server *self)
str_free (&self->irc_user_mode);
free (self->irc_user_host);
free (self->irc_chantypes);
free (self->irc_idchan_prefixes);
free (self->irc_statusmsg);
free (self->irc_chanmodes_list);
free (self->irc_chanmodes_param_always);
free (self->irc_chanmodes_param_when_set);
free (self->irc_chanmodes_param_never);
free (self->irc_chanuser_prefixes);
free (self->irc_chanuser_modes);
server_free_specifics (self);
}
static void
@ -3208,9 +3225,18 @@ on_irc_disconnected (struct server *s)
free (s->irc_user_host);
s->irc_user_host = NULL;
// TODO: reset RPL_ISUPPORT information
s->cap_echo_message = false;
irc_tolower_fn old_tolower = s->irc_tolower;
irc_strxfrm_fn old_strxfrm = s->irc_strxfrm;
server_free_specifics (s);
server_init_specifics (s);
// TODO: compare with the original functions and merge users and their
// buffers as necessary; ideally we would never have to do this but
// I can't think of any good workaround
s->irc_tolower = old_tolower;
s->irc_strxfrm = old_strxfrm;
// Take any relevant actions
if (s->ctx->quitting)
try_finish_quit (s->ctx);