void qq_info_free(QQInfo *info) { if(info == NULL){ return; } qq_buddy_free(info -> me); #define FREE_STR(x) if(info -> x != NULL){g_string_free(info -> x, TRUE);} FREE_STR(vc_type); FREE_STR(vc_image_data); FREE_STR(vc_image_type); FREE_STR(verify_code); FREE_STR(ptvfsession); FREE_STR(version); FREE_STR(ptuserinfo); FREE_STR(ptwebqq); FREE_STR(ptcz); FREE_STR(skey); FREE_STR(cookie); FREE_STR(clientid); FREE_STR(seskey); FREE_STR(cip); FREE_STR(index); FREE_STR(port); FREE_STR(psessionid); FREE_STR(vfwebqq); #undef FREE_STR gint i; for(i = 0; i < info -> buddies -> len; ++i){ qq_buddy_free(info -> buddies -> pdata[i]); } g_ptr_array_free(info -> buddies, TRUE); for(i = 0; i < info -> groups -> len; ++i){ qq_group_free(info -> groups -> pdata[i]); } g_ptr_array_free(info -> groups, TRUE); for(i = 0; i < info -> recentcons -> len; ++i){ qq_recentcon_free(info -> recentcons -> pdata[i]); } g_ptr_array_free(info -> recentcons, TRUE); for(i = 0; i < info -> categories -> len; ++i){ qq_category_free(info -> categories -> pdata[i]); } g_ptr_array_free(info -> categories, TRUE); g_hash_table_unref(info -> buddies_ht); g_hash_table_unref(info -> groups_ht); g_hash_table_unref(info -> buddies_number_ht); g_hash_table_unref(info -> groups_number_ht); g_mutex_free(info -> lock); g_slice_free(QQInfo, info); }
/* add a buddy and send packet to QQ server * note that when purple load local cached buddy list into its blist * it also calls this funtion, so we have to * define qd->is_login=TRUE AFTER LOGIN */ void qq_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) { qq_data *qd; guint32 uid; g_return_if_fail(NULL != gc && NULL != gc->proto_data); g_return_if_fail(buddy != NULL); qd = (qq_data *) gc->proto_data; if (!qd->is_login) return; /* IMPORTANT ! */ uid = purple_name_to_uid(purple_buddy_get_name(buddy)); if (uid > 0) { if (qd->client_version > 2005) { request_add_buddy_no_auth_ex(gc, uid); } else { request_add_buddy_no_auth(gc, uid); } return; } purple_notify_error(gc, _("QQ Buddy"), _("Add buddy"), _("Invalid QQ Number")); if (buddy == NULL) { return; } purple_debug_info("QQ", "Remove buddy with invalid QQ number %u\n", uid); qq_buddy_free(buddy); }
PurpleBuddy * qq_buddy_find_or_new( PurpleConnection *gc, guint32 uid, guint8 group_id) { PurpleBuddy *buddy; qq_buddy_data *bd; qq_data *qd; GSList *l; qq_group * g; PurpleGroup * old_group; g_return_val_if_fail(gc->account != NULL && uid != 0, NULL); qd = (qq_data *)gc->proto_data; buddy = qq_buddy_find(gc, uid); /* group_id==0xFF only when add an unknown stranger */ if (group_id==0xFF) { if (buddy) goto buddy_data_check; else group_id=0; //add stranger to group 0 } /* find input group_id */ for (l=qd->group_list; l; l=l->next) { if (((qq_group *)(l->data))->group_id == group_id) break; } /* if group_id found */ if (l) { if (buddy) //if buddy already exist, we need check if he is in new group { old_group = purple_buddy_get_group(buddy); g = (qq_group *)l->data; if (old_group != purple_find_group(g->group_name)) { qq_buddy_free(buddy); } else goto buddy_data_check; } old_group = purple_find_group(((qq_group *)(l->data))->group_name); buddy = qq_buddy_new(gc, uid, old_group); } else { if (group_id==0) { if (!buddy) buddy = qq_buddy_new(gc, uid, NULL); goto buddy_data_check; } purple_debug_error("QQ","cannot find group id: %u", group_id); return NULL; } buddy_data_check: if (purple_buddy_get_protocol_data(buddy) != NULL) return buddy; bd = qq_buddy_data_new(uid); purple_buddy_set_protocol_data(buddy, bd); return buddy; }
/* add a buddy and send packet to QQ server * note that when purple load local cached buddy list into its blist * it also calls this funtion, so we have to * define qd->is_login=TRUE AFTER LOGIN */ void qq_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group) { qq_data *qd; gchar * group_name; qq_buddy_opt_req *opt_req; g_return_if_fail(NULL != gc && NULL != gc->proto_data); g_return_if_fail(buddy != NULL); qd = (qq_data *) gc->proto_data; if (!qd->is_login) return; /* IMPORTANT ! */ if (purple_buddy_get_protocol_data(buddy)) { purple_notify_error(gc, _("QQ Buddy"), _("Add buddy"), _("Buddy exists")); return; } /* free it in qq_request_add_buddy_touch */ opt_req = g_new0(qq_buddy_opt_req, 1); opt_req->gc = gc; opt_req->uid = purple_name_to_uid(purple_buddy_get_name(buddy)); if (group) { group_name = purple_group_get_name(group); if (!group_name) { purple_notify_error(gc, _("QQ Buddy"), _("Add buddy"), _("Group not exists")); goto free; } opt_req->group_id = group_name_to_id(gc, group_name); if (opt_req->group_id == 0xFF) { purple_notify_error(gc, _("QQ Buddy"), _("Add buddy"), _("Chosen Group not associated with this account")); goto free; } } else opt_req->group_id = 0; if (opt_req->uid > 0) { qq_request_add_buddy_touch(gc, opt_req); return; } purple_notify_error(gc, _("QQ Buddy"), _("Add buddy"), _("Invalid QQ Number")); free: if (buddy == NULL) return; qq_buddy_free(buddy); }
/* process the server reply for my request to remove a buddy */ void qq_process_remove_buddy(PurpleConnection *gc, guint8 *data, gint data_len, guint32 uid) { PurpleBuddy *buddy = NULL; gchar *msg; g_return_if_fail(data != NULL && data_len != 0); g_return_if_fail(uid != 0); buddy = qq_buddy_find(gc, uid); if (data[0] != 0) { msg = g_strdup_printf(_("Failed removing buddy %u"), uid); purple_notify_info(gc, _("QQ Buddy"), msg, NULL); g_free(msg); } purple_debug_info("QQ", "Reply OK for removing buddy\n"); /* remove buddy again */ if (buddy != NULL) { qq_buddy_free(buddy); } }