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);