Mercurial > pidgin
diff src/protocols/msn/notification.c @ 8808:bbd8cdaf0ad5
[gaim-migrate @ 9570]
A massive patch by shx to reorganize MSN some more and add command
processor support. This allows us to do cool things like produce more
detailed error messages. For example, the Invalid Username dialog now
shows the username of the invalid user.
I modified the aforementioned dialog so it'll look a little nicer looking,
and also mention the account this happened on. It also removes the user
from your blist, as there's no point to keeping the user on there.
committer: Tailor Script <tailor@pidgin.im>
| author | Christian Hammond <chipx86@chipx86.com> |
|---|---|
| date | Sun, 25 Apr 2004 22:02:06 +0000 |
| parents | 06dd136238ab |
| children | c313e3b1f2c0 |
line wrap: on
line diff
--- a/src/protocols/msn/notification.c Sun Apr 25 17:01:38 2004 +0000 +++ b/src/protocols/msn/notification.c Sun Apr 25 22:02:06 2004 +0000 @@ -32,18 +32,17 @@ } MsnPermitAdd; -static GHashTable *notification_commands = NULL; -static GHashTable *notification_msg_types = NULL; +static MsnTable *cbs_table = NULL; /************************************************************************** * Utility functions **************************************************************************/ static gboolean -add_buddy(MsnServConn *servconn, MsnUser *user) +add_buddy(MsnCmdProc *cmdproc, MsnUser *user) { - MsnSession *session = servconn->session; - GaimAccount *account = session->account; - GaimConnection *gc = gaim_account_get_connection(account); + MsnSession *session; + GaimAccount *account; + GaimConnection *gc; GaimBuddy *b; MsnGroup *group = NULL; GaimGroup *g = NULL; @@ -51,6 +50,9 @@ GSList *sl; GSList *buddies; + session = cmdproc->session; + account = session->account; + gc = gaim_account_get_connection(account); buddies = gaim_find_buddies(account, msn_user_get_passport(user)); for (l = msn_user_get_group_ids(user); l != NULL; l = l->next) @@ -134,19 +136,20 @@ static void msn_accept_add_cb(MsnPermitAdd *pa) { - if (g_list_find(gaim_connections_get_all(), pa->gc) != NULL) { - MsnSession *session = pa->gc->proto_data; - char outparams[MSN_BUF_LEN]; + if (g_list_find(gaim_connections_get_all(), pa->gc) != NULL) + { + MsnSession *session; + MsnCmdProc *cmdproc; - g_snprintf(outparams, sizeof(outparams), "AL %s %s", - msn_user_get_passport(pa->user), - gaim_url_encode(msn_user_get_name(pa->user))); + session = pa->gc->proto_data; + cmdproc = session->notification_conn->cmdproc; - if (msn_servconn_send_command(session->notification_conn, - "ADD", outparams) <= 0) { - gaim_connection_error(pa->gc, _("Write error")); + msn_cmdproc_send(cmdproc, "ADD", "AL %s %s", + msn_user_get_passport(pa->user), + gaim_url_encode(msn_user_get_name(pa->user))); + + if (cmdproc->error) return; - } gaim_privacy_permit_add(pa->gc->account, msn_user_get_passport(pa->user), TRUE); @@ -162,19 +165,20 @@ static void msn_cancel_add_cb(MsnPermitAdd *pa) { - if (g_list_find(gaim_connections_get_all(), pa->gc) != NULL) { - MsnSession *session = pa->gc->proto_data; - char outparams[MSN_BUF_LEN]; + if (g_list_find(gaim_connections_get_all(), pa->gc) != NULL) + { + MsnSession *session; + MsnCmdProc *cmdproc; - g_snprintf(outparams, sizeof(outparams), "BL %s %s", - msn_user_get_passport(pa->user), - gaim_url_encode(msn_user_get_name(pa->user))); + session = pa->gc->proto_data; + cmdproc = session->notification_conn->cmdproc; - if (msn_servconn_send_command(session->notification_conn, - "ADD", outparams) <= 0) { - gaim_connection_error(pa->gc, _("Write error")); + msn_cmdproc_send(cmdproc, "ADD", "BL %s %s", + msn_user_get_passport(pa->user), + gaim_url_encode(msn_user_get_name(pa->user))); + + if (cmdproc->error) return; - } gaim_privacy_deny_add(pa->gc->account, msn_user_get_passport(pa->user), TRUE); @@ -185,113 +189,69 @@ } /************************************************************************** - * Catch-all commands - **************************************************************************/ -static gboolean -blank_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) -{ - return TRUE; -} - -static gboolean -unknown_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) -{ - int errnum = 0; - - if (isdigit(*command)) { - errnum = atoi(command); - - if (errnum == 225) { - /* - * Ignore this. It happens as a result of moving a buddy from - * one group that isn't on the server to another that is. - * The user doesn't care if the old group was there or not. - */ - return TRUE; - } - } - - msn_error_handle(servconn->session, errnum); - - return TRUE; -} - - -/************************************************************************** * Login **************************************************************************/ - -static gboolean -cvr_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +cvr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - GaimAccount *account = servconn->session->account; - GaimConnection *gc = gaim_account_get_connection(account); - char outparams[MSN_BUF_LEN]; + GaimAccount *account; + GaimConnection *gc; - g_snprintf(outparams, sizeof(outparams), - "TWN I %s", gaim_account_get_username(account)); + account = cmdproc->session->account; + gc = gaim_account_get_connection(account); - if (!msn_servconn_send_command(servconn, "USR", outparams)) - { - gaim_connection_error(gc, _("Unable to request USR\n")); - - return FALSE; - } - - return TRUE; + msn_cmdproc_send(cmdproc, "USR", "TWN I %s", + gaim_account_get_username(account)); } -static gboolean -inf_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +inf_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - GaimAccount *account = servconn->session->account; - GaimConnection *gc = gaim_account_get_connection(account); - char outparams[MSN_BUF_LEN]; + GaimAccount *account; + GaimConnection *gc; - if (strcmp(params[1], "MD5")) { + account = cmdproc->session->account; + gc = gaim_account_get_connection(account); + + if (strcmp(cmd->params[1], "MD5")) + { gaim_connection_error(gc, _("Unable to login using MD5")); - return FALSE; + return; } - g_snprintf(outparams, sizeof(outparams), "MD5 I %s", - gaim_account_get_username(account)); + msn_cmdproc_send(cmdproc, "USR", "MD5 I %s", + gaim_account_get_username(account)); - if (!msn_servconn_send_command(servconn, "USR", outparams)) { - gaim_connection_error(gc, _("Unable to send USR")); - - return FALSE; - } + if (cmdproc->error) + return; gaim_connection_update_progress(gc, _("Requesting to send password"), 5, MSN_CONNECT_STEPS); - - return TRUE; } -static gboolean -usr_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +usr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; - GaimAccount *account = session->account; - GaimConnection *gc = gaim_account_get_connection(account); + MsnSession *session; + GaimAccount *account; + GaimConnection *gc; char outparams[MSN_BUF_LEN]; + session = cmdproc->session; + account = session->account; + gc = gaim_account_get_connection(account); + /* * We're either getting the passport connect info (if we're on * MSNP8 or higher), or a challenge request (MSNP7 and lower). * * Let's find out. */ - if (!g_ascii_strcasecmp(params[1], "OK")) + if (!g_ascii_strcasecmp(cmd->params[1], "OK")) { - const char *friendly = gaim_url_decode(params[3]); + const char *friendly = gaim_url_decode(cmd->params[3]); /* OK */ @@ -299,17 +259,15 @@ session->syncing_lists = TRUE; - if (!msn_servconn_send_command(servconn, "SYN", "0")) - { - gaim_connection_error(gc, _("Unable to write")); + msn_cmdproc_send(cmdproc, "SYN", "%s", "0"); - return FALSE; - } + if (cmdproc->error) + return; gaim_connection_update_progress(gc, _("Retrieving buddy list"), 7, MSN_CONNECT_STEPS); } - else if (!g_ascii_strcasecmp(params[1], "TWN")) + else if (!g_ascii_strcasecmp(cmd->params[1], "TWN")) { char **elems, **cur, **tokens; @@ -317,7 +275,7 @@ session->nexus = msn_nexus_new(session); /* Parse the challenge data. */ - elems = g_strsplit(params[3], ",", 0); + elems = g_strsplit(cmd->params[3], ",", 0); for (cur = elems; *cur != NULL; cur++) { @@ -334,244 +292,229 @@ gaim_connection_update_progress(gc, _("Password sent"), 6, MSN_CONNECT_STEPS); } - else if (!g_ascii_strcasecmp(params[1], "MD5")) + else if (!g_ascii_strcasecmp(cmd->params[1], "MD5")) { /* Challenge */ - const char *challenge = params[3]; - char buf[MSN_BUF_LEN]; + const char *challenge; + const char *password; + char buf[33]; md5_state_t st; md5_byte_t di[16]; int i; - g_snprintf(buf, sizeof(buf), "%s%s", challenge, - gaim_account_get_password(account)); + challenge = cmd->params[3]; + password = gaim_account_get_password(account); md5_init(&st); - md5_append(&st, (const md5_byte_t *)buf, strlen(buf)); + md5_append(&st, (const md5_byte_t *)challenge, strlen(challenge)); + md5_append(&st, (const md5_byte_t *)password, strlen(password)); md5_finish(&st, di); g_snprintf(outparams, sizeof(outparams), "MD5 S "); - for (i = 0; i < 16; i++) { - g_snprintf(buf, sizeof(buf), "%02x", di[i]); - strcat(outparams, buf); - } + for (i = 0; i < 16; i++) + g_snprintf(buf + (i*2), 3, "%02x", di[i]); - if (!msn_servconn_send_command(servconn, "USR", outparams)) { - gaim_connection_error(gc, _("Unable to send password")); + msn_cmdproc_send(cmdproc, "USR", "MD5 S %s", buf); - return FALSE; - } + if (cmdproc->error) + return; gaim_connection_update_progress(gc, _("Password sent"), 6, MSN_CONNECT_STEPS); } - - return TRUE; } -static gboolean -ver_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +ver_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; - GaimAccount *account = session->account; - GaimConnection *gc = gaim_account_get_connection(account); + MsnSession *session; + GaimAccount *account; + GaimConnection *gc; gboolean protocol_supported = FALSE; - char outparams[MSN_BUF_LEN]; char proto_str[8]; size_t i; + session = cmdproc->session; + account = session->account; + gc = gaim_account_get_connection(account); + g_snprintf(proto_str, sizeof(proto_str), "MSNP%d", session->protocol_ver); - for (i = 1; i < param_count; i++) + for (i = 1; i < cmd->param_count; i++) { - if (!strcmp(params[i], proto_str)) + if (!strcmp(cmd->params[i], proto_str)) { protocol_supported = TRUE; break; } } - if (!protocol_supported) { + if (!protocol_supported) + { gaim_connection_error(gc, _("Protocol not supported")); - return FALSE; + return; } if (session->protocol_ver >= 8) { - g_snprintf(outparams, sizeof(outparams), - "0x0409 winnt 5.1 i386 MSNMSGR 6.0.0602 MSMSGS %s", - gaim_account_get_username(account)); - - if (!msn_servconn_send_command(servconn, "CVR", outparams)) - { - gaim_connection_error(gc, _("Unable to request CVR\n")); - - return FALSE; - } + msn_cmdproc_send(cmdproc, "CVR", + "0x0409 winnt 5.1 i386 MSNMSGR 6.0.0602 MSMSGS %s", + gaim_account_get_username(account)); } else { - if (!msn_servconn_send_command(servconn, "INF", NULL)) - { - gaim_connection_error(gc, _("Unable to request INF\n")); - - return FALSE; - } + msn_cmdproc_send(cmdproc, "INF", NULL, NULL); } - - return TRUE; } /************************************************************************** * Log out **************************************************************************/ -static gboolean -out_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +out_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - GaimConnection *gc = servconn->session->account->gc; + GaimConnection *gc; - if (!g_ascii_strcasecmp(params[0], "OTH")) { + gc = cmdproc->session->account->gc; + + if (!g_ascii_strcasecmp(cmd->params[0], "OTH")) + { gc->wants_to_die = TRUE; gaim_connection_error(gc, - _("You have been disconnected. You have " - "signed on from another location.")); + _("You have been disconnected. You have " + "signed on from another location.")); } - else if (!g_ascii_strcasecmp(params[0], "SSD")) { + else if (!g_ascii_strcasecmp(cmd->params[0], "SSD")) + { gaim_connection_error(gc, - _("You have been disconnected. The MSN servers " - "are going down temporarily.")); + _("You have been disconnected. The MSN servers " + "are going down temporarily.")); } - - return FALSE; } /************************************************************************** * Messages **************************************************************************/ static void -msg_cmd_post(MsnServConn *servconn, char *payload, size_t len) +msg_cmd_post(MsnCmdProc *cmdproc, char *payload, size_t len) { - MsnMessage *msg = msn_message_new(); + MsnMessage *msg; - msg->passport = servconn->msg_passport; + msg = msn_message_new(); msn_message_parse_payload(msg, payload, len); - msn_servconn_process_message(servconn, msg); + msg->passport = cmdproc->temp; + msn_cmdproc_process_msg(cmdproc, msg); + g_free(cmdproc->temp); + cmdproc->temp = NULL; msn_message_destroy(msg); } -static gboolean -msg_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +msg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { gaim_debug(GAIM_DEBUG_INFO, "msn", "Found message. Parsing.\n"); - servconn->payload_cb = msg_cmd_post; - servconn->payload_len = atoi(params[2]); - - servconn->msg_passport = g_strdup(params[0]); - - return TRUE; + cmdproc->payload_cb = msg_cmd_post; + cmdproc->servconn->payload_len = atoi(cmd->params[2]); + cmdproc->temp = g_strdup(cmd->params[0]); } /************************************************************************** * Challenges **************************************************************************/ -static gboolean -chl_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +chl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; - GaimConnection *gc = session->account->gc; + MsnSession *session; + GaimConnection *gc; + MsnTransaction *trans; char buf[MSN_BUF_LEN]; - char buf2[3]; const char *challenge_resp; + const char *challenge_str; md5_state_t st; md5_byte_t di[16]; int i; + session = cmdproc->session; + gc = session->account->gc; + md5_init(&st); - md5_append(&st, (const md5_byte_t *)params[1], strlen(params[1])); + md5_append(&st, (const md5_byte_t *)cmd->params[1], strlen(cmd->params[1])); if (session->protocol_ver >= 8) { challenge_resp = "VT6PX?UQTM4WM%YR"; + challenge_str = "PROD0038W!61ZTF9"; } else { challenge_resp = "Q1P7W2E4J9R8U3S5"; + challenge_str = "msmsgs@msnmsgr.com"; } md5_append(&st, (const md5_byte_t *)challenge_resp, strlen(challenge_resp)); md5_finish(&st, di); - g_snprintf(buf, sizeof(buf), - "QRY %u %s 32\r\n", - servconn->session->trId++, - (session->protocol_ver >= 8 - ? "PROD0038W!61ZTF9" - : "msmsgs@msnmsgr.com")); + for (i = 0; i < 16; i++) + g_snprintf(buf + (i*2), 3, "%02x", di[i]); - for (i = 0; i < 16; i++) { - g_snprintf(buf2, sizeof(buf2), "%02x", di[i]); - strcat(buf, buf2); - } + trans = msn_transaction_new("QRY", "%s 32", challenge_str); - if (msn_servconn_write(servconn, buf, strlen(buf)) <= 0) { - gaim_connection_error(gc, _("Unable to write to server")); - } + msn_transaction_set_payload(trans, buf, 32); - return TRUE; + msn_cmdproc_send_trans(cmdproc, trans); } /************************************************************************** * Buddy Lists **************************************************************************/ -static gboolean -add_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +add_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; + MsnSession *session; MsnUser *user; - GaimAccount *account = session->account; - GaimConnection *gc = gaim_account_get_connection(account); + GaimAccount *account; + GaimConnection *gc; MsnPermitAdd *pa; GSList *sl; const char *list, *passport, *group_id = NULL; const char *friend; char msg[MSN_BUF_LEN]; - list = params[1]; - passport = params[3]; - friend = gaim_url_decode(params[4]); + session = cmdproc->session; + account = session->account; + gc = gaim_account_get_connection(account); - if (param_count >= 6) - group_id = params[5]; + list = cmd->params[1]; + passport = cmd->params[3]; + friend = gaim_url_decode(cmd->params[4]); - if (!g_ascii_strcasecmp(list, "FL")) { + if (cmd->param_count >= 6) + group_id = cmd->params[5]; + + if (!g_ascii_strcasecmp(list, "FL")) + { user = msn_user_new(session, passport, NULL); if (group_id != NULL) msn_user_add_group_id(user, atoi(group_id)); - add_buddy(servconn, user); + add_buddy(cmdproc, user); - return TRUE; + return; } else if (g_ascii_strcasecmp(list, "RL")) - return TRUE; + return; - for (sl = gc->account->permit; sl != NULL; sl = sl->next) { + for (sl = gc->account->permit; sl != NULL; sl = sl->next) if (!gaim_utf8_strcasecmp(sl->data, passport)) - return TRUE; - } + return; user = msn_user_new(session, passport, friend); msn_user_set_name(user, friend); @@ -587,43 +530,105 @@ gaim_request_action(gc, NULL, msg, NULL, 0, pa, 2, _("Authorize"), G_CALLBACK(msn_accept_add_cb), _("Deny"), G_CALLBACK(msn_cancel_add_cb)); - - return TRUE; } -static gboolean -adg_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +add_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error) +{ + MsnSession *session; + GaimAccount *account; + GaimConnection *gc; + const char *list, *passport; + char *reason; + char *msg = NULL; + char **params; + + session = cmdproc->session; + account = session->account; + gc = gaim_account_get_connection(account); + params = g_strsplit(trans->params, " ", 0); + + list = params[0]; + passport = params[1]; + + reason = "invalid user"; + + if (!strcmp(list, "FL")) + msg = g_strdup("Unable to add user on MSN"); + else if (!strcmp(list, "BL")) + msg = g_strdup("Unable to block user on MSN"); + else if (!strcmp(list, "AL")) + msg = g_strdup("Unable to permit user on MSN"); + + if (!strcmp(list, "FL")) + { + reason = g_strdup_printf("%s is not a valid passport account.\n\n" + "This user will be automatically removed " + "from your %s account's buddy list, so this " + "won't appear again.", + passport, gaim_account_get_username(account)); + } + else + { + reason = g_strdup_printf("%s is not a valid passport account.", + passport); + } + + if (msg != NULL) + { + gaim_notify_error(gc, NULL, msg, reason); + g_free(msg); + } + + if (!strcmp(list, "FL")) + { + GaimBuddy *buddy; + + buddy = gaim_find_buddy(account, passport); + + if (buddy != NULL) + gaim_blist_remove_buddy(buddy); + } + + g_free(reason); + + g_strfreev(params); +} + +static void +adg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { MsnGroup *group; - MsnSession *session = servconn->session; + MsnSession *session; gint group_id; const char *group_name; - group_id = atoi(params[3]); + session = cmdproc->session; - group_name = gaim_url_decode(params[2]); + group_id = atoi(cmd->params[3]); + + group_name = gaim_url_decode(cmd->params[2]); group = msn_group_new(session, group_id, group_name); msn_groups_add(session->groups, group); - - return TRUE; } -static gboolean -blp_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +blp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - GaimConnection *gc = servconn->session->account->gc; + GaimConnection *gc; const char *list_name; - if (servconn->session->protocol_ver >= 8) - list_name = params[0]; + gc = cmdproc->session->account->gc; + + if (cmdproc->session->protocol_ver >= 8) + list_name = cmd->params[0]; else - list_name = params[2]; + list_name = cmd->params[2]; - if (!g_ascii_strcasecmp(list_name, "AL")) { + if (!g_ascii_strcasecmp(list_name, "AL")) + { /* * If the current setting is AL, messages from users who * are not in BL will be delivered. @@ -632,7 +637,8 @@ */ gc->account->perm_deny = GAIM_PRIVACY_DENY_USERS; } - else { + else + { /* If the current setting is BL, only messages from people * who are in the AL will be delivered. * @@ -640,44 +646,49 @@ */ gc->account->perm_deny = GAIM_PRIVACY_ALLOW_USERS; } - - return TRUE; } -static gboolean -bpr_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +bpr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; - GaimConnection *gc = session->account->gc; + MsnSession *session; + GaimConnection *gc; const char *passport, *type, *value; GaimBuddy *b; MsnUser *user; - if (param_count == 4) + session = cmdproc->session; + gc = session->account->gc; + + if (cmd->param_count == 4) { - passport = params[1]; - type = params[2]; - value = params[3]; + passport = cmd->params[1]; + type = cmd->params[2]; + value = cmd->params[3]; } - else if (param_count == 2) + else if (cmd->param_count == 2) { passport = msn_user_get_passport(session->last_user_added); - type = params[0]; - value = params[1]; + type = cmd->params[0]; + value = cmd->params[1]; } else - return TRUE; + return; user = msn_users_find_with_passport(session->users, passport); - if (value != NULL) { - if (!strcmp(type, "MOB")) { - if (!strcmp(value, "Y") || !strcmp(value, "N")) { + if (value != NULL) + { + if (!strcmp(type, "MOB")) + { + if (!strcmp(value, "Y") || !strcmp(value, "N")) + { user->mobile = (!strcmp(value, "Y") ? TRUE : FALSE); - if ((b = gaim_find_buddy(gc->account, passport)) != NULL) { - if (GAIM_BUDDY_IS_ONLINE(b)) { + if ((b = gaim_find_buddy(gc->account, passport)) != NULL) + { + if (GAIM_BUDDY_IS_ONLINE(b)) + { serv_got_update(gc, (char *)passport, 1, 0, 0, 0, b->uc); } @@ -691,36 +702,35 @@ else if (!strcmp(type, "PHM")) msn_user_set_mobile_phone(user, gaim_url_decode(value)); } - - return TRUE; } -static gboolean -fln_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +fln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - GaimConnection *gc = servconn->session->account->gc; + GaimConnection *gc; - serv_got_update(gc, (char *)params[0], 0, 0, 0, 0, 0); + gc = cmdproc->session->account->gc; - return TRUE; + serv_got_update(gc, (char *)cmd->params[0], 0, 0, 0, 0, 0); } -static gboolean -iln_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +iln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; - GaimConnection *gc = session->account->gc; + MsnSession *session; + GaimConnection *gc; MsnUser *user; MsnObject *msnobj; int status = 0; const char *state, *passport, *friend; GaimBuddy *b; - state = params[1]; - passport = params[2]; - friend = gaim_url_decode(params[3]); + session = cmdproc->session; + gc = session->account->gc; + + state = cmd->params[1]; + passport = cmd->params[2]; + friend = gaim_url_decode(cmd->params[3]); user = msn_users_find_with_passport(session->users, passport); @@ -728,9 +738,9 @@ msn_user_set_name(user, friend); - if (session->protocol_ver >= 9 && param_count == 6) + if (session->protocol_ver >= 9 && cmd->param_count == 6) { - msnobj = msn_object_new_from_string(gaim_url_decode(params[5])); + msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[5])); msn_user_set_object(user, msnobj); } @@ -751,43 +761,39 @@ status |= UC_UNAVAILABLE | (MSN_LUNCH << 1); serv_got_update(gc, (char *)passport, 1, 0, 0, 0, status); - - return TRUE; } -static gboolean -ipg_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +ipg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - servconn->payload_cb = NULL; - servconn->payload_len = atoi(params[2]); - - return TRUE; + cmdproc->payload_cb = NULL; + cmdproc->servconn->payload_len = atoi(cmd->params[2]); } -static gboolean -lsg_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +lsg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; + MsnSession *session; MsnGroup *group; GaimGroup *g; const char *name; int num_groups, group_id; + session = cmdproc->session; + if (session->protocol_ver >= 8) { - group_id = atoi(params[0]); - name = gaim_url_decode(params[1]); + group_id = atoi(cmd->params[0]); + name = gaim_url_decode(cmd->params[1]); } else { - num_groups = atoi(params[3]); - group_id = atoi(params[4]); - name = gaim_url_decode(params[5]); + num_groups = atoi(cmd->params[3]); + group_id = atoi(cmd->params[4]); + name = gaim_url_decode(cmd->params[5]); if (num_groups == 0) - return TRUE; + return; if (!strcmp(name, "~")) name = _("Buddies"); @@ -797,33 +803,35 @@ msn_groups_add(session->groups, group); - if ((g = gaim_find_group(name)) == NULL) { + if ((g = gaim_find_group(name)) == NULL) + { g = gaim_group_new(name); gaim_blist_add_group(g, NULL); } - - return TRUE; } -static gboolean -lst_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +lst_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; - GaimAccount *account = session->account; - GaimConnection *gc = gaim_account_get_connection(account); + MsnSession *session; + GaimAccount *account; + GaimConnection *gc; const char *passport = NULL; const char *friend = NULL; + session = cmdproc->session; + account = session->account; + gc = gaim_account_get_connection(account); + if (session->protocol_ver >= 8) { const char *group_nums; int list_op; - passport = params[0]; - friend = gaim_url_decode(params[1]); - list_op = atoi(params[2]); - group_nums = params[3]; + passport = cmd->params[0]; + friend = gaim_url_decode(cmd->params[1]); + list_op = atoi(cmd->params[2]); + group_nums = cmd->params[3]; if (list_op & MSN_LIST_FL_OP) { @@ -921,7 +929,7 @@ gaim_account_get_buddy_icon(session->account)); if (!msn_session_change_status(session, "NLN")) - return FALSE; + return; gaim_connection_set_state(gc, GAIM_CONNECTED); serv_finish_login(gc); @@ -947,7 +955,7 @@ session->lists.forward = g_slist_remove(session->lists.forward, user); - add_buddy(servconn, user); + add_buddy(cmdproc, user); buddies = gaim_find_buddies(account, msn_user_get_passport(user)); @@ -981,24 +989,24 @@ int user_num; int num_users; - list_name = params[1]; - user_num = atoi(params[3]); - num_users = atoi(params[4]); + list_name = cmd->params[1]; + user_num = atoi(cmd->params[3]); + num_users = atoi(cmd->params[4]); if (g_ascii_strcasecmp(list_name, "RL") && user_num == 0 && num_users == 0) { - return TRUE; /* There are no users on this list. */ + return; /* There are no users on this list. */ } if (num_users > 0) { - passport = params[5]; - friend = gaim_url_decode(params[6]); + passport = cmd->params[5]; + friend = gaim_url_decode(cmd->params[6]); } if (session->syncing_lists && session->lists_synced) - return TRUE; + return; if (!g_ascii_strcasecmp(list_name, "FL") && user_num != 0) { @@ -1007,8 +1015,8 @@ user = msn_user_new(session, passport, friend); - if (param_count == 8) - msn_user_add_group_id(user, atoi(params[7])); + if (cmd->param_count == 8) + msn_user_add_group_id(user, atoi(cmd->params[7])); session->lists.forward = g_slist_append(session->lists.forward, user); @@ -1081,13 +1089,13 @@ } if (user_num != num_users) - return TRUE; /* This isn't the last one in the RL. */ + return; /* This isn't the last one in the RL. */ /* Now we're at the last one, so we can do final work. */ if (!session->lists_synced) { if (!msn_session_change_status(session, "NLN")) - return FALSE; + return; gaim_connection_set_state(gc, GAIM_CONNECTED); serv_finish_login(gc); @@ -1112,23 +1120,20 @@ session->lists.forward = g_slist_remove(session->lists.forward, user); - add_buddy(servconn, user); + add_buddy(cmdproc, user); } session->syncing_lists = FALSE; session->lists_synced = TRUE; } } - - return TRUE; } -static gboolean -nln_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +nln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; - GaimConnection *gc = session->account->gc; + MsnSession *session; + GaimConnection *gc; MsnUser *user; MsnObject *msnobj; const char *state; @@ -1136,9 +1141,12 @@ const char *friend; int status = 0; - state = params[0]; - passport = params[1]; - friend = gaim_url_decode(params[2]); + session = cmdproc->session; + gc = session->account->gc; + + state = cmd->params[0]; + passport = cmd->params[1]; + friend = gaim_url_decode(cmd->params[2]); user = msn_users_find_with_passport(session->users, passport); @@ -1146,9 +1154,9 @@ msn_user_set_name(user, friend); - if (session->protocol_ver >= 9 && param_count == 5) + if (session->protocol_ver >= 9 && cmd->param_count == 5) { - msnobj = msn_object_new_from_string(gaim_url_decode(params[4])); + msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[4])); msn_user_set_object(user, msnobj); } @@ -1166,31 +1174,28 @@ status |= UC_UNAVAILABLE | (MSN_LUNCH << 1); serv_got_update(gc, (char *)passport, 1, 0, 0, 0, status); +} - return TRUE; +static void +not_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) +{ + cmdproc->payload_cb = NULL; + cmdproc->servconn->payload_len = atoi(cmd->params[1]); } -static gboolean -not_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +prp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - servconn->payload_cb = NULL; - servconn->payload_len = atoi(params[1]); - - return TRUE; -} - -static gboolean -prp_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) -{ - MsnSession *session = servconn->session; + MsnSession *session; const char *type, *value; - type = params[2]; - value = params[3]; + session = cmdproc->session; - if (param_count == 4) { + type = cmd->params[2]; + value = cmd->params[3]; + + if (cmd->param_count == 4) + { if (!strcmp(type, "PHH")) msn_user_set_home_phone(session->user, gaim_url_decode(value)); else if (!strcmp(type, "PHW")) @@ -1198,37 +1203,34 @@ else if (!strcmp(type, "PHM")) msn_user_set_mobile_phone(session->user, gaim_url_decode(value)); } - - return TRUE; } -static gboolean -rea_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +rea_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; - GaimConnection *gc = session->account->gc; + MsnSession *session; + GaimConnection *gc; const char *friend; - friend = gaim_url_decode(params[3]); + session = cmdproc->session; + gc = session->account->gc; + friend = gaim_url_decode(cmd->params[3]); gaim_connection_set_display_name(gc, friend); - - return TRUE; } -static gboolean -reg_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +reg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; + MsnSession *session; MsnGroup *group; int group_id; const char *group_name; - group_id = atoi(params[2]); + session = cmdproc->session; + group_id = atoi(cmd->params[2]); - group_name = gaim_url_decode(params[3]); + group_name = gaim_url_decode(cmd->params[3]); group = msn_groups_find_with_id(session->groups, group_id); @@ -1237,21 +1239,21 @@ if (group != NULL) msn_group_set_name(group, group_name); - - return TRUE; } -static gboolean -rem_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +rem_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; - const char *passport = params[3]; + MsnSession *session; + const char *passport; - if (param_count == 5) + session = cmdproc->session; + passport = cmd->params[3]; + + if (cmd->param_count == 5) { MsnUser *user; - int group_id = atoi(params[4]); + int group_id = atoi(cmd->params[4]); user = msn_users_find_with_passport(session->users, passport); @@ -1259,11 +1261,11 @@ } /* I hate this. */ - if (session->moving_buddy) { + /* shx: it won't be here for long. */ + if (session->moving_buddy) + { MsnGroup *group, *old_group; - GaimConnection *gc = session->account->gc; const char *friendly; - char outparams[MSN_BUF_LEN]; group = msn_groups_find_with_name(session->groups, session->dest_group_name); @@ -1273,15 +1275,14 @@ session->moving_buddy = FALSE; session->old_group = NULL; - if (group == NULL) { + if (group == NULL) + { gaim_debug(GAIM_DEBUG_ERROR, "msn", "Still don't have a group ID for %s while moving %s!\n", session->dest_group_name, passport); g_free(session->dest_group_name); session->dest_group_name = NULL; - - return TRUE; } g_free(session->dest_group_name); @@ -1290,15 +1291,12 @@ if ((friendly = msn_user_get_name(session->moving_user)) == NULL) friendly = passport; - g_snprintf(outparams, sizeof(outparams), "FL %s %s %d", - passport, gaim_url_encode(friendly), - msn_group_get_id(group)); + msn_cmdproc_send(cmdproc, "ADD", "FL %s %s %d", + passport, gaim_url_encode(friendly), + msn_group_get_id(group)); - if (!msn_servconn_send_command(session->notification_conn, - "ADD", outparams)) { - gaim_connection_error(gc, _("Write error")); - return FALSE; - } + if (cmdproc->error) + return; if (old_group != NULL) msn_group_remove_user(old_group, session->moving_user); @@ -1308,67 +1306,61 @@ session->moving_user = NULL; if (old_group != NULL && - msn_users_get_count(msn_group_get_users(old_group)) <= 0) { - - g_snprintf(outparams, sizeof(outparams), "%d", - msn_group_get_id(old_group)); - - if (!msn_servconn_send_command(session->notification_conn, - "RMG", outparams)) { - - gaim_connection_error(gc, _("Write error")); - return FALSE; - } + msn_users_get_count(msn_group_get_users(old_group)) <= 0) + { + msn_cmdproc_send(cmdproc, "REM", "%s", "%d", + msn_group_get_id(old_group)); } } - - return TRUE; } -static gboolean -rmg_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +rmg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; + MsnSession *session; MsnGroup *group; - group = msn_groups_find_with_id(session->groups, atoi(params[2])); + session = cmdproc->session; + group = msn_groups_find_with_id(session->groups, atoi(cmd->params[2])); if (group != NULL) msn_groups_remove(session->groups, group); - - return TRUE; } -static gboolean -syn_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +syn_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; - GaimConnection *gc = gaim_account_get_connection(session->account); + MsnSession *session; + GaimConnection *gc; + + session = cmdproc->session; + gc = gaim_account_get_connection(session->account); if (session->protocol_ver >= 8) { - if (param_count == 2) + if (cmd->param_count == 2) { - char buf[256]; + char *buf; /* * This can happen if we sent a SYN with an up-to-date * buddy list revision, but we send 0 to get a full list. * So, error out. */ - snprintf(buf, sizeof(buf), + buf = g_strdup_printf( _("Your MSN buddy list for %s is temporarily unavailable. " - "Please wait and try again."), + "Please wait and try again."), gaim_account_get_username(session->account)); + gaim_connection_error(gc, buf); - return FALSE; + g_free(buf); + + return; } - session->total_users = atoi(params[2]); - session->total_groups = atoi(params[3]); + session->total_users = atoi(cmd->params[2]); + session->total_groups = atoi(cmd->params[3]); if (session->total_users == 0) { @@ -1379,19 +1371,16 @@ session->lists_synced = TRUE; } } - - return TRUE; } /************************************************************************** * Misc commands **************************************************************************/ -static gboolean -url_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +url_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; - GaimAccount *account = session->account; + MsnSession *session; + GaimAccount *account; const char *rru; const char *url; md5_state_t st; @@ -1402,8 +1391,11 @@ char sendbuf[64]; int i; - rru = params[1]; - url = params[2]; + session = cmdproc->session; + account = session->account; + + rru = cmd->params[1]; + url = cmd->params[2]; g_snprintf(buf, sizeof(buf), "%s%lu%s", session->passport_info.mspauth, @@ -1416,22 +1408,26 @@ memset(sendbuf, 0, sizeof(sendbuf)); - for (i = 0; i < 16; i++) { + for (i = 0; i < 16; i++) + { g_snprintf(buf2, sizeof(buf2), "%02x", di[i]); strcat(sendbuf, buf2); } - if (session->passport_info.file != NULL) { + if (session->passport_info.file != NULL) + { unlink(session->passport_info.file); g_free(session->passport_info.file); } - if ((fd = gaim_mkstemp(&session->passport_info.file)) == NULL) { + if ((fd = gaim_mkstemp(&session->passport_info.file)) == NULL) + { gaim_debug(GAIM_DEBUG_ERROR, "msn", "Error opening temp passport file: %s\n", strerror(errno)); } - else { + else + { fputs("<html>\n" "<head>\n" "<noscript>\n" @@ -1467,7 +1463,8 @@ fprintf(fd, "</form></body>\n"); fprintf(fd, "</html>\n"); - if (fclose(fd)) { + if (fclose(fd)) + { gaim_debug(GAIM_DEBUG_ERROR, "msn", "Error closing temp passport file: %s\n", strerror(errno)); @@ -1475,7 +1472,8 @@ unlink(session->passport_info.file); g_free(session->passport_info.file); } - else { + else + { /* * Renaming file with .html extension, so that the * win32 open_url will work. @@ -1483,9 +1481,10 @@ char *tmp; if ((tmp = g_strdup_printf("%s.html", - session->passport_info.file)) != NULL) { - - if (rename(session->passport_info.file, tmp) == 0) { + session->passport_info.file)) != NULL) + { + if (rename(session->passport_info.file, tmp) == 0) + { g_free(session->passport_info.file); session->passport_info.file = tmp; } @@ -1494,28 +1493,27 @@ } } } - - return TRUE; } /************************************************************************** * Switchboards **************************************************************************/ -static gboolean -rng_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +rng_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; + MsnSession *session; MsnSwitchBoard *swboard; MsnUser *user; const char *session_id; char *host, *c; int port; - session_id = params[0]; + session = cmdproc->session; + session_id = cmd->params[0]; - host = g_strdup(params[1]); + host = g_strdup(cmd->params[1]); - if ((c = strchr(host, ':')) != NULL) { + if ((c = strchr(host, ':')) != NULL) + { *c = '\0'; port = atoi(c + 1); } @@ -1527,80 +1525,87 @@ swboard = msn_switchboard_new(session); - user = msn_user_new(session, params[4], NULL); + user = msn_user_new(session, cmd->params[4], NULL); msn_switchboard_set_invited(swboard, TRUE); - msn_switchboard_set_session_id(swboard, params[0]); - msn_switchboard_set_auth_key(swboard, params[3]); + msn_switchboard_set_session_id(swboard, cmd->params[0]); + msn_switchboard_set_auth_key(swboard, cmd->params[3]); msn_switchboard_set_user(swboard, user); - if (!msn_switchboard_connect(swboard, host, port)) { + if (!msn_switchboard_connect(swboard, host, port)) + { gaim_debug(GAIM_DEBUG_ERROR, "msn", "Unable to connect to switchboard on %s, port %d\n", host, port); g_free(host); - return FALSE; + return; } g_free(host); - - return TRUE; } -static gboolean -xfr_cmd(MsnServConn *servconn, const char *command, const char **params, - size_t param_count) +static void +xfr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd) { - MsnSession *session = servconn->session; + MsnSession *session; MsnSwitchBoard *swboard; - GaimConnection *gc = session->account->gc; + GaimConnection *gc; char *host; char *c; int port; - if (strcmp(params[1], "SB") && strcmp(params[1], "NS")) { + session = cmdproc->session; + gc = session->account->gc; + + if (strcmp(cmd->params[1], "SB") && strcmp(cmd->params[1], "NS")) + { gaim_connection_error(gc, _("Got invalid XFR")); - return FALSE; + return; } - host = g_strdup(params[2]); + host = g_strdup(cmd->params[2]); - if ((c = strchr(host, ':')) != NULL) { + if ((c = strchr(host, ':')) != NULL) + { *c = '\0'; port = atoi(c + 1); } else port = 1863; - if (!strcmp(params[1], "SB")) { + if (!strcmp(cmd->params[1], "SB")) + { swboard = msn_session_find_unused_switch(session); - if (swboard == NULL) { - gaim_debug(GAIM_DEBUG_ERROR, "msn", - "Received an XFR SB request when there's no unused " - "switchboards!\n"); - return FALSE; + if (swboard == NULL) + { + gaim_debug_error("msn", + "Received an XFR SB request when there's no unused " + "switchboards!\n"); + return; } - msn_switchboard_set_auth_key(swboard, params[4]); + msn_switchboard_set_auth_key(swboard, cmd->params[4]); if (session->http_method) port = 80; - if (!msn_switchboard_connect(swboard, host, port)) { - gaim_debug(GAIM_DEBUG_ERROR, "msn", - "Unable to connect to switchboard on %s, port %d\n", - host, port); + if (!msn_switchboard_connect(swboard, host, port)) + { + gaim_debug_error("msn", + "Unable to connect to switchboard on %s, port %d\n", + host, port); g_free(host); - return FALSE; + return; } } - else if (!strcmp(params[1], "NS")) { + else if (!strcmp(cmd->params[1], "NS")) + { if (!msn_notification_connect(session->notification_conn, host, port)) { @@ -1609,27 +1614,30 @@ g_free(host); - return FALSE; + return; } } g_free(host); - - return TRUE; } /************************************************************************** * Message Types **************************************************************************/ -static gboolean -profile_msg(MsnServConn *servconn, MsnMessage *msg) +static void +profile_msg(MsnCmdProc *cmdproc, MsnMessage *msg) { - MsnSession *session = servconn->session; + MsnSession *session; const char *value; + const char *passport; - if (strcmp(msg->passport, "Hotmail")) { + session = cmdproc->session; + passport = msg->passport; + + if (strcmp(passport, "Hotmail")) + { /* This isn't an official message. */ - return TRUE; + return; } if ((value = msn_message_get_attr(msg, "kv")) != NULL) @@ -1646,39 +1654,45 @@ if ((value = msn_message_get_attr(msg, "ClientPort")) != NULL) session->passport_info.client_port = ntohs(atoi(value)); - - return TRUE; } -static gboolean -initial_email_msg(MsnServConn *servconn, MsnMessage *msg) +static void +initial_email_msg(MsnCmdProc *cmdproc, MsnMessage *msg) { - MsnSession *session = servconn->session; - GaimConnection *gc = session->account->gc; + MsnSession *session; + GaimConnection *gc; GHashTable *table; const char *unread; + const char *passport; - if (strcmp(msg->passport, "Hotmail")) { + session = cmdproc->session; + gc = session->account->gc; + passport = msg->passport; + + if (strcmp(passport, "Hotmail")) + { /* This isn't an official message. */ - return TRUE; + return; } if (!gaim_account_get_check_mail(session->account)) - return TRUE; + return; - if (session->passport_info.file == NULL) { - msn_servconn_send_command(servconn, "URL", "INBOX"); + if (session->passport_info.file == NULL) + { + msn_cmdproc_send(cmdproc, "URL", "%s", "INBOX"); - msn_servconn_queue_message(servconn, "URL", msg); + msn_cmdproc_queue_message(cmdproc, "URL", msg); - return TRUE; + return; } table = msn_message_get_hashtable_from_body(msg); unread = g_hash_table_lookup(table, "Inbox-Unread"); - if (unread != NULL) { + if (unread != NULL) + { int count = atoi(unread); if (count != 0) @@ -1696,34 +1710,39 @@ } g_hash_table_destroy(table); - - return TRUE; } -static gboolean -email_msg(MsnServConn *servconn, MsnMessage *msg) +static void +email_msg(MsnCmdProc *cmdproc, MsnMessage *msg) { - MsnSession *session = servconn->session; - GaimConnection *gc = session->account->gc; + MsnSession *session; + GaimConnection *gc; GHashTable *table; char *from, *subject, *tmp; + const char *passport; + + session = cmdproc->session; + gc = session->account->gc; + passport = msg->passport; from = subject = NULL; - if (strcmp(msg->passport, "Hotmail")) { + if (strcmp(passport, "Hotmail")) + { /* This isn't an official message. */ - return TRUE; + return; } if (!gaim_account_get_check_mail(session->account)) - return TRUE; + return; - if (session->passport_info.file == NULL) { - msn_servconn_send_command(servconn, "URL", "INBOX"); + if (session->passport_info.file == NULL) + { + msn_cmdproc_send(cmdproc, "URL", "%s", "INBOX"); - msn_servconn_queue_message(servconn, "URL", msg); + msn_cmdproc_queue_message(cmdproc, "URL", msg); - return TRUE; + return; } table = msn_message_get_hashtable_from_body(msg); @@ -1747,29 +1766,33 @@ g_free(subject); g_hash_table_destroy(table); - - return TRUE; } -static gboolean -system_msg(MsnServConn *servconn, MsnMessage *msg) +static void +system_msg(MsnCmdProc *cmdproc, MsnMessage *msg) { GHashTable *table; const char *type_s; + const char *passport; - if (strcmp(msg->passport, "Hotmail")) { + passport = msg->passport; + + if (strcmp(passport, "Hotmail")) + { /* This isn't an official message. */ - return TRUE; + return; } table = msn_message_get_hashtable_from_body(msg); - if ((type_s = g_hash_table_lookup(table, "Type")) != NULL) { + if ((type_s = g_hash_table_lookup(table, "Type")) != NULL) + { int type = atoi(type_s); char buf[MSN_BUF_LEN]; int minutes; - switch (type) { + switch (type) + { case 1: minutes = atoi(g_hash_table_lookup(table, "Arg1")); g_snprintf(buf, sizeof(buf), ngettext( @@ -1791,41 +1814,46 @@ } if (*buf != '\0') - gaim_notify_info(servconn->session->account->gc, NULL, buf, NULL); + gaim_notify_info(cmdproc->session->account->gc, NULL, buf, NULL); } g_hash_table_destroy(table); - - return TRUE; } static gboolean connect_cb(MsnServConn *servconn) { - MsnSession *session = servconn->session; - GaimAccount *account = session->account; - GaimConnection *gc = gaim_account_get_connection(account); - char proto_vers[256]; + MsnCmdProc *cmdproc; + MsnSession *session; + GaimAccount *account; + GaimConnection *gc; + char **a, **c, *vers; size_t i; - proto_vers[0] = '\0'; + g_return_val_if_fail(servconn != NULL, FALSE); - for (i = 7; i <= session->protocol_ver; i++) - { - char old_buf[256]; + cmdproc = servconn->cmdproc; + session = servconn->session; + account = session->account; + gc = gaim_account_get_connection(account); - strcpy(old_buf, proto_vers); + /* Allocate an array for CVR0, NULL, and all the versions */ + a = c = g_new0(char *, session->protocol_ver - 8 + 3); - g_snprintf(proto_vers, sizeof(proto_vers), "MSNP%d %s", (int)i, old_buf); - } + for (i = session->protocol_ver; i >= 8; i--) + *c++ = g_strdup_printf("MSNP%d", i); + + *c++ = g_strdup("CVR0"); - strncat(proto_vers, "CVR0", sizeof(proto_vers)); + vers = g_strjoinv(" ", a); - if (!msn_servconn_send_command(servconn, "VER", proto_vers)) - { - gaim_connection_error(gc, _("Unable to write to server")); + msn_cmdproc_send(cmdproc, "VER", "%s", vers); + + g_strfreev(a); + g_free(vers); + + if (cmdproc->error) return FALSE; - } session->user = msn_user_new(session, gaim_account_get_username(account), NULL); @@ -1836,77 +1864,97 @@ return TRUE; } +void +msn_notification_init(void) +{ + cbs_table = msn_table_new(); + + /* Register the command callbacks. */ + + /* Syncing */ + msn_table_add_cmd(cbs_table, NULL, "GTC", NULL); + msn_table_add_cmd(cbs_table, NULL, "BLP", blp_cmd); + msn_table_add_cmd(cbs_table, NULL, "PRP", prp_cmd); + msn_table_add_cmd(cbs_table, NULL, "LSG", lsg_cmd); + msn_table_add_cmd(cbs_table, NULL, "LST", lst_cmd); + msn_table_add_cmd(cbs_table, NULL, "BPR", bpr_cmd); + + /* Syncronous */ + /* msn_table_add_cmd(cbs_table, "CHG", "CHG", chg_cmd); */ + msn_table_add_cmd(cbs_table, "CHG", "ILN", iln_cmd); + msn_table_add_cmd(cbs_table, "ADD", "ADD", add_cmd); + msn_table_add_cmd(cbs_table, "ADD", "ILN", iln_cmd); + msn_table_add_cmd(cbs_table, "REM", "REM", rem_cmd); + msn_table_add_cmd(cbs_table, "USR", "USR", usr_cmd); + msn_table_add_cmd(cbs_table, "USR", "XFR", xfr_cmd); + msn_table_add_cmd(cbs_table, "SYN", "SYN", syn_cmd); + msn_table_add_cmd(cbs_table, "CVR", "CVR", cvr_cmd); + msn_table_add_cmd(cbs_table, "INF", "INF", inf_cmd); + msn_table_add_cmd(cbs_table, "VER", "VER", ver_cmd); + msn_table_add_cmd(cbs_table, "REA", "REA", rea_cmd); + /* msn_table_add_cmd(cbs_table, "PRP", "PRP", prp_cmd); */ + /* msn_table_add_cmd(cbs_table, "BLP", "BLP", blp_cmd); */ + msn_table_add_cmd(cbs_table, "REG", "REG", reg_cmd); + msn_table_add_cmd(cbs_table, "ADG", "ADG", adg_cmd); + msn_table_add_cmd(cbs_table, "RMG", "RMG", rmg_cmd); + msn_table_add_cmd(cbs_table, "XFR", "XFR", xfr_cmd); + + /* Asyncronous */ + msn_table_add_cmd(cbs_table, NULL, "IPG", ipg_cmd); + msn_table_add_cmd(cbs_table, NULL, "MSG", msg_cmd); + msn_table_add_cmd(cbs_table, NULL, "NOT", not_cmd); + + msn_table_add_cmd(cbs_table, NULL, "CHL", chl_cmd); + msn_table_add_cmd(cbs_table, NULL, "REM", rem_cmd); + msn_table_add_cmd(cbs_table, NULL, "ADD", add_cmd); + + msn_table_add_cmd(cbs_table, NULL, "QRY", NULL); + msn_table_add_cmd(cbs_table, NULL, "QNG", NULL); + msn_table_add_cmd(cbs_table, NULL, "FLN", fln_cmd); + msn_table_add_cmd(cbs_table, NULL, "NLN", nln_cmd); + msn_table_add_cmd(cbs_table, NULL, "OUT", out_cmd); + msn_table_add_cmd(cbs_table, NULL, "RNG", rng_cmd); + + msn_table_add_cmd(cbs_table, NULL, "URL", url_cmd); + + msn_table_add_error(cbs_table, "ADD", add_error); + + /* Register the message type callbacks. */ + msn_table_add_msg_type(cbs_table, + "text/x-msmsgsprofile", + profile_msg); + msn_table_add_msg_type(cbs_table, + "text/x-msmsgsinitialemailnotification", + initial_email_msg); + msn_table_add_msg_type(cbs_table, + "text/x-msmsgsemailnotification", + email_msg); + msn_table_add_msg_type(cbs_table, + "application/x-msmsgssystemmessage", + system_msg); +} + +void +msn_notification_end(void) +{ + msn_table_destroy(cbs_table); +} + MsnServConn * msn_notification_new(MsnSession *session) { MsnServConn *notification; + MsnCmdProc *cmdproc; - notification = msn_servconn_new(session); + notification = msn_servconn_new(session, MSN_SERVER_NS); + cmdproc = notification->cmdproc; msn_servconn_set_connect_cb(notification, connect_cb); if (session->http_method) notification->http_data->server_type = "NS"; - if (notification_commands == NULL) { - /* Register the command callbacks. */ - msn_servconn_register_command(notification, "ADD", add_cmd); - msn_servconn_register_command(notification, "ADG", adg_cmd); - msn_servconn_register_command(notification, "BLP", blp_cmd); - msn_servconn_register_command(notification, "BPR", bpr_cmd); - msn_servconn_register_command(notification, "CHG", blank_cmd); - msn_servconn_register_command(notification, "CHL", chl_cmd); - msn_servconn_register_command(notification, "CVR", cvr_cmd); - msn_servconn_register_command(notification, "FLN", fln_cmd); - msn_servconn_register_command(notification, "GTC", blank_cmd); - msn_servconn_register_command(notification, "ILN", iln_cmd); - msn_servconn_register_command(notification, "INF", inf_cmd); - msn_servconn_register_command(notification, "IPG", ipg_cmd); - msn_servconn_register_command(notification, "LSG", lsg_cmd); - msn_servconn_register_command(notification, "LST", lst_cmd); - msn_servconn_register_command(notification, "MSG", msg_cmd); - msn_servconn_register_command(notification, "NLN", nln_cmd); - msn_servconn_register_command(notification, "NOT", not_cmd); - msn_servconn_register_command(notification, "OUT", out_cmd); - msn_servconn_register_command(notification, "PRP", prp_cmd); - msn_servconn_register_command(notification, "QNG", blank_cmd); - msn_servconn_register_command(notification, "QRY", blank_cmd); - msn_servconn_register_command(notification, "REA", rea_cmd); - msn_servconn_register_command(notification, "REG", reg_cmd); - msn_servconn_register_command(notification, "REM", rem_cmd); - msn_servconn_register_command(notification, "RMG", rmg_cmd); - msn_servconn_register_command(notification, "RNG", rng_cmd); - msn_servconn_register_command(notification, "SYN", syn_cmd); - msn_servconn_register_command(notification, "URL", url_cmd); - msn_servconn_register_command(notification, "USR", usr_cmd); - msn_servconn_register_command(notification, "VER", ver_cmd); - msn_servconn_register_command(notification, "XFR", xfr_cmd); - msn_servconn_register_command(notification, "_UNKNOWN_", unknown_cmd); - - /* Register the message type callbacks. */ - msn_servconn_register_msg_type(notification, "text/x-msmsgsprofile", - profile_msg); - msn_servconn_register_msg_type(notification, - "text/x-msmsgsinitialemailnotification", - initial_email_msg); - msn_servconn_register_msg_type(notification, - "text/x-msmsgsemailnotification", - email_msg); - msn_servconn_register_msg_type(notification, - "application/x-msmsgssystemmessage", - system_msg); - - /* Save these for future use. */ - notification_commands = notification->commands; - notification_msg_types = notification->msg_types; - } - else { - g_hash_table_destroy(notification->commands); - g_hash_table_destroy(notification->msg_types); - - notification->commands = notification_commands; - notification->msg_types = notification_msg_types; - } + cmdproc->cbs_table = cbs_table; return notification; }
