comparison src/protocols/qq/group_search.c @ 13870:983fd420e86b

[gaim-migrate @ 16340] Performed minor cleanup of the OpenQ codebase and patched it into the Gaim trunk as a prpl, providing basic QQ functionality. committer: Tailor Script <tailor@pidgin.im>
author Mark Huetsch <markhuetsch>
date Mon, 26 Jun 2006 02:58:54 +0000
parents
children ef8490f9e823
comparison
equal deleted inserted replaced
13869:5642f4658b59 13870:983fd420e86b
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