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
|
|
23 // START OF FILE
|
|
24 /*****************************************************************************/
|
|
25 #include "debug.h" // gaim_debug
|
|
26
|
|
27 #include "char_conv.h" // convert_as_pascal_string
|
|
28 #include "group_free.h" // qq_group_free_not_subscribed
|
|
29 #include "group_network.h" // qq_send_group_cmd
|
|
30 #include "group_search.h"
|
|
31 #include "utils.h"
|
|
32
|
|
33 enum {
|
|
34 QQ_GROUP_SEARCH_TYPE_BY_ID = 0x01,
|
|
35 QQ_GROUP_SEARCH_TYPE_DEMO = 0x02,
|
|
36 };
|
|
37
|
|
38 /*****************************************************************************/
|
|
39 // send packet to search for qq_group
|
|
40 void qq_send_cmd_group_search_group(GaimConnection * gc, guint32 external_group_id) {
|
|
41 guint8 *raw_data, *cursor, type;
|
|
42 gint bytes, data_len;
|
|
43
|
|
44 g_return_if_fail(gc != NULL);
|
|
45
|
|
46 data_len = 6;
|
|
47 raw_data = g_newa(guint8, data_len);
|
|
48 cursor = raw_data;
|
|
49 type = (external_group_id == 0x00000000) ? QQ_GROUP_SEARCH_TYPE_DEMO : QQ_GROUP_SEARCH_TYPE_BY_ID;
|
|
50
|
|
51 bytes = 0;
|
|
52 bytes += create_packet_b(raw_data, &cursor, QQ_GROUP_CMD_SEARCH_GROUP);
|
|
53 bytes += create_packet_b(raw_data, &cursor, type);
|
|
54 bytes += create_packet_dw(raw_data, &cursor, external_group_id);
|
|
55
|
|
56 if (bytes != data_len)
|
|
57 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
|
|
58 "Fail create packet for %s\n", qq_group_cmd_get_desc(QQ_GROUP_CMD_SEARCH_GROUP));
|
|
59 else
|
|
60 qq_send_group_cmd(gc, NULL, raw_data, data_len);
|
|
61 } // qq_send_cmd_group_search_group
|
|
62
|
|
63 /*****************************************************************************/
|
|
64 // process group cmd reply "search group"
|
|
65 void qq_process_group_cmd_search_group(guint8 * data, guint8 ** cursor, gint len, GaimConnection * gc) {
|
|
66 guint8 search_type;
|
|
67 guint16 unknown;
|
|
68 gint bytes, pascal_len, i;
|
|
69 qq_data *qd;
|
|
70 GaimRoomlistRoom *room;
|
|
71 qq_group *group;
|
|
72
|
|
73 g_return_if_fail(gc != NULL && gc->proto_data != NULL);
|
|
74 g_return_if_fail(data != NULL && len > 0);
|
|
75 qd = (qq_data *) gc->proto_data;
|
|
76
|
|
77 i = 0;
|
|
78 bytes += read_packet_b(data, cursor, len, &search_type);
|
|
79 group = g_newa(qq_group, 1);
|
|
80
|
|
81 // now it starts with group_info_entry
|
|
82 while (*cursor < (data + len)) { // still have data to read
|
|
83 // begin of one qq_group
|
|
84 bytes = 0;
|
|
85 i++;
|
|
86 bytes += read_packet_dw(data, cursor, len, &(group->internal_group_id));
|
|
87 bytes += read_packet_dw(data, cursor, len, &(group->external_group_id));
|
|
88 bytes += read_packet_b(data, cursor, len, &(group->group_type));
|
|
89 bytes += read_packet_w(data, cursor, len, &(unknown)); // protocal changed, gfhuang
|
|
90 bytes += read_packet_w(data, cursor, len, &(unknown)); // protocal changed, gfhuang
|
|
91 bytes += read_packet_dw(data, cursor, len, &(group->creator_uid));
|
|
92 bytes += read_packet_w(data, cursor, len, &(unknown)); // protocal changed, gfhuang
|
|
93 bytes += read_packet_w(data, cursor, len, &(unknown)); // protocal changed, gfhuang
|
|
94 bytes += read_packet_w(data, cursor, len, &(unknown)); // protocal changed, gfhuang
|
|
95 bytes += read_packet_dw(data, cursor, len, &(group->group_category));
|
|
96 pascal_len = convert_as_pascal_string(*cursor, &(group->group_name_utf8), QQ_CHARSET_DEFAULT);
|
|
97 bytes += pascal_len;
|
|
98 *cursor += pascal_len;
|
|
99 bytes += read_packet_w(data, cursor, len, &(unknown));
|
|
100 bytes += read_packet_b(data, cursor, len, &(group->auth_type));
|
|
101 pascal_len = convert_as_pascal_string(*cursor, &(group->group_desc_utf8), QQ_CHARSET_DEFAULT);
|
|
102 bytes += pascal_len;
|
|
103 *cursor += pascal_len;
|
|
104 // end of one qq_group
|
|
105 room = gaim_roomlist_room_new(GAIM_ROOMLIST_ROOMTYPE_ROOM, group->group_name_utf8, NULL);
|
|
106 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->external_group_id));
|
|
107 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->creator_uid));
|
|
108 gaim_roomlist_room_add_field(qd->roomlist, room, group->group_desc_utf8);
|
|
109 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->internal_group_id));
|
|
110 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->group_type));
|
|
111 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->auth_type));
|
|
112 gaim_roomlist_room_add_field(qd->roomlist, room, g_strdup_printf("%d", group->group_category));
|
|
113 gaim_roomlist_room_add_field(qd->roomlist, room, group->group_name_utf8);
|
|
114 gaim_roomlist_room_add(qd->roomlist, room);
|
|
115 } // while
|
|
116 if(*cursor > (data + len)) {
|
|
117 gaim_debug(GAIM_DEBUG_ERROR, "QQ", "group_cmd_search_group: Dangerous error! maybe protocal changed, notify me!");
|
|
118 }
|
|
119 gaim_roomlist_set_in_progress(qd->roomlist, FALSE);
|
|
120 gaim_debug(GAIM_DEBUG_INFO, "QQ", "Search group reply: %d groups\n", i);
|
|
121
|
|
122 } // qq_process_group_cmd_search_group
|
|
123
|
|
124 /*****************************************************************************/
|
|
125 // END OF FILE
|