Mercurial > pidgin
diff gtk/plugins/crazychat/crazychat.c @ 14191:009db0b357b5
This is a hand-crafted commit to migrate across subversion revisions
16854:16861, due to some vagaries of the way the original renames were
done. Witness that monotone can do in one revision what svn had to
spread across several.
author | Ethan Blanton <elb@pidgin.im> |
---|---|
date | Sat, 16 Dec 2006 04:59:55 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gtk/plugins/crazychat/crazychat.c Sat Dec 16 04:59:55 2006 +0000 @@ -0,0 +1,96 @@ +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include "cc_interface.h" + +struct cc_session_node { + struct cc_session session; + struct cc_session_node *next; +}; + +struct cc_session *cc_find_session(struct crazychat *cc, char *handle) +{ + struct cc_session_node *curr; + + assert(cc); + assert(handle); + + curr = cc->sessions; + while (curr) { + struct cc_session *session = &curr->session; + if (!strncmp(session->name, handle, strlen(session->name))) { + return session; + } + curr = curr->next; + } + return NULL; +} + +struct cc_session *cc_add_session(struct crazychat *cc, char *handle) +{ + struct cc_session_node *curr; + + assert(cc); + assert(handle); + + if (!cc->sessions) { + cc->sessions = (struct cc_session_node*) + malloc(sizeof(*cc->sessions)); + memset(cc->sessions, 0, sizeof(*cc->sessions)); + cc->sessions->session.cc = cc; + cc->sessions->session.name = strdup(handle); + return &cc->sessions->session; + } else { + if (!strncmp(cc->sessions->session.name, handle, + strlen(cc->sessions->session.name))) { + return &cc->sessions->session; + } + } + + curr = cc->sessions; + while (curr->next) { + struct cc_session *session = &curr->next->session; + if (!strncmp(session->name, handle, strlen(session->name))) { + return session; + } + curr = curr->next; + } + curr->next = (struct cc_session_node*)malloc(sizeof(*curr->next)); + memset(curr->next, 0, sizeof(*curr->next)); + curr->next->session.cc = cc; + curr->next->session.name = strdup(handle); + return &curr->next->session; +} + +void cc_remove_session(struct crazychat *cc, struct cc_session *session) +{ + struct cc_session_node *curr, *prev; + + assert(cc); + assert(session); + + assert(cc->sessions); + + curr = cc->sessions; + prev = NULL; + + while (curr) { + if (&curr->session == session) { + if (prev) { + prev->next = curr->next; + } else { + cc->sessions = curr->next; + } + /* destroy curr */ + free(curr); + g_source_remove(session->timer_id); + free(session->name); + free(session); + return; + } + prev = curr; + curr = curr->next; + } + + assert(0); +}