首页 | 数据结构 | 文件列表 | 数据字段 | 全局定义

group_opt.c

浏览该文件的文档。
00001 
00023 // START OF FILE
00024 /*****************************************************************************/
00025 #include "debug.h"              // gaim_debug
00026 #include "notify.h"             // gaim_notify_info
00027 #include "request.h"            // gaim_request_input
00028 
00029 #include "utils.h"              // uid_to_gaim_name
00030 #include "packet_parse.h"       // create_packet_b
00031 #include "buddy_info.h"         // qq_send_packet_get_info
00032 #include "char_conv.h"          // utf8_to_qq
00033 #include "group_admindlg.h"     // qq_group_manage_window_show
00034 #include "group_find.h"         // qq_group_find_by_internal_group_id
00035 #include "group_hash.h"         // qq_group_refresh
00036 #include "group_info.h"         // qq_send_cmd_group_get_group_info
00037 #include "group_join.h"         // qq_send_cmd_group_auth
00038 #include "group_network.h"      // qq_send_group_cmd
00039 #include "group_opt.h"
00040 #include "qq.h"
00041 
00042 /*****************************************************************************/
00043 // This implement quick sort algorithm (low->high)
00044 void _quick_sort(gint * numbers, gint left, gint right)
00045 {
00046         gint pivot, l_hold, r_hold;
00047 
00048         l_hold = left;
00049         r_hold = right;
00050         pivot = numbers[left];
00051         while (left < right) {
00052                 while ((numbers[right] >= pivot) && (left < right))
00053                         right--;
00054                 if (left != right) {
00055                         numbers[left] = numbers[right];
00056                         left++;
00057                 }               // if
00058                 while ((numbers[left] <= pivot) && (left < right))
00059                         left++;
00060                 if (left != right) {
00061                         numbers[right] = numbers[left];
00062                         right--;
00063                 }               // if
00064         }                       // while
00065         numbers[left] = pivot;
00066         pivot = left;
00067         left = l_hold;
00068         right = r_hold;
00069         if (left < pivot)
00070                 _quick_sort(numbers, left, pivot - 1);
00071         if (right > pivot)
00072                 _quick_sort(numbers, pivot + 1, right);
00073 }                               // _quick_sort
00074 
00075 /*****************************************************************************/
00076 void _sort(guint32 * list)
00077 {
00078         gint i;
00079         for (i = 0; list[i] < 0xffffffff; i++) {;
00080         }
00081         _quick_sort(list, 0, i - 1);
00082 }                               // _sort
00083 
00084 /*****************************************************************************/
00085 void _qq_group_member_opt(GaimConnection * gc, qq_group * group, gint operation, guint32 * members) {
00086         guint8 *data, *cursor;
00087         gint i, count, data_len;
00088         g_return_if_fail(gc != NULL && group != NULL && members != NULL);
00089 
00090         for (i = 0; members[i] != 0xffffffff; i++) {;
00091         }
00092         count = i;
00093         data_len = 6 + count * 4;
00094         data = g_newa(guint8, data_len);
00095         cursor = data;
00096         create_packet_b(data, &cursor, QQ_GROUP_CMD_MEMBER_OPT);
00097         create_packet_dw(data, &cursor, group->internal_group_id);
00098         create_packet_b(data, &cursor, operation);
00099         for (i = 0; i < count; i++)
00100                 create_packet_dw(data, &cursor, members[i]);
00101         qq_send_group_cmd(gc, group, data, data_len);
00102 }                               // _qq_group_member_opt
00103 
00104 /*****************************************************************************/
00105 void _qq_group_do_nothing_with_struct(group_member_opt * g)
00106 {
00107         if (g != NULL)
00108                 g_free(g);
00109 }                               // _qq_group_do_nothing_with_struct
00110 
00111 /*****************************************************************************/
00112 void _qq_group_reject_application_real(group_member_opt * g, gchar * msg_utf8)
00113 {
00114         qq_group *group;
00115         g_return_if_fail(g != NULL && g->gc != NULL && g->internal_group_id > 0 && g->member > 0);
00116         group = qq_group_find_by_internal_group_id(g->gc, g->internal_group_id);
00117         g_return_if_fail(group != NULL);
00118         qq_send_cmd_group_auth(g->gc, group, QQ_GROUP_AUTH_REQUEST_REJECT, g->member, msg_utf8);
00119         g_free(g);
00120 }                               // _qq_group_reject_application_real
00121 
00122 /*****************************************************************************/
00123 void qq_group_search_application_with_struct(group_member_opt * g)
00124 {
00125         g_return_if_fail(g != NULL && g->gc != NULL && g->member > 0);
00126 
00127         qq_send_packet_get_info(g->gc, g->member, TRUE);        // we wanna see window
00128         gaim_request_action
00129             (g->gc, NULL, _("Do you wanna approve the request?"), "", 2, g,
00130              2, _("Reject"),
00131              G_CALLBACK(qq_group_reject_application_with_struct),
00132              _("Approve"), G_CALLBACK(qq_group_approve_application_with_struct));
00133 
00134 }                               // qq_group_search_application_with_struct
00135 
00136 /*****************************************************************************/
00137 void qq_group_reject_application_with_struct(group_member_opt * g)
00138 {
00139         gchar *msg1, *msg2;
00140         g_return_if_fail(g != NULL && g->gc != NULL && g->member > 0);
00141 
00142         msg1 = g_strdup_printf(_("You rejected %d's request"), g->member);
00143         msg2 = g_strdup(_("Input your reason:"));
00144 
00145         gaim_request_input(g->gc, NULL, msg1, msg2,
00146                            _("Sorry, you are not my type..."), TRUE, FALSE,
00147                            NULL, _("Send"),
00148                            G_CALLBACK(_qq_group_reject_application_real),
00149                            _("Cancel"), G_CALLBACK(_qq_group_do_nothing_with_struct), g);
00150 
00151         g_free(msg1);
00152         g_free(msg2);
00153 
00154 }                               // qq_group_do_nothing_with_struct
00155 
00156 /*****************************************************************************/
00157 void qq_group_approve_application_with_struct(group_member_opt * g)
00158 {
00159         qq_group *group;
00160         g_return_if_fail(g != NULL && g->gc != NULL && g->internal_group_id > 0 && g->member > 0);
00161         group = qq_group_find_by_internal_group_id(g->gc, g->internal_group_id);
00162         g_return_if_fail(group != NULL);
00163         qq_send_cmd_group_auth(g->gc, group, QQ_GROUP_AUTH_REQUEST_APPROVE, g->member, "");
00164         qq_group_find_or_add_member(g->gc, group, g->member);
00165         g_free(g);
00166 }                               // qq_group_add_member_with_gc_and_uid
00167 
00168 /*****************************************************************************/
00169 void qq_group_modify_members(GaimConnection * gc, qq_group * group, guint32 * new_members) {
00170         guint32 *old_members, *del_members, *add_members;
00171         qq_buddy *q_bud;
00172         qq_data *qd;
00173         gint i = 0, old = 0, new = 0, del = 0, add = 0;
00174         GList *list;
00175 
00176         g_return_if_fail(gc != NULL && gc->proto_data != NULL && group != NULL);
00177         qd = (qq_data *) gc->proto_data;
00178         if (new_members[0] == 0xffffffff)
00179                 return;
00180 
00181         old_members = g_newa(guint32, QQ_QUN_MEMBER_MAX);
00182         del_members = g_newa(guint32, QQ_QUN_MEMBER_MAX);
00183         add_members = g_newa(guint32, QQ_QUN_MEMBER_MAX);
00184 
00185         // construct the old member list
00186         list = group->members;
00187         while (list != NULL) {
00188                 q_bud = (qq_buddy *) list->data;
00189                 if (q_bud != NULL)
00190                         old_members[i++] = q_bud->uid;
00191                 list = list->next;
00192         }                       // while
00193         old_members[i] = 0xffffffff;    // this is the end
00194 
00195         // sort to speed up making del_members and add_members list
00196         _sort(old_members);
00197         _sort(new_members);
00198 
00199         for (old = 0, new = 0; old_members[old] < 0xffffffff || new_members[new] < 0xffffffff;) {
00200                 if (old_members[old] > new_members[new])
00201                         add_members[add++] = new_members[new++];
00202                 else if (old_members[old] < new_members[new])
00203                         del_members[del++] = old_members[old++];
00204                 else {
00205                         if (old_members[old] < 0xffffffff)
00206                                 old++;
00207                         if (new_members[new] < 0xffffffff)
00208                                 new++;
00209                 }               // if old_members, new_members
00210         }                       // for old,new
00211         del_members[del] = add_members[add] = 0xffffffff;
00212 
00213         for (i = 0; i < del; i++)
00214                 qq_group_remove_member_by_uid(group, del_members[i]);
00215         for (i = 0; i < add; i++)
00216                 qq_group_find_or_add_member(gc, group, add_members[i]);
00217 
00218         if (del > 0)
00219                 _qq_group_member_opt(gc, group, QQ_GROUP_MEMBER_DEL, del_members);
00220         if (add > 0)
00221                 _qq_group_member_opt(gc, group, QQ_GROUP_MEMBER_ADD, add_members);
00222 
00223 }                               // qq_group_modify_members
00224 
00225 /*****************************************************************************/
00226 void qq_group_process_modify_members_reply(guint8 * data, guint8 ** cursor, gint len, GaimConnection * gc) {
00227         guint32 internal_group_id;
00228         qq_group *group;
00229         g_return_if_fail(data != NULL && gc != NULL);
00230 
00231         read_packet_dw(data, cursor, len, &internal_group_id);
00232         g_return_if_fail(internal_group_id > 0);
00233 
00234         // we should have its info locally
00235         group = qq_group_find_by_internal_group_id(gc, internal_group_id);
00236         g_return_if_fail(group != NULL);
00237 
00238         gaim_debug(GAIM_DEBUG_INFO, "QQ", "Succeed in modify members for Qun %d\n", group->external_group_id);
00239 
00240         gaim_notify_info(gc, _("QQ Qun Operation"), _("You have successfully modify Qun member"), NULL);
00241 
00242 }                               // qq_group_process_modify_members_reply
00243 
00244 /*****************************************************************************/
00245 void qq_group_modify_info(GaimConnection * gc, qq_group * group)
00246 {
00247         gint data_len, data_written;
00248         guint8 *data, *cursor;
00249         gchar *group_name, *group_desc, *notice;
00250 
00251         g_return_if_fail(gc != NULL && group != NULL);
00252 
00253         group_name = group->group_name_utf8 == NULL ? "" : utf8_to_qq(group->group_name_utf8, QQ_CHARSET_DEFAULT);
00254         group_desc = group->group_desc_utf8 == NULL ? "" : utf8_to_qq(group->group_desc_utf8, QQ_CHARSET_DEFAULT);
00255         notice = group->notice_utf8 == NULL ? "" : utf8_to_qq(group->notice_utf8, QQ_CHARSET_DEFAULT);
00256 
00257         data_len = 13 + 1 + strlen(group_name)
00258             + 1 + strlen(group_desc)
00259             + 1 + strlen(notice);
00260 
00261         data = g_newa(guint8, data_len);
00262         cursor = data;
00263         data_written = 0;
00264         // 000-000
00265         data_written += create_packet_b(data, &cursor, QQ_GROUP_CMD_MODIFY_GROUP_INFO);
00266         // 001-004
00267         data_written += create_packet_dw(data, &cursor, group->internal_group_id);
00268         // 005-005
00269         data_written += create_packet_b(data, &cursor, 0x01);
00270         // 006-006
00271         data_written += create_packet_b(data, &cursor, group->auth_type);
00272         // 007-008
00273         data_written += create_packet_w(data, &cursor, 0x0000);
00274         // 009-010
00275         data_written += create_packet_w(data, &cursor, group->group_category);
00276 
00277         data_written += create_packet_b(data, &cursor, strlen(group_name));
00278         data_written += create_packet_data(data, &cursor, group_name, strlen(group_name));
00279 
00280         data_written += create_packet_w(data, &cursor, 0x0000);
00281 
00282         data_written += create_packet_b(data, &cursor, strlen(notice));
00283         data_written += create_packet_data(data, &cursor, notice, strlen(notice));
00284 
00285         data_written += create_packet_b(data, &cursor, strlen(group_desc));
00286         data_written += create_packet_data(data, &cursor, group_desc, strlen(group_desc));
00287 
00288         if (data_written != data_len)
00289                 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
00290                            "Fail to create group_modify_info packet, expect %d bytes, wrote %d bytes\n",
00291                            data_len, data_written);
00292         else
00293                 qq_send_group_cmd(gc, group, data, data_len);
00294 
00295 }                               // qq_group_modify_info
00296 
00297 /*****************************************************************************/
00298 void qq_group_process_modify_info_reply(guint8 * data, guint8 ** cursor, gint len, GaimConnection * gc) {
00299         guint32 internal_group_id;
00300         qq_group *group;
00301         g_return_if_fail(data != NULL && gc != NULL);
00302 
00303         read_packet_dw(data, cursor, len, &internal_group_id);
00304         g_return_if_fail(internal_group_id > 0);
00305 
00306         // we should have its info locally
00307         group = qq_group_find_by_internal_group_id(gc, internal_group_id);
00308         g_return_if_fail(group != NULL);
00309 
00310         gaim_debug(GAIM_DEBUG_INFO, "QQ", "Succeed in modify info for Qun %d\n", group->external_group_id);
00311         qq_group_refresh(gc, group);
00312 
00313         gaim_notify_info(gc, _("QQ Qun Operation"), _("You have successfully modify Qun information"), NULL);
00314 
00315 }                               // qq_group_process_modify_info_reply
00316 
00317 /*****************************************************************************/
00318 // we create a very simple group first, and then let the user to modify
00319 void qq_group_create_with_name(GaimConnection * gc, const gchar * name)
00320 {
00321         gint data_len, data_written;
00322         guint8 *data, *cursor;
00323         qq_data *qd;
00324         g_return_if_fail(gc != NULL && name != NULL);
00325 
00326         qd = (qq_data *) gc->proto_data;
00327         data_len = 7 + 1 + strlen(name) + 2 + 1 + 1 + 4;
00328         data = g_newa(guint8, data_len);
00329         cursor = data;
00330 
00331         data_written = 0;
00332         // we create the simpleset group, only group name is given
00333         // 000
00334         data_written += create_packet_b(data, &cursor, QQ_GROUP_CMD_CREATE_GROUP);
00335         // 001
00336         data_written += create_packet_b(data, &cursor, QQ_GROUP_TYPE_PERMANENT);
00337         // 002
00338         data_written += create_packet_b(data, &cursor, QQ_GROUP_AUTH_TYPE_NEED_AUTH);
00339         // 003-004
00340         data_written += create_packet_w(data, &cursor, 0x0000);
00341         // 005-006
00342         data_written += create_packet_w(data, &cursor, 0x0003);
00343         // 007
00344         data_written += create_packet_b(data, &cursor, strlen(name));
00345         data_written += create_packet_data(data, &cursor, (gchar *) name, strlen(name));
00346         data_written += create_packet_w(data, &cursor, 0x0000);
00347         data_written += create_packet_b(data, &cursor, 0x00);   // no group notice
00348         data_written += create_packet_b(data, &cursor, 0x00);   // no group desc
00349         data_written += create_packet_dw(data, &cursor, qd->uid);       // I am member of coz
00350 
00351         if (data_written != data_len)
00352                 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
00353                            "Fail create create_group packet, expect %d bytes, written %d bytes\n",
00354                            data_len, data_written);
00355         else
00356                 qq_send_group_cmd(gc, NULL, data, data_len);
00357 
00358 }                               // qq_group_create_with_name
00359 
00360 /*****************************************************************************/
00361 void qq_group_setup_with_gc_and_uid(gc_and_uid * g)
00362 {
00363         qq_group *group;
00364         g_return_if_fail(g != NULL && g->gc != NULL && g->uid > 0);
00365 
00366         group = qq_group_find_by_internal_group_id(g->gc, g->uid);
00367         g_return_if_fail(group != NULL);
00368 
00369         qq_group_detail_window_show(g->gc, group);
00370         g_free(g);
00371 }                               // qq_group_setup_with_gc_and_uid
00372 
00373 /*****************************************************************************/
00374 void qq_group_process_create_group_reply(guint8 * data, guint8 ** cursor, gint len, GaimConnection * gc) {
00375         guint32 internal_group_id, external_group_id;
00376         qq_group *group;
00377         gc_and_uid *g;
00378         qq_data *qd;
00379 
00380         g_return_if_fail(data != NULL && gc != NULL);
00381         g_return_if_fail(gc->proto_data != NULL);
00382         qd = (qq_data *) gc->proto_data;
00383 
00384         read_packet_dw(data, cursor, len, &internal_group_id);
00385         read_packet_dw(data, cursor, len, &external_group_id);
00386         g_return_if_fail(internal_group_id > 0 && external_group_id);
00387 
00388         group = qq_group_create_by_id(gc, internal_group_id, external_group_id);
00389         group->my_status = QQ_GROUP_MEMBER_STATUS_IS_ADMIN;
00390         group->creator_uid = qd->uid;
00391         qq_group_refresh(gc, group);
00392 
00393         qq_group_activate_group(gc, internal_group_id);
00394         qq_send_cmd_group_get_group_info(gc, group);
00395 
00396         gaim_debug(GAIM_DEBUG_INFO, "QQ", "Succeed in create Qun, external ID %d\n", group->external_group_id);
00397 
00398         g = g_new0(gc_and_uid, 1);
00399         g->gc = gc;
00400         g->uid = internal_group_id;
00401 
00402         gaim_request_action(gc, _("QQ Qun Operation"),
00403                             _("You have successfully created a Qun"),
00404                             _
00405                             ("Would you like to set up the Qun details now?"),
00406                             1, g, 2, _("Setup"),
00407                             G_CALLBACK(qq_group_setup_with_gc_and_uid),
00408                             _("Cancel"), G_CALLBACK(qq_do_nothing_with_gc_and_uid));
00409 
00410 }                               // qq_group_process_modify_info_reply
00411 
00412 /*****************************************************************************/
00413 // we have to activate group after creation, otherwise the group can not be searched
00414 void qq_group_activate_group(GaimConnection * gc, guint32 internal_group_id)
00415 {
00416         gint data_len, data_written;
00417         guint8 *data, *cursor;
00418         g_return_if_fail(gc != NULL && internal_group_id > 0);
00419 
00420         data_len = 5;
00421         data = g_newa(guint8, data_len);
00422         cursor = data;
00423 
00424         data_written = 0;
00425         // we create the simpleset group, only group name is given
00426         // 000
00427         data_written += create_packet_b(data, &cursor, QQ_GROUP_CMD_ACTIVATE_GROUP);
00428         // 001-005
00429         data_written += create_packet_dw(data, &cursor, internal_group_id);
00430 
00431         if (data_written != data_len)
00432                 gaim_debug(GAIM_DEBUG_ERROR, "QQ",
00433                            "Fail create activate_group packet, expect %d bytes, written %d bytes\n",
00434                            data_len, data_written);
00435         else
00436                 qq_send_group_cmd(gc, NULL, data, data_len);
00437 
00438 }                               // qq_group_activate_group
00439 
00440 /*****************************************************************************/
00441 void qq_group_process_activate_group_reply(guint8 * data, guint8 ** cursor, gint len, GaimConnection * gc) {
00442         guint32 internal_group_id;
00443         qq_group *group;
00444         g_return_if_fail(data != NULL && gc != NULL);
00445 
00446         read_packet_dw(data, cursor, len, &internal_group_id);
00447         g_return_if_fail(internal_group_id > 0);
00448 
00449         // we should have its info locally
00450         group = qq_group_find_by_internal_group_id(gc, internal_group_id);
00451         g_return_if_fail(group != NULL);
00452 
00453         gaim_debug(GAIM_DEBUG_INFO, "QQ", "Succeed in activate Qun %d\n", group->external_group_id);
00454 
00455 }                               // qq_group_process_activate_group_reply
00456 
00457 /*****************************************************************************/
00458 void qq_group_manage_group(GaimConnection * gc, GHashTable * data)
00459 {
00460         gchar *internal_group_id_ptr;
00461         guint32 internal_group_id;
00462         qq_group *group;
00463 
00464         g_return_if_fail(gc != NULL && data != NULL);
00465 
00466         internal_group_id_ptr = g_hash_table_lookup(data, "internal_group_id");
00467         internal_group_id = strtol(internal_group_id_ptr, NULL, 10);
00468         g_return_if_fail(internal_group_id > 0);
00469 
00470         group = qq_group_find_by_internal_group_id(gc, internal_group_id);
00471         g_return_if_fail(group != NULL);
00472 
00473         qq_group_detail_window_show(gc, group);
00474 
00475 }                               // qq_group_manage_members
00476 
00477 
00478 /*****************************************************************************/
00479 // END OF FILE

Generated at Mon May 8 15:41:24 2006 for OpenQ by  doxygen 1.4.4