src/protocols/msn/notification.c

branch
cpw.khc.msnp14
changeset 20472
6a6d2ef151e6
parent 13912
463b4fa9f067
parent 20469
b2836a24d81e
child 20473
91e1b3a49d10
--- a/src/protocols/msn/notification.c	Wed Oct 18 16:28:51 2006 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1881 +0,0 @@
-/**
- * @file notification.c Notification server functions
- *
- * gaim
- *
- * Gaim is the legal property of its developers, whose names are too numerous
- * to list here.  Please refer to the COPYRIGHT file distributed with this
- * source distribution.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-#include "msn.h"
-#include "notification.h"
-#include "state.h"
-#include "error.h"
-#include "msn-utils.h"
-#include "page.h"
-
-#include "userlist.h"
-#include "sync.h"
-#include "slplink.h"
-
-static MsnTable *cbs_table;
-
-/****************************************************************************
- * 	Local Function Prototype
- ****************************************************************************/
-void msn_notification_post_adl(MsnCmdProc *cmdproc,char *payload ,int payload_len);
-
-void msn_add_contact_xml(xmlnode *mlNode,const char *passport,int list_op,int type);
-
-/**************************************************************************
- * Main
- **************************************************************************/
-
-static void
-destroy_cb(MsnServConn *servconn)
-{
-	MsnNotification *notification;
-
-	notification = servconn->cmdproc->data;
-	g_return_if_fail(notification != NULL);
-
-	msn_notification_destroy(notification);
-}
-
-MsnNotification *
-msn_notification_new(MsnSession *session)
-{
-	MsnNotification *notification;
-	MsnServConn *servconn;
-
-	g_return_val_if_fail(session != NULL, NULL);
-
-	notification = g_new0(MsnNotification, 1);
-
-	notification->session = session;
-	notification->servconn = servconn = msn_servconn_new(session, MSN_SERVCONN_NS);
-	msn_servconn_set_destroy_cb(servconn, destroy_cb);
-
-	notification->cmdproc = servconn->cmdproc;
-	notification->cmdproc->data = notification;
-	notification->cmdproc->cbs_table = cbs_table;
-
-	return notification;
-}
-
-void
-msn_notification_destroy(MsnNotification *notification)
-{
-	notification->cmdproc->data = NULL;
-
-	msn_servconn_set_destroy_cb(notification->servconn, NULL);
-
-	msn_servconn_destroy(notification->servconn);
-
-	g_free(notification);
-}
-
-/**************************************************************************
- * Connect
- **************************************************************************/
-
-static void
-connect_cb(MsnServConn *servconn)
-{
-	MsnCmdProc *cmdproc;
-	MsnSession *session;
-	GaimAccount *account;
-	char **a, **c, *vers;
-	int i;
-
-	g_return_if_fail(servconn != NULL);
-
-	cmdproc = servconn->cmdproc;
-	session = servconn->session;
-	account = session->account;
-
-	/* Allocate an array for CVR0, NULL, and all the versions */
-//	a = c = g_new0(char *, session->protocol_ver - WLM_MIN_PROTOCOL + 3);
-	a = c = g_new0(char *, WLM_MAX_PROTOCOL - WLM_MIN_PROTOCOL + 3);
-
-//	for (i = session->protocol_ver; i >= WLM_MIN_PROTOCOL; i--)
-	for (i = WLM_MAX_PROTOCOL; i >= WLM_MIN_PROTOCOL; i--)
-		*c++ = g_strdup_printf("MSNP%d", i);
-
-	*c++ = g_strdup("CVR0");
-
-	vers = g_strjoinv(" ", a);
-
-	if (session->login_step == MSN_LOGIN_STEP_START){
-		msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE);
-	}else{
-		msn_session_set_login_step(session, MSN_LOGIN_STEP_HANDSHAKE2);
-	}
-
-	msn_cmdproc_send(cmdproc, "VER", "%s", vers);
-
-	g_strfreev(a);
-	g_free(vers);
-}
-
-gboolean
-msn_notification_connect(MsnNotification *notification, const char *host, int port)
-{
-	MsnServConn *servconn;
-
-	g_return_val_if_fail(notification != NULL, FALSE);
-
-	servconn = notification->servconn;
-
-	msn_servconn_set_connect_cb(servconn, connect_cb);
-	notification->in_use = msn_servconn_connect(servconn, host, port);
-
-	return notification->in_use;
-}
-
-void
-msn_notification_disconnect(MsnNotification *notification)
-{
-	g_return_if_fail(notification != NULL);
-	g_return_if_fail(notification->in_use);
-
-	msn_servconn_disconnect(notification->servconn);
-
-	notification->in_use = FALSE;
-}
-
-/**************************************************************************
- * Util
- **************************************************************************/
-
-static void
-group_error_helper(MsnSession *session, const char *msg, const char *group_id, int error)
-{
-	GaimAccount *account;
-	GaimConnection *gc;
-	char *reason = NULL;
-	char *title = NULL;
-
-	account = session->account;
-	gc = gaim_account_get_connection(account);
-
-	if (error == 224){
-		if (group_id == 0){
-			return;
-		}else{
-			const char *group_name;
-			group_name = msn_userlist_find_group_name(session->userlist,group_id);
-			reason = g_strdup_printf(_("%s is not a valid group."),
-									 group_name);
-		}
-	}else{
-		reason = g_strdup(_("Unknown error."));
-	}
-
-	title = g_strdup_printf(_("%s on %s (%s)"), msg,
-						  gaim_account_get_username(account),
-						  gaim_account_get_protocol_name(account));
-	gaim_notify_error(gc, NULL, title, reason);
-	g_free(title);
-	g_free(reason);
-}
-
-/**************************************************************************
- * Login
- **************************************************************************/
-
-void
-msn_got_login_params(MsnSession *session, const char *login_params)
-{
-	MsnCmdProc *cmdproc;
-
-	cmdproc = session->notification->cmdproc;
-
-	msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH_END);
-
-	msn_cmdproc_send(cmdproc, "USR", "TWN S %s", login_params);
-}
-
-static void
-cvr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	GaimAccount *account;
-
-	account = cmdproc->session->account;
-	msn_cmdproc_send(cmdproc, "USR", "TWN I %s",
-					 gaim_account_get_username(account));
-}
-
-static void
-usr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	GaimAccount *account;
-	GaimConnection *gc;
-
-	session = cmdproc->session;
-	account = session->account;
-	gc = gaim_account_get_connection(account);
-
-	if (!g_ascii_strcasecmp(cmd->params[1], "OK")){
-		/* authenticate OK */
-		const char *friendly = gaim_url_decode(cmd->params[3]);
-
-		gaim_connection_set_display_name(gc, friendly);
-
-		msn_session_set_login_step(session, MSN_LOGIN_STEP_SYN);
-
-//		msn_cmdproc_send(cmdproc, "SYN", "%s", "0");
-		//TODO we should use SOAP contact to fetch contact list
-	}else if (!g_ascii_strcasecmp(cmd->params[1], "TWN")){
-		/* Passport authentication */
-		char **elems, **cur, **tokens;
-
-		session->nexus = msn_nexus_new(session);
-
-		/* Parse the challenge data. */
-		session->nexus->challenge_data_str = g_strdup(cmd->params[3]);
-		elems = g_strsplit(cmd->params[3], ",", 0);
-
-		for (cur = elems; *cur != NULL; cur++){
-			tokens = g_strsplit(*cur, "=", 2);
-			if(tokens[0]&&tokens[1]){
-				gaim_debug_info("MaYuan","challenge %p,key:%s,value:%s\n",
-									session->nexus->challenge_data,tokens[0],tokens[1]);
-				g_hash_table_insert(session->nexus->challenge_data, tokens[0], tokens[1]);
-			}
-			/* Don't free each of the tokens, only the array. */
-			g_free(tokens);
-		}
-
-		g_strfreev(elems);
-
-		msn_session_set_login_step(session, MSN_LOGIN_STEP_AUTH_START);
-
-		msn_nexus_connect(session->nexus);
-	}
-}
-
-static void
-usr_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
-{
-	MsnErrorType msnerr = 0;
-
-	switch (error)
-	{
-		case 500:
-		case 601:
-		case 910:
-		case 921:
-			msnerr = MSN_ERROR_SERV_UNAVAILABLE;
-			break;
-		case 911:
-			msnerr = MSN_ERROR_AUTH;
-			break;
-		default:
-			return;
-			break;
-	}
-
-	msn_session_set_error(cmdproc->session, msnerr, NULL);
-}
-
-static void
-ver_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	GaimAccount *account;
-	gboolean protocol_supported = FALSE;
-	char proto_str[8];
-	size_t i;
-
-	session = cmdproc->session;
-	account = session->account;
-
-	g_snprintf(proto_str, sizeof(proto_str), "MSNP%d", session->protocol_ver);
-
-	for (i = 1; i < cmd->param_count -1; i++){
-		gaim_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){
-		msn_session_set_error(session, MSN_ERROR_UNSUPPORTED_PROTOCOL,
-							  NULL);
-		return;
-	}
-
-	/*
-	 * Windows Live Messenger 8.0 
-	 * Notice :CVR String discriminate!
-	 * reference of http://www.microsoft.com/globaldev/reference/oslocversion.mspx
-	 * to see the Local ID
-	 */
-	msn_cmdproc_send(cmdproc, "CVR",
-//					 "0x0409 winnt 5.1 i386 MSG80BETA 8.0.0689 msmsgs %s",
-					"0x0804 winnt 5.1 i386 MSNMSGR 8.0.0792 msmsgs %s",
-					 gaim_account_get_username(account));
-}
-
-/**************************************************************************
- * Log out
- **************************************************************************/
-
-static void
-out_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	if (!g_ascii_strcasecmp(cmd->params[0], "OTH"))
-		msn_session_set_error(cmdproc->session, MSN_ERROR_SIGN_OTHER,
-							  NULL);
-	else if (!g_ascii_strcasecmp(cmd->params[0], "SSD"))
-		msn_session_set_error(cmdproc->session, MSN_ERROR_SERV_DOWN, NULL);
-}
-
-void
-msn_notification_close(MsnNotification *notification)
-{
-	g_return_if_fail(notification != NULL);
-
-	if (!notification->in_use)
-		return;
-
-	msn_cmdproc_send_quick(notification->cmdproc, "OUT", NULL, NULL);
-
-	msn_notification_disconnect(notification);
-}
-
-/**************************************************************************
- * Messages
- **************************************************************************/
-
-static void
-msg_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
-			 size_t len)
-{
-	MsnMessage *msg;
-
-	msg = msn_message_new_from_cmd(cmdproc->session, cmd);
-
-	msn_message_parse_payload(msg, payload, len,MSG_LINE_DEM,MSG_BODY_DEM);
-#ifdef MSN_DEBUG_NS
-	msn_message_show_readable(msg, "Notification", TRUE);
-#endif
-
-	msn_cmdproc_process_msg(cmdproc, msg);
-
-	msn_message_destroy(msg);
-}
-
-static void
-msg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	gaim_debug_info("MaYuan","Processing MSG... \n");
-	if(cmd->payload_len == 0){
-		return;
-	}
-	/* NOTE: cmd is not always cmdproc->last_cmd, sometimes cmd is a queued
-	 * command and we are processing it */
-	if (cmd->payload == NULL){
-		cmdproc->last_cmd->payload_cb  = msg_cmd_post;
-		cmdproc->servconn->payload_len = atoi(cmd->params[2]);
-	}else{
-		g_return_if_fail(cmd->payload_cb != NULL);
-
-		gaim_debug_info("MaYuan","MSG payload:{%s}\n",cmd->payload);
-		cmd->payload_cb(cmdproc, cmd, cmd->payload, cmd->payload_len);
-	}
-}
-
-/*send Message to Yahoo Messenger*/
-void
-uum_send_msg(MsnSession *session,MsnMessage *msg)
-{
-	MsnCmdProc *cmdproc;
-	MsnTransaction *trans;
-	char *payload;
-	gsize payload_len;
-	int type;
-	
-	cmdproc = session->notification->cmdproc;
-	g_return_if_fail(msg     != NULL);
-	payload = msn_message_gen_payload(msg, &payload_len);
-	gaim_debug_info("MaYuan","send UUM,payload{%s},strlen:%d,len:%d\n",
-		payload,strlen(payload),payload_len);
-	type = msg->type;
-	trans = msn_transaction_new(cmdproc, "UUM","%s 32 %d %d",msg->remote_user,type,payload_len);
-	msn_transaction_set_payload(trans, payload, strlen(payload));
-	msn_cmdproc_send_trans(cmdproc, trans);
-}
-
-static void
-ubm_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
-			 size_t len)
-{
-	MsnMessage *msg;
-	GaimConnection *gc;
-	const char *passport;
-	const char *content_type;
-
-	gaim_debug_info("MaYuan","Process UBM payload:%s\n",payload);
-	msg = msn_message_new_from_cmd(cmdproc->session, cmd);
-
-	msn_message_parse_payload(msg, payload, len,MSG_LINE_DEM,MSG_BODY_DEM);
-#ifdef MSN_DEBUG_NS
-	msn_message_show_readable(msg, "Notification", TRUE);
-#endif
-
-	gc = cmdproc->session->account->gc;
-	passport = msg->remote_user;
-
-	content_type = msn_message_get_content_type(msg);
-	gaim_debug_info("MaYuan","type:%d\n",content_type);
-	if(!strcmp(content_type,"text/plain")){
-		const char *value;
-		const char *body;
-		char *body_str;
-		char *body_enc;
-		char *body_final = NULL;
-		size_t body_len;
-
-		body = msn_message_get_bin_data(msg, &body_len);
-		body_str = g_strndup(body, body_len);
-		body_enc = g_markup_escape_text(body_str, -1);
-		g_free(body_str);
-
-		if ((value = msn_message_get_attr(msg, "X-MMS-IM-Format")) != NULL)	{
-			char *pre, *post;
-
-			msn_parse_format(value, &pre, &post);
-			body_final = g_strdup_printf("%s%s%s", pre ? pre : "",
-							body_enc ? body_enc : "", post ? post : "");
-			g_free(pre);
-			g_free(post);
-			g_free(body_enc);
-		}
-		serv_got_im(gc, passport, body_final, 0, time(NULL));
-	}
-	if(!strcmp(content_type,"text/x-msmsgscontrol")){
-		if(msn_message_get_attr(msg, "TypingUser") != NULL){
-			serv_got_typing(gc, passport, MSN_TYPING_RECV_TIMEOUT,
-						GAIM_TYPING);
-		}
-	}
-	if(!strcmp(content_type,"text/x-msnmsgr-datacast")){
-		char *username, *str;
-		GaimAccount *account;
-		GaimBuddy *buddy;
-		const char *user;
-
-		account = cmdproc->session->account;
-		user = msg->remote_user;
-
-		if ((buddy = gaim_find_buddy(account, user)) != NULL){
-			username = g_markup_escape_text(gaim_buddy_get_alias(buddy), -1);
-		}else{
-			username = g_markup_escape_text(user, -1);
-		}
-
-		str = g_strdup_printf(_("%s just sent you a Nudge!"), username);
-		g_free(username);
-		msn_session_report_user(cmdproc->session,user,str,GAIM_MESSAGE_SYSTEM);
-		g_free(str);
-	}
-	msn_message_destroy(msg);
-}
-
-/*Yahoo msg process*/
-static void
-ubm_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	gaim_debug_info("MaYuan","Processing UBM... \n");
-	if(cmd->payload_len == 0){
-		return;
-	}
-	/* NOTE: cmd is not always cmdproc->last_cmd, sometimes cmd is a queued
-	 * command and we are processing it */
-	if (cmd->payload == NULL){
-		cmdproc->last_cmd->payload_cb  = ubm_cmd_post;
-		cmdproc->servconn->payload_len = atoi(cmd->params[2]);
-	}else{
-		g_return_if_fail(cmd->payload_cb != NULL);
-
-		gaim_debug_info("MaYuan","UBM payload:{%s}\n",cmd->payload);
-		ubm_cmd_post(cmdproc, cmd, cmd->payload, cmd->payload_len);
-	}
-}
-
-/**************************************************************************
- * Challenges
- *  we use MD5 to caculate the Chanllenges 
- **************************************************************************/
-static void
-chl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnTransaction *trans;
-	char buf[33];
-
-#if 0
-	cipher = gaim_ciphers_find_cipher("md5");
-	context = gaim_cipher_context_new(cipher, NULL);
-	gaim_cipher_context_append(context, (const guchar *)cmd->params[1],
-							   strlen(cmd->params[1]));
-	challenge_resp = MSNP13_WLM_PRODUCT_KEY;
-
-	gaim_cipher_context_append(context, (const guchar *)challenge_resp,
-							   strlen(challenge_resp));
-	gaim_cipher_context_digest(context, sizeof(digest), digest, NULL);
-	gaim_cipher_context_destroy(context);
-
-	for (i = 0; i < 16; i++){
-		g_snprintf(buf + (i*2), 3, "%02x", digest[i]);
-	}
-#else
-	msn_handle_chl(cmd->params[1], buf);
-#endif
-//	gaim_debug_info("MaYuan","<<challenge:{%s}:{%s}\n",cmd->params[1],buf);
-	trans = msn_transaction_new(cmdproc, "QRY", "%s 32", MSNP13_WLM_PRODUCT_ID);
-
-	msn_transaction_set_payload(trans, buf, 32);
-
-	msn_cmdproc_send_trans(cmdproc, trans);
-}
-
-/**************************************************************************
- * Buddy Lists
- **************************************************************************/
-/* add contact to xmlnode */
-void 
-msn_add_contact_xml(xmlnode *mlNode,const char *passport,int list_op,int type)
-{
-	xmlnode *d_node,*c_node;
-	char **tokens;
-	char *email,*domain;
-	char *list_op_str,*type_str;
-
-	gaim_debug_info("MaYuan","passport:%s\n",passport);
-	tokens = g_strsplit(passport, "@", 2);
-	email = tokens[0];
-	domain = tokens[1];
-
-	/*find a domain Node*/
-	for(d_node = xmlnode_get_child(mlNode,"d"); d_node; d_node = xmlnode_get_next_twin(d_node)){
-		const char * attr = NULL;
-		gaim_debug_info("MaYuan","d_node:%s\n",d_node->name);
-		attr = xmlnode_get_attrib(d_node,"n");
-		if(attr == NULL){
-			continue;
-		}
-		if(!strcmp(attr,domain)){
-			break;
-		}
-	}
-	if(d_node == NULL){
-		/*domain not found, create a new domain Node*/
-		gaim_debug_info("MaYuan","get No d_node\n");
-		d_node = xmlnode_new("d");
-		xmlnode_set_attrib(d_node,"n",domain);
-		xmlnode_insert_child(mlNode,d_node);
-	}
-
-	/*create contact node*/
-	c_node = xmlnode_new("c");
-	xmlnode_set_attrib(c_node,"n",email);
-
-	list_op_str = g_strdup_printf("%d",list_op);
-	gaim_debug_info("MaYuan","list_op:%d\n",list_op_str);
-	xmlnode_set_attrib(c_node,"l",list_op_str);
-	g_free(list_op_str);
-#if 0
-	type_str = g_strdup_printf("%d",type);
-	xmlnode_set_attrib(c_node,"t",type_str);
-#else
-	if(g_strrstr(domain,"yahoo") != NULL){
-		type_str = g_strdup_printf("32");
-	}else{
-		/*passport*/
-		type_str = g_strdup_printf("1");
-	}
-	/*mobile*/
-	//type_str = g_strdup_printf("4");
-	xmlnode_set_attrib(c_node,"t",type_str);
-	g_free(type_str);
-#endif
-	xmlnode_insert_child(d_node, c_node);
-
-	g_free(tokens);
-}
-
-void
-msn_notification_post_adl(MsnCmdProc *cmdproc,char *payload, int payload_len)
-{
-	MsnTransaction *trans;
-
-	gaim_debug_info("MaYuan","Send ADL{%s}\n",payload);
-	trans = msn_transaction_new(cmdproc, "ADL","%d",strlen(payload));
-	msn_transaction_set_payload(trans, payload, strlen(payload));
-	msn_cmdproc_send_trans(cmdproc, trans);
-}
-
-/*dump contact info to NS*/
-void
-msn_notification_dump_contact(MsnSession *session)
-{
-	MsnUserList *userlist;
-	MsnUser *user;
-	GList *l;
-	xmlnode *adl_node;
-	char *payload;
-	int payload_len;
-
-	userlist = session->userlist;
-	adl_node = xmlnode_new("ml");
-	adl_node->child = NULL;
-	xmlnode_set_attrib(adl_node, "l", "1");
-
-	/*get the userlist*/
-	for (l = userlist->users; l != NULL; l = l->next){
-		user = l->data;
-		msn_add_contact_xml(adl_node,user->passport,user->list_op&MSN_LIST_OP_MASK,user->type);
-	}
-
-	payload = xmlnode_to_str(adl_node,&payload_len);
-	xmlnode_free(adl_node);
-
-	msn_notification_post_adl(session->notification->cmdproc,payload,payload_len);
-}
-
-/*Post FQY to NS,Inform add a Yahoo User*/
-void
-msn_notification_fqy_yahoo(MsnSession *session,char *passport)
-{
-	MsnTransaction *trans;
-	MsnCmdProc *cmdproc;
-	char* email,*domain,*payload;
-	char **tokens;
-
-	cmdproc = session->notification->cmdproc;
-
-	tokens = g_strsplit(passport, "@", 2);
-	email = tokens[0];
-	domain = tokens[1];
-
-	payload = g_strdup_printf("<ml><d n=\"%s\"><c n=\"%s\"/></d></ml>",domain,email);
-	trans = msn_transaction_new(cmdproc, "FQY","%d",strlen(payload));
-	msn_transaction_set_payload(trans, payload, strlen(payload));
-	msn_cmdproc_send_trans(cmdproc, trans);
-
-	g_free(payload);
-	g_free(tokens);
-}
-
-static void
-blp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	gaim_debug_info("MaYuan","Process BLP\n");
-}
-
-static void
-adl_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	gaim_debug_info("MaYuan","Process ADL\n");
-}
-
-static void
-fqy_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
-			 size_t len)
-{
-	gaim_debug_info("MaYuan","FQY payload{%s}\n",payload);
-	msn_notification_post_adl(cmdproc,payload,len);
-}
-
-static void
-fqy_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	gaim_debug_info("MaYuan","Process FQY\n");
-	cmdproc->last_cmd->payload_cb  = fqy_cmd_post;
-}
-
-static void
-rml_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnTransaction *trans;
-	char * payload;
-
-	gaim_debug_info("MaYuan","Process ADL\n");
-#if 0
-	trans = msn_transaction_new(cmdproc, "RML","");
-
-	msn_transaction_set_payload(trans, payload, strlen(payload));
-
-	msn_cmdproc_send_trans(cmdproc, trans);
-#endif
-}
-
-static void
-add_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
-{
-	MsnSession *session;
-	GaimAccount *account;
-	GaimConnection *gc;
-	const char *list, *passport;
-	char *reason = NULL;
-	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];
-
-	if (!strcmp(list, "FL"))
-		msg = g_strdup_printf(_("Unable to add user on %s (%s)"),
-							  gaim_account_get_username(account),
-							  gaim_account_get_protocol_name(account));
-	else if (!strcmp(list, "BL"))
-		msg = g_strdup_printf(_("Unable to block user on %s (%s)"),
-							  gaim_account_get_username(account),
-							  gaim_account_get_protocol_name(account));
-	else if (!strcmp(list, "AL"))
-		msg = g_strdup_printf(_("Unable to permit user on %s (%s)"),
-							  gaim_account_get_username(account),
-							  gaim_account_get_protocol_name(account));
-
-	if (!strcmp(list, "FL"))
-	{
-		if (error == 210)
-		{
-			reason = g_strdup_printf(_("%s could not be added because "
-									   "your buddy list is full."), passport);
-		}
-	}
-
-	if (reason == NULL)
-	{
-		if (error == 208)
-		{
-			reason = g_strdup_printf(_("%s is not a valid passport account."),
-									 passport);
-		}
-		else if (error == 500)
-		{
-			reason = g_strdup(_("Service Temporarily Unavailable."));
-		}
-		else
-		{
-			reason = g_strdup(_("Unknown error."));
-		}
-	}
-
-	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)
-{
-	MsnSession *session;
-	gint group_id;
-	const char *group_name;
-
-	session = cmdproc->session;
-
-	group_id = atoi(cmd->params[3]);
-
-	group_name = gaim_url_decode(cmd->params[2]);
-
-	msn_group_new(session->userlist, group_id, group_name);
-
-	/* There is a user that must me moved to this group */
-	if (cmd->trans->data)
-	{
-		/* msn_userlist_move_buddy(); */
-		MsnUserList *userlist = cmdproc->session->userlist;
-		MsnMoveBuddy *data = cmd->trans->data;
-
-		if (data->old_group_name != NULL)
-		{
-			msn_userlist_rem_buddy(userlist, data->who, MSN_LIST_FL, data->old_group_name);
-			g_free(data->old_group_name);
-		}
-
-		msn_userlist_add_buddy(userlist, data->who, MSN_LIST_FL, group_name);
-		g_free(data->who);
-
-	}
-}
-
-static void
-fln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSlpLink *slplink;
-	MsnUser *user;
-
-	user = msn_userlist_find_user(cmdproc->session->userlist, cmd->params[0]);
-
-	user->status = "offline";
-	msn_user_update(user);
-
-	slplink = msn_session_find_slplink(cmdproc->session, cmd->params[0]);
-
-	if (slplink != NULL)
-		msn_slplink_destroy(slplink);
-
-}
-
-static void
-iln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	GaimAccount *account;
-	GaimConnection *gc;
-	MsnUser *user;
-	MsnObject *msnobj;
-	int wlmclient;
-	const char *state, *passport, *friendly;
-
-	session = cmdproc->session;
-	account = session->account;
-	gc = gaim_account_get_connection(account);
-
-	state    = cmd->params[1];
-	passport = cmd->params[2];
-	/*if a contact is actually on the WLM part or the yahoo part*/
-	wlmclient = atoi(cmd->params[3]);
-	friendly = gaim_url_decode(cmd->params[4]);
-
-	user = msn_userlist_find_user(session->userlist, passport);
-
-	serv_got_alias(gc, passport, friendly);
-
-	msn_user_set_friendly_name(user, friendly);
-
-	if (session->protocol_ver >= 9 && cmd->param_count == 8){
-		msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[6]));
-		msn_user_set_object(user, msnobj);
-	}
-
-	msn_user_set_state(user, state);
-	msn_user_update(user);
-}
-
-static void
-ipg_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, size_t len)
-{
-#if 0
-	gaim_debug_misc("msn", "Incoming Page: {%s}\n", payload);
-#endif
-}
-
-static void
-ipg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	cmdproc->servconn->payload_len = atoi(cmd->params[0]);
-	cmdproc->last_cmd->payload_cb = ipg_cmd_post;
-}
-
-static void
-nln_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	GaimAccount *account;
-	GaimConnection *gc;
-	MsnUser *user;
-	MsnObject *msnobj;
-	int clientid;
-	int wlmclient;
-	const char *state, *passport, *friendly;
-
-	session = cmdproc->session;
-	account = session->account;
-	gc = gaim_account_get_connection(account);
-
-	state    = cmd->params[0];
-	passport = cmd->params[1];
-	wlmclient = atoi(cmd->params[2]);
-	friendly = gaim_url_decode(cmd->params[3]);
-
-	user = msn_userlist_find_user(session->userlist, passport);
-
-	serv_got_alias(gc, passport, friendly);
-
-	msn_user_set_friendly_name(user, friendly);
-
-	if (session->protocol_ver >= 9){
-		if (cmd->param_count == 7){
-			msnobj = msn_object_new_from_string(gaim_url_decode(cmd->params[5]));
-			msn_user_set_object(user, msnobj);
-		}else{
-			msn_user_set_object(user, NULL);
-		}
-	}
-
-	clientid = atoi(cmd->params[4]);
-	user->mobile = (clientid & MSN_CLIENT_CAP_MSNMOBILE);
-
-	msn_user_set_state(user, state);
-	msn_user_update(user);
-}
-
-#if 0
-static void
-chg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	char *state = cmd->params[1];
-	int state_id = 0;
-
-	if (!strcmp(state, "NLN"))
-		state_id = MSN_ONLINE;
-	else if (!strcmp(state, "BSY"))
-		state_id = MSN_BUSY;
-	else if (!strcmp(state, "IDL"))
-		state_id = MSN_IDLE;
-	else if (!strcmp(state, "BRB"))
-		state_id = MSN_BRB;
-	else if (!strcmp(state, "AWY"))
-		state_id = MSN_AWAY;
-	else if (!strcmp(state, "PHN"))
-		state_id = MSN_PHONE;
-	else if (!strcmp(state, "LUN"))
-		state_id = MSN_LUNCH;
-	else if (!strcmp(state, "HDN"))
-		state_id = MSN_HIDDEN;
-
-	cmdproc->session->state = state_id;
-}
-#endif
-
-
-static void
-not_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload, size_t len)
-{
-#if 0
-	MSN_SET_PARAMS("NOT %d\r\n%s", cmdproc->servconn->payload, payload);
-	gaim_debug_misc("msn", "Notification: {%s}\n", payload);
-#endif
-}
-
-static void
-not_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	cmdproc->servconn->payload_len = atoi(cmd->params[0]);
-	cmdproc->last_cmd->payload_cb = not_cmd_post;
-}
-
-static void
-rea_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	/* TODO: This might be for us too */
-
-	MsnSession *session;
-	GaimConnection *gc;
-	const char *friendly;
-
-	session = cmdproc->session;
-	gc = session->account->gc;
-	friendly = gaim_url_decode(cmd->params[3]);
-
-	gaim_connection_set_display_name(gc, friendly);
-}
-
-static void
-prp_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session = cmdproc->session;
-	const char *type, *value;
-
-	g_return_if_fail(cmd->param_count >= 3);
-
-	type  = cmd->params[2];
-
-	if (cmd->param_count == 4)
-	{
-		value = cmd->params[3];
-		if (!strcmp(type, "PHH"))
-			msn_user_set_home_phone(session->user, gaim_url_decode(value));
-		else if (!strcmp(type, "PHW"))
-			msn_user_set_work_phone(session->user, gaim_url_decode(value));
-		else if (!strcmp(type, "PHM"))
-			msn_user_set_mobile_phone(session->user, gaim_url_decode(value));
-	}
-	else
-	{
-		if (!strcmp(type, "PHH"))
-			msn_user_set_home_phone(session->user, NULL);
-		else if (!strcmp(type, "PHW"))
-			msn_user_set_work_phone(session->user, NULL);
-		else if (!strcmp(type, "PHM"))
-			msn_user_set_mobile_phone(session->user, NULL);
-	}
-}
-
-static void
-reg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	int group_id;
-	const char *group_name;
-
-	session = cmdproc->session;
-	group_id = atoi(cmd->params[2]);
-	group_name = gaim_url_decode(cmd->params[3]);
-
-	msn_userlist_rename_group_id(session->userlist, group_id, group_name);
-}
-
-static void
-reg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
-{
-	const char * group_id;
-	char **params;
-
-	params = g_strsplit(trans->params, " ", 0);
-
-	group_id = params[0];
-
-	group_error_helper(cmdproc->session, _("Unable to rename group"), group_id, error);
-
-	g_strfreev(params);
-}
-
-static void
-rem_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	MsnUser *user;
-	const char *list;
-	const char *passport;
-	MsnListId list_id;
-	int group_id;
-
-	session = cmdproc->session;
-	list = cmd->params[1];
-	passport = cmd->params[3];
-	user = msn_userlist_find_user(session->userlist, passport);
-
-	g_return_if_fail(user != NULL);
-
-	list_id = msn_get_list_id(list);
-
-	if (cmd->param_count == 5)
-		group_id = atoi(cmd->params[4]);
-	else
-		group_id = -1;
-
-	msn_got_rem_user(session, user, list_id, group_id);
-	msn_user_update(user);
-}
-
-static void
-rmg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	int group_id;
-
-	session = cmdproc->session;
-	group_id = atoi(cmd->params[2]);
-
-	msn_userlist_remove_group_id(session->userlist, group_id);
-}
-
-static void
-rmg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
-{
-	int group_id;
-	char **params;
-
-	params = g_strsplit(trans->params, " ", 0);
-
-	group_id = atoi(params[0]);
-
-	group_error_helper(cmdproc->session, _("Unable to delete group"), group_id, error);
-
-	g_strfreev(params);
-}
-
-static void
-syn_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	int total_users;
-
-	session = cmdproc->session;
-
-	if (cmd->param_count == 2)
-	{
-		/*
-		 * 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.
-		 */
-
-		msn_session_set_error(cmdproc->session, MSN_ERROR_BAD_BLIST, NULL);
-		return;
-	}
-
-	total_users  = atoi(cmd->params[2]);
-
-	if (total_users == 0)
-	{
-		msn_session_finish_login(session);
-	}
-	else
-	{
-		/* syn_table */
-		MsnSync *sync;
-
-		sync = msn_sync_new(session);
-		sync->total_users = total_users;
-		sync->old_cbs_table = cmdproc->cbs_table;
-
-		session->sync = sync;
-		cmdproc->cbs_table = sync->cbs_table;
-	}
-}
-
-/**************************************************************************
- * Misc commands
- **************************************************************************/
-
-static void
-url_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	GaimAccount *account;
-	const char *rru;
-	const char *url;
-	GaimCipher *cipher;
-	GaimCipherContext *context;
-	guchar digest[16];
-	FILE *fd;
-	char *buf;
-	char buf2[3];
-	char sendbuf[64];
-	int i;
-
-	session = cmdproc->session;
-	account = session->account;
-
-	rru = cmd->params[1];
-	url = cmd->params[2];
-
-	buf = g_strdup_printf("%s%lu%s",
-			   session->passport_info.mspauth,
-			   time(NULL) - session->passport_info.sl,
-			   gaim_connection_get_password(account->gc));
-
-	cipher = gaim_ciphers_find_cipher("md5");
-	context = gaim_cipher_context_new(cipher, NULL);
-
-	gaim_cipher_context_append(context, (const guchar *)buf, strlen(buf));
-	gaim_cipher_context_digest(context, sizeof(digest), digest, NULL);
-	gaim_cipher_context_destroy(context);
-
-	g_free(buf);
-
-	memset(sendbuf, 0, sizeof(sendbuf));
-
-	for (i = 0; i < 16; i++)
-	{
-		g_snprintf(buf2, sizeof(buf2), "%02x", digest[i]);
-		strcat(sendbuf, buf2);
-	}
-
-	if (session->passport_info.file != NULL)
-	{
-		g_unlink(session->passport_info.file);
-		g_free(session->passport_info.file);
-	}
-
-	if ((fd = gaim_mkstemp(&session->passport_info.file, FALSE)) == NULL)
-	{
-		gaim_debug_error("msn",
-						 "Error opening temp passport file: %s\n",
-						 strerror(errno));
-	}
-	else
-	{
-		fputs("<html>\n"
-			  "<head>\n"
-			  "<noscript>\n"
-			  "<meta http-equiv=\"Refresh\" content=\"0; "
-			  "url=http://www.hotmail.com\">\n"
-			  "</noscript>\n"
-			  "</head>\n\n",
-			  fd);
-
-		fprintf(fd, "<body onload=\"document.pform.submit(); \">\n");
-		fprintf(fd, "<form name=\"pform\" action=\"%s\" method=\"POST\">\n\n",
-				url);
-		fprintf(fd, "<input type=\"hidden\" name=\"mode\" value=\"ttl\">\n");
-		fprintf(fd, "<input type=\"hidden\" name=\"login\" value=\"%s\">\n",
-				gaim_account_get_username(account));
-		fprintf(fd, "<input type=\"hidden\" name=\"username\" value=\"%s\">\n",
-				gaim_account_get_username(account));
-		fprintf(fd, "<input type=\"hidden\" name=\"sid\" value=\"%s\">\n",
-				session->passport_info.sid);
-		fprintf(fd, "<input type=\"hidden\" name=\"kv\" value=\"%s\">\n",
-				session->passport_info.kv);
-		fprintf(fd, "<input type=\"hidden\" name=\"id\" value=\"2\">\n");
-		fprintf(fd, "<input type=\"hidden\" name=\"sl\" value=\"%ld\">\n",
-				time(NULL) - session->passport_info.sl);
-		fprintf(fd, "<input type=\"hidden\" name=\"rru\" value=\"%s\">\n",
-				rru);
-		fprintf(fd, "<input type=\"hidden\" name=\"auth\" value=\"%s\">\n",
-				session->passport_info.mspauth);
-		fprintf(fd, "<input type=\"hidden\" name=\"creds\" value=\"%s\">\n",
-				sendbuf); /* TODO Digest me (huh? -- ChipX86) */
-		fprintf(fd, "<input type=\"hidden\" name=\"svc\" value=\"mail\">\n");
-		fprintf(fd, "<input type=\"hidden\" name=\"js\" value=\"yes\">\n");
-		fprintf(fd, "</form></body>\n");
-		fprintf(fd, "</html>\n");
-
-		if (fclose(fd))
-		{
-			gaim_debug_error("msn",
-							 "Error closing temp passport file: %s\n",
-							 strerror(errno));
-
-			g_unlink(session->passport_info.file);
-			g_free(session->passport_info.file);
-			session->passport_info.file = NULL;
-		}
-#ifdef _WIN32
-		else
-		{
-			/*
-			 * Renaming file with .html extension, so that the
-			 * win32 open_url will work.
-			 */
-			char *tmp;
-
-			if ((tmp =
-				g_strdup_printf("%s.html",
-					session->passport_info.file)) != NULL)
-			{
-				if (g_rename(session->passport_info.file,
-							tmp) == 0)
-				{
-					g_free(session->passport_info.file);
-					session->passport_info.file = tmp;
-				}
-				else
-					g_free(tmp);
-			}
-		}
-#endif
-	}
-}
-/**************************************************************************
- * Switchboards
- **************************************************************************/
-
-static void
-rng_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	MsnSwitchBoard *swboard;
-	const char *session_id;
-	char *host;
-	int port;
-
-	session = cmdproc->session;
-	session_id = cmd->params[0];
-
-	msn_parse_socket(cmd->params[1], &host, &port);
-
-	if (session->http_method)
-		port = 80;
-
-	swboard = msn_switchboard_new(session);
-
-	msn_switchboard_set_invited(swboard, TRUE);
-	msn_switchboard_set_session_id(swboard, cmd->params[0]);
-	msn_switchboard_set_auth_key(swboard, cmd->params[3]);
-	swboard->im_user = g_strdup(cmd->params[4]);
-	/* msn_switchboard_add_user(swboard, cmd->params[4]); */
-
-	if (!msn_switchboard_connect(swboard, host, port))
-		msn_switchboard_destroy(swboard);
-
-	g_free(host);
-}
-
-static void
-xfr_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	char *host;
-	int port;
-
-	if (strcmp(cmd->params[1], "SB") && strcmp(cmd->params[1], "NS"))
-	{
-		/* Maybe we can have a generic bad command error. */
-		gaim_debug_error("msn", "Bad XFR command (%s)\n", cmd->params[1]);
-		return;
-	}
-
-	msn_parse_socket(cmd->params[2], &host, &port);
-
-	if (!strcmp(cmd->params[1], "SB")){
-		gaim_debug_error("msn", "This shouldn't be handled here.\n");
-	}else if (!strcmp(cmd->params[1], "NS")){
-		MsnSession *session;
-
-		session = cmdproc->session;
-
-		msn_session_set_login_step(session, MSN_LOGIN_STEP_TRANSFER);
-
-		msn_notification_connect(session->notification, host, port);
-	}
-
-	g_free(host);
-}
-
-static void
-gcf_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
-			 size_t len)
-{
-	/*get the payload content*/
-	gaim_debug_info("MaYuan","GCF{%s}\n",cmd->payload);
-}
-
-static void
-gcf_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	gaim_debug_info("MaYuan","Processing GCF... \n");
-	cmdproc->last_cmd->payload_cb  = gcf_cmd_post;
-	return;
-}
-
-static void
-sbs_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	gaim_debug_info("MaYuan","Processing SBS... \n");
-	if(cmd->payload_len == 0){
-		return;
-	}
-	/*get the payload content*/
-}
-
-/*
- * Get the UBX's PSM info
- * Post it to the User status
- * Thanks for Chris <ukdrizzle@yahoo.co.uk>'s code
- */
-static void
-ubx_cmd_post(MsnCmdProc *cmdproc, MsnCommand *cmd, char *payload,
-			 size_t len)
-{
-	MsnSession *session;
-	GaimAccount *account;
-	GaimConnection *gc;
-	MsnUser *user;
-	const char *passport, *psm_str;
-
-	/*get the payload content*/
-//	gaim_debug_info("MaYuan","UBX {%s} payload{%s}\n",cmd->params[0], cmd->payload);
-
-	session = cmdproc->session;
-	account = session->account;
-	gc = gaim_account_get_connection(account);
-
-	passport = cmd->params[0];
-	user = msn_userlist_find_user(session->userlist, passport);
-	
-	psm_str = msn_get_psm(cmd->payload,len);
-	msn_user_set_statusline(user, psm_str);
-	msn_user_update(user);
-
-	g_free(psm_str);
-}
-
-static void
-ubx_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	gaim_debug_info("MaYuan","UBX... \n");
-	if(cmd->payload_len == 0){
-		return;
-	}
-	cmdproc->last_cmd->payload_cb  = ubx_cmd_post;
-}
-
-static void
-uux_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	gaim_debug_info("MaYuan","UUX... \n");
-}
-
-/**************************************************************************
- * Message Types
- **************************************************************************/
-
-static void
-profile_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
-{
-	MsnSession *session;
-	const char *value;
-	const char *clLastChange;
-
-	gaim_debug_info("MaYuan","profile_msg... \n");
-	session = cmdproc->session;
-
-	if (strcmp(msg->remote_user, "Hotmail"))
-		/* This isn't an official message. */
-		return;
-
-	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 (session->passport_info.sid != NULL)
-			g_free(session->passport_info.sid);
-
-		session->passport_info.sid = g_strdup(value);
-	}
-
-	if ((value = msn_message_get_attr(msg, "MSPAuth")) != NULL){
-		if (session->passport_info.mspauth != NULL)
-			g_free(session->passport_info.mspauth);
-
-		gaim_debug_info("MaYuan","MSPAuth:%s\n",value);
-		session->passport_info.mspauth = g_strdup(value);
-	}
-
-	if ((value = msn_message_get_attr(msg, "ClientIP")) != NULL){
-		if (session->passport_info.client_ip != NULL)
-			g_free(session->passport_info.client_ip);
-
-		session->passport_info.client_ip = g_strdup(value);
-	}
-
-	if ((value = msn_message_get_attr(msg, "ClientPort")) != NULL){
-		session->passport_info.client_port = ntohs(atoi(value));
-	}
-
-	if ((value = msn_message_get_attr(msg, "LoginTime")) != NULL)
-		session->passport_info.sl = atol(value);
-
-	/*starting retrieve the contact list*/
-	msn_userlist_load(session);
-	
-	msn_session_set_bnode(session);
-	session->contact = msn_contact_new(session);
-	clLastChange = gaim_blist_node_get_string(msn_session_get_bnode(session),"CLLastChange");
-	msn_get_contact_list(session->contact,clLastChange);
-//	msn_contact_connect(session->contact);
-}
-
-static void
-initial_email_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
-{
-	MsnSession *session;
-	GaimConnection *gc;
-	GHashTable *table;
-	const char *unread;
-
-	session = cmdproc->session;
-	gc = session->account->gc;
-
-	if (strcmp(msg->remote_user, "Hotmail"))
-		/* This isn't an official message. */
-		return;
-
-	if (session->passport_info.file == NULL)
-	{
-		MsnTransaction *trans;
-		trans = msn_transaction_new(cmdproc, "URL", "%s", "INBOX");
-		msn_transaction_queue_cmd(trans, msg->cmd);
-
-		msn_cmdproc_send_trans(cmdproc, trans);
-
-		return;
-	}
-
-	if (!gaim_account_get_check_mail(session->account))
-		return;
-
-	table = msn_message_get_hashtable_from_body(msg);
-
-	unread = g_hash_table_lookup(table, "Inbox-Unread");
-
-	if (unread != NULL)
-	{
-		int count = atoi(unread);
-
-		if (count > 0)
-		{
-			const char *passport;
-			const char *url;
-
-			passport = msn_user_get_passport(session->user);
-			url = session->passport_info.file;
-
-			gaim_notify_emails(gc, atoi(unread), FALSE, NULL, NULL,
-							   &passport, &url, NULL, NULL);
-		}
-	}
-
-	g_hash_table_destroy(table);
-}
-
-/*offline Message notification process*/
-static void
-initial_mdata_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
-{
-	MsnSession *session;
-	char **elems, **cur, **tokens;
-
-//	gaim_debug_info("MaYuan","mdata...{%s} \n",msg->body);
-
-//	/*time debug*/
-	{
-	const char *timestr;
-	time_t t;
-	struct tm *tm;
-	char datestr[]="2006-07-15T07:21:26+0700";
-	GDate *date;
-	time(&t);
-	tm = gmtime(&t);
-	timestr = gaim_utf8_strftime("%a, %d %b %Y %T %Z", tm);
-//	strftime(datestr,strlen(datestr),"%a",tm);
-	date = g_date_new();
-	g_date_set_parse(date,datestr);
-	gaim_debug_info("MaYuan","date is NULL?date valid%d\n",g_date_valid(date));
-	g_date_free(date);
-	gaim_debug_info("MaYuan","utf8 time:{%s}\n",timestr);
-	}
-
-	/*new a oim session*/
-	session = cmdproc->session;
-	session->oim = msn_oim_new(session);
-//	msn_oim_connect(session->oim);
-
-	/*parse offline message data*/
-	elems = g_strsplit(msg->body, "\r\n", 0);
-	for (cur = elems; *cur != NULL; cur++){
-		const char *key, *value;
-
-//		gaim_debug_info("MaYuan","cur:{%s}\n",*cur);
-		tokens = g_strsplit(*cur, ": ", 2);
-
-		key = tokens[0];
-		value = tokens[1];
-
-		/*if not MIME content ,then return*/
-		if ((key != NULL) && (!strcmp(key, "Mail-Data")) ){
-//			gaim_debug_info("MaYuan","data:{%s}\n",value);
-			msn_parse_oim_msg(session->oim,value);
-			g_strfreev(tokens);
-			break;
-		}
-
-		g_strfreev(tokens);
-	}
-
-	g_strfreev(elems);
-/* test code for add group*/
-//	msn_add_group(session,"hello");
-}
-
-/*offline Message Notification*/
-static void
-delete_oim_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
-{
-}
-
-static void
-email_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
-{
-	MsnSession *session;
-	GaimConnection *gc;
-	GHashTable *table;
-	char *from, *subject, *tmp;
-
-	session = cmdproc->session;
-	gc = session->account->gc;
-
-	if (strcmp(msg->remote_user, "Hotmail"))
-		/* This isn't an official message. */
-		return;
-
-	if (session->passport_info.file == NULL)
-	{
-		MsnTransaction *trans;
-		trans = msn_transaction_new(cmdproc, "URL", "%s", "INBOX");
-		msn_transaction_queue_cmd(trans, msg->cmd);
-
-		msn_cmdproc_send_trans(cmdproc, trans);
-
-		return;
-	}
-
-	if (!gaim_account_get_check_mail(session->account))
-		return;
-
-	table = msn_message_get_hashtable_from_body(msg);
-
-	from = subject = NULL;
-
-	tmp = g_hash_table_lookup(table, "From");
-	if (tmp != NULL)
-		from = gaim_mime_decode_field(tmp);
-
-	tmp = g_hash_table_lookup(table, "Subject");
-	if (tmp != NULL)
-		subject = gaim_mime_decode_field(tmp);
-
-	gaim_notify_email(gc,
-					  (subject != NULL ? subject : ""),
-					  (from != NULL ?  from : ""),
-					  msn_user_get_passport(session->user),
-					  session->passport_info.file, NULL, NULL);
-
-	if (from != NULL)
-		g_free(from);
-
-	if (subject != NULL)
-		g_free(subject);
-
-	g_hash_table_destroy(table);
-}
-
-static void
-system_msg(MsnCmdProc *cmdproc, MsnMessage *msg)
-{
-	GHashTable *table;
-	const char *type_s;
-
-	if (strcmp(msg->remote_user, "Hotmail"))
-		/* This isn't an official message. */
-		return;
-
-	table = msn_message_get_hashtable_from_body(msg);
-
-	if ((type_s = g_hash_table_lookup(table, "Type")) != NULL)
-	{
-		int type = atoi(type_s);
-		char buf[MSN_BUF_LEN];
-		int minutes;
-
-		switch (type)
-		{
-			case 1:
-				minutes = atoi(g_hash_table_lookup(table, "Arg1"));
-				g_snprintf(buf, sizeof(buf), ngettext(
-							"The MSN server will shut down for maintenance "
-							"in %d minute. You will automatically be "
-							"signed out at that time.  Please finish any "
-							"conversations in progress.\n\nAfter the "
-							"maintenance has been completed, you will be "
-							"able to successfully sign in.",
-							"The MSN server will shut down for maintenance "
-							"in %d minutes. You will automatically be "
-							"signed out at that time.  Please finish any "
-							"conversations in progress.\n\nAfter the "
-							"maintenance has been completed, you will be "
-							"able to successfully sign in.", minutes),
-						minutes);
-			default:
-				break;
-		}
-
-		if (*buf != '\0')
-			gaim_notify_info(cmdproc->session->account->gc, NULL, buf, NULL);
-	}
-
-	g_hash_table_destroy(table);
-}
-
-void
-msn_notification_add_buddy(MsnNotification *notification, const char *list,
-						   const char *who, const char *store_name,
-						   const char *group_id)
-{
-	MsnCmdProc *cmdproc;
-	MsnTransaction *trans;
-	xmlnode *adl_node;
-	char *payload;
-	int payload_len;
-
-	cmdproc = notification->servconn->cmdproc;
-
-	if (strcmp(list, "FL") != 0){
-	}
-
-	adl_node = xmlnode_new("ml");
-	adl_node->child = NULL;
-
-	msn_add_contact_xml(adl_node,who,1,1);
-
-	payload = xmlnode_to_str(adl_node,&payload_len);
-	xmlnode_free(adl_node);
-	if(msn_user_is_yahoo(notification->session->account,who)){
-		msn_notification_fqy_yahoo(notification->session, who);
-	}else{
-		msn_notification_post_adl(notification->servconn->cmdproc,
-							payload,payload_len);
-	}
-}
-
-void
-msn_notification_rem_buddy(MsnNotification *notification, const char *list,
-						   const char *who, const char *group_id)
-{
-	MsnCmdProc *cmdproc;
-	MsnTransaction *trans;
-	xmlnode *rml_node;
-	char *payload;
-	int payload_len;
-
-	cmdproc = notification->servconn->cmdproc;
-
-	rml_node = xmlnode_new("ml");
-	rml_node->child = NULL;
-
-	msn_add_contact_xml(rml_node,who,1,1);
-
-	payload = xmlnode_to_str(rml_node,&payload_len);
-	xmlnode_free(rml_node);
-
-	gaim_debug_info("MaYuan","RML{%s}\n",payload);
-	trans = msn_transaction_new(cmdproc, "RML","%d",strlen(payload));
-	msn_transaction_set_payload(trans, payload, strlen(payload));
-	msn_cmdproc_send_trans(cmdproc, trans);
-}
-
-/**************************************************************************
- * Init
- **************************************************************************/
-void
-msn_notification_init(void)
-{
-	/* TODO: check prp, blp */
-
-	cbs_table = msn_table_new();
-
-	/* Synchronous */
-	msn_table_add_cmd(cbs_table, "CHG", "CHG", NULL);
-	msn_table_add_cmd(cbs_table, "CHG", "ILN", iln_cmd);
-	msn_table_add_cmd(cbs_table, "ADL", "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, "USR", "GCF", gcf_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, "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, "BLP", "BLP", NULL);
-	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);
-
-	/* Asynchronous */
-	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, "UBM", ubm_cmd);
-	msn_table_add_cmd(cbs_table, NULL, "GCF", gcf_cmd);
-	msn_table_add_cmd(cbs_table, NULL, "SBS", sbs_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, "RML", rml_cmd);
-	msn_table_add_cmd(cbs_table, NULL, "ADL", adl_cmd);
-	msn_table_add_cmd(cbs_table, NULL, "FQY", fqy_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, "ILN", iln_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, "UBX", ubx_cmd);
-	msn_table_add_cmd(cbs_table, NULL, "UUX", uux_cmd);
-
-	msn_table_add_cmd(cbs_table, NULL, "URL", url_cmd);
-
-	msn_table_add_cmd(cbs_table, "fallback", "XFR", xfr_cmd);
-
-	msn_table_add_error(cbs_table, "ADD", add_error);
-	msn_table_add_error(cbs_table, "REG", reg_error);
-	msn_table_add_error(cbs_table, "RMG", rmg_error);
-	/* msn_table_add_error(cbs_table, "REA", rea_error); */
-	msn_table_add_error(cbs_table, "USR", usr_error);
-
-	msn_table_add_msg_type(cbs_table,
-						   "text/x-msmsgsprofile",
-						   profile_msg);
-	/*initial OIM notification*/
-	msn_table_add_msg_type(cbs_table,
-							"text/x-msmsgsinitialmdatanotification",
-							initial_mdata_msg);	
-	/*OIM notification when user online*/
-	msn_table_add_msg_type(cbs_table,
-							"text/x-msmsgsoimnotification",
-							initial_mdata_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);
-	/*delete an offline Message notification*/
-	msn_table_add_msg_type(cbs_table,
-							"text/x-msmsgsactivemailnotification",
-						   delete_oim_msg);
-	msn_table_add_msg_type(cbs_table,
-						   "application/x-msmsgssystemmessage",
-						   system_msg);
-}
-
-void
-msn_notification_end(void)
-{
-	msn_table_destroy(cbs_table);
-}
-

mercurial