Mercurial > pidgin.yaz
diff libpurple/protocols/qq/group_join.c @ 23753:5f454b975a99
2008.08.10 - csyfek <csyfek(at)gmail.com>
* Commit to Pidgin
2008.08.06 - ccpaging <ecc_hy(at)hotmail.com>
* Rename names of variables, Group, to Room
* Functions of group_network merged into qq_network and qq_process
* Canceled managing glist of group packet, add sub_cmdd and room_id to transaction
* Fixed error of demo group:
If 'room list' and 'room infor' are not setup, response received from server will emits
'room_id = 0' packet.
2008.08.04 - ccpaging <ecc_hy(at)hotmail.com>
* Use new crypt/decrypt functions
* Rename crypt.c/h to qq_crypt.c/h
* Clean code of decrypt functions
* Fixed decryption failure
2008.08.04 - csyfek <csyfek(at)gmail.com>
* Update AUTHORS
author | SHiNE CsyFeK <csyfek@gmail.com> |
---|---|
date | Sun, 10 Aug 2008 04:32:14 +0000 |
parents | 9a5d140400f1 |
children | 967344bc404d |
line wrap: on
line diff
--- a/libpurple/protocols/qq/group_join.c Sat Aug 09 23:23:48 2008 +0000 +++ b/libpurple/protocols/qq/group_join.c Sun Aug 10 04:32:14 2008 +0000 @@ -38,8 +38,10 @@ #include "group_info.h" #include "group_join.h" #include "group_opt.h" -#include "group_network.h" #include "group_search.h" +#include "header_info.h" +#include "packet_parse.h" +#include "qq_network.h" enum { QQ_GROUP_JOIN_OK = 0x01, @@ -49,24 +51,21 @@ static void _qq_group_exit_with_gc_and_id(gc_and_uid *g) { PurpleConnection *gc; - guint32 internal_group_id; + guint32 id; qq_group *group; gc = g->gc; - internal_group_id = g->uid; + id = g->uid; - group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); + group = qq_room_search_id(gc, id); g_return_if_fail(group != NULL); - qq_send_cmd_group_exit_group(gc, group); + qq_send_room_cmd_only(gc, QQ_ROOM_CMD_QUIT, group->id); } /* send packet to join a group without auth */ void qq_send_cmd_group_join_group(PurpleConnection *gc, qq_group *group) { - guint8 raw_data[16] = {0}; - gint bytes = 0; - g_return_if_fail(group != NULL); if (group->my_status == QQ_GROUP_MEMBER_STATUS_NOT_MEMBER) { @@ -86,25 +85,21 @@ break; } - bytes = 0; - bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_JOIN_GROUP); - bytes += qq_put32(raw_data + bytes, group->internal_group_id); - - qq_send_group_cmd(gc, group, raw_data, bytes); + qq_send_room_cmd_only(gc, QQ_ROOM_CMD_JOIN, group->id); } static void _qq_group_join_auth_with_gc_and_id(gc_and_uid *g, const gchar *reason_utf8) { PurpleConnection *gc; qq_group *group; - guint32 internal_group_id; + guint32 id; gc = g->gc; - internal_group_id = g->uid; + id = g->uid; - group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); + group = qq_room_search_id(gc, id); if (group == NULL) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Can not find qq_group by internal_id: %d\n", internal_group_id); + purple_debug(PURPLE_DEBUG_ERROR, "QQ", "Can not find qq_group by internal_id: %d\n", id); return; } else { /* everything is OK */ qq_send_cmd_group_auth(gc, group, QQ_GROUP_AUTH_REQUEST_APPLY, 0, reason_utf8); @@ -118,12 +113,12 @@ g_return_if_fail(group != NULL); purple_debug(PURPLE_DEBUG_INFO, "QQ", - "Group (internal id: %d) needs authentication\n", group->internal_group_id); + "Group (internal id: %d) needs authentication\n", group->id); msg = g_strdup_printf("Group \"%s\" needs authentication\n", group->group_name_utf8); g = g_new0(gc_and_uid, 1); g->gc = gc; - g->uid = group->internal_group_id; + g->uid = group->id; purple_request_input(gc, NULL, msg, _("Input request here"), _("Would you be my friend?"), TRUE, FALSE, NULL, @@ -139,7 +134,7 @@ { guint8 *raw_data; gchar *reason_qq; - gint bytes, data_len; + gint bytes; g_return_if_fail(group != NULL); @@ -154,45 +149,22 @@ uid = 0; } - data_len = 10 + strlen(reason_qq) + 1; - raw_data = g_newa(guint8, data_len); + raw_data = g_newa(guint8, 6 + strlen(reason_qq)); bytes = 0; - bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_JOIN_GROUP_AUTH); - bytes += qq_put32(raw_data + bytes, group->internal_group_id); bytes += qq_put8(raw_data + bytes, opt); bytes += qq_put32(raw_data + bytes, uid); bytes += qq_put8(raw_data + bytes, strlen(reason_qq)); bytes += qq_putdata(raw_data + bytes, (guint8 *) reason_qq, strlen(reason_qq)); - if (bytes != data_len) { - purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_JOIN_GROUP_AUTH)); - return; - } - - qq_send_group_cmd(gc, group, raw_data, data_len); -} - -/* send a packet to exit a group */ -void qq_send_cmd_group_exit_group(PurpleConnection *gc, qq_group *group) -{ - guint8 raw_data[16] = {0}; - gint bytes = 0; - - g_return_if_fail(group != NULL); - - bytes += qq_put8(raw_data + bytes, QQ_GROUP_CMD_EXIT_GROUP); - bytes += qq_put32(raw_data + bytes, group->internal_group_id); - - qq_send_group_cmd(gc, group, raw_data, bytes); + qq_send_room_cmd(gc, QQ_ROOM_CMD_AUTH, group->id, raw_data, bytes); } /* If comes here, cmd is OK already */ void qq_process_group_cmd_exit_group(guint8 *data, gint len, PurpleConnection *gc) { gint bytes; - guint32 internal_group_id; + guint32 id; PurpleChat *chat; qq_group *group; qq_data *qd; @@ -207,15 +179,15 @@ } bytes = 0; - bytes += qq_get32(&internal_group_id, data + bytes); + bytes += qq_get32(&id, data + bytes); - group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); + group = qq_room_search_id(gc, id); if (group != NULL) { chat = purple_blist_find_chat - (purple_connection_get_account(gc), g_strdup_printf("%d", group->external_group_id)); + (purple_connection_get_account(gc), g_strdup_printf("%d", group->ext_id)); if (chat != NULL) purple_blist_remove_chat(chat); - qq_group_delete_internal_record(qd, internal_group_id); + qq_group_delete_internal_record(qd, id); } purple_notify_info(gc, _("QQ Qun Operation"), _("You have successfully left the group"), NULL); } @@ -224,7 +196,7 @@ void qq_process_group_cmd_join_group_auth(guint8 *data, gint len, PurpleConnection *gc) { gint bytes; - guint32 internal_group_id; + guint32 id; qq_data *qd; g_return_if_fail(data != NULL && len > 0); @@ -236,8 +208,8 @@ return; } bytes = 0; - bytes += qq_get32(&internal_group_id, data + bytes); - g_return_if_fail(internal_group_id > 0); + bytes += qq_get32(&id, data + bytes); + g_return_if_fail(id > 0); purple_notify_info(gc, _("QQ Group Auth"), _("Your authorization request has been accepted by the QQ server"), NULL); @@ -247,7 +219,7 @@ void qq_process_group_cmd_join_group(guint8 *data, gint len, PurpleConnection *gc) { gint bytes; - guint32 internal_group_id; + guint32 id; guint8 reply; qq_group *group; @@ -260,11 +232,11 @@ } bytes = 0; - bytes += qq_get32(&internal_group_id, data + bytes); + bytes += qq_get32(&id, data + bytes); bytes += qq_get8(&reply, data + bytes); /* join group OK */ - group = qq_group_find_by_id(gc, internal_group_id, QQ_INTERNAL_ID); + group = qq_room_search_id(gc, id); /* need to check if group is NULL or not. */ g_return_if_fail(group != NULL); switch (reply) { @@ -274,12 +246,12 @@ qq_group_refresh(gc, group); /* this must be shown before getting online members */ qq_group_conv_show_window(gc, group); - qq_send_cmd_group_get_group_info(gc, group); + qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, group->id); break; case QQ_GROUP_JOIN_NEED_AUTH: purple_debug(PURPLE_DEBUG_INFO, "QQ", "Fail joining group [%d] %s, needs authentication\n", - group->external_group_id, group->group_name_utf8); + group->ext_id, group->group_name_utf8); group->my_status = QQ_GROUP_MEMBER_STATUS_NOT_MEMBER; qq_group_refresh(gc, group); _qq_group_join_auth(gc, group); @@ -287,7 +259,7 @@ default: purple_debug(PURPLE_DEBUG_INFO, "QQ", "Error joining group [%d] %s, unknown reply: 0x%02x\n", - group->external_group_id, group->group_name_utf8, reply); + group->ext_id, group->group_name_utf8, reply); } } @@ -295,48 +267,48 @@ void qq_group_join(PurpleConnection *gc, GHashTable *data) { qq_data *qd; - gchar *external_group_id_ptr; - guint32 external_group_id; + gchar *ext_id_ptr; + guint32 ext_id; qq_group *group; g_return_if_fail(data != NULL); qd = (qq_data *) gc->proto_data; - external_group_id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID); - g_return_if_fail(external_group_id_ptr != NULL); + ext_id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_EXTERNAL_ID); + g_return_if_fail(ext_id_ptr != NULL); errno = 0; - external_group_id = strtol(external_group_id_ptr, NULL, 10); + ext_id = strtol(ext_id_ptr, NULL, 10); if (errno != 0) { purple_notify_error(gc, _("Error"), _("You entered a group ID outside the acceptable range"), NULL); return; } - group = qq_group_find_by_id(gc, external_group_id, QQ_EXTERNAL_ID); + group = qq_room_search_ext_id(gc, ext_id); if (group) { qq_send_cmd_group_join_group(gc, group); } else { - qq_set_pending_id(&qd->joining_groups, external_group_id, TRUE); - qq_send_cmd_group_search_group(gc, external_group_id); + qq_set_pending_id(&qd->joining_groups, ext_id, TRUE); + qq_send_cmd_group_search_group(gc, ext_id); } } void qq_group_exit(PurpleConnection *gc, GHashTable *data) { - gchar *internal_group_id_ptr; - guint32 internal_group_id; + gchar *id_ptr; + guint32 id; gc_and_uid *g; g_return_if_fail(data != NULL); - internal_group_id_ptr = g_hash_table_lookup(data, "internal_group_id"); - internal_group_id = strtol(internal_group_id_ptr, NULL, 10); + id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_INTERNAL_ID); + id = strtol(id_ptr, NULL, 10); - g_return_if_fail(internal_group_id > 0); + g_return_if_fail(id > 0); g = g_new0(gc_and_uid, 1); g->gc = gc; - g->uid = internal_group_id; + g->uid = id; purple_request_action(gc, _("QQ Qun Operation"), _("Are you sure you want to leave this Qun?"),