comparison libpurple/protocols/qq/group_join.c @ 24088:1ee91ff0d5fe

2008.10.09 - ccpaging <ccpaging(at)gmail.com> * Update 'group' protocol * Functions of group_find, group_free, group_search merged into group_join and group_internal * Removed group_find.c/h, group_free.c/h, group_search.c/h
author SHiNE CsyFeK <csyfek@gmail.com>
date Tue, 28 Oct 2008 16:38:16 +0000
parents 3c52353b83ae
children 9be95f0b9472
comparison
equal deleted inserted replaced
24087:147f1b17b6ce 24088:1ee91ff0d5fe
29 #include "request.h" 29 #include "request.h"
30 #include "server.h" 30 #include "server.h"
31 31
32 #include "char_conv.h" 32 #include "char_conv.h"
33 #include "im.h" 33 #include "im.h"
34 #include "group_find.h"
35 #include "group_internal.h" 34 #include "group_internal.h"
36 #include "group_info.h" 35 #include "group_info.h"
37 #include "group_join.h" 36 #include "group_join.h"
38 #include "group_opt.h" 37 #include "group_opt.h"
39 #include "group_search.h"
40 #include "group_im.h" 38 #include "group_im.h"
41 #include "qq_define.h" 39 #include "qq_define.h"
42 #include "packet_parse.h" 40 #include "packet_parse.h"
43 #include "qq_network.h" 41 #include "qq_network.h"
44 #include "qq_process.h" 42 #include "qq_process.h"
47 QQ_ROOM_JOIN_OK = 0x01, 45 QQ_ROOM_JOIN_OK = 0x01,
48 QQ_ROOM_JOIN_NEED_AUTH = 0x02, 46 QQ_ROOM_JOIN_NEED_AUTH = 0x02,
49 QQ_ROOM_JOIN_DENIED = 0x03, 47 QQ_ROOM_JOIN_DENIED = 0x03,
50 }; 48 };
51 49
50 enum {
51 QQ_ROOM_SEARCH_TYPE_BY_ID = 0x01,
52 QQ_ROOM_SEARCH_TYPE_DEMO = 0x02
53 };
54
52 static void group_quit_cb(qq_add_request *add_req) 55 static void group_quit_cb(qq_add_request *add_req)
53 { 56 {
54 PurpleConnection *gc; 57 PurpleConnection *gc;
55 guint32 id; 58 guint32 id;
56 qq_group *group; 59 qq_room_data *rmd;
57 60
58 if (add_req->gc == NULL || add_req->uid == 0) { 61 if (add_req->gc == NULL || add_req->uid == 0) {
59 g_free(add_req); 62 g_free(add_req);
60 return; 63 return;
61 } 64 }
62 65
63 gc = add_req->gc; 66 gc = add_req->gc;
64 id = add_req->uid; 67 id = add_req->uid;
65 68
66 group = qq_room_search_id(gc, id); 69 rmd = qq_room_data_find(gc, id);
67 if (group == NULL) { 70 if (rmd == NULL) {
68 g_free(add_req); 71 g_free(add_req);
69 return; 72 return;
70 } 73 }
71 74
72 qq_send_room_cmd_only(gc, QQ_ROOM_CMD_QUIT, group->id); 75 qq_send_room_cmd_only(gc, QQ_ROOM_CMD_QUIT, rmd->id);
73 g_free(add_req); 76 g_free(add_req);
74 } 77 }
75 78
76 /* send packet to join a group without auth */ 79 /* send packet to join a group without auth */
77 void qq_request_room_join(PurpleConnection *gc, qq_group *group) 80 void qq_request_room_join(PurpleConnection *gc, qq_room_data *rmd)
78 { 81 {
79 g_return_if_fail(group != NULL); 82 g_return_if_fail(rmd != NULL);
80 83
81 if (group->my_role == QQ_ROOM_ROLE_NO) { 84 if (rmd->my_role == QQ_ROOM_ROLE_NO) {
82 group->my_role = QQ_ROOM_ROLE_REQUESTING; 85 rmd->my_role = QQ_ROOM_ROLE_REQUESTING;
83 qq_group_refresh(gc, group); 86 }
84 } 87
85 88 switch (rmd->auth_type) {
86 switch (group->auth_type) {
87 case QQ_ROOM_AUTH_TYPE_NO_AUTH: 89 case QQ_ROOM_AUTH_TYPE_NO_AUTH:
88 case QQ_ROOM_AUTH_TYPE_NEED_AUTH: 90 case QQ_ROOM_AUTH_TYPE_NEED_AUTH:
89 break; 91 break;
90 case QQ_ROOM_AUTH_TYPE_NO_ADD: 92 case QQ_ROOM_AUTH_TYPE_NO_ADD:
91 if (group->my_role == QQ_ROOM_ROLE_NO 93 if (rmd->my_role == QQ_ROOM_ROLE_NO
92 && group->my_role == QQ_ROOM_ROLE_REQUESTING) { 94 && rmd->my_role == QQ_ROOM_ROLE_REQUESTING) {
93 purple_notify_warning(gc, NULL, _("The Qun does not allow others to join"), NULL); 95 purple_notify_warning(gc, NULL, _("The Qun does not allow others to join"), NULL);
94 return; 96 return;
95 } 97 }
96 break; 98 break;
97 default: 99 default:
98 purple_debug_error("QQ", "Unknown room auth type: %d\n", group->auth_type); 100 purple_debug_error("QQ", "Unknown room auth type: %d\n", rmd->auth_type);
99 break; 101 break;
100 } 102 }
101 103
102 qq_send_room_cmd_only(gc, QQ_ROOM_CMD_JOIN, group->id); 104 qq_send_room_cmd_only(gc, QQ_ROOM_CMD_JOIN, rmd->id);
103 } 105 }
104 106
105 static void group_join_cb(qq_add_request *add_req, const gchar *reason_utf8) 107 static void group_join_cb(qq_add_request *add_req, const gchar *reason_utf8)
106 { 108 {
107 qq_group *group; 109 qq_room_data *rmd;
108 110
109 g_return_if_fail(add_req != NULL); 111 g_return_if_fail(add_req != NULL);
110 if (add_req->gc == NULL || add_req->uid == 0) { 112 if (add_req->gc == NULL || add_req->uid == 0) {
111 g_free(add_req); 113 g_free(add_req);
112 return; 114 return;
113 } 115 }
114 116
115 group = qq_room_search_id(add_req->gc, add_req->uid); 117 rmd = qq_room_data_find(add_req->gc, add_req->uid);
116 if (group == NULL) { 118 if (rmd == NULL) {
117 purple_debug_error("QQ", "Can not find qq_group by internal_id: %d\n", add_req->uid); 119 purple_debug_error("QQ", "Can not find qq_room_data by internal_id: %d\n", add_req->uid);
118 g_free(add_req); 120 g_free(add_req);
119 return; 121 return;
120 } 122 }
121 123
122 qq_send_cmd_group_auth(add_req->gc, group, QQ_ROOM_AUTH_REQUEST_APPLY, 0, reason_utf8); 124 qq_send_cmd_group_auth(add_req->gc, rmd, QQ_ROOM_AUTH_REQUEST_APPLY, 0, reason_utf8);
123 g_free(add_req); 125 g_free(add_req);
124 } 126 }
125 127
126 void qq_group_cancel_cb(qq_add_request *add_req, const gchar *msg) 128 void qq_group_cancel_cb(qq_add_request *add_req, const gchar *msg)
127 { 129 {
128 g_return_if_fail(add_req != NULL); 130 g_return_if_fail(add_req != NULL);
129 g_free(add_req); 131 g_free(add_req);
130 } 132 }
131 133
132 static void _qq_group_join_auth(PurpleConnection *gc, qq_group *group) 134 static void _qq_group_join_auth(PurpleConnection *gc, qq_room_data *rmd)
133 { 135 {
134 gchar *msg; 136 gchar *msg;
135 qq_add_request *add_req; 137 qq_add_request *add_req;
136 g_return_if_fail(group != NULL); 138 g_return_if_fail(rmd != NULL);
137 139
138 purple_debug_info("QQ", "Group (internal id: %d) needs authentication\n", group->id); 140 purple_debug_info("QQ", "Group (internal id: %d) needs authentication\n", rmd->id);
139 141
140 msg = g_strdup_printf("Group \"%s\" needs authentication\n", group->title_utf8); 142 msg = g_strdup_printf("Group \"%s\" needs authentication\n", rmd->title_utf8);
141 add_req = g_new0(qq_add_request, 1); 143 add_req = g_new0(qq_add_request, 1);
142 add_req->gc = gc; 144 add_req->gc = gc;
143 add_req->uid = group->id; 145 add_req->uid = rmd->id;
144 purple_request_input(gc, NULL, msg, 146 purple_request_input(gc, NULL, msg,
145 _("Input request here"), 147 _("Input request here"),
146 _("Would you be my friend?"), TRUE, FALSE, NULL, 148 _("Would you be my friend?"), TRUE, FALSE, NULL,
147 _("Send"), 149 _("Send"),
148 G_CALLBACK(group_join_cb), 150 G_CALLBACK(group_join_cb),
149 _("Cancel"), G_CALLBACK(qq_group_cancel_cb), 151 _("Cancel"), G_CALLBACK(qq_group_cancel_cb),
150 purple_connection_get_account(gc), group->title_utf8, NULL, 152 purple_connection_get_account(gc), rmd->title_utf8, NULL,
151 add_req); 153 add_req);
152 g_free(msg); 154 g_free(msg);
153 } 155 }
154 156
155 void qq_send_cmd_group_auth(PurpleConnection *gc, qq_group *group, guint8 opt, guint32 uid, const gchar *reason_utf8) 157 void qq_send_cmd_group_auth(PurpleConnection *gc, qq_room_data *rmd, guint8 opt, guint32 uid, const gchar *reason_utf8)
156 { 158 {
157 guint8 *raw_data; 159 guint8 *raw_data;
158 gchar *reason_qq; 160 gchar *reason_qq;
159 gint bytes; 161 gint bytes;
160 162
161 g_return_if_fail(group != NULL); 163 g_return_if_fail(rmd != NULL);
162 164
163 if (reason_utf8 == NULL || strlen(reason_utf8) == 0) 165 if (reason_utf8 == NULL || strlen(reason_utf8) == 0)
164 reason_qq = g_strdup(""); 166 reason_qq = g_strdup("");
165 else 167 else
166 reason_qq = utf8_to_qq(reason_utf8, QQ_CHARSET_DEFAULT); 168 reason_qq = utf8_to_qq(reason_utf8, QQ_CHARSET_DEFAULT);
167 169
168 if (opt == QQ_ROOM_AUTH_REQUEST_APPLY) { 170 if (opt == QQ_ROOM_AUTH_REQUEST_APPLY) {
169 group->my_role = QQ_ROOM_ROLE_REQUESTING; 171 rmd->my_role = QQ_ROOM_ROLE_REQUESTING;
170 qq_group_refresh(gc, group);
171 uid = 0; 172 uid = 0;
172 } 173 }
173 174
174 raw_data = g_newa(guint8, 6 + strlen(reason_qq)); 175 raw_data = g_newa(guint8, 6 + strlen(reason_qq));
175 176
177 bytes += qq_put8(raw_data + bytes, opt); 178 bytes += qq_put8(raw_data + bytes, opt);
178 bytes += qq_put32(raw_data + bytes, uid); 179 bytes += qq_put32(raw_data + bytes, uid);
179 bytes += qq_put8(raw_data + bytes, strlen(reason_qq)); 180 bytes += qq_put8(raw_data + bytes, strlen(reason_qq));
180 bytes += qq_putdata(raw_data + bytes, (guint8 *) reason_qq, strlen(reason_qq)); 181 bytes += qq_putdata(raw_data + bytes, (guint8 *) reason_qq, strlen(reason_qq));
181 182
182 qq_send_room_cmd(gc, QQ_ROOM_CMD_AUTH, group->id, raw_data, bytes); 183 qq_send_room_cmd(gc, QQ_ROOM_CMD_AUTH, rmd->id, raw_data, bytes);
183 } 184 }
184 185
185 /* If comes here, cmd is OK already */ 186 /* If comes here, cmd is OK already */
186 void qq_process_group_cmd_exit_group(guint8 *data, gint len, PurpleConnection *gc) 187 void qq_process_group_cmd_exit_group(guint8 *data, gint len, PurpleConnection *gc)
187 { 188 {
189 qq_data *qd;
188 gint bytes; 190 gint bytes;
189 guint32 id; 191 guint32 id;
190 PurpleChat *chat;
191 qq_group *group;
192 qq_data *qd;
193 gchar *msg;
194 192
195 g_return_if_fail(data != NULL && len > 0); 193 g_return_if_fail(data != NULL && len > 0);
196 qd = (qq_data *) gc->proto_data; 194 qd = (qq_data *) gc->proto_data;
197 195
198 if (len < 4) { 196 if (len < 4) {
201 } 199 }
202 200
203 bytes = 0; 201 bytes = 0;
204 bytes += qq_get32(&id, data + bytes); 202 bytes += qq_get32(&id, data + bytes);
205 203
206 group = qq_room_search_id(gc, id); 204 qq_room_remove(gc, id);
207 if (group != NULL) {
208 msg = g_strdup_printf(_("Successed quit Qun %s (%d)"),
209 group->title_utf8, group->ext_id);
210 chat = purple_blist_find_chat
211 (purple_connection_get_account(gc), g_strdup_printf("%d", group->ext_id));
212 if (chat != NULL)
213 purple_blist_remove_chat(chat);
214 qq_group_delete_internal_record(qd, id);
215 } else {
216 msg = g_strdup(_("Successed quit Qun"));
217 }
218 qq_got_attention(gc, msg);
219 g_free(msg);
220 } 205 }
221 206
222 /* Process the reply to group_auth subcmd */ 207 /* Process the reply to group_auth subcmd */
223 void qq_process_group_cmd_join_group_auth(guint8 *data, gint len, PurpleConnection *gc) 208 void qq_process_group_cmd_join_group_auth(guint8 *data, gint len, PurpleConnection *gc)
224 { 209 {
225 gint bytes; 210 gint bytes;
226 guint32 id; 211 guint32 id;
227 qq_data *qd; 212 qq_data *qd;
228 qq_group *group; 213 qq_room_data *rmd;
229 gchar *msg; 214 gchar *msg;
230 215
231 g_return_if_fail(data != NULL && len > 0); 216 g_return_if_fail(data != NULL && len > 0);
232 qd = (qq_data *) gc->proto_data; 217 qd = (qq_data *) gc->proto_data;
233 218
238 } 223 }
239 bytes = 0; 224 bytes = 0;
240 bytes += qq_get32(&id, data + bytes); 225 bytes += qq_get32(&id, data + bytes);
241 g_return_if_fail(id > 0); 226 g_return_if_fail(id > 0);
242 227
243 group = qq_room_search_id(gc, id); 228 rmd = qq_room_data_find(gc, id);
244 if (group != NULL) { 229 if (rmd != NULL) {
245 msg = g_strdup_printf(_("Successed join to Qun %s (%d)"), group->title_utf8, group->ext_id); 230 msg = g_strdup_printf(_("Successed join to Qun %s (%d)"), rmd->title_utf8, rmd->ext_id);
246 qq_got_attention(gc, msg); 231 qq_got_attention(gc, msg);
247 g_free(msg); 232 g_free(msg);
248 } else { 233 } else {
249 qq_got_attention(gc, _("Successed join to Qun")); 234 qq_got_attention(gc, _("Successed join to Qun"));
250 } 235 }
254 void qq_process_group_cmd_join_group(guint8 *data, gint len, PurpleConnection *gc) 239 void qq_process_group_cmd_join_group(guint8 *data, gint len, PurpleConnection *gc)
255 { 240 {
256 gint bytes; 241 gint bytes;
257 guint32 id; 242 guint32 id;
258 guint8 reply; 243 guint8 reply;
259 qq_group *group; 244 qq_room_data *rmd;
260 gchar *msg; 245 gchar *msg;
261 246
262 g_return_if_fail(data != NULL && len > 0); 247 g_return_if_fail(data != NULL && len > 0);
263 248
264 if (len < 5) { 249 if (len < 5) {
265 purple_debug_error("QQ", 250 purple_debug_error("QQ",
266 "Invalid join group reply, expect %d bytes, read %d bytes\n", 5, len); 251 "Invalid join room reply, expect %d bytes, read %d bytes\n", 5, len);
267 return; 252 return;
268 } 253 }
269 254
270 bytes = 0; 255 bytes = 0;
271 bytes += qq_get32(&id, data + bytes); 256 bytes += qq_get32(&id, data + bytes);
272 bytes += qq_get8(&reply, data + bytes); 257 bytes += qq_get8(&reply, data + bytes);
273 258
274 /* join group OK */ 259 /* join group OK */
275 group = qq_room_search_id(gc, id); 260 rmd = qq_room_data_find(gc, id);
276 /* need to check if group is NULL or not. */ 261 /* need to check if group is NULL or not. */
277 g_return_if_fail(group != NULL); 262 g_return_if_fail(rmd != NULL);
278 switch (reply) { 263 switch (reply) {
279 case QQ_ROOM_JOIN_OK: 264 case QQ_ROOM_JOIN_OK:
280 purple_debug_info("QQ", "Successed in joining group \"%s\"\n", group->title_utf8); 265 purple_debug_info("QQ", "Successed in joining group \"%s\"\n", rmd->title_utf8);
281 group->my_role = QQ_ROOM_ROLE_YES; 266 rmd->my_role = QQ_ROOM_ROLE_YES;
282 qq_group_refresh(gc, group);
283 /* this must be shown before getting online members */ 267 /* this must be shown before getting online members */
284 qq_room_conv_open(gc, group); 268 qq_room_conv_open(gc, rmd);
285 break; 269 break;
286 case QQ_ROOM_JOIN_NEED_AUTH: 270 case QQ_ROOM_JOIN_NEED_AUTH:
287 purple_debug_info("QQ", 271 purple_debug_info("QQ",
288 "Fail joining group [%d] %s, needs authentication\n", 272 "Fail joining group [%d] %s, needs authentication\n",
289 group->ext_id, group->title_utf8); 273 rmd->ext_id, rmd->title_utf8);
290 group->my_role = QQ_ROOM_ROLE_NO; 274 rmd->my_role = QQ_ROOM_ROLE_NO;
291 qq_group_refresh(gc, group); 275 _qq_group_join_auth(gc, rmd);
292 _qq_group_join_auth(gc, group);
293 break; 276 break;
294 case QQ_ROOM_JOIN_DENIED: 277 case QQ_ROOM_JOIN_DENIED:
295 msg = g_strdup_printf(_("Qun %d denied to join"), group->ext_id); 278 msg = g_strdup_printf(_("Qun %d denied to join"), rmd->ext_id);
296 purple_notify_info(gc, _("QQ Qun Operation"), _("Failed:"), msg); 279 purple_notify_info(gc, _("QQ Qun Operation"), _("Failed:"), msg);
297 g_free(msg); 280 g_free(msg);
298 break; 281 break;
299 default: 282 default:
300 purple_debug_info("QQ", 283 purple_debug_info("QQ",
301 "Failed joining group [%d] %s, unknown reply: 0x%02x\n", 284 "Failed joining group [%d] %s, unknown reply: 0x%02x\n",
302 group->ext_id, group->title_utf8, reply); 285 rmd->ext_id, rmd->title_utf8, reply);
303 286
304 purple_notify_info(gc, _("QQ Qun Operation"), _("Failed:"), _("Join Qun, Unknow Reply")); 287 purple_notify_info(gc, _("QQ Qun Operation"), _("Failed:"), _("Join Qun, Unknow Reply"));
305 } 288 }
306 } 289 }
307 290
311 qq_data *qd; 294 qq_data *qd;
312 gchar *ext_id_str; 295 gchar *ext_id_str;
313 gchar *id_str; 296 gchar *id_str;
314 guint32 ext_id; 297 guint32 ext_id;
315 guint32 id; 298 guint32 id;
316 qq_group *group; 299 qq_room_data *rmd;
317 300
318 g_return_if_fail(data != NULL); 301 g_return_if_fail(data != NULL);
319 qd = (qq_data *) gc->proto_data; 302 qd = (qq_data *) gc->proto_data;
320 303
321 ext_id_str = g_hash_table_lookup(data, QQ_ROOM_KEY_EXTERNAL_ID); 304 ext_id_str = g_hash_table_lookup(data, QQ_ROOM_KEY_EXTERNAL_ID);
323 purple_debug_info("QQ", "Join room %s, extend id %s\n", id_str, ext_id_str); 306 purple_debug_info("QQ", "Join room %s, extend id %s\n", id_str, ext_id_str);
324 307
325 if (id_str != NULL) { 308 if (id_str != NULL) {
326 id = strtol(id_str, NULL, 10); 309 id = strtol(id_str, NULL, 10);
327 if (id != 0) { 310 if (id != 0) {
328 group = qq_room_search_id(gc, id); 311 rmd = qq_room_data_find(gc, id);
329 if (group) { 312 if (rmd) {
330 qq_request_room_join(gc, group); 313 qq_request_room_join(gc, rmd);
331 return; 314 return;
332 } 315 }
333 } 316 }
334 } 317 }
335 318
360 purple_connection_get_account(gc), NULL, NULL, 343 purple_connection_get_account(gc), NULL, NULL,
361 add_req, 2, _("Cancel"), 344 add_req, 2, _("Cancel"),
362 G_CALLBACK(qq_group_cancel_cb), 345 G_CALLBACK(qq_group_cancel_cb),
363 _("Continue"), G_CALLBACK(group_quit_cb)); 346 _("Continue"), G_CALLBACK(group_quit_cb));
364 } 347 }
348
349 /* send packet to search for qq_group */
350 void qq_request_room_search(PurpleConnection *gc, guint32 ext_id, int action)
351 {
352 guint8 raw_data[16] = {0};
353 gint bytes = 0;
354 guint8 type;
355
356 purple_debug_info("QQ", "Search QQ Qun %d\n", ext_id);
357 type = (ext_id == 0x00000000) ? QQ_ROOM_SEARCH_TYPE_DEMO : QQ_ROOM_SEARCH_TYPE_BY_ID;
358
359 bytes = 0;
360 bytes += qq_put8(raw_data + bytes, type);
361 bytes += qq_put32(raw_data + bytes, ext_id);
362
363 qq_send_room_cmd_mess(gc, QQ_ROOM_CMD_SEARCH, 0, raw_data, bytes, 0, action);
364 }
365
366 static void add_to_roomlist(qq_data *qd, qq_room_data *rmd)
367 {
368 PurpleRoomlistRoom *room;
369 gchar field[11];
370
371 room = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_ROOM, rmd->title_utf8, NULL);
372 g_snprintf(field, sizeof(field), "%d", rmd->ext_id);
373 purple_roomlist_room_add_field(qd->roomlist, room, field);
374 g_snprintf(field, sizeof(field), "%d", rmd->creator_uid);
375 purple_roomlist_room_add_field(qd->roomlist, room, field);
376 purple_roomlist_room_add_field(qd->roomlist, room, rmd->desc_utf8);
377 g_snprintf(field, sizeof(field), "%d", rmd->id);
378 purple_roomlist_room_add_field(qd->roomlist, room, field);
379 g_snprintf(field, sizeof(field), "%d", rmd->type8);
380 purple_roomlist_room_add_field(qd->roomlist, room, field);
381 g_snprintf(field, sizeof(field), "%d", rmd->auth_type);
382 purple_roomlist_room_add_field(qd->roomlist, room, field);
383 g_snprintf(field, sizeof(field), "%d", rmd->category);
384 purple_roomlist_room_add_field(qd->roomlist, room, field);
385 purple_roomlist_room_add_field(qd->roomlist, room, rmd->title_utf8);
386 purple_roomlist_room_add(qd->roomlist, room);
387
388 purple_roomlist_set_in_progress(qd->roomlist, FALSE);
389 }
390
391 /* process group cmd reply "search group" */
392 void qq_process_room_search(PurpleConnection *gc, guint8 *data, gint len, guint32 ship32)
393 {
394 qq_data *qd;
395 qq_room_data rmd;
396 PurpleChat *chat;
397 gint bytes;
398 guint8 search_type;
399 guint16 unknown;
400
401 g_return_if_fail(data != NULL && len > 0);
402 qd = (qq_data *) gc->proto_data;
403
404 bytes = 0;
405 bytes += qq_get8(&search_type, data + bytes);
406
407 /* now it starts with group_info_entry */
408 bytes += qq_get32(&(rmd.id), data + bytes);
409 bytes += qq_get32(&(rmd.ext_id), data + bytes);
410 bytes += qq_get8(&(rmd.type8), data + bytes);
411 bytes += qq_get16(&(unknown), data + bytes);
412 bytes += qq_get16(&(unknown), data + bytes);
413 bytes += qq_get32(&(rmd.creator_uid), data + bytes);
414 bytes += qq_get16(&(unknown), data + bytes);
415 bytes += qq_get16(&(unknown), data + bytes);
416 bytes += qq_get16(&(unknown), data + bytes);
417 bytes += qq_get32(&(rmd.category), data + bytes);
418 bytes += qq_get_vstr(&(rmd.title_utf8), QQ_CHARSET_DEFAULT, data + bytes);
419 bytes += qq_get16(&(unknown), data + bytes);
420 bytes += qq_get8(&(rmd.auth_type), data + bytes);
421 bytes += qq_get_vstr(&(rmd.desc_utf8), QQ_CHARSET_DEFAULT, data + bytes);
422 /* end of one qq_group */
423 if(bytes != len) {
424 purple_debug_error("QQ",
425 "group_cmd_search_group: Dangerous error! maybe protocol changed, notify developers!");
426 }
427
428 if (ship32 == QQ_ROOM_SEARCH_FOR_JOIN) {
429 chat = qq_room_find_or_new(gc, rmd.id, rmd.ext_id);
430 g_return_if_fail(chat != NULL);
431
432 qq_room_update_chat_info(gc, &rmd);
433 qq_request_room_join(gc, &rmd);
434 } else {
435 add_to_roomlist(qd, &rmd);
436 }
437 }