Mercurial > pidgin.yaz
changeset 20399:6f986caeab59
merge of 'b4911943cba6f29cf0694dfd563cac17612236dc'
and 'c28931a50bfa21e0be81777bcd91fdeab9116d77'
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Sun, 15 Apr 2007 04:29:56 +0000 |
parents | 60bc06498746 (diff) 61d6a3dfbb3c (current diff) |
children | ea9a5566a156 |
files | libpurple/protocols/msn/cmdproc.c libpurple/protocols/msn/command.c libpurple/protocols/msn/dialog.c libpurple/protocols/msn/msg.c libpurple/protocols/msn/msn.c libpurple/protocols/msn/msn.h libpurple/protocols/msn/notification.c libpurple/protocols/msn/servconn.c libpurple/protocols/msn/session.c libpurple/protocols/msn/session.h libpurple/protocols/msn/state.c libpurple/protocols/msn/state.h libpurple/protocols/msn/switchboard.c libpurple/protocols/msn/sync.c libpurple/protocols/msn/user.c libpurple/protocols/msn/user.h libpurple/protocols/msn/userlist.c |
diffstat | 14 files changed, 304 insertions(+), 105 deletions(-) [+] |
line wrap: on
line diff
--- a/libpurple/protocols/msn/cmdproc.c Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/cmdproc.c Sun Apr 15 04:29:56 2007 +0000 @@ -133,7 +133,7 @@ } msn_servconn_write(servconn, data, len); -// gaim_debug_info("<<","%s\n",data); +// purple_debug_info("<<","%s\n",data); g_free(data); }
--- a/libpurple/protocols/msn/command.c Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/command.c Sun Apr 15 04:29:56 2007 +0000 @@ -146,7 +146,7 @@ /*add payload Length checking*/ msn_set_payload_len(cmd); - gaim_debug_info("MaYuan","get payload len:%d\n",cmd->payload_len); + purple_debug_info("MaYuan","get payload len:%d\n",cmd->payload_len); msn_command_ref(cmd);
--- a/libpurple/protocols/msn/dialog.c Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/dialog.c Sun Apr 15 04:29:56 2007 +0000 @@ -117,6 +117,7 @@ buddy = purple_find_buddy_in_group(account, passport, group); else buddy = purple_find_buddy(account, passport); + } if (buddy != NULL) purple_blist_remove_buddy(buddy);
--- a/libpurple/protocols/msn/msg.c Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/msg.c Sun Apr 15 04:29:56 2007 +0000 @@ -215,7 +215,7 @@ char **elems, **cur, **tokens; g_return_if_fail(payload != NULL); -// gaim_debug_info("MaYuan","payload:{%s}\n",payload); +// purple_debug_info("MaYuan","payload:{%s}\n",payload); tmp_base = tmp = g_malloc0(payload_len + 1); memcpy(tmp_base, payload, payload_len);
--- a/libpurple/protocols/msn/msn.c Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/msn.c Sun Apr 15 04:29:56 2007 +0000 @@ -114,7 +114,7 @@ return PURPLE_CMD_RET_OK; } -static void +void msn_act_id(PurpleConnection *gc, const char *entry) { MsnCmdProc *cmdproc; @@ -450,6 +450,7 @@ session = gc->proto_data; xfer = purple_xfer_new(gc->account, PURPLE_XFER_SEND, who); + if (xfer) { slplink = msn_session_get_slplink(session, who); @@ -501,44 +502,6 @@ return "msn"; } -static void -msn_list_emblems(PurpleBuddy *b, const char **se, const char **sw, - const char **nw, const char **ne) -{ - MsnUser *user; - PurplePresence *presence; - const char *emblems[4] = { NULL, NULL, NULL, NULL }; - int i = 0; - - user = b->proto_data; - presence = purple_buddy_get_presence(b); - - if (!purple_presence_is_online(presence)) - emblems[i++] = "offline"; - else if (purple_presence_is_status_active(presence, "busy") || - purple_presence_is_status_active(presence, "phone")) - emblems[i++] = "occupied"; - else if (!purple_presence_is_available(presence)) - emblems[i++] = "away"; - - if (user == NULL) - { - emblems[0] = "offline"; - } - else - { - if (user->mobile) - emblems[i++] = "wireless"; - if (!(user->list_op & (1 << MSN_LIST_RL))) - emblems[i++] = "nr"; - } - - *se = emblems[0]; - *sw = emblems[1]; - *nw = emblems[2]; - *ne = emblems[3]; -} - /* * Set the User status text * Add the PSM String Using "Name - PSM String" format @@ -548,20 +511,30 @@ { PurplePresence *presence; PurpleStatus *status; - const char *msg, *name; + const char *msg, *name, *cmedia; char *psm_str, *tmp2, *text; presence = purple_buddy_get_presence(buddy); status = purple_presence_get_active_status(presence); msg = purple_status_get_attr_string(status, "message"); + cmedia=purple_status_get_attr_string(status, "currentmedia"); + if (!purple_presence_is_available(presence) && !purple_presence_is_idle(presence)){ name = purple_status_get_name(status); }else{ name = NULL; } - if (msg != NULL) { + if (cmedia != NULL) { + if(name) { + tmp2 = g_strdup_printf("%s - %s", name, cmedia); + text = g_markup_escape_text(tmp2, -1); + } else { + text = g_markup_escape_text(cmedia, -1); + } + return text; + } else if (msg != NULL) { tmp2 = purple_markup_strip_html(msg); if (name){ psm_str = g_strdup_printf("%s - %s", name, tmp2); @@ -596,14 +569,23 @@ if (purple_presence_is_online(presence)) { - char *psm; - psm = msn_status_text(buddy); + const char *psm, *currentmedia; + char *tmp; + + psm = purple_status_get_attr_string(status, "message"); + currentmedia = purple_status_get_attr_string(status, "currentmedia"); purple_notify_user_info_add_pair(user_info, _("Status"), (purple_presence_is_idle(presence) ? _("Idle") : purple_status_get_name(status))); if (psm) { - purple_notify_user_info_add_pair(user_info, _("PSM"), psm); - g_free(psm); + tmp = g_markup_escape_text(psm, -1); + purple_notify_user_info_add_pair(user_info, _("PSM"), tmp); + g_free(tmp); + } + if (currentmedia) { + tmp = g_markup_escape_text(currentmedia, -1); + purple_notify_user_info_add_pair(user_info, _("Current media"), tmp); + g_free(tmp); } } @@ -636,34 +618,40 @@ status = purple_status_type_new_with_attrs( PURPLE_STATUS_AVAILABLE, NULL, NULL, TRUE, TRUE, FALSE, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), + "currentmedia", _("Current media"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, status); status = purple_status_type_new_with_attrs( PURPLE_STATUS_AWAY, NULL, NULL, TRUE, TRUE, FALSE, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), + "currentmedia", _("Current media"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, status); status = purple_status_type_new_with_attrs( PURPLE_STATUS_AWAY, "brb", _("Be Right Back"), TRUE, TRUE, FALSE, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), + "currentmedia", _("Current media"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, status); status = purple_status_type_new_with_attrs( PURPLE_STATUS_AWAY, "busy", _("Busy"), TRUE, TRUE, FALSE, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), + "currentmedia", _("Current media"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, status); status = purple_status_type_new_with_attrs( PURPLE_STATUS_AWAY, "phone", _("On the Phone"), TRUE, TRUE, FALSE, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), + "currentmedia", _("Current media"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, status); status = purple_status_type_new_with_attrs( PURPLE_STATUS_AWAY, "lunch", _("Out to Lunch"), TRUE, TRUE, FALSE, "message", _("Message"), purple_value_new(PURPLE_TYPE_STRING), + "currentmedia", _("Current media"), purple_value_new(PURPLE_TYPE_STRING), NULL); types = g_list_append(types, status); @@ -674,7 +662,11 @@ status = purple_status_type_new_full(PURPLE_STATUS_OFFLINE, NULL, NULL, FALSE, TRUE, FALSE); types = g_list_append(types, status); - + + status = purple_status_type_new_full(PURPLE_STATUS_MOBILE, + "mobile", NULL, FALSE, FALSE, TRUE); + types = g_list_append(types, status); + return types; } @@ -795,9 +787,7 @@ gc->wants_to_die = TRUE; purple_connection_error(gc, _("SSL support is needed for MSN. Please install a supported " - "SSL library. See http://purple.sf.net/faq-ssl.php for more " - "information.")); - + "SSL library.")); return; } @@ -844,6 +834,7 @@ PurpleMessageFlags flags) { PurpleAccount *account; + PurpleBuddy *buddy = purple_find_buddy(gc->account, who); MsnMessage *msg; char *msgformat; char *msgtext; @@ -851,6 +842,16 @@ purple_debug_info("MaYuan","send IM {%s} to %s\n",message,who); account = purple_connection_get_account(gc); + if (buddy) { + PurplePresence *p = purple_buddy_get_presence(buddy); + if (purple_presence_is_status_primitive_active(p, PURPLE_STATUS_MOBILE)) { + char *text = purple_markup_strip_html(message); + send_to_mobile(gc, who, text); + g_free(text); + return 1; + } + } + msn_import_html(message, &msgformat, &msgtext); if(msn_user_is_online(account, who)|| msn_user_is_yahoo(account, who)){ @@ -1908,7 +1909,7 @@ "This either means that the user does not exist, " "or that the user exists " "but has not created a public profile.") : - _("Purple could not find " /* This should never happen */ + _("Could not find " /* This should never happen */ "any information in the user's profile. " "The user most likely does not exist.")))); } @@ -2051,6 +2052,71 @@ return TRUE; } +static PurpleAccount *find_acct(const char *prpl, const char *acct_id) +{ + PurpleAccount *acct = NULL; + + /* If we have a specific acct, use it */ + if (acct_id) { + acct = purple_accounts_find(acct_id, prpl); + if (acct && !purple_account_is_connected(acct)) + acct = NULL; + } else { /* Otherwise find an active account for the protocol */ + GList *l = purple_accounts_get_all(); + while (l) { + if (!strcmp(prpl, purple_account_get_protocol_id(l->data)) + && purple_account_is_connected(l->data)) { + acct = l->data; + break; + } + l = l->next; + } + } + + return acct; +} + +static gboolean msn_uri_handler(const char *proto, const char *cmd, GHashTable *params) +{ + char *acct_id = g_hash_table_lookup(params, "account"); + PurpleAccount *acct; + + if (g_ascii_strcasecmp(proto, "msnim")) + return FALSE; + + acct = find_acct("prpl-msn", acct_id); + + if (!acct) + return FALSE; + + /* msnim:chat?contact=user@domain.tld */ + if (!g_ascii_strcasecmp(cmd, "Chat")) { + char *sname = g_hash_table_lookup(params, "contact"); + if (sname) { + PurpleConversation *conv = purple_find_conversation_with_account( + PURPLE_CONV_TYPE_IM, sname, acct); + if (conv == NULL) + conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, acct, sname); + purple_conversation_present(conv); + } + /*else + **If pidgindialogs_im() was in the core, we could use it here. + * It is all purple_request_* based, but I'm not sure it really belongs in the core + pidgindialogs_im();*/ + + return TRUE; + } + /* msnim:add?contact=user@domain.tld */ + else if (!g_ascii_strcasecmp(cmd, "Add")) { + char *name = g_hash_table_lookup(params, "contact"); + purple_blist_request_add_buddy(acct, name, NULL, NULL); + return TRUE; + } + + return FALSE; +} + + static PurplePluginProtocolInfo prpl_info = { OPT_PROTO_MAIL_CHECK, @@ -2058,7 +2124,7 @@ NULL, /* protocol_options */ {"png", 0, 0, 96, 96, 0, PURPLE_ICON_SCALE_SEND}, /* icon_spec */ msn_list_icon, /* list_icon */ - msn_list_emblems, /* list_emblems */ + NULL, /* list_emblems */ msn_status_text, /* status_text */ msn_tooltip_text, /* tooltip_text */ msn_status_types, /* away_states */ @@ -2132,10 +2198,10 @@ "MSN", /**< name */ VERSION, /**< version */ /** summary */ - N_("MSN Protocol Plugin"), + N_("Windows Live Messenger Protocol Plugin"), /** description */ - N_("MSN Protocol Plugin"), - "Christian Hammond <chipx86@gnupdate.org>", /**< author */ + N_("Windows Live Messenger Protocol Plugin"), + "MaYuan <mayuan2006@gmail.com>", /**< author */ PURPLE_WEBSITE, /**< homepage */ msn_load, /**< load */
--- a/libpurple/protocols/msn/msn.h Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/msn.h Sun Apr 15 04:29:56 2007 +0000 @@ -141,7 +141,7 @@ (MSN_CLIENT_ID_RESERVED_2 << 8) | \ (MSN_CLIENT_ID_CAPABILITIES)) -void msn_act_id(GaimConnection *gc, const char *entry); +void msn_act_id(PurpleConnection *gc, const char *entry); #endif /* _MSN_H_ */
--- a/libpurple/protocols/msn/notification.c Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/notification.c Sun Apr 15 04:29:56 2007 +0000 @@ -311,17 +311,17 @@ g_snprintf(proto_str, sizeof(proto_str), "MSNP%d", session->protocol_ver); - for (i = 1; i < cmd->param_count; i++) + for (i = 1; i < cmd->param_count -1; i++) { - if (!strcmp(cmd->params[i], proto_str)) + purple_debug_info("MaYuan","%s,proto_str:%s\n",cmd->params[i],proto_str); + if (strcmp(cmd->params[i], proto_str) >= 0) { protocol_supported = TRUE; break; } } - if (!protocol_supported) - { + if (!protocol_supported){ msn_session_set_error(session, MSN_ERROR_UNSUPPORTED_PROTOCOL, NULL); return; @@ -906,7 +906,7 @@ if (session->protocol_ver >= 9 && cmd->param_count == 8) { - msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[5])); + msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[6])); msn_user_set_object(user, msnobj); } @@ -963,8 +963,7 @@ { if (cmd->param_count == 7) { - msnobj = - msn_object_new_from_string(purple_url_decode(cmd->params[4])); + msnobj = msn_object_new_from_string(purple_url_decode(cmd->params[5])); msn_user_set_object(user, msnobj); } else @@ -1443,7 +1442,7 @@ PurpleConnection *gc; MsnUser *user; const char *passport; - char *psm_str; + char *psm_str, *currentmedia_str; /*get the payload content*/ // purple_debug_info("MaYuan","UBX {%s} payload{%s}\n",cmd->params[0], cmd->payload); @@ -1456,10 +1455,15 @@ user = msn_userlist_find_user(session->userlist, passport); psm_str = msn_get_psm(cmd->payload,len); + currentmedia_str = msn_parse_currentmedia( + msn_get_currentmedia(cmd->payload, len)); + msn_user_set_statusline(user, psm_str); + msn_user_set_currentmedia(user, currentmedia_str); msn_user_update(user); g_free(psm_str); + g_free(currentmedia_str); } static void @@ -1496,16 +1500,14 @@ /* This isn't an official message. */ return; - if ((value = msn_message_get_attr(msg, "kv")) != NULL) - { + if ((value = msn_message_get_attr(msg, "kv")) != NULL){ if (session->passport_info.kv != NULL) g_free(session->passport_info.kv); session->passport_info.kv = g_strdup(value); } - if ((value = msn_message_get_attr(msg, "sid")) != NULL) - { + if ((value = msn_message_get_attr(msg, "sid")) != NULL){ if (session->passport_info.sid != NULL) g_free(session->passport_info.sid); @@ -1530,9 +1532,9 @@ } if ((value = msn_message_get_attr(msg, "ClientPort")) != NULL) -{ - session->passport_info.client_port = ntohs(atoi(value)); -} + { + session->passport_info.client_port = ntohs(atoi(value)); + } if ((value = msn_message_get_attr(msg, "LoginTime")) != NULL) session->passport_info.sl = atol(value); @@ -1743,7 +1745,7 @@ { case 1: minutes = atoi(g_hash_table_lookup(table, "Arg1")); - g_snprintf(buf, sizeof(buf), ngettext( + g_snprintf(buf, sizeof(buf), dngettext(PACKAGE, "The MSN server will shut down for maintenance " "in %d minute. You will automatically be " "signed out at that time. Please finish any "
--- a/libpurple/protocols/msn/servconn.c Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/servconn.c Sun Apr 15 04:29:56 2007 +0000 @@ -166,7 +166,7 @@ **************************************************************************/ static void -connect_cb(gpointer data, gint source, GaimInputCondition cond) +connect_cb(gpointer data, gint source, PurpleInputCondition cond) { MsnServConn *servconn = data;
--- a/libpurple/protocols/msn/session.c Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/session.c Sun Apr 15 04:29:56 2007 +0000 @@ -273,10 +273,8 @@ /* The core used to use msn_add_buddy to add all buddies before * being logged in. This no longer happens, so we manually iterate * over the whole buddy list to identify sync issues. */ - - for (gnode = purple_blist_get_root(); gnode; gnode = gnode->next) { - PurpleGroup *group = (PurpleGroup *)gnode; - const char *group_name = group->name; + for (gnode = purple_get_blist()->root; gnode; gnode = gnode->next) + { if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue; for(cnode = gnode->child; cnode; cnode = cnode->next) {
--- a/libpurple/protocols/msn/session.h Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/session.h Sun Apr 15 04:29:56 2007 +0000 @@ -113,7 +113,7 @@ char *psm; /*first blist contact node*/ - GaimBlistNode *bnode; + PurpleBlistNode *bnode; struct { @@ -240,14 +240,14 @@ /*get conversation via session, * If has one, return that,else create a new one; */ -GaimConversation *msn_session_get_conv(MsnSession *session,const char *passport); +PurpleConversation *msn_session_get_conv(MsnSession *session,const char *passport); /*post message to User*/ void msn_session_report_user(MsnSession *session,const char *passport, - char *msg,GaimMessageFlags flags); + char *msg,PurpleMessageFlags flags); void msn_session_set_bnode(MsnSession *session); -GaimBlistNode *msn_session_get_bnode(MsnSession *session); +PurpleBlistNode *msn_session_get_bnode(MsnSession *session); #endif /* _MSN_SESSION_H_ */
--- a/libpurple/protocols/msn/state.c Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/state.c Sun Apr 15 04:29:56 2007 +0000 @@ -81,6 +81,102 @@ return result; } +/* parse CurrentMedia string */ +char * +msn_parse_currentmedia(const char *cmedia) +{ + char **cmedia_array; + char *buffer=NULL, *inptr, *outptr, *tmpptr; + int length, strings, tmp; + + purple_debug_info("msn", "Parsing currentmedia string: \"%s\"\n", cmedia); + if( (cmedia == NULL) || (!strcmp(cmedia, ""))) { + purple_debug_info("msn", "No currentmedia string\n"); + return NULL; + } + + cmedia_array=g_strsplit(cmedia, "\\0", 0); + + strings=1; /* Skip first empty string */ + length=5; /* Space for '\0' (1 byte) and prefix (4 bytes) */ + while(strcmp(cmedia_array[strings], "")) { + length+= strlen(cmedia_array[strings]); + strings++; + } + + if((strings>3) && (!strcmp(cmedia_array[2], "1"))) { /* Check if enabled */ + + buffer=g_malloc(length); + + inptr=cmedia_array[3]; + outptr=buffer; + + if(!strcmp(cmedia_array[1], "Music")) { + strcpy(outptr, "np. "); + outptr+=4; + }/* else if(!strcmp(cmedia_array[1], "Games")) { + } else if(!strcmp(cmedia_array[1], "Office")) { + }*/ + + while(*inptr!='\0') { + if((*inptr == '{') && (strlen(inptr) > 2) && (*(inptr+2) == '}') ) { + errno = 0; + tmp = strtol(inptr+1,&tmpptr,10); + if( (errno!=0) || (tmpptr == (inptr+1)) || + ((tmp+5)>(strings)) ) { + *outptr = *inptr; /* Conversion not successful */ + outptr++; + } else { + /* Replace {?} tag with appropriate text */ + strcpy(outptr, cmedia_array[tmp+4]); + outptr+=strlen(cmedia_array[tmp+4]); + inptr+=2; + } + } else { + *outptr = *inptr; + outptr++; + } + inptr++; + } + *outptr='\0'; + purple_debug_info("msn", "Parsed currentmedia string, result: \"%s\"\n", + buffer); + } else { + purple_debug_info("msn", "Current media marked disabled, not parsing\n"); + } + + g_strfreev(cmedia_array); + return buffer; +} + +/* get the CurrentMedia info from the XML string */ +char * +msn_get_currentmedia(char *xml_str, gsize len) +{ + xmlnode *payloadNode, *currentmediaNode; + char *currentmedia_str, *currentmedia; + + purple_debug_info("msn","msn get CurrentMedia\n"); + payloadNode = xmlnode_from_str(xml_str, len); + if (!payloadNode){ + purple_debug_error("msn","PSM XML parse Error!\n"); + return NULL; + } + currentmediaNode = xmlnode_get_child(payloadNode, "CurrentMedia"); + if (currentmediaNode == NULL){ + purple_debug_info("msn","No CurrentMedia Node"); + g_free(payloadNode); + return NULL; + } + currentmedia_str = xmlnode_get_data(currentmediaNode); + currentmedia = g_strdup(currentmedia_str); + + g_free(currentmediaNode); + g_free(payloadNode); + + return currentmedia; +} + /*get the PSM info from the XML string*/ char * msn_get_psm(char *xml_str, gsize len) @@ -88,15 +184,15 @@ xmlnode *payloadNode, *psmNode; char *psm_str, *psm; - gaim_debug_info("Ma Yuan","msn get PSM\n"); + purple_debug_info("Ma Yuan","msn get PSM\n"); payloadNode = xmlnode_from_str(xml_str, len); if (!payloadNode){ - gaim_debug_error("MaYuan","PSM XML parse Error!\n"); + purple_debug_error("MaYuan","PSM XML parse Error!\n"); return NULL; } psmNode = xmlnode_get_child(payloadNode, "PSM"); if (psmNode == NULL){ - gaim_debug_info("Ma Yuan","No PSM status Node"); + purple_debug_info("Ma Yuan","No PSM status Node"); g_free(payloadNode); return NULL; } @@ -115,9 +211,9 @@ void msn_set_psm(MsnSession *session) { - GaimAccount *account = session->account; - GaimPresence *presence; - GaimStatus *status; + PurpleAccount *account = session->account; + PurplePresence *presence; + PurpleStatus *status; MsnCmdProc *cmdproc; MsnTransaction *trans; char *payload; @@ -131,14 +227,14 @@ if(session->psm){ g_free(session->psm); } - /*Get the PSM string from Gaim's Status Line*/ - presence = gaim_account_get_presence(account); - status = gaim_presence_get_active_status(presence); - statusline = gaim_status_get_attr_string(status, "message"); + /*Get the PSM string from Purple's Status Line*/ + presence = purple_account_get_presence(account); + status = purple_presence_get_active_status(presence); + statusline = purple_status_get_attr_string(status, "message"); session ->psm = msn_build_psm(statusline, NULL, NULL); payload = session->psm; - gaim_debug_info("MaYuan","UUX{%s}\n",payload); + purple_debug_info("MaYuan","UUX{%s}\n",payload); trans = msn_transaction_new(cmdproc, "UUX","%d",strlen(payload)); msn_transaction_set_payload(trans, payload, strlen(payload)); msn_cmdproc_send_trans(cmdproc, trans);
--- a/libpurple/protocols/msn/state.h Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/state.h Sun Apr 15 04:29:56 2007 +0000 @@ -61,6 +61,12 @@ void msn_set_psm(MsnSession *session); +/* Parse CurrentMedia string */ +char * msn_parse_currentmedia(const char *cmedia); + +/* Get the CurrentMedia info from the XML string */ +char * msn_get_currentmedia(char *xml_str,gsize len); + /*get the PSM info from the XML string*/ char * msn_get_psm(char *xml_str,gsize len);
--- a/libpurple/protocols/msn/user.c Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/user.c Sun Apr 15 04:29:56 2007 +0000 @@ -89,19 +89,31 @@ account = user->userlist->session->account; - if (user->statusline != NULL) { + if (user->statusline != NULL && user->currentmedia != NULL) { + purple_prpl_got_user_status(account, user->passport, user->status, + "message", user->statusline, + "currentmedia", user->currentmedia, NULL); + } else if (user->currentmedia != NULL) { + purple_prpl_got_user_status(account, user->passport, "currentmedia", + user->currentmedia, NULL); + } else if (user->statusline != NULL) { //char *status = g_strdup_printf("%s - %s", user->status, user->statusline); - purple_prpl_got_user_status(account, user->passport, user->status, "message", user->statusline, NULL); - } - else if (user->status != NULL) { - purple_prpl_got_user_status(account, user->passport, user->status, NULL); + purple_prpl_got_user_status(account, user->passport, user->status, + "message", user->statusline, NULL); + } else if (user->status != NULL) { + if (!strcmp(user->status, "offline") && user->mobile) { + purple_prpl_got_user_status(account, user->passport, "available", NULL); + purple_prpl_got_user_status(account, user->passport, "mobile", NULL); + } else { + purple_prpl_got_user_status(account, user->passport, user->status, NULL); + purple_prpl_got_user_status_deactive(account, user->passport, "mobile"); + } } - if (user->idle){ + if (user->idle) purple_prpl_got_user_idle(account, user->passport, TRUE, -1); - }else{ + else purple_prpl_got_user_idle(account, user->passport, FALSE, 0); - } } void @@ -158,6 +170,15 @@ } void +msn_user_set_currentmedia(MsnUser *user, const char *currentmedia) +{ + g_return_if_fail(user != NULL); + + g_free(user->currentmedia); + user->currentmedia = g_strdup(currentmedia); +} + +void msn_user_set_store_name(MsnUser *user, const char *name) { g_return_if_fail(user != NULL);
--- a/libpurple/protocols/msn/user.h Sun Apr 15 03:56:08 2007 +0000 +++ b/libpurple/protocols/msn/user.h Sun Apr 15 04:29:56 2007 +0000 @@ -48,7 +48,8 @@ char * uid; /*< User Id */ const char *status; /**< The state of the user. */ - char *statusline; /**< The state of the user. */ + char *statusline; /**< The state of the user. */ + char *currentmedia; /**< The current media of the user. */ gboolean idle; /**< The idle state of the user. */ @@ -115,6 +116,14 @@ */ void msn_user_set_statusline(MsnUser *user, const char *statusline); + /** + * Sets the current media of user. + * + * @param user The user. + * @param state The statusline string. + */ +void msn_user_set_currentmedia(MsnUser *user, const char *currentmedia); + /** * Sets the new state of user. * @@ -299,13 +308,13 @@ * check to see if user is online */ gboolean -msn_user_is_online(GaimAccount *account, const char *name); +msn_user_is_online(PurpleAccount *account, const char *name); /** * check to see if user is Yahoo User */ gboolean -msn_user_is_yahoo(GaimAccount *account ,const char *name); +msn_user_is_yahoo(PurpleAccount *account ,const char *name); void msn_user_set_op(MsnUser *user,int list_op);