Mercurial > pidgin
view plugins/crazychat/crazychat.c @ 13592:6519aeb66b31
[gaim-migrate @ 15978]
Holy cow this is crazy.
34 files changed, 5760 insertions(+), 8517 deletions(-)
* Non-blocking I/O for all of oscar. That includes normal FLAP
connections as well as file transfers and direct IM.
* Kick-ass file transfer and direct IM. Either party can request
the connection. Gaim will try both the "public" IP and the
"client" IP. It'll fall back to transferring through a proxy
if that fails. Should be relatively few memleaks (I didn't
have a lot of confidence in the non-memleakiness of the old
code). And the code is reasonably generic, so it shouldn't
be too much work to add voice chat. This might still be a
LITTLE buggy, but it shouldn't be too bad. If anything, file
transfer will be more buggy than direct IM. And sending a
file will be more buggy than receiving a file. Bug reports
with a series of steps to reproduce are welcome.
* I merged OscarData and aim_session_t
* Somewhere between 50 and 100 hours of work.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Fri, 07 Apr 2006 05:10:56 +0000 |
parents | ed017b9c532d |
children |
line wrap: on
line source
#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); }