Mercurial > pidgin
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; |