void qq_process_add_buddy_no_auth(PurpleConnection *gc, guint8 *data, gint data_len, guint32 uid) { qq_data *qd; gchar **segments; gchar *dest_uid, *reply; PurpleBuddy *buddy; g_return_if_fail(data != NULL && data_len != 0); g_return_if_fail(uid != 0); qd = (qq_data *) gc->proto_data; purple_debug_info("QQ", "Process buddy add for id [%u]\n", uid); qq_show_packet("buddy_add_no_auth", data, data_len); if (NULL == (segments = split_data(data, data_len, "\x1f", 2))) return; dest_uid = segments[0]; reply = segments[1]; if (strtoul(dest_uid, NULL, 10) != qd->uid) { /* should not happen */ purple_debug_error("QQ", "Add buddy reply is to [%s], not me!", dest_uid); g_strfreev(segments); return; } if (strtol(reply, NULL, 10) == 0) { /* add OK */ qq_buddy_find_or_new(gc, uid); qq_request_buddy_info(gc, uid, 0, 0); if (qd->client_version >= 2007) { qq_request_get_level_2007(gc, uid); } else { qq_request_get_level(gc, uid); } qq_request_get_buddies_online(gc, 0, 0); purple_debug_info("QQ", "Successed adding into %u's buddy list", uid); g_strfreev(segments); return; } /* need auth */ purple_debug_warning("QQ", "Failed adding buddy, need authorize\n"); buddy = qq_buddy_find(gc, uid); if (buddy == NULL) { buddy = qq_buddy_new(gc, uid); } if (buddy != NULL && buddy->proto_data != NULL) { /* Not authorized now, free buddy data */ qq_buddy_data_free(buddy->proto_data); buddy->proto_data = NULL; } add_buddy_authorize_input(gc, uid, NULL, 0); g_strfreev(segments); }
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; }
/* you are rejected by the person */ static void server_buddy_rejected_me(PurpleConnection *gc, gchar *from, gchar *to, guint8 *data, gint data_len) { guint32 uid; PurpleBuddy *buddy; gchar *msg, *msg_utf8; gint bytes; gchar **segments; gchar *primary, *secondary; qq_buddy_data *bd; g_return_if_fail(from != NULL && to != NULL); qq_show_packet("server_buddy_rejected_me", data, data_len); if (data_len <= 0) { msg = g_strdup( _("No reason given") ); } else { segments = g_strsplit((gchar *)data, "\x1f", 1); if (segments != NULL && segments[0] != NULL) { msg = g_strdup(segments[0]); g_strfreev(segments); bytes = strlen(msg) + 1; if (bytes < data_len) { server_buddy_check_code(gc, from, data + bytes, data_len - bytes); } } else { msg = g_strdup( _("No reason given") ); } } msg_utf8 = qq_to_utf8(msg, QQ_CHARSET_DEFAULT); if (msg_utf8 == NULL) { msg_utf8 = g_strdup( _("Unknown reason") ); } g_free(msg); primary = g_strdup_printf(_("Rejected by %s"), from); secondary = g_strdup_printf(_("Message: %s"), msg_utf8); purple_notify_info(gc, _("QQ Buddy"), primary, secondary); g_free(msg_utf8); g_free(primary); g_free(secondary); uid = strtoul(from, NULL, 10); g_return_if_fail(uid != 0); buddy = qq_buddy_find(gc, uid); if (buddy != NULL && (bd = purple_buddy_get_protocol_data(buddy)) != NULL) { /* Not authorized now, free buddy data */ qq_buddy_data_free(bd); purple_buddy_set_protocol_data(buddy, NULL); } }
/* 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); } }
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, uid); if (buddy == NULL) { return NULL; } } if (buddy->proto_data != NULL) { return buddy; } buddy->proto_data = qq_buddy_data_new(uid); return buddy; }
PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, guint32 uid) { PurpleBuddy *buddy; qq_buddy_data *bd; 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, uid); if (buddy == NULL) { return NULL; } } 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; }