00001
00023
00024
00025 #include "debug.h"
00026
00027 #include "char_conv.h"
00028 #include "group_free.h"
00029 #include "group_network.h"
00030 #include "group_search.h"
00031
00032 enum {
00033 QQ_GROUP_SEARCH_TYPE_BY_ID = 0x01,
00034 QQ_GROUP_SEARCH_TYPE_DEMO = 0x02,
00035 };
00036
00037
00038
00039 void qq_send_cmd_group_search_group(GaimConnection * gc, guint32 external_group_id) {
00040 guint8 *raw_data, *cursor, type;
00041 gint bytes, data_len;
00042
00043 g_return_if_fail(gc != NULL);
00044
00045 data_len = 6;
00046 raw_data = g_newa(guint8, data_len);
00047 cursor = raw_data;
00048 type = (external_group_id == 0x00000000) ? QQ_GROUP_SEARCH_TYPE_DEMO : QQ_GROUP_SEARCH_TYPE_BY_ID;
00049
00050 bytes = 0;
00051 bytes += create_packet_b(raw_data, &cursor, QQ_GROUP_CMD_SEARCH_GROUP);
00052 bytes += create_packet_b(raw_data, &cursor, type);
00053 bytes += create_packet_dw(raw_data, &cursor, external_group_id);
00054
00055 if (bytes != data_len)
00056 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
00057 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_SEARCH_GROUP));
00058 else
00059 qq_send_group_cmd(gc, NULL, raw_data, data_len);
00060 }
00061
00062
00063
00064 void qq_process_group_cmd_search_group(guint8 * data, guint8 ** cursor, gint len, GaimConnection * gc) {
00065 guint8 search_type, *punknown=NULL, unknown1=0;
00066 guint16 unknown, unknownlen=0;
00067 gint bytes, pascal_len, i;
00068 qq_data *qd;
00069 GaimRoomlistRoom *room;
00070 qq_group *group;
00071
00072 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
00073 g_return_if_fail(data != NULL && len > 0);
00074 qd = (qq_data *) gc->proto_data;
00075
00076 i = 0;
00077 bytes += read_packet_b(data, cursor, len, &search_type);
00078 group = g_newa(qq_group, 1);
00079
00080
00081 while (*cursor < (data + len)) {
00082
00083 bytes = 0;
00084 i++;
00085 bytes += read_packet_dw(data, cursor, len, &(group->internal_group_id));
00086 bytes += read_packet_dw(data, cursor, len, &(group->external_group_id));
00087 bytes += read_packet_b(data, cursor, len, &(group->group_type));
00088 bytes += read_packet_w(data, cursor, len, &(unknown));
00089 bytes += read_packet_w(data, cursor, len, &(unknown));
00090 bytes += read_packet_dw(data, cursor, len, &(group->creator_uid));
00091 bytes += read_packet_w(data, cursor, len, &(unknown));
00092 bytes += read_packet_w(data, cursor, len, &(unknown));
00093 bytes += read_packet_dw(data, cursor, len, &(group->group_category));
00094 bytes += read_packet_w(data, cursor, len, &(unknown));
00095 pascal_len = convert_as_pascal_string(*cursor, &(group->group_name_utf8), QQ_CHARSET_DEFAULT);
00096 bytes += pascal_len;
00097 *cursor += pascal_len;
00098 bytes += read_packet_w(data, cursor, len, &(unknown));
00099 bytes += read_packet_b(data, cursor, len, &(group->auth_type));
00100 pascal_len = convert_as_pascal_string(*cursor, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT);
00101 bytes += pascal_len;
00102 *cursor += pascal_len;
00103 bytes += read_packet_b(data, cursor, len, &unknown1);
00104 bytes += read_packet_b(data, cursor, len, &unknownlen);
00105 punknown=g_new0(guint8, unknownlen);
00106 gaim_debug(GAIM_DEBUG_WARNING, "QQ",
00107 "Dump unknown text\n%s", hex_dump_to_str(*cursor, unknownlen));
00108 bytes += read_packet_data(data, cursor, len, punknown, unknownlen);
00109 g_free(punknown);
00110
00111 room = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_ROOM, group->group_name_utf8, NULL);
00112 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->external_group_id));
00113 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->creator_uid));
00114 gaim_roomlist_room_add_field(qd->roomlist, room, group->group_desc_utf8);
00115 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->internal_group_id));
00116 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->group_type));
00117 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->auth_type));
00118 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->group_category));
00119 gaim_roomlist_room_add_field(qd->roomlist, room, group->group_name_utf8);
00120 gaim_roomlist_room_add(qd->roomlist, room);
00121 }
00122
00123 gaim_roomlist_set_in_progress(qd->roomlist, FALSE);
00124 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Search group reply: %d groups\n", i);
00125
00126 }
00127
00128
00129