--- a/libpurple/protocols/msn/contact.c Wed Feb 22 05:32:14 2012 +0000
+++ b/libpurple/protocols/msn/contact.c Wed Feb 22 05:52:30 2012 +0000
@@ -864,6 +864,21 @@
+msn_parse_addressbook_circles(MsnSession *session, xmlnode *node) + /* TODO: Parse groups */ + ticket = xmlnode_get_child(node, "CircleTicket"); + char *data = xmlnode_get_data(ticket); + msn_notification_send_circle_auth(session, data); msn_parse_addressbook(MsnSession *session, xmlnode *node)
@@ -871,6 +886,7 @@
if ((fault = xmlnode_get_child(node, "Body/Fault"))) {
@@ -897,7 +913,7 @@
- result = xmlnode_get_child(node, "Body/ABFindAllResponse/ABFindAllResult");
+ result = xmlnode_get_child(node, "Body/ABFindContactsPagedResponse/ABFindContactsPagedResult"); purple_debug_misc("msn", "Received no address book update\n");
@@ -906,7 +922,7 @@
/* I don't see this "groups" tag documented on msnpiki, need to find out
if they are really there, and update msnpiki */
- groups = xmlnode_get_child(result, "groups");
+ groups = xmlnode_get_child(result, "Groups"); msn_parse_addressbook_groups(session, groups);
@@ -931,12 +947,12 @@
purple_debug_info("msn", "Process contact list...\n");
- contacts = xmlnode_get_child(result, "contacts");
+ contacts = xmlnode_get_child(result, "Contacts"); msn_parse_addressbook_contacts(session, contacts);
- abNode = xmlnode_get_child(result, "ab");
+ abNode = xmlnode_get_child(result, "Ab"); @@ -954,6 +970,11 @@
+ circleNode = xmlnode_get_child(result, "CircleResult"); + if (circleNode != NULL) { + msn_parse_addressbook_circles(session, circleNode); --- a/libpurple/protocols/msn/notification.c Wed Feb 22 05:32:14 2012 +0000
+++ b/libpurple/protocols/msn/notification.c Wed Feb 22 05:52:30 2012 +0000
@@ -164,10 +164,7 @@
msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH_END);
- if (session->protocol_ver >= 16)
- trans = msn_transaction_new(cmdproc, "USR", "SSO S %s %s %s", ticket, response, session->guid);
- trans = msn_transaction_new(cmdproc, "USR", "SSO S %s %s", ticket, response);
+ trans = msn_transaction_new(cmdproc, "USR", "SSO S %s %s %s", ticket, response, session->guid); msn_cmdproc_send_trans(cmdproc, trans);
@@ -359,23 +356,34 @@
/*send Message to Yahoo Messenger*/
-uum_send_msg(MsnSession *session,MsnMessage *msg)
+msn_notification_send_uum(MsnSession *session, MsnMessage *msg) + g_return_if_fail(msg != NULL); cmdproc = session->notification->cmdproc;
- g_return_if_fail(msg != NULL);
payload = msn_message_gen_payload(msg, &payload_len);
+ user = msn_userlist_find_user(session->userlist, msg->remote_user); + network = msn_user_get_network(user); + network = MSN_NETWORK_PASSPORT; "send UUM, payload{%s}, strlen:%" G_GSIZE_FORMAT ", len:%" G_GSIZE_FORMAT "\n",
payload, strlen(payload), payload_len);
- trans = msn_transaction_new(cmdproc, "UUM", "%s 32 %d %" G_GSIZE_FORMAT,
- msg->remote_user, type, payload_len);
+ trans = msn_transaction_new(cmdproc, "UUM", "%s %d %d %" G_GSIZE_FORMAT, + msg->remote_user, network, type, payload_len); msn_transaction_set_payload(trans, payload, strlen(payload));
msn_cmdproc_send_trans(cmdproc, trans);
@@ -390,10 +398,7 @@
* command and we are processing it */
if (cmd->payload == NULL) {
cmdproc->last_cmd->payload_cb = msg_cmd_post;
- if (cmdproc->session->protocol_ver >= 16)
- cmd->payload_len = atoi(cmd->params[5]);
- cmd->payload_len = atoi(cmd->params[3]);
+ cmd->payload_len = atoi(cmd->params[5]); g_return_if_fail(cmd->payload_cb != NULL);
@@ -1042,7 +1047,7 @@
networkid = atoi(cmd->params[3]);
friendly = g_strdup(purple_url_decode(cmd->params[4]));
clientid = strtoul(cmd->params[5], &extcap_str, 10);
- if (session->protocol_ver >= 16 && extcap_str && *extcap_str)
+ if (extcap_str && *extcap_str) extcaps = strtoul(extcap_str+1, NULL, 10);
@@ -1056,7 +1061,7 @@
networkid = atoi(cmd->params[3]);
friendly = g_strdup(purple_url_decode(cmd->params[4]));
clientid = strtoul(cmd->params[5], &extcap_str, 10);
- if (session->protocol_ver >= 16 && extcap_str && *extcap_str)
+ if (extcap_str && *extcap_str) extcaps = strtoul(extcap_str+1, NULL, 10);
@@ -1069,7 +1074,7 @@
networkid = atoi(cmd->params[3]);
friendly = g_strdup(purple_url_decode(cmd->params[4]));
clientid = strtoul(cmd->params[5], &extcap_str, 10);
- if (session->protocol_ver >= 16 && extcap_str && *extcap_str)
+ if (extcap_str && *extcap_str) extcaps = strtoul(extcap_str+1, NULL, 10);
@@ -1077,7 +1082,7 @@
/* MSNP8+ with Display Picture object */
friendly = g_strdup(purple_url_decode(cmd->params[3]));
clientid = strtoul(cmd->params[4], &extcap_str, 10);
- if (session->protocol_ver >= 16 && extcap_str && *extcap_str)
+ if (extcap_str && *extcap_str) extcaps = strtoul(extcap_str+1, NULL, 10);
@@ -1087,7 +1092,7 @@
/* MSNP8+ without Display Picture object */
friendly = g_strdup(purple_url_decode(cmd->params[3]));
clientid = strtoul(cmd->params[4], &extcap_str, 10);
- if (session->protocol_ver >= 16 && extcap_str && *extcap_str)
+ if (extcap_str && *extcap_str) extcaps = strtoul(extcap_str+1, NULL, 10);
@@ -1250,15 +1255,15 @@
unsigned long clientid, extcaps;
- const char *state, *passport, *friendly;
+ const char *state, *friendly; session = cmdproc->session;
- state = cmd->params[0];
- passport = cmd->params[1];
- networkid = atoi(cmd->params[2]);
- friendly = purple_url_decode(cmd->params[3]);
+ state = cmd->params[0]; + msn_parse_user(cmd->params[1], &passport, &networkid); + friendly = purple_url_decode(cmd->params[2]); user = msn_userlist_find_user(session->userlist, passport);
if (user == NULL) return;
@@ -1268,9 +1273,9 @@
msn_update_contact(session, passport, MSN_UPDATE_DISPLAY, friendly);
- if (cmd->param_count == 6)
+ if (cmd->param_count == 5) - msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[5]));
+ msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[4])); msn_user_set_object(user, msnobj);
@@ -1278,8 +1283,8 @@
msn_user_set_object(user, NULL);
- clientid = strtoul(cmd->params[4], &extcap_str, 10);
- if (session->protocol_ver >= 16 && extcap_str && *extcap_str)
+ clientid = strtoul(cmd->params[3], &extcap_str, 10); + if (extcap_str && *extcap_str) extcaps = strtoul(extcap_str+1, NULL, 10);
@@ -1292,6 +1297,8 @@
msn_user_set_state(user, state);
@@ -1705,22 +1712,27 @@
session = cmdproc->session;
- passport = cmd->params[0];
+ msn_parse_user(cmd->params[0], &passport, &network); user = msn_userlist_find_user(session->userlist, passport);
- char *str = g_strndup(payload, len);
+ str = g_strndup(payload, len); purple_debug_info("msn", "unknown user %s, payload is %s\n",
/* Free any existing media info for this user */
g_free(user->extinfo->media_album);
@@ -1767,7 +1779,7 @@
purple_debug_misc("msn", "UBX received.\n");
cmdproc->last_cmd->payload_cb = ubx_cmd_post;
- cmd->payload_len = atoi(cmd->params[2]);
+ cmd->payload_len = atoi(cmd->params[1]); @@ -1812,10 +1824,7 @@
epDataNode = xmlnode_new("EndpointData");
capNode = xmlnode_new_child(epDataNode, "Capabilities");
- if (session->protocol_ver >= 16)
- caps = g_strdup_printf("%d:%02d", MSN_CLIENT_ID_CAPABILITIES, MSN_CLIENT_ID_EXT_CAPS);
- caps = g_strdup_printf("%d", MSN_CLIENT_ID_CAPABILITIES);
+ caps = g_strdup_printf("%d:%02d", MSN_CLIENT_ID_CAPABILITIES, MSN_CLIENT_ID_EXT_CAPS); xmlnode_insert_data(capNode, caps, -1);
@@ -1942,6 +1951,22 @@
msn_cmdproc_send_trans(cmdproc, trans);
+msn_notification_send_circle_auth(MsnSession *session, const char *ticket) + cmdproc = session->notification->cmdproc; + encoded = purple_base64_encode((guchar *)ticket, strlen(ticket)); + trans = msn_transaction_new(cmdproc, "USR", "SHA A %s", encoded); + msn_cmdproc_send_trans(cmdproc, trans); /**************************************************************************
**************************************************************************/
--- a/libpurple/protocols/msn/notification.h Wed Feb 22 05:32:14 2012 +0000
+++ b/libpurple/protocols/msn/notification.h Wed Feb 22 05:52:30 2012 +0000
@@ -76,8 +76,6 @@
} MsnUnifiedNotificationType;
-void uum_send_msg(MsnSession *session, MsnMessage *msg);
void msn_notification_end(void);
void msn_notification_init(void);
@@ -97,6 +95,8 @@
void msn_notification_disconnect(MsnNotification *notification);
void msn_notification_dump_contact(MsnSession *session);
+void msn_notification_send_uum(MsnSession *session, MsnMessage *msg); void msn_notification_send_uux(MsnSession *session, const char *payload);
void msn_notification_send_uux_endpointdata(MsnSession *session);
@@ -108,6 +108,8 @@
MsnUnifiedNotificationType type,
+void msn_notification_send_circle_auth(MsnSession *session, const char *ticket);