libpurple/protocols/msn/switchboard.c

branch
soc.2010.msn-tlc
changeset 30940
fd3559f6d13c
parent 30930
bea746046da3
parent 30938
fe9d2308ab3f
child 30943
c505e5a35e55
--- a/libpurple/protocols/msn/switchboard.c	Wed May 26 19:47:56 2010 +0000
+++ b/libpurple/protocols/msn/switchboard.c	Wed May 26 20:01:05 2010 +0000
@@ -25,6 +25,7 @@
 #include "prefs.h"
 #include "switchboard.h"
 #include "notification.h"
+#include "userlist.h"
 #include "msnutils.h"
 
 #include "error.h"
@@ -123,7 +124,6 @@
 	g_free(swboard->session_id);
 
 	for (; swboard->users; swboard->users = g_list_delete_link(swboard->users, swboard->users))
-		g_free(swboard->users->data);
 
 	session = swboard->session;
 	session->switches = g_list_remove(session->switches, swboard);
@@ -226,11 +226,23 @@
 	msn_message_destroy(msg);
 }
 
+static int
+user_passport_cmp(MsnUser *user, const char *passport)
+{
+	const char *pass;
+
+	pass = msn_user_get_passport(user);
+
+	return strcmp(pass, passport);
+}
+
 static void
 msn_switchboard_add_user(MsnSwitchBoard *swboard, const char *user)
 {
 	MsnCmdProc *cmdproc;
 	PurpleAccount *account;
+	MsnUserList *userlist;
+	MsnUser *msnuser;
 	char *semicolon;
 	char *passport;
 
@@ -246,8 +258,14 @@
 	else
 		passport = g_strdup(user);
 
+	userlist = swboard->session->userlist;
+	msnuser = msn_userlist_find_user(userlist, passport);
+
+	if (!msnuser)
+		purple_debug_error("msn","User %s is not on our list.\n", passport);
+
 	/* Don't add multiple endpoints to the conversation. */
-	if (g_list_find_custom(swboard->users, passport, (GCompareFunc)strcmp)) {
+	if (g_list_find_custom(swboard->users, passport, (GCompareFunc)user_passport_cmp)) {
 		g_free(passport);
 		return;
 	}
@@ -257,8 +275,10 @@
 		g_free(passport);
 		return;
 	}
+	
+	g_free(passport);
 
-	swboard->users = g_list_prepend(swboard->users, passport);
+	swboard->users = g_list_prepend(swboard->users, msnuser);
 	swboard->current_users++;
 	swboard->empty = FALSE;
 
@@ -276,7 +296,7 @@
 	if ((swboard->conv != NULL) &&
 		(purple_conversation_get_type(swboard->conv) == PURPLE_CONV_TYPE_CHAT))
 	{
-		purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), user, NULL,
+		purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv), msnuser->passport, NULL,
 								PURPLE_CBFLAGS_NONE, TRUE);
 		msn_servconn_set_idle_timeout(swboard->servconn, 0);
 	}
@@ -304,8 +324,9 @@
 			for (l = swboard->users; l != NULL; l = l->next)
 			{
 				const char *tmp_user;
+				user = l->data;
 
-				tmp_user = l->data;
+				tmp_user = msnuser->passport;
 
 				purple_conv_chat_add_user(PURPLE_CONV_CHAT(swboard->conv),
 										tmp_user, NULL, PURPLE_CBFLAGS_NONE, TRUE);
@@ -322,7 +343,7 @@
 	else if (swboard->conv == NULL)
 	{
 		swboard->conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,
-															user, account);
+															msnuser->passport, account);
 	}
 	else
 	{

mercurial