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