Mercurial > pidgin.yaz
diff libpurple/protocols/qq/group_opt.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_opt.c Sat Aug 09 23:23:48 2008 +0000 +++ b/libpurple/protocols/qq/group_opt.c Sun Aug 10 04:32:14 2008 +0000 @@ -34,9 +34,10 @@ #include "group_internal.h" #include "group_info.h" #include "group_join.h" -#include "group_network.h" #include "group_opt.h" +#include "header_info.h" #include "packet_parse.h" +#include "qq_network.h" #include "utils.h" static int _compare_guint32(const void *a, @@ -68,13 +69,11 @@ data = g_newa(guint8, data_len); bytes = 0; - bytes += qq_put8(data + bytes, QQ_GROUP_CMD_MEMBER_OPT); - bytes += qq_put32(data + bytes, group->internal_group_id); bytes += qq_put8(data + bytes, operation); for (i = 0; i < count; i++) bytes += qq_put32(data + bytes, members[i]); - qq_send_group_cmd(gc, group, data, bytes); + qq_send_room_cmd(gc, QQ_ROOM_CMD_MEMBER_OPT, group->id, data, bytes); } static void _qq_group_do_nothing_with_struct(group_member_opt *g) @@ -86,8 +85,8 @@ static void _qq_group_reject_application_real(group_member_opt *g, gchar *msg_utf8) { qq_group *group; - g_return_if_fail(g != NULL && g->gc != NULL && g->internal_group_id > 0 && g->member > 0); - group = qq_group_find_by_id(g->gc, g->internal_group_id, QQ_INTERNAL_ID); + g_return_if_fail(g != NULL && g->gc != NULL && g->id > 0 && g->member > 0); + group = qq_room_search_id(g->gc, g->id); g_return_if_fail(group != NULL); qq_send_cmd_group_auth(g->gc, group, QQ_GROUP_AUTH_REQUEST_REJECT, g->member, msg_utf8); g_free(g); @@ -131,8 +130,8 @@ void qq_group_approve_application_with_struct(group_member_opt *g) { qq_group *group; - g_return_if_fail(g != NULL && g->gc != NULL && g->internal_group_id > 0 && g->member > 0); - group = qq_group_find_by_id(g->gc, g->internal_group_id, QQ_INTERNAL_ID); + g_return_if_fail(g != NULL && g->gc != NULL && g->id > 0 && g->member > 0); + group = qq_room_search_id(g->gc, g->id); g_return_if_fail(group != NULL); qq_send_cmd_group_auth(g->gc, group, QQ_GROUP_AUTH_REQUEST_APPROVE, g->member, ""); qq_group_find_or_add_member(g->gc, group, g->member); @@ -198,24 +197,24 @@ void qq_group_process_modify_members_reply(guint8 *data, gint len, PurpleConnection *gc) { gint bytes; - guint32 internal_group_id; + guint32 id; qq_group *group; g_return_if_fail(data != NULL); 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); /* we should have its info locally */ - 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); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in modify members for Qun %d\n", group->external_group_id); + purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in modify members for Qun %d\n", group->ext_id); purple_notify_info(gc, _("QQ Qun Operation"), _("You have successfully modified Qun member"), NULL); } -void qq_group_modify_info(PurpleConnection *gc, qq_group *group) +void qq_room_change_info(PurpleConnection *gc, qq_group *group) { guint8 *data; gint data_len; @@ -228,16 +227,9 @@ group_desc = group->group_desc_utf8 == NULL ? "" : utf8_to_qq(group->group_desc_utf8, QQ_CHARSET_DEFAULT); notice = group->notice_utf8 == NULL ? "" : utf8_to_qq(group->notice_utf8, QQ_CHARSET_DEFAULT); - data_len = 13 + 1 + strlen(group_name) - + 1 + strlen(group_desc) - + 1 + strlen(notice); - + data_len = 64 + strlen(group_name) + strlen(group_desc) + strlen(notice); data = g_newa(guint8, data_len); bytes = 0; - /* 000-000 */ - bytes += qq_put8(data + bytes, QQ_GROUP_CMD_MODIFY_GROUP_INFO); - /* 001-004 */ - bytes += qq_put32(data + bytes, group->internal_group_id); /* 005-005 */ bytes += qq_put8(data + bytes, 0x01); /* 006-006 */ @@ -258,54 +250,52 @@ bytes += qq_put8(data + bytes, strlen(group_desc)); bytes += qq_putdata(data + bytes, (guint8 *) group_desc, strlen(group_desc)); - if (bytes != data_len) { + if (bytes > data_len) { purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "Fail to create group_modify_info packet, expect %d bytes, wrote %d bytes\n", + "Overflow in qq_room_change_info, max %d bytes, now %d bytes\n", data_len, bytes); return; } - - qq_send_group_cmd(gc, group, data, bytes); + qq_send_room_cmd(gc, QQ_ROOM_CMD_CHANGE_INFO, group->id, data, bytes); } void qq_group_process_modify_info_reply(guint8 *data, gint len, PurpleConnection *gc) { gint bytes; - guint32 internal_group_id; + guint32 id; qq_group *group; g_return_if_fail(data != NULL); 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); /* we should have its info locally */ - 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); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in modify info for Qun %d\n", group->external_group_id); + purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in modify info for Qun %d\n", group->ext_id); qq_group_refresh(gc, group); purple_notify_info(gc, _("QQ Qun Operation"), _("You have successfully modified Qun information"), NULL); } /* we create a very simple group first, and then let the user to modify */ -void qq_group_create_with_name(PurpleConnection *gc, const gchar *name) +void qq_room_create_new(PurpleConnection *gc, const gchar *name) { + guint8 *data; gint data_len; - guint8 *data; gint bytes; qq_data *qd; g_return_if_fail(name != NULL); qd = (qq_data *) gc->proto_data; - data_len = 7 + 1 + strlen(name) + 2 + 1 + 1 + 4; + + data_len = 64 + strlen(name); data = g_newa(guint8, data_len); bytes = 0; /* we create the simpleset group, only group name is given */ - /* 000 */ - bytes += qq_put8(data + bytes, QQ_GROUP_CMD_CREATE_GROUP); /* 001 */ bytes += qq_put8(data + bytes, QQ_GROUP_TYPE_PERMANENT); /* 002 */ @@ -322,14 +312,13 @@ bytes += qq_put8(data + bytes, 0x00); /* no group desc */ bytes += qq_put32(data + bytes, qd->uid); /* I am member of coz */ - if (bytes != data_len) { + if (bytes > data_len) { purple_debug(PURPLE_DEBUG_ERROR, "QQ", - "Fail create create_group packet, expect %d bytes, written %d bytes\n", + "Overflow in qq_room_create, max %d bytes, now %d bytes\n", data_len, bytes); return; } - - qq_send_group_cmd(gc, NULL, data, bytes); + qq_send_room_cmd_noid(gc, QQ_ROOM_CMD_CREATE, data, bytes); } static void qq_group_setup_with_gc_and_uid(gc_and_uid *g) @@ -337,7 +326,7 @@ qq_group *group; g_return_if_fail(g != NULL && g->gc != NULL && g->uid > 0); - group = qq_group_find_by_id(g->gc, g->uid, QQ_INTERNAL_ID); + group = qq_room_search_id(g->gc, g->uid); g_return_if_fail(group != NULL); /* TODO insert UI code here */ @@ -348,7 +337,7 @@ void qq_group_process_create_group_reply(guint8 *data, gint len, PurpleConnection *gc) { gint bytes; - guint32 internal_group_id, external_group_id; + guint32 id, ext_id; qq_group *group; gc_and_uid *g; qq_data *qd; @@ -358,23 +347,23 @@ qd = (qq_data *) gc->proto_data; bytes = 0; - bytes += qq_get32(&internal_group_id, data + bytes); - bytes += qq_get32(&external_group_id, data + bytes); - g_return_if_fail(internal_group_id > 0 && external_group_id); + bytes += qq_get32(&id, data + bytes); + bytes += qq_get32(&ext_id, data + bytes); + g_return_if_fail(id > 0 && ext_id); - group = qq_group_create_internal_record(gc, internal_group_id, external_group_id, NULL); + group = qq_group_create_internal_record(gc, id, ext_id, NULL); group->my_status = QQ_GROUP_MEMBER_STATUS_IS_ADMIN; group->creator_uid = qd->uid; qq_group_refresh(gc, group); - qq_group_activate_group(gc, internal_group_id); - qq_send_cmd_group_get_group_info(gc, group); + qq_send_room_cmd_only(gc, QQ_ROOM_CMD_ACTIVATE, id); + qq_send_room_cmd_only(gc, QQ_ROOM_CMD_GET_INFO, id); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in create Qun, external ID %d\n", group->external_group_id); + purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in create Qun, external ID %d\n", group->ext_id); 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"), _("You have successfully created a Qun"), @@ -387,54 +376,37 @@ _("Cancel"), G_CALLBACK(qq_do_nothing_with_gc_and_uid)); } -/* we have to activate group after creation, otherwise the group can not be searched */ -void qq_group_activate_group(PurpleConnection *gc, guint32 internal_group_id) -{ - guint8 data[16] = {0}; - gint bytes = 0; - g_return_if_fail(internal_group_id > 0); - - bytes = 0; - /* we create the simplest group, only group name is given */ - /* 000 */ - bytes += qq_put8(data + bytes, QQ_GROUP_CMD_ACTIVATE_GROUP); - /* 001-005 */ - bytes += qq_put32(data + bytes, internal_group_id); - - qq_send_group_cmd(gc, NULL, data, bytes); -} - void qq_group_process_activate_group_reply(guint8 *data, gint len, PurpleConnection *gc) { gint bytes; - guint32 internal_group_id; + guint32 id; qq_group *group; g_return_if_fail(data != NULL); 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); /* we should have its info locally */ - 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); - purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in activate Qun %d\n", group->external_group_id); + purple_debug(PURPLE_DEBUG_INFO, "QQ", "Succeed in activate Qun %d\n", group->ext_id); } void qq_group_manage_group(PurpleConnection *gc, GHashTable *data) { - gchar *internal_group_id_ptr; - guint32 internal_group_id; + gchar *id_ptr; + guint32 id; qq_group *group; 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); - g_return_if_fail(internal_group_id > 0); + id_ptr = g_hash_table_lookup(data, QQ_GROUP_KEY_INTERNAL_ID); + id = strtol(id_ptr, NULL, 10); + g_return_if_fail(id > 0); - 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); /* XXX insert UI code here */