void mwSession_free(struct mwSession *s) { struct mwSessionHandler *h; g_return_if_fail(s != NULL); if(! mwSession_isStopped(s)) { g_debug("session is not stopped (state: %s), proceeding with free", state_str(s->state)); } h = s->handler; if(h && h->clear) h->clear(s); s->handler = NULL; session_buf_free(s); mwChannelSet_free(s->channels); g_hash_table_destroy(s->services); g_hash_table_destroy(s->ciphers); g_hash_table_destroy(s->attributes); mwLoginInfo_clear(&s->login); mwUserStatus_clear(&s->status); mwPrivacyInfo_clear(&s->privacy); g_free(s); }
static void channel_free(struct mwChannel *chan) { struct mwSession *s; struct mwMessage *msg; GSList *l; /* maybe no warning in the future */ g_return_if_fail(chan != NULL); s = chan->session; mwLoginInfo_clear(&chan->user); mwOpaque_clear(&chan->addtl_create); mwOpaque_clear(&chan->addtl_accept); if(chan->supported) { g_hash_table_destroy(chan->supported); chan->supported = NULL; } if(chan->stats) { g_hash_table_destroy(chan->stats); chan->stats = NULL; } mwCipherInstance_free(chan->cipher); /* clean up the outgoing queue */ for(l = chan->outgoing_queue; l; l = l->next) { msg = (struct mwMessage *) l->data; l->data = NULL; mwMessage_free(msg); } g_slist_free(chan->outgoing_queue); /* clean up the incoming queue */ for(l = chan->incoming_queue; l; l = l->next) { msg = (struct mwMessage *) l->data; l->data = NULL; mwMessage_free(msg); } g_slist_free(chan->incoming_queue); g_free(chan); }
static void LOGIN_ACK_clear(struct mwMsgLoginAck *msg) { mwLoginInfo_clear(&msg->login); mwPrivacyInfo_clear(&msg->privacy); mwUserStatus_clear(&msg->status); }
/** clear and free a login info block */ static void login_free(struct mwLoginInfo *li) { mwLoginInfo_clear(li); g_free(li); }