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 }