# HG changeset patch # User Eric Warmenhoven # Date 992592466 0 # Node ID d94c82b32b06ab9d552a43d9987b39ed7a4c49c5 # Parent 3a991ed8b45c055f5168b736904b7562786907b4 [gaim-migrate @ 2031] someone please test this committer: Tailor Script diff -r 3a991ed8b45c -r d94c82b32b06 plugins/msn/msn.c --- a/plugins/msn/msn.c Fri Jun 15 04:47:14 2001 +0000 +++ b/plugins/msn/msn.c Fri Jun 15 08:07:46 2001 +0000 @@ -42,6 +42,7 @@ struct msn_switchboard { struct gaim_connection *gc; + struct conversation *chat; int fd; int inpa; char *sessid; @@ -49,6 +50,7 @@ int trId; int total; char *user; + char *friend; char *txqueue; }; @@ -288,7 +290,22 @@ while (m) { struct msn_switchboard *ms = m->data; m = m->next; - if (!g_strcasecmp(ms->user, id)) + if ((ms->total == 1) && !g_strcasecmp(ms->user, id)) + return ms; + } + + return NULL; +} + +static struct msn_switchboard *msn_find_switch_by_id(struct gaim_connection *gc, int id) +{ + struct msn_data *md = gc->proto_data; + GSList *m = md->switches; + + while (m) { + struct msn_switchboard *ms = m->data; + m = m->next; + if (ms->chat && (ms->chat->id == id)) return ms; } @@ -322,6 +339,8 @@ g_free(ms->auth); if (ms->user) g_free(ms->user); + if (ms->friend) + g_free(ms->friend); if (ms->txqueue) g_free(ms->txqueue); ms->txqueue = NULL; @@ -336,6 +355,7 @@ struct msn_switchboard *ms = data; struct gaim_connection *gc = ms->gc; char buf[MSN_BUF_LEN]; + static int id = 0; int i = 0; bzero(buf, sizeof(buf)); @@ -352,7 +372,15 @@ if (!g_strncasecmp(buf, "ACK", 3)) { } else if (!g_strncasecmp(buf, "ANS", 3)) { + if (ms->chat) + add_chat_buddy(ms->chat, gc->username); } else if (!g_strncasecmp(buf, "BYE", 3)) { + if (ms->chat) { + char *friend, *tmp = buf; + GET_NEXT(tmp); + friend = url_decode(tmp); + remove_chat_buddy(ms->chat, friend); + } } else if (!g_strncasecmp(buf, "CAL", 3)) { } else if (!g_strncasecmp(buf, "IRO", 3)) { char *tot, *friend, *tmp = buf; @@ -364,14 +392,39 @@ GET_NEXT(tmp); ms->total = atoi(tot); GET_NEXT(tmp); - friend = tmp; + friend = url_decode(tmp); + + if (ms->total > 1) { + if (!ms->chat) + ms->chat = serv_got_joined_chat(gc, ++id, "MSN Chat"); + add_chat_buddy(ms->chat, friend); + } } else if (!g_strncasecmp(buf, "JOI", 3)) { + char *user, *friend, *tmp = buf; + GET_NEXT(tmp); + user = tmp; + GET_NEXT(tmp); + friend = url_decode(tmp); + + if (ms->total == 1) { + ms->chat = serv_got_joined_chat(gc, ++id, "MSN Chat"); + add_chat_buddy(ms->chat, ms->friend); + add_chat_buddy(ms->chat, gc->username); + g_free(ms->user); + ms->user = NULL; + g_free(ms->friend); + ms->friend = NULL; + } + if (ms->chat) + add_chat_buddy(ms->chat, friend); + ms->total++; if (ms->txqueue) { g_snprintf(buf, sizeof(buf), "MSG %d N %d\r\n%s%s", ++ms->trId, strlen(MIME_HEADER) + strlen(ms->txqueue), MIME_HEADER, ms->txqueue); g_free(ms->txqueue); ms->txqueue = NULL; + ms->friend = g_strdup(friend); if (msn_write(ms->fd, buf, strlen(buf)) < 0) msn_kill_switch(ms); debug_printf("\n"); @@ -421,7 +474,10 @@ g_snprintf(final, len, "%s", utf); g_free(utf); - serv_got_im(gc, user, final, 0, time(NULL)); + if (ms->chat) + serv_got_chat_in(gc, ms->chat->id, user, 0, final, time(NULL)); + else + serv_got_im(gc, user, final, 0, time(NULL)); g_free(final); g_free(msg); @@ -429,6 +485,9 @@ do_error_dialog("A message may not have been received.", "MSN Error"); } else if (!g_strncasecmp(buf, "NLN", 3)) { } else if (!g_strncasecmp(buf, "OUT", 3)) { + if (ms->chat) + serv_got_chat_left(gc, ms->chat->id); + msn_kill_switch(ms); } else if (!g_strncasecmp(buf, "USR", 3)) { /* good, we got USR, now we need to find out who we want to talk to */ struct msn_switchboard *ms = msn_find_writable_switch(gc); @@ -569,11 +628,11 @@ return; ap->user = g_strdup(user); - ap->friend = g_strdup(url_decode(friend)); + ap->friend = g_strdup(friend); ap->gc = gc; g_snprintf(msg, sizeof(msg), "The user %s (%s) wants to add you to their buddy list.", - ap->user, ap->friend); + ap->user, url_decode(ap->friend)); do_ask_dialog(msg, ap, msn_accept_add, msn_cancel_add); } else if (!g_strncasecmp(buf, "BLP", 3)) { @@ -629,7 +688,7 @@ who = tmp; GET_NEXT(tmp); - friend = tmp; + friend = url_decode(tmp); if (!g_strcasecmp(which, "FL")) { struct msn_buddy *b = g_new0(struct msn_buddy, 1); @@ -732,7 +791,7 @@ } else if (!g_strncasecmp(buf, "REM", 3)) { } else if (!g_strncasecmp(buf, "RNG", 3)) { struct msn_switchboard *ms; - char *sessid, *ssaddr, *auth, *user; + char *sessid, *ssaddr, *auth, *user, *friend; int port, i = 0; char *tmp = buf; @@ -751,6 +810,7 @@ user = tmp; GET_NEXT(tmp); + friend = url_decode(tmp); while (ssaddr[i] && ssaddr[i] != ':') i++; if (ssaddr[i] == ':') { @@ -762,6 +822,7 @@ ms = g_new0(struct msn_switchboard, 1); ms->user = g_strdup(user); + ms->friend = g_strdup(friend); ms->sessid = g_strdup(sessid); ms->auth = g_strdup(auth); ms->gc = gc; @@ -1095,6 +1156,35 @@ } } +static void msn_chat_send(struct gaim_connection *gc, int id, char *message) +{ + struct msn_switchboard *ms = msn_find_switch_by_id(gc, id); + char buf[MSN_BUF_LEN]; + + if (!ms) + return; + + g_snprintf(buf, sizeof(buf), "MSG %d N %d\r\n%s%s", ++ms->trId, + strlen(MIME_HEADER) + strlen(message), + MIME_HEADER, message); + if (msn_write(ms->fd, buf, strlen(buf)) < 0) + msn_kill_switch(ms); + debug_printf("\n"); +} + +static void msn_chat_leave(struct gaim_connection *gc, int id) +{ + struct msn_switchboard *ms = msn_find_switch_by_id(gc, id); + char buf[MSN_BUF_LEN]; + + if (!ms) + return; + + g_snprintf(buf, sizeof(buf), "OUT\n"); + if (msn_write(ms->fd, buf, strlen(buf)) < 0) + msn_kill_switch(ms); +} + static GList *msn_away_states() { GList *m = NULL; @@ -1314,6 +1404,8 @@ ret->set_idle = msn_set_idle; ret->add_buddy = msn_add_buddy; ret->remove_buddy = msn_rem_buddy; + ret->chat_send = msn_chat_send; + ret->chat_leave = msn_chat_leave; ret->normalize = msn_normalize; my_protocol = ret;