13870
|
1 /**
|
|
2 * The QQ2003C protocol plugin
|
|
3 *
|
|
4 * for gaim
|
|
5 *
|
|
6 * Copyright (C) 2004 Puzzlebird
|
|
7 *
|
|
8 * This program is free software; you can redistribute it and/or modify
|
|
9 * it under the terms of the GNU General Public License as published by
|
|
10 * the Free Software Foundation; either version 2 of the License, or
|
|
11 * (at your option) any later version.
|
|
12 *
|
|
13 * This program is distributed in the hope that it will be useful,
|
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16 * GNU General Public License for more details.
|
|
17 *
|
|
18 * You should have received a copy of the GNU General Public License
|
|
19 * along with this program; if not, write to the Free Software
|
|
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
21 */
|
|
22
|
14021
|
23 #include "debug.h"
|
13870
|
24
|
14021
|
25 #include "char_conv.h"
|
|
26 #include "group_free.h"
|
|
27 #include "group_network.h"
|
13870
|
28 #include "group_search.h"
|
|
29 #include "utils.h"
|
|
30
|
|
31 enum {
|
|
32 QQ_GROUP_SEARCH_TYPE_BY_ID = 0x01,
|
14021
|
33 QQ_GROUP_SEARCH_TYPE_DEMO = 0x02
|
13870
|
34 };
|
|
35
|
14021
|
36 /* send packet to search for qq_group */
|
|
37 void qq_send_cmd_group_search_group(GaimConnection *gc, guint32 external_group_id)
|
|
38 {
|
13870
|
39 guint8 *raw_data, *cursor, type;
|
|
40 gint bytes, data_len;
|
|
41
|
|
42 g_return_if_fail(gc != NULL);
|
|
43
|
|
44 data_len = 6;
|
|
45 raw_data = g_newa(guint8, data_len);
|
|
46 cursor = raw_data;
|
|
47 type = (external_group_id == 0x00000000) ? QQ_GROUP_SEARCH_TYPE_DEMO : QQ_GROUP_SEARCH_TYPE_BY_ID;
|
|
48
|
|
49 bytes = 0;
|
|
50 bytes += create_packet_b(raw_data, &cursor, QQ_GROUP_CMD_SEARCH_GROUP);
|
|
51 bytes += create_packet_b(raw_data, &cursor, type);
|
|
52 bytes += create_packet_dw(raw_data, &cursor, external_group_id);
|
|
53
|
|
54 if (bytes != data_len)
|
|
55 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
|
|
56 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_SEARCH_GROUP));
|
|
57 else
|
|
58 qq_send_group_cmd(gc, NULL, raw_data, data_len);
|
14021
|
59 }
|
13870
|
60
|
14021
|
61 /* process group cmd reply "search group" */
|
|
62 void qq_process_group_cmd_search_group(guint8 *data, guint8 **cursor, gint len, GaimConnection *gc)
|
|
63 {
|
13870
|
64 guint8 search_type;
|
|
65 guint16 unknown;
|
|
66 gint bytes, pascal_len, i;
|
|
67 qq_data *qd;
|
|
68 GaimRoomlistRoom *room;
|
|
69 qq_group *group;
|
|
70
|
|
71 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
|
|
72 g_return_if_fail(data != NULL && len > 0);
|
|
73 qd = (qq_data *) gc->proto_data;
|
|
74
|
|
75 i = 0;
|
|
76 bytes += read_packet_b(data, cursor, len, &search_type);
|
|
77 group = g_newa(qq_group, 1);
|
|
78
|
14021
|
79 /* now it starts with group_info_entry */
|
|
80 while (*cursor < (data + len)) { /* still have data to read */
|
|
81 /* begin of one qq_group */
|
13870
|
82 bytes = 0;
|
|
83 i++;
|
|
84 bytes += read_packet_dw(data, cursor, len, &(group->internal_group_id));
|
|
85 bytes += read_packet_dw(data, cursor, len, &(group->external_group_id));
|
|
86 bytes += read_packet_b(data, cursor, len, &(group->group_type));
|
14021
|
87 bytes += read_packet_w(data, cursor, len, &(unknown));
|
|
88 bytes += read_packet_w(data, cursor, len, &(unknown));
|
13870
|
89 bytes += read_packet_dw(data, cursor, len, &(group->creator_uid));
|
14021
|
90 bytes += read_packet_w(data, cursor, len, &(unknown));
|
|
91 bytes += read_packet_w(data, cursor, len, &(unknown));
|
|
92 bytes += read_packet_w(data, cursor, len, &(unknown));
|
13870
|
93 bytes += read_packet_dw(data, cursor, len, &(group->group_category));
|
|
94 pascal_len = convert_as_pascal_string(*cursor, &(group->group_name_utf8), QQ_CHARSET_DEFAULT);
|
|
95 bytes += pascal_len;
|
|
96 *cursor += pascal_len;
|
|
97 bytes += read_packet_w(data, cursor, len, &(unknown));
|
|
98 bytes += read_packet_b(data, cursor, len, &(group->auth_type));
|
|
99 pascal_len = convert_as_pascal_string(*cursor, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT);
|
|
100 bytes += pascal_len;
|
|
101 *cursor += pascal_len;
|
14021
|
102 /* end of one qq_group */
|
13870
|
103 room = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_ROOM, group->group_name_utf8, NULL);
|
|
104 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->external_group_id));
|
|
105 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->creator_uid));
|
|
106 gaim_roomlist_room_add_field(qd->roomlist, room, group->group_desc_utf8);
|
|
107 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->internal_group_id));
|
|
108 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->group_type));
|
|
109 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->auth_type));
|
|
110 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->group_category));
|
|
111 gaim_roomlist_room_add_field(qd->roomlist, room, group->group_name_utf8);
|
|
112 gaim_roomlist_room_add(qd->roomlist, room);
|
14021
|
113 }
|
13870
|
114 if(*cursor > (data + len)) {
|
14021
|
115 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
|
|
116 "group_cmd_search_group: Dangerous error! maybe protocol changed, notify developers!");
|
13870
|
117 }
|
|
118 gaim_roomlist_set_in_progress(qd->roomlist, FALSE);
|
|
119 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Search group reply: %d groups\n", i);
|
14021
|
120 }
|