diff libpurple/protocols/qq/buddy_opt.c @ 24080:818ab62006f5

2008.10.07 - ccpaging <ccpaging(at)gmail.com> * Update qq_buddy
author SHiNE CsyFeK <csyfek@gmail.com>
date Wed, 22 Oct 2008 14:59:55 +0000
parents 1bdf7b602684
children 9be95f0b9472
line wrap: on
line diff
--- a/libpurple/protocols/qq/buddy_opt.c	Wed Oct 22 14:58:32 2008 +0000
+++ b/libpurple/protocols/qq/buddy_opt.c	Wed Oct 22 14:59:55 2008 +0000
@@ -315,9 +315,9 @@
 		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_debug_warning("QQ", "We have no qq_buddy_data record for %s\n", buddy->name);
 	}
-	
+
 	purple_blist_remove_buddy(buddy);
 	g_free(add_req);
 }
@@ -475,7 +475,14 @@
 		g_free(msg);
 		g_free(nombre);
 	} else {	/* add OK */
-		qq_create_buddy(gc, uid, TRUE, TRUE);
+		qq_buddy_find_or_new(gc, uid);
+		qq_request_buddy_info(gc, uid, 0, 0);
+		qq_request_get_buddies_online(gc, 0, 0);
+		if (qd->client_version >= 2007) {
+			qq_request_get_level_2007(gc, uid);
+		} else {
+			qq_request_get_level(gc, uid);
+		}
 
 		msg = g_strdup_printf(_("Successed adding into %d's buddy list"), uid);
 		qq_got_attention(gc, msg);
@@ -500,101 +507,39 @@
 	return g;
 }
 
-/* we add new buddy, if the received packet is from someone not in my list
- * return the PurpleBuddy that is just created */
-PurpleBuddy *qq_create_buddy(PurpleConnection *gc, guint32 uid,
-		gboolean is_known, gboolean is_create_data)
+static qq_buddy_data *qq_buddy_data_new(guint32 uid)
 {
-	PurpleBuddy *purple_buddy;
-	PurpleGroup *group;
-	qq_data *qd;
-	qq_buddy *buddy;
-	gchar *buddy_name, *group_name;
-
-	g_return_val_if_fail(gc->account != NULL && uid != 0, NULL);
-	qd = (qq_data *) gc->proto_data;
-
-	if (is_known) {
-		group_name = g_strdup_printf(PURPLE_GROUP_QQ_FORMAT,
-				purple_account_get_username(gc->account));
-	 } else {
-	 	group_name = g_strdup(PURPLE_GROUP_QQ_UNKNOWN);
-	}
-
-	group = qq_group_find_or_new(group_name);
-
-	buddy_name = uid_to_purple_name(uid);
-	purple_buddy = purple_find_buddy(gc->account, buddy_name);
-	/* remove old, we can not simply return here
-	 * because there might be old local copy of this buddy */
-	if (purple_buddy != NULL)
-		purple_blist_remove_buddy(purple_buddy);
-
-	purple_buddy = purple_buddy_new(gc->account, buddy_name, NULL);
-	if ( !is_known) {
-		if (purple_privacy_check(gc->account, buddy_name)) {
-			purple_privacy_deny(gc->account, buddy_name, TRUE, FALSE);
-		} else {
-			purple_privacy_deny_add(gc->account, buddy_name, TRUE);
-		}
-	}
-
-	if (!is_create_data)
-		purple_buddy->proto_data = NULL;
-	else {
-		buddy = g_new0(qq_buddy, 1);
-		buddy->uid = uid;
-		purple_buddy->proto_data = buddy;
-		qq_request_buddy_info(gc, uid, 0, 0);
-		qq_request_get_buddies_online(gc, 0, 0);
-		if (qd->client_version >= 2007) {
-			qq_request_get_level_2007(gc, uid);
-		} else {
-			qq_request_get_level(gc, uid);
-		}
-	}
-
-	purple_blist_add_buddy(purple_buddy, NULL, group, NULL);
-	purple_debug_info("QQ", "Add new buddy: [%s]\n", buddy_name);
-
-	g_free(buddy_name);
-	g_free(group_name);
-
-	return purple_buddy;
+	qq_buddy_data *bd = g_new0(qq_buddy_data, 1);
+	memset(bd, 0, sizeof(qq_buddy_data));
+	bd->uid = uid;
+	bd->status = QQ_BUDDY_ONLINE_NORMAL;
+	return bd;
 }
 
-static qq_buddy *qq_buddy_data_new(guint32 uid)
+qq_buddy_data *qq_buddy_data_find(PurpleConnection *gc, 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;
+	gchar *who;
+	PurpleBuddy *buddy;
 
 	g_return_val_if_fail(gc != NULL, NULL);
-	purple_name = uid_to_purple_name(uid);
-	if (purple_name == NULL)	return NULL;
 
-	purple_buddy = purple_find_buddy(purple_connection_get_account(gc), purple_name);
-	g_free(purple_name);
-	if (purple_buddy == NULL) {
+	who = uid_to_purple_name(uid);
+	if (who == NULL)	return NULL;
+	buddy = purple_find_buddy(purple_connection_get_account(gc), who);
+	g_free(who);
+
+	if (buddy == NULL) {
 		purple_debug_error("QQ", "Can not find purple buddy of %d\n", uid);
 		return NULL;
 	}
-	if (purple_buddy->proto_data == NULL) {
+	if (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_data *)buddy->proto_data;
 }
 
-void qq_buddy_data_free(qq_buddy *bd)
+void qq_buddy_data_free(qq_buddy_data *bd)
 {
 	g_return_if_fail(bd != NULL);
 
@@ -602,13 +547,15 @@
 	g_free(bd);
 }
 
-static PurpleBuddy *qq_buddy_new(PurpleConnection *gc, gchar *who)
+/* create purple buddy without data and display with no-auth icon */
+PurpleBuddy *qq_buddy_new(PurpleConnection *gc, guint32 uid)
 {
 	PurpleBuddy *buddy;
 	PurpleGroup *group;
+	gchar *who;
 	gchar *group_name;
 
-	g_return_val_if_fail(gc->account != NULL && who != NULL, NULL);
+	g_return_val_if_fail(gc->account != NULL && uid != 0, NULL);
 
 	group_name = g_strdup_printf(PURPLE_GROUP_QQ_FORMAT,
 			purple_account_get_username(gc->account));
@@ -618,7 +565,9 @@
 		return NULL;
 	}
 
+	who = uid_to_purple_name(uid);
 	buddy = purple_buddy_new(gc->account, who, NULL);	/* alias is NULL */
+	g_free(who);
 	buddy->proto_data = NULL;
 
 	purple_blist_add_buddy(buddy, NULL, group, NULL);
@@ -629,7 +578,7 @@
 	return buddy;
 }
 
-PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, guint32 uid)
+PurpleBuddy *qq_buddy_find(PurpleConnection *gc, guint32 uid)
 {
 	PurpleBuddy *buddy;
 	gchar *who;
@@ -637,24 +586,30 @@
 	g_return_val_if_fail(gc->account != NULL && uid != 0, NULL);
 
 	who = uid_to_purple_name(uid);
+	buddy = purple_find_buddy(gc->account, who);
+	g_free(who);
+	return buddy;
+}
 
-	buddy = purple_find_buddy(gc->account, who);
+PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, guint32 uid)
+{
+	PurpleBuddy *buddy;
+
+	g_return_val_if_fail(gc->account != NULL && uid != 0, NULL);
+
+	buddy = qq_buddy_find(gc, uid);
 	if (buddy == NULL) {
-		buddy = qq_buddy_new(gc, who);
+		buddy = qq_buddy_new(gc, uid);
 		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;
 }
 
@@ -680,9 +635,9 @@
 		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_debug_warning("QQ", "We have no qq_buddy_data record for %s\n", buddy->name);
 	}
-	
+
 	/* Do not call purple_blist_remove_buddy,
 	 * otherwise purple segmentation fault */
 }
@@ -784,11 +739,23 @@
 {
 	PurpleAccount *account = purple_connection_get_account(gc);
 	qq_data *qd;
+	guint32 uid;
 
 	g_return_if_fail(from != NULL && to != NULL);
 
 	qd = (qq_data *) gc->proto_data;
-	qq_create_buddy(gc, strtol(from, NULL, 10), TRUE, TRUE);
+	uid = strtol(from, NULL, 10);
+
+	g_return_if_fail(uid > 0);
+
+	qq_buddy_find_or_new(gc, uid);
+	qq_request_buddy_info(gc, uid, 0, 0);
+	qq_request_get_buddies_online(gc, 0, 0);
+	if (qd->client_version >= 2007) {
+		qq_request_get_level_2007(gc, uid);
+	} else {
+		qq_request_get_level(gc, uid);
+	}
 
 	purple_account_notify_added(account, from, to, NULL, msg_utf8);
 }