Mercurial > pidgin.yaz
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 |