comparison src/protocols/oscar/oscar.c @ 3210:5e90ecb578c5

[gaim-migrate @ 3227] Among other things, a warning for when your OSCAR buddy list is too long. Thanks KingAnt committer: Tailor Script <tailor@pidgin.im>
author Sean Egan <seanegan@gmail.com>
date Sun, 05 May 2002 18:42:11 +0000
parents 51e4fb38a140
children 56746b0868db
comparison
equal deleted inserted replaced
3209:265a3c9d0557 3210:5e90ecb578c5
2783 static void oscar_add_buddy(struct gaim_connection *g, char *name) { 2783 static void oscar_add_buddy(struct gaim_connection *g, char *name) {
2784 struct oscar_data *odata = (struct oscar_data *)g->proto_data; 2784 struct oscar_data *odata = (struct oscar_data *)g->proto_data;
2785 if (odata->icq) { 2785 if (odata->icq) {
2786 aim_add_buddy(odata->sess, odata->conn, name); 2786 aim_add_buddy(odata->sess, odata->conn, name);
2787 } else { 2787 } else {
2788 if ((odata->sess->ssi.received_data) && !(aim_ssi_inlist(odata->sess, odata->conn, name, 0x0000))) { 2788 if ((odata->sess->ssi.received_data) && !(aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, name, 0x0000))) {
2789 debug_printf("ssi: adding buddy %s to group %s\n", name, find_group_by_buddy(g, name)->name); 2789 debug_printf("ssi: adding buddy %s to group %s\n", name, find_group_by_buddy(g, name)->name);
2790 aim_ssi_addbuddies(odata->sess, odata->conn, find_group_by_buddy(g, name)->name, &name, 1); 2790 aim_ssi_addbuddies(odata->sess, odata->conn, find_group_by_buddy(g, name)->name, &name, 1);
2791 } 2791 }
2792 } 2792 }
2793 } 2793 }
2811 int tmp; 2811 int tmp;
2812 GSList *curgrp, *curbud; 2812 GSList *curgrp, *curbud;
2813 for (curgrp=g->groups; curgrp; curgrp=g_slist_next(curgrp)) { 2813 for (curgrp=g->groups; curgrp; curgrp=g_slist_next(curgrp)) {
2814 tmp = 0; 2814 tmp = 0;
2815 for (curbud=((struct group*)curgrp->data)->members; curbud; curbud=curbud->next) 2815 for (curbud=((struct group*)curgrp->data)->members; curbud; curbud=curbud->next)
2816 if (!aim_ssi_inlist(odata->sess, odata->conn, ((struct buddy*)curbud->data)->name, 0x0000)) 2816 if (!aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000))
2817 tmp++; 2817 tmp++;
2818 if (tmp) { 2818 if (tmp) {
2819 char **sns = (char **)malloc(tmp*sizeof(char*)); 2819 char **sns = (char **)malloc(tmp*sizeof(char*));
2820 tmp = 0; 2820 tmp = 0;
2821 for (curbud=((struct group*)curgrp->data)->members; curbud; curbud=curbud->next) 2821 for (curbud=((struct group*)curgrp->data)->members; curbud; curbud=curbud->next)
2822 if (!aim_ssi_inlist(odata->sess, odata->conn, ((struct buddy*)curbud->data)->name, 0x0000)) { 2822 if (!aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) {
2823 debug_printf("ssi: adding buddy %s to group %s\n", ((struct buddy*)curbud->data)->name, ((struct group*)curgrp->data)->name); 2823 debug_printf("ssi: adding buddy %s to group %s\n", ((struct buddy*)curbud->data)->name, ((struct group*)curgrp->data)->name);
2824 sns[tmp] = (char *)((struct buddy*)curbud->data)->name; 2824 sns[tmp] = (char *)((struct buddy*)curbud->data)->name;
2825 tmp++; 2825 tmp++;
2826 } 2826 }
2827 aim_ssi_addbuddies(odata->sess, odata->conn, ((struct group*)curgrp->data)->name, sns, tmp); 2827 aim_ssi_addbuddies(odata->sess, odata->conn, ((struct group*)curgrp->data)->name, sns, tmp);
2845 struct oscar_data *odata = (struct oscar_data *)g->proto_data; 2845 struct oscar_data *odata = (struct oscar_data *)g->proto_data;
2846 if (odata->icq) { 2846 if (odata->icq) {
2847 aim_remove_buddy(odata->sess, odata->conn, name); 2847 aim_remove_buddy(odata->sess, odata->conn, name);
2848 } else { 2848 } else {
2849 if (odata->sess->ssi.received_data) { 2849 if (odata->sess->ssi.received_data) {
2850 char *ssigroup; 2850 struct aim_ssi_item *ssigroup;
2851 while (aim_ssi_inlist(odata->sess, odata->conn, name, 0x0000) && (ssigroup = aim_ssi_getparentgroup(odata->sess, odata->conn, name)) && !aim_ssi_delbuddies(odata->sess, odata->conn, ssigroup, &name, 1)) 2851 while (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, name, 0x0000) && (ssigroup = aim_ssi_itemlist_findparent(odata->sess->ssi.items, name)) && !aim_ssi_delbuddies(odata->sess, odata->conn, ssigroup->name, &name, 1))
2852 debug_printf("ssi: deleted buddy %s from group %s\n", name, group); 2852 debug_printf("ssi: deleted buddy %s from group %s\n", name, group);
2853 } 2853 }
2854 } 2854 }
2855 } 2855 }
2856 2856
2863 } else { 2863 } else {
2864 if (odata->sess->ssi.received_data) { 2864 if (odata->sess->ssi.received_data) {
2865 GList *cur; 2865 GList *cur;
2866 int tmp = 0; 2866 int tmp = 0;
2867 for (cur=buddies; cur; cur=cur->next) 2867 for (cur=buddies; cur; cur=cur->next)
2868 if (aim_ssi_inlist(odata->sess, odata->conn, cur->data, 0x0000)) 2868 if (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, cur->data, 0x0000))
2869 tmp++; 2869 tmp++;
2870 if (tmp) { 2870 if (tmp) {
2871 char **sns; 2871 char **sns;
2872 sns = (char **)malloc(tmp*sizeof(char*)); 2872 sns = (char **)malloc(tmp*sizeof(char*));
2873 tmp = 0; 2873 tmp = 0;
2874 for (cur=buddies; cur; cur=cur->next) 2874 for (cur=buddies; cur; cur=cur->next)
2875 if (aim_ssi_inlist(odata->sess, odata->conn, cur->data, 0x0000)) { 2875 if (aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, cur->data, 0x0000)) {
2876 debug_printf("ssi: deleting buddy %s from group %s\n", cur->data, group); 2876 debug_printf("ssi: deleting buddy %s from group %s\n", cur->data, group);
2877 sns[tmp] = cur->data; 2877 sns[tmp] = cur->data;
2878 tmp++; 2878 tmp++;
2879 } 2879 }
2880 aim_ssi_delbuddies(odata->sess, odata->conn, group, sns, tmp); 2880 aim_ssi_delbuddies(odata->sess, odata->conn, group, sns, tmp);
2917 /* Activate SSI */ 2917 /* Activate SSI */
2918 debug_printf("ssi: activating server-stored buddy list\n"); 2918 debug_printf("ssi: activating server-stored buddy list\n");
2919 aim_ssi_enable(sess, fr->conn); 2919 aim_ssi_enable(sess, fr->conn);
2920 2920
2921 /* Clean the buddy list */ 2921 /* Clean the buddy list */
2922 /* aim_ssi_cleanlist(sess, fr->conn); */ 2922 aim_ssi_cleanlist(sess, fr->conn);
2923 2923
2924 /* Add from server list to local list */ 2924 /* Add from server list to local list */
2925 tmp = 0; 2925 tmp = 0;
2926 for (curitem=sess->ssi.items; curitem; curitem=curitem->next) { 2926 for (curitem=sess->ssi.items; curitem; curitem=curitem->next) {
2927 switch (curitem->type) { 2927 switch (curitem->type) {
2970 break; 2970 break;
2971 2971
2972 case 0x0004: /* Permit/deny setting */ 2972 case 0x0004: /* Permit/deny setting */
2973 if (curitem->data) { 2973 if (curitem->data) {
2974 fu8_t permdeny; 2974 fu8_t permdeny;
2975 if ((permdeny = aim_ssi_getpermdeny(sess, fr->conn)) && (permdeny != gc->permdeny)) { 2975 if ((permdeny = aim_ssi_getpermdeny(sess->ssi.items)) && (permdeny != gc->permdeny)) {
2976 debug_printf("ssi: changing permdeny from %d to %d\n", gc->permdeny, permdeny); 2976 debug_printf("ssi: changing permdeny from %d to %d\n", gc->permdeny, permdeny);
2977 gc->permdeny = permdeny; 2977 gc->permdeny = permdeny;
2978 tmp++; 2978 tmp++;
2979 } 2979 }
2980 } 2980 }
2996 cur = gc->groups; 2996 cur = gc->groups;
2997 while (cur) { 2997 while (cur) {
2998 GSList *curbud; 2998 GSList *curbud;
2999 tmp = 0; 2999 tmp = 0;
3000 for (curbud=((struct group*)cur->data)->members; curbud; curbud=curbud->next) 3000 for (curbud=((struct group*)cur->data)->members; curbud; curbud=curbud->next)
3001 if (!aim_ssi_inlist(sess, fr->conn, ((struct buddy*)curbud->data)->name, 0x0000)) 3001 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000))
3002 tmp++; 3002 tmp++;
3003 if (tmp) { 3003 if (tmp) {
3004 sns = (char **)malloc(tmp*sizeof(char*)); 3004 sns = (char **)malloc(tmp*sizeof(char*));
3005 tmp = 0; 3005 tmp = 0;
3006 for (curbud=((struct group*)cur->data)->members; curbud; curbud=curbud->next) 3006 for (curbud=((struct group*)cur->data)->members; curbud; curbud=curbud->next)
3007 if (!aim_ssi_inlist(sess, fr->conn, ((struct buddy*)curbud->data)->name, 0x0000)) { 3007 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) {
3008 debug_printf("ssi: adding buddy %s from local list to server list\n", ((struct buddy*)curbud->data)->name); 3008 debug_printf("ssi: adding buddy %s from local list to server list\n", ((struct buddy*)curbud->data)->name);
3009 sns[tmp] = ((char *)((struct buddy*)curbud->data)->name); 3009 sns[tmp] = ((char *)((struct buddy*)curbud->data)->name);
3010 tmp++; 3010 tmp++;
3011 } 3011 }
3012 aim_ssi_addbuddies(sess, fr->conn, ((struct group*)cur->data)->name, sns, tmp); 3012 aim_ssi_addbuddies(sess, fr->conn, ((struct group*)cur->data)->name, sns, tmp);
3017 3017
3018 /* Permit list */ 3018 /* Permit list */
3019 if (gc->permit) { 3019 if (gc->permit) {
3020 tmp = 0; 3020 tmp = 0;
3021 for (cur=gc->permit; cur; cur=cur->next) 3021 for (cur=gc->permit; cur; cur=cur->next)
3022 if (!aim_ssi_inlist(sess, fr->conn, cur->data, 0x0002)) 3022 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0002))
3023 tmp++; 3023 tmp++;
3024 if (tmp) { 3024 if (tmp) {
3025 sns = (char **)malloc(tmp*sizeof(char*)); 3025 sns = (char **)malloc(tmp*sizeof(char*));
3026 tmp = 0; 3026 tmp = 0;
3027 for (cur=gc->permit; cur; cur=cur->next) 3027 for (cur=gc->permit; cur; cur=cur->next)
3028 if (!aim_ssi_inlist(sess, fr->conn, cur->data, 0x0002)) { 3028 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0002)) {
3029 debug_printf("ssi: adding permit %s from local list to server list\n", cur->data); 3029 debug_printf("ssi: adding permit %s from local list to server list\n", cur->data);
3030 sns[tmp] = cur->data; 3030 sns[tmp] = cur->data;
3031 tmp++; 3031 tmp++;
3032 } 3032 }
3033 aim_ssi_addpord(sess, fr->conn, sns, tmp, AIM_SSI_TYPE_PERMIT); 3033 aim_ssi_addpord(sess, fr->conn, sns, tmp, AIM_SSI_TYPE_PERMIT);
3037 3037
3038 /* Deny list */ 3038 /* Deny list */
3039 if (gc->deny) { 3039 if (gc->deny) {
3040 tmp = 0; 3040 tmp = 0;
3041 for (cur=gc->deny; cur; cur=cur->next) 3041 for (cur=gc->deny; cur; cur=cur->next)
3042 if (!aim_ssi_inlist(sess, fr->conn, cur->data, 0x0003)) 3042 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0003))
3043 tmp++; 3043 tmp++;
3044 if (tmp) { 3044 if (tmp) {
3045 sns = (char **)malloc(tmp*sizeof(char*)); 3045 sns = (char **)malloc(tmp*sizeof(char*));
3046 tmp = 0; 3046 tmp = 0;
3047 for (cur=gc->deny; cur; cur=cur->next) 3047 for (cur=gc->deny; cur; cur=cur->next)
3048 if (!aim_ssi_inlist(sess, fr->conn, cur->data, 0x0003)) { 3048 if (!aim_ssi_itemlist_finditem(sess->ssi.items, NULL, cur->data, 0x0003)) {
3049 debug_printf("ssi: adding deny %s from local list to server list\n", cur->data); 3049 debug_printf("ssi: adding deny %s from local list to server list\n", cur->data);
3050 sns[tmp] = cur->data; 3050 sns[tmp] = cur->data;
3051 tmp++; 3051 tmp++;
3052 } 3052 }
3053 aim_ssi_addpord(sess, fr->conn, sns, tmp, AIM_SSI_TYPE_DENY); 3053 aim_ssi_addpord(sess, fr->conn, sns, tmp, AIM_SSI_TYPE_DENY);
3054 free(sns); 3054 free(sns);
3055 } 3055 }
3056 } 3056 }
3057 3057
3058 /* Presence settings (idle time visibility) */ 3058 /* Presence settings (idle time visibility) */
3059 if ((tmp = aim_ssi_getpresence(sess, fr->conn)) != 0xFFFFFFFF) 3059 if ((tmp = aim_ssi_getpresence(sess->ssi.items)) != 0xFFFFFFFF)
3060 if (report_idle && !(tmp & 0x400)) 3060 if (report_idle && !(tmp & 0x400))
3061 aim_ssi_setpresence(sess, fr->conn, tmp | 0x400); 3061 aim_ssi_setpresence(sess, fr->conn, tmp | 0x400);
3062 } 3062
3063 /* Check for maximum number of buddies */
3064 for (cur=gc->groups, tmp=0; cur; cur=g_slist_next(cur)) {
3065 tmp = tmp + g_slist_length(cur->data->members);
3066
3067 if (tmp > odata->rights.maxbuddies) {
3068 char *dialog_msg = g_strdup_printf(_("The maximum number of buddies allowed in your buddy list is %d, and you have %d."
3069 " Until you are below the limit, some buddies will not show up as online."),
3070 odata->rights.maxbuddies, tmp);
3071 do_error_dialog(dialog_msg, _("Gaim - Warning"));
3072 g_free(dialog_msg);
3073 }
3074
3075 } /* end if (gc) */
3063 3076
3064 return 1; 3077 return 1;
3065 } 3078 }
3066 3079
3067 static GList *oscar_chat_info(struct gaim_connection *gc) { 3080 static GList *oscar_chat_info(struct gaim_connection *gc) {
3518 break; 3531 break;
3519 } 3532 }
3520 signoff_blocked(gc); 3533 signoff_blocked(gc);
3521 } else { 3534 } else {
3522 if (od->sess->ssi.received_data) 3535 if (od->sess->ssi.received_data)
3523 aim_ssi_setpermdeny(od->sess, od->conn, gc->permdeny); 3536 aim_ssi_setpermdeny(od->sess, od->conn, gc->permdeny, 0xffffffff);
3524 } 3537 }
3525 } 3538 }
3526 3539
3527 static void oscar_add_permit(struct gaim_connection *gc, char *who) { 3540 static void oscar_add_permit(struct gaim_connection *gc, char *who) {
3528 struct oscar_data *od = (struct oscar_data *)gc->proto_data; 3541 struct oscar_data *od = (struct oscar_data *)gc->proto_data;