diff libpurple/protocols/qq/buddy_opt.c @ 24079:1bdf7b602684

2008.10.07 - ccpaging <ccpaging(at)gmail.com> * Update qun conversation * Drop group_conv.c and group_conv.h
author SHiNE CsyFeK <csyfek@gmail.com>
date Wed, 22 Oct 2008 14:58:32 +0000
parents ce94189f15ad
children 818ab62006f5
line wrap: on
line diff
--- a/libpurple/protocols/qq/buddy_opt.c	Wed Oct 22 14:55:09 2008 +0000
+++ b/libpurple/protocols/qq/buddy_opt.c	Wed Oct 22 14:58:32 2008 +0000
@@ -291,7 +291,6 @@
 	qq_data *qd;
 	gchar *purple_name;
 	PurpleBuddy *buddy;
-	qq_buddy *q_buddy;
 
 	g_return_if_fail(add_req != NULL);
 	if (add_req->gc == NULL || add_req->uid == 0) {
@@ -312,12 +311,13 @@
 		return;
 	}
 
-	q_buddy = (qq_buddy *) buddy->proto_data;
-	if (q_buddy != NULL)
-		qd->buddies = g_list_remove(qd->buddies, q_buddy);
-	else
+	if (buddy->proto_data != NULL) {
+		qq_buddy_data_free(buddy->proto_data);
+		buddy->proto_data = NULL;
+	} else {
 		purple_debug_warning("QQ", "We have no qq_buddy record for %s\n", buddy->name);
-
+	}
+	
 	purple_blist_remove_buddy(buddy);
 	g_free(add_req);
 }
@@ -476,6 +476,7 @@
 		g_free(nombre);
 	} else {	/* add OK */
 		qq_create_buddy(gc, uid, TRUE, TRUE);
+
 		msg = g_strdup_printf(_("Successed adding into %d's buddy list"), uid);
 		qq_got_attention(gc, msg);
 		g_free(msg);
@@ -483,7 +484,7 @@
 	g_strfreev(segments);
 }
 
-PurpleGroup *qq_create_group(const gchar *group_name)
+PurpleGroup *qq_group_find_or_new(const gchar *group_name)
 {
 	PurpleGroup *g;
 
@@ -520,7 +521,7 @@
 	 	group_name = g_strdup(PURPLE_GROUP_QQ_UNKNOWN);
 	}
 
-	group = qq_create_group(group_name);
+	group = qq_group_find_or_new(group_name);
 
 	buddy_name = uid_to_purple_name(uid);
 	purple_buddy = purple_find_buddy(gc->account, buddy_name);
@@ -544,7 +545,6 @@
 		buddy = g_new0(qq_buddy, 1);
 		buddy->uid = uid;
 		purple_buddy->proto_data = buddy;
-		qd->buddies = g_list_append(qd->buddies, buddy);
 		qq_request_buddy_info(gc, uid, 0, 0);
 		qq_request_get_buddies_online(gc, 0, 0);
 		if (qd->client_version >= 2007) {
@@ -555,7 +555,7 @@
 	}
 
 	purple_blist_add_buddy(purple_buddy, NULL, group, NULL);
-	purple_debug_warning("QQ", "Add new buddy: [%s]\n", buddy_name);
+	purple_debug_info("QQ", "Add new buddy: [%s]\n", buddy_name);
 
 	g_free(buddy_name);
 	g_free(group_name);
@@ -563,7 +563,16 @@
 	return purple_buddy;
 }
 
-qq_buddy *qq_get_buddy(PurpleConnection *gc, guint32 uid)
+static qq_buddy *qq_buddy_data_new(guint32 uid)
+{
+	qq_buddy *buddy = g_new0(qq_buddy, 1);
+	memset(buddy, 0, sizeof(qq_buddy));
+	buddy->uid = uid;
+	buddy->status = QQ_BUDDY_ONLINE_NORMAL;
+	return buddy;
+}
+
+qq_buddy *qq_buddy_find(PurpleConnection *gc, guint32 uid)
 {
 	gchar *purple_name;
 	PurpleBuddy *purple_buddy;
@@ -574,20 +583,85 @@
 
 	purple_buddy = purple_find_buddy(purple_connection_get_account(gc), purple_name);
 	g_free(purple_name);
-	if (purple_buddy == NULL)	return NULL;
-
+	if (purple_buddy == NULL) {
+		purple_debug_error("QQ", "Can not find purple buddy of %d\n", uid);
+		return NULL;
+	}
 	if (purple_buddy->proto_data == NULL) {
 		purple_debug_error("QQ", "Can not find buddy data of %d\n", uid);
 		return NULL;
 	}
-	return (qq_buddy *) purple_buddy->proto_data;
+	return (qq_buddy *)purple_buddy->proto_data;
+}
+
+void qq_buddy_data_free(qq_buddy *bd)
+{
+	g_return_if_fail(bd != NULL);
+
+	if (bd->nickname) g_free(bd->nickname);
+	g_free(bd);
+}
+
+static PurpleBuddy *qq_buddy_new(PurpleConnection *gc, gchar *who)
+{
+	PurpleBuddy *buddy;
+	PurpleGroup *group;
+	gchar *group_name;
+
+	g_return_val_if_fail(gc->account != NULL && who != NULL, NULL);
+
+	group_name = g_strdup_printf(PURPLE_GROUP_QQ_FORMAT,
+			purple_account_get_username(gc->account));
+	group = qq_group_find_or_new(group_name);
+	if (group == NULL) {
+		purple_debug_error("QQ", "Failed creating group %s\n", group_name);
+		return NULL;
+	}
+
+	buddy = purple_buddy_new(gc->account, who, NULL);	/* alias is NULL */
+	buddy->proto_data = NULL;
+
+	purple_blist_add_buddy(buddy, NULL, group, NULL);
+	purple_debug_info("QQ", "Add new purple buddy: [%s]\n", who);
+
+	g_free(group_name);
+
+	return buddy;
+}
+
+PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, guint32 uid)
+{
+	PurpleBuddy *buddy;
+	gchar *who;
+
+	g_return_val_if_fail(gc->account != NULL && uid != 0, NULL);
+
+	who = uid_to_purple_name(uid);
+
+	buddy = purple_find_buddy(gc->account, who);
+	if (buddy == NULL) {
+		buddy = qq_buddy_new(gc, who);
+		if (buddy == NULL) {
+			g_free(who);
+			return NULL;
+		}
+	}
+	
+	if (buddy->proto_data != NULL) {
+		g_free(who);
+		return buddy;
+	}
+
+	buddy->proto_data = qq_buddy_data_new(uid);
+
+	g_free(who);
+	return buddy;
 }
 
 /* remove a buddy and send packet to QQ server accordingly */
 void qq_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
 {
 	qq_data *qd;
-	qq_buddy *q_bud;
 	guint32 uid;
 
 	g_return_if_fail(gc != NULL && gc->proto_data != NULL);
@@ -602,44 +676,17 @@
 		request_buddy_remove(gc, uid);
 	}
 
-	q_bud = (qq_buddy *) buddy->proto_data;
-	if (q_bud != NULL)
-		qd->buddies = g_list_remove(qd->buddies, q_bud);
-	else
+	if (buddy->proto_data) {
+		qq_buddy_data_free(buddy->proto_data);
+		buddy->proto_data = NULL;
+	} else {
 		purple_debug_warning("QQ", "We have no qq_buddy record for %s\n", buddy->name);
-
+	}
+	
 	/* Do not call purple_blist_remove_buddy,
 	 * otherwise purple segmentation fault */
 }
 
-/* free all qq_buddy */
-void qq_buddies_list_free(PurpleAccount *account, qq_data *qd)
-{
-	gint count;
-	qq_buddy *p;
-	gchar *name;
-	PurpleBuddy *b;
-
-	count = 0;
-	while (qd->buddies) {
-		p = (qq_buddy *) (qd->buddies->data);
-		qd->buddies = g_list_remove(qd->buddies, p);
-		name = uid_to_purple_name(p->uid);
-		b = purple_find_buddy(account, name);
-		if(b != NULL)
-			b->proto_data = NULL;
-		else
-			purple_debug_info("QQ", "qq_buddy %s not found in purple proto_data\n", name);
-		g_free(name);
-
-		g_free(p);
-		count++;
-	}
-	if (count > 0) {
-		purple_debug_info("QQ", "%d qq_buddy structures are freed!\n", count);
-	}
-}
-
 /* someone wants to add you to his buddy list */
 static void server_buddy_add_request(PurpleConnection *gc, gchar *from, gchar *to, gchar *msg_utf8)
 {