Mercurial > pidgin
comparison libpurple/protocols/qq/group_opt.c @ 24157: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 | 818ab62006f5 |
children | 9be95f0b9472 |
comparison
equal
deleted
inserted
replaced
24156:147f1b17b6ce | 24157:1ee91ff0d5fe |
---|---|
28 #include "notify.h" | 28 #include "notify.h" |
29 #include "request.h" | 29 #include "request.h" |
30 | 30 |
31 #include "buddy_info.h" | 31 #include "buddy_info.h" |
32 #include "char_conv.h" | 32 #include "char_conv.h" |
33 #include "group_find.h" | |
34 #include "group_internal.h" | 33 #include "group_internal.h" |
35 #include "group_info.h" | 34 #include "group_info.h" |
36 #include "group_join.h" | 35 #include "group_join.h" |
37 #include "group_im.h" | 36 #include "group_im.h" |
38 #include "group_opt.h" | 37 #include "group_opt.h" |
56 for (i = 0; list[i] < 0xffffffff; i++) {; | 55 for (i = 0; list[i] < 0xffffffff; i++) {; |
57 } | 56 } |
58 qsort (list, i, sizeof (guint32), _compare_guint32); | 57 qsort (list, i, sizeof (guint32), _compare_guint32); |
59 } | 58 } |
60 | 59 |
61 static void _qq_group_member_opt(PurpleConnection *gc, qq_group *group, gint operation, guint32 *members) | 60 static void _qq_group_member_opt(PurpleConnection *gc, qq_room_data *rmd, gint operation, guint32 *members) |
62 { | 61 { |
63 guint8 *data; | 62 guint8 *data; |
64 gint i, count, data_len; | 63 gint i, count, data_len; |
65 gint bytes; | 64 gint bytes; |
66 g_return_if_fail(members != NULL); | 65 g_return_if_fail(members != NULL); |
73 bytes = 0; | 72 bytes = 0; |
74 bytes += qq_put8(data + bytes, operation); | 73 bytes += qq_put8(data + bytes, operation); |
75 for (i = 0; i < count; i++) | 74 for (i = 0; i < count; i++) |
76 bytes += qq_put32(data + bytes, members[i]); | 75 bytes += qq_put32(data + bytes, members[i]); |
77 | 76 |
78 qq_send_room_cmd(gc, QQ_ROOM_CMD_MEMBER_OPT, group->id, data, bytes); | 77 qq_send_room_cmd(gc, QQ_ROOM_CMD_MEMBER_OPT, rmd->id, data, bytes); |
79 } | 78 } |
80 | 79 |
81 static void _qq_group_do_nothing_with_struct(group_member_opt *g) | 80 static void _qq_group_do_nothing_with_struct(group_member_opt *g) |
82 { | 81 { |
83 if (g != NULL) | 82 if (g != NULL) |
84 g_free(g); | 83 g_free(g); |
85 } | 84 } |
86 | 85 |
87 static void _qq_group_reject_application_real(group_member_opt *g, gchar *msg_utf8) | 86 static void _qq_group_reject_application_real(group_member_opt *g, gchar *msg_utf8) |
88 { | 87 { |
89 qq_group *group; | 88 qq_room_data *rmd; |
90 g_return_if_fail(g != NULL && g->gc != NULL && g->id > 0 && g->member > 0); | 89 g_return_if_fail(g != NULL && g->gc != NULL && g->id > 0 && g->member > 0); |
91 group = qq_room_search_id(g->gc, g->id); | 90 rmd = qq_room_data_find(g->gc, g->id); |
92 g_return_if_fail(group != NULL); | 91 g_return_if_fail(rmd != NULL); |
93 qq_send_cmd_group_auth(g->gc, group, QQ_ROOM_AUTH_REQUEST_REJECT, g->member, msg_utf8); | 92 qq_send_cmd_group_auth(g->gc, rmd, QQ_ROOM_AUTH_REQUEST_REJECT, g->member, msg_utf8); |
94 g_free(g); | 93 g_free(g); |
95 } | 94 } |
96 | 95 |
97 void qq_group_search_application_with_struct(group_member_opt *g) | 96 void qq_group_search_application_with_struct(group_member_opt *g) |
98 { | 97 { |
129 g_free(nombre); | 128 g_free(nombre); |
130 } | 129 } |
131 | 130 |
132 void qq_group_approve_application_with_struct(group_member_opt *g) | 131 void qq_group_approve_application_with_struct(group_member_opt *g) |
133 { | 132 { |
134 qq_group *group; | 133 qq_room_data *rmd; |
135 g_return_if_fail(g != NULL && g->gc != NULL && g->id > 0 && g->member > 0); | 134 g_return_if_fail(g != NULL && g->gc != NULL && g->id > 0 && g->member > 0); |
136 group = qq_room_search_id(g->gc, g->id); | 135 rmd = qq_room_data_find(g->gc, g->id); |
137 g_return_if_fail(group != NULL); | 136 g_return_if_fail(rmd != NULL); |
138 qq_send_cmd_group_auth(g->gc, group, QQ_ROOM_AUTH_REQUEST_APPROVE, g->member, ""); | 137 qq_send_cmd_group_auth(g->gc, rmd, QQ_ROOM_AUTH_REQUEST_APPROVE, g->member, ""); |
139 qq_group_find_or_add_member(g->gc, group, g->member); | 138 qq_room_buddy_find_or_new(g->gc, rmd, g->member); |
140 g_free(g); | 139 g_free(g); |
141 } | 140 } |
142 | 141 |
143 void qq_group_modify_members(PurpleConnection *gc, qq_group *group, guint32 *new_members) | 142 void qq_group_modify_members(PurpleConnection *gc, qq_room_data *rmd, guint32 *new_members) |
144 { | 143 { |
145 guint32 *old_members, *del_members, *add_members; | 144 guint32 *old_members, *del_members, *add_members; |
146 qq_buddy_data *bd; | 145 qq_buddy_data *bd; |
147 qq_data *qd; | 146 qq_data *qd; |
148 gint i = 0, old = 0, new = 0, del = 0, add = 0; | 147 gint i = 0, old = 0, new = 0, del = 0, add = 0; |
149 GList *list; | 148 GList *list; |
150 | 149 |
151 g_return_if_fail(group != NULL); | 150 g_return_if_fail(rmd != NULL); |
152 qd = (qq_data *) gc->proto_data; | 151 qd = (qq_data *) gc->proto_data; |
153 if (new_members[0] == 0xffffffff) | 152 if (new_members[0] == 0xffffffff) |
154 return; | 153 return; |
155 | 154 |
156 old_members = g_newa(guint32, QQ_QUN_MEMBER_MAX); | 155 old_members = g_newa(guint32, QQ_QUN_MEMBER_MAX); |
157 del_members = g_newa(guint32, QQ_QUN_MEMBER_MAX); | 156 del_members = g_newa(guint32, QQ_QUN_MEMBER_MAX); |
158 add_members = g_newa(guint32, QQ_QUN_MEMBER_MAX); | 157 add_members = g_newa(guint32, QQ_QUN_MEMBER_MAX); |
159 | 158 |
160 /* construct the old member list */ | 159 /* construct the old member list */ |
161 list = group->members; | 160 list = rmd->members; |
162 while (list != NULL) { | 161 while (list != NULL) { |
163 bd = (qq_buddy_data *) list->data; | 162 bd = (qq_buddy_data *) list->data; |
164 if (bd != NULL) | 163 if (bd != NULL) |
165 old_members[i++] = bd->uid; | 164 old_members[i++] = bd->uid; |
166 list = list->next; | 165 list = list->next; |
184 } | 183 } |
185 } | 184 } |
186 del_members[del] = add_members[add] = 0xffffffff; | 185 del_members[del] = add_members[add] = 0xffffffff; |
187 | 186 |
188 for (i = 0; i < del; i++) | 187 for (i = 0; i < del; i++) |
189 qq_group_remove_member_by_uid(group, del_members[i]); | 188 qq_room_buddy_remove(rmd, del_members[i]); |
190 for (i = 0; i < add; i++) | 189 for (i = 0; i < add; i++) |
191 qq_group_find_or_add_member(gc, group, add_members[i]); | 190 qq_room_buddy_find_or_new(gc, rmd, add_members[i]); |
192 | 191 |
193 if (del > 0) | 192 if (del > 0) |
194 _qq_group_member_opt(gc, group, QQ_ROOM_MEMBER_DEL, del_members); | 193 _qq_group_member_opt(gc, rmd, QQ_ROOM_MEMBER_DEL, del_members); |
195 if (add > 0) | 194 if (add > 0) |
196 _qq_group_member_opt(gc, group, QQ_ROOM_MEMBER_ADD, add_members); | 195 _qq_group_member_opt(gc, rmd, QQ_ROOM_MEMBER_ADD, add_members); |
197 } | 196 } |
198 | 197 |
199 void qq_group_process_modify_members_reply(guint8 *data, gint len, PurpleConnection *gc) | 198 void qq_group_process_modify_members_reply(guint8 *data, gint len, PurpleConnection *gc) |
200 { | 199 { |
201 gint bytes; | 200 gint bytes; |
202 guint32 id; | 201 guint32 id; |
203 time_t now = time(NULL); | 202 time_t now = time(NULL); |
204 qq_group *group; | 203 qq_room_data *rmd; |
205 g_return_if_fail(data != NULL); | 204 g_return_if_fail(data != NULL); |
206 | 205 |
207 bytes = 0; | 206 bytes = 0; |
208 bytes += qq_get32(&id, data + bytes); | 207 bytes += qq_get32(&id, data + bytes); |
209 g_return_if_fail(id > 0); | 208 g_return_if_fail(id > 0); |
210 | 209 |
211 /* we should have its info locally */ | 210 /* we should have its info locally */ |
212 group = qq_room_search_id(gc, id); | 211 rmd = qq_room_data_find(gc, id); |
213 g_return_if_fail(group != NULL); | 212 g_return_if_fail(rmd != NULL); |
214 | 213 |
215 purple_debug_info("QQ", "Succeed in modify members for room %d\n", group->ext_id); | 214 purple_debug_info("QQ", "Succeed in modify members for room %d\n", rmd->ext_id); |
216 | 215 |
217 qq_room_got_chat_in(gc, group, 0, _("Successed changing Qun member"), now); | 216 qq_room_got_chat_in(gc, id, 0, _("Successed changing Qun member"), now); |
218 } | 217 } |
219 | 218 |
220 void qq_room_change_info(PurpleConnection *gc, qq_group *group) | 219 void qq_room_change_info(PurpleConnection *gc, qq_room_data *rmd) |
221 { | 220 { |
222 guint8 *data; | 221 guint8 *data; |
223 gint data_len; | 222 gint data_len; |
224 gint bytes; | 223 gint bytes; |
225 gchar *group_name, *group_desc, *notice; | 224 gchar *group_name, *group_desc, *notice; |
226 | 225 |
227 g_return_if_fail(group != NULL); | 226 g_return_if_fail(rmd != NULL); |
228 | 227 |
229 group_name = group->title_utf8 == NULL ? "" : utf8_to_qq(group->title_utf8, QQ_CHARSET_DEFAULT); | 228 group_name = rmd->title_utf8 == NULL ? "" : utf8_to_qq(rmd->title_utf8, QQ_CHARSET_DEFAULT); |
230 group_desc = group->desc_utf8 == NULL ? "" : utf8_to_qq(group->desc_utf8, QQ_CHARSET_DEFAULT); | 229 group_desc = rmd->desc_utf8 == NULL ? "" : utf8_to_qq(rmd->desc_utf8, QQ_CHARSET_DEFAULT); |
231 notice = group->notice_utf8 == NULL ? "" : utf8_to_qq(group->notice_utf8, QQ_CHARSET_DEFAULT); | 230 notice = rmd->notice_utf8 == NULL ? "" : utf8_to_qq(rmd->notice_utf8, QQ_CHARSET_DEFAULT); |
232 | 231 |
233 data_len = 64 + strlen(group_name) + strlen(group_desc) + strlen(notice); | 232 data_len = 64 + strlen(group_name) + strlen(group_desc) + strlen(notice); |
234 data = g_newa(guint8, data_len); | 233 data = g_newa(guint8, data_len); |
235 bytes = 0; | 234 bytes = 0; |
236 /* 005-005 */ | 235 /* 005-005 */ |
237 bytes += qq_put8(data + bytes, 0x01); | 236 bytes += qq_put8(data + bytes, 0x01); |
238 /* 006-006 */ | 237 /* 006-006 */ |
239 bytes += qq_put8(data + bytes, group->auth_type); | 238 bytes += qq_put8(data + bytes, rmd->auth_type); |
240 /* 007-008 */ | 239 /* 007-008 */ |
241 bytes += qq_put16(data + bytes, 0x0000); | 240 bytes += qq_put16(data + bytes, 0x0000); |
242 /* 009-010 */ | 241 /* 009-010 */ |
243 bytes += qq_put16(data + bytes, group->category); | 242 bytes += qq_put16(data + bytes, rmd->category); |
244 | 243 |
245 bytes += qq_put8(data + bytes, strlen(group_name)); | 244 bytes += qq_put8(data + bytes, strlen(group_name)); |
246 bytes += qq_putdata(data + bytes, (guint8 *) group_name, strlen(group_name)); | 245 bytes += qq_putdata(data + bytes, (guint8 *) group_name, strlen(group_name)); |
247 | 246 |
248 bytes += qq_put16(data + bytes, 0x0000); | 247 bytes += qq_put16(data + bytes, 0x0000); |
257 purple_debug_error("QQ", | 256 purple_debug_error("QQ", |
258 "Overflow in qq_room_change_info, max %d bytes, now %d bytes\n", | 257 "Overflow in qq_room_change_info, max %d bytes, now %d bytes\n", |
259 data_len, bytes); | 258 data_len, bytes); |
260 return; | 259 return; |
261 } | 260 } |
262 qq_send_room_cmd(gc, QQ_ROOM_CMD_CHANGE_INFO, group->id, data, bytes); | 261 qq_send_room_cmd(gc, QQ_ROOM_CMD_CHANGE_INFO, rmd->id, data, bytes); |
263 } | 262 } |
264 | 263 |
265 void qq_group_process_modify_info_reply(guint8 *data, gint len, PurpleConnection *gc) | 264 void qq_group_process_modify_info_reply(guint8 *data, gint len, PurpleConnection *gc) |
266 { | 265 { |
267 gint bytes; | 266 gint bytes; |
268 guint32 id; | 267 guint32 id; |
269 qq_group *group; | |
270 time_t now = time(NULL); | 268 time_t now = time(NULL); |
271 | 269 |
272 g_return_if_fail(data != NULL); | 270 g_return_if_fail(data != NULL); |
273 | 271 |
274 bytes = 0; | 272 bytes = 0; |
275 bytes += qq_get32(&id, data + bytes); | 273 bytes += qq_get32(&id, data + bytes); |
276 g_return_if_fail(id > 0); | 274 g_return_if_fail(id > 0); |
277 | 275 |
278 /* we should have its info locally */ | 276 purple_debug_info("QQ", "Succeed modify room info of %d\n", id); |
279 group = qq_room_search_id(gc, id); | 277 |
280 g_return_if_fail(group != NULL); | 278 qq_room_got_chat_in(gc, id, 0, _("Successed changing Qun information"), now); |
281 | 279 } |
282 purple_debug_info("QQ", "Succeed in modify info for Qun %d\n", group->ext_id); | 280 |
283 qq_group_refresh(gc, group); | 281 /* we create a very simple room first, and then let the user to modify */ |
284 | |
285 qq_room_got_chat_in(gc, group, 0, _("Successed changing Qun information"), now); | |
286 } | |
287 | |
288 /* we create a very simple group first, and then let the user to modify */ | |
289 void qq_room_create_new(PurpleConnection *gc, const gchar *name) | 282 void qq_room_create_new(PurpleConnection *gc, const gchar *name) |
290 { | 283 { |
291 guint8 *data; | 284 guint8 *data; |
292 gint data_len; | 285 gint data_len; |
293 gint bytes; | 286 gint bytes; |
326 qq_send_room_cmd_noid(gc, QQ_ROOM_CMD_CREATE, data, bytes); | 319 qq_send_room_cmd_noid(gc, QQ_ROOM_CMD_CREATE, data, bytes); |
327 } | 320 } |
328 | 321 |
329 static void qq_group_setup_cb(qq_add_request *add_req) | 322 static void qq_group_setup_cb(qq_add_request *add_req) |
330 { | 323 { |
331 qq_group *group; | 324 qq_room_data *rmd; |
332 g_return_if_fail(add_req != NULL); | 325 g_return_if_fail(add_req != NULL); |
333 if (add_req->gc == NULL || add_req->uid == 0) { | 326 if (add_req->gc == NULL || add_req->uid == 0) { |
334 g_free(add_req); | 327 g_free(add_req); |
335 return; | 328 return; |
336 } | 329 } |
337 | 330 |
338 group = qq_room_search_id(add_req->gc, add_req->uid); | 331 rmd = qq_room_data_find(add_req->gc, add_req->uid); |
339 if (group == NULL) { | 332 if (rmd == NULL) { |
340 g_free(add_req); | 333 g_free(add_req); |
341 return; | 334 return; |
342 } | 335 } |
343 | 336 |
344 /* TODO insert UI code here */ | 337 /* TODO insert UI code here */ |
345 /* qq_group_detail_window_show(g->gc, group); */ | 338 /* qq_group_detail_window_show(g->gc, rmd); */ |
346 g_free(add_req); | 339 g_free(add_req); |
347 } | 340 } |
348 | 341 |
349 void qq_group_process_create_group_reply(guint8 *data, gint len, PurpleConnection *gc) | 342 void qq_group_process_create_group_reply(guint8 *data, gint len, PurpleConnection *gc) |
350 { | 343 { |
351 gint bytes; | 344 gint bytes; |
352 guint32 id, ext_id; | 345 guint32 id, ext_id; |
353 qq_group *group; | 346 qq_room_data *rmd; |
354 qq_add_request *add_req; | 347 qq_add_request *add_req; |
355 qq_data *qd; | 348 qq_data *qd; |
356 | 349 |
357 g_return_if_fail(data != NULL); | 350 g_return_if_fail(data != NULL); |
358 g_return_if_fail(gc->proto_data != NULL); | 351 g_return_if_fail(gc->proto_data != NULL); |
361 bytes = 0; | 354 bytes = 0; |
362 bytes += qq_get32(&id, data + bytes); | 355 bytes += qq_get32(&id, data + bytes); |
363 bytes += qq_get32(&ext_id, data + bytes); | 356 bytes += qq_get32(&ext_id, data + bytes); |
364 g_return_if_fail(id > 0 && ext_id); | 357 g_return_if_fail(id > 0 && ext_id); |
365 | 358 |
366 group = qq_group_create_internal_record(gc, id, ext_id, NULL); | 359 qq_room_find_or_new(gc, id, ext_id); |
367 group->my_role = QQ_ROOM_ROLE_ADMIN; | 360 rmd = qq_room_data_find(gc, id); |
368 group->creator_uid = qd->uid; | 361 g_return_if_fail(rmd != NULL); |
369 qq_group_refresh(gc, group); | 362 |
363 rmd->my_role = QQ_ROOM_ROLE_ADMIN; | |
364 rmd->creator_uid = qd->uid; | |
370 | 365 |
371 qq_send_room_cmd_only(gc, QQ_ROOM_CMD_ACTIVATE, id); | 366 qq_send_room_cmd_only(gc, QQ_ROOM_CMD_ACTIVATE, id); |
372 qq_update_room(gc, 0, group->id); | 367 qq_update_room(gc, 0, rmd->id); |
373 | 368 |
374 purple_debug_info("QQ", "Succeed in create Qun, external ID %d\n", group->ext_id); | 369 purple_debug_info("QQ", "Succeed in create Qun, external ID %d\n", rmd->ext_id); |
375 | 370 |
376 add_req = g_new0(qq_add_request, 1); | 371 add_req = g_new0(qq_add_request, 1); |
377 add_req->gc = gc; | 372 add_req->gc = gc; |
378 add_req->uid = id; | 373 add_req->uid = id; |
379 | 374 |
389 | 384 |
390 void qq_group_process_activate_group_reply(guint8 *data, gint len, PurpleConnection *gc) | 385 void qq_group_process_activate_group_reply(guint8 *data, gint len, PurpleConnection *gc) |
391 { | 386 { |
392 gint bytes; | 387 gint bytes; |
393 guint32 id; | 388 guint32 id; |
394 qq_group *group; | 389 qq_room_data *rmd; |
395 g_return_if_fail(data != NULL); | 390 g_return_if_fail(data != NULL); |
396 | 391 |
397 bytes = 0; | 392 bytes = 0; |
398 bytes += qq_get32(&id, data + bytes); | 393 bytes += qq_get32(&id, data + bytes); |
399 g_return_if_fail(id > 0); | 394 g_return_if_fail(id > 0); |
400 | 395 |
401 /* we should have its info locally */ | 396 /* we should have its info locally */ |
402 group = qq_room_search_id(gc, id); | 397 rmd = qq_room_data_find(gc, id); |
403 g_return_if_fail(group != NULL); | 398 g_return_if_fail(rmd != NULL); |
404 | 399 |
405 purple_debug_info("QQ", "Succeed in activate Qun %d\n", group->ext_id); | 400 purple_debug_info("QQ", "Succeed in activate Qun %d\n", rmd->ext_id); |
406 } | 401 } |
407 | 402 |
408 void qq_group_manage_group(PurpleConnection *gc, GHashTable *data) | 403 void qq_group_manage_group(PurpleConnection *gc, GHashTable *data) |
409 { | 404 { |
410 gchar *id_ptr; | 405 gchar *id_ptr; |
411 guint32 id; | 406 guint32 id; |
412 qq_group *group; | 407 qq_room_data *rmd; |
413 | 408 |
414 g_return_if_fail(data != NULL); | 409 g_return_if_fail(data != NULL); |
415 | 410 |
416 id_ptr = g_hash_table_lookup(data, QQ_ROOM_KEY_INTERNAL_ID); | 411 id_ptr = g_hash_table_lookup(data, QQ_ROOM_KEY_INTERNAL_ID); |
417 id = strtol(id_ptr, NULL, 10); | 412 id = strtol(id_ptr, NULL, 10); |
418 g_return_if_fail(id > 0); | 413 g_return_if_fail(id > 0); |
419 | 414 |
420 group = qq_room_search_id(gc, id); | 415 rmd = qq_room_data_find(gc, id); |
421 g_return_if_fail(group != NULL); | 416 g_return_if_fail(rmd != NULL); |
422 | 417 |
423 /* XXX insert UI code here */ | 418 /* XXX insert UI code here */ |
424 /* qq_group_detail_window_show(gc, group); */ | 419 /* qq_group_detail_window_show(gc, rmd); */ |
425 } | 420 } |