comparison src/protocols/oscar/oscar.c @ 3595:1e60a05c7482

[gaim-migrate @ 3697] This adds le non-direct connect typing notification for oscar. How it works, in a nutshell: -AIM servers append a flag telling remote clients you support typing notification -You tell the AIM servers you support typing notification when you sign on (by changing the "flags" passed to aim_seticbmparam()) -Clients send little typing notification messages to other clients, but only when they know that the other client supports it (so after you've received an IM from the other person) I also fixed a compile warning or two dealing with SSI stuff. Things to look out for: -ICQ states doing weird things -Typing notification works with MacAIM clients (iChat and the official one) -Typing notification doesn't try to send stuff to clients that don't support (I have no idea how you're supposed to look out for this. It should be ok) committer: Tailor Script <tailor@pidgin.im>
author Mark Doliner <mark@kingant.net>
date Sun, 06 Oct 2002 03:08:47 +0000
parents 8b3491f1ca56
children bb966d68f9e3
comparison
equal deleted inserted replaced
3594:17e6dd05666a 3595:1e60a05c7482
68 #define UC_ADMIN 0x04 68 #define UC_ADMIN 0x04
69 #define UC_UNCONFIRMED 0x08 69 #define UC_UNCONFIRMED 0x08
70 #define UC_NORMAL 0x10 70 #define UC_NORMAL 0x10
71 #define UC_AB 0x20 71 #define UC_AB 0x20
72 #define UC_WIRELESS 0x40 72 #define UC_WIRELESS 0x40
73 #define UC_TYPINGNOT 0x80
73 74
74 #define AIMHASHDATA "http://gaim.sourceforge.net/aim_data.php3" 75 #define AIMHASHDATA "http://gaim.sourceforge.net/aim_data.php3"
75 76
76 static int caps_aim = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_IMIMAGE; 77 static int caps_aim = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_IMIMAGE;
77 /* What does AIM_CAPS_ICQ actually mean? -SE */
78 /* static int caps_icq = AIM_CAPS_ICQ; */
79 78
80 /* Set AIM caps, because Gaim can still do them over ICQ and 79 /* Set AIM caps, because Gaim can still do them over ICQ and
81 * Winicq doesn't mind. */ 80 * Winicq doesn't mind. */
82 static int caps_icq = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_IMIMAGE; 81 static int caps_icq = AIM_CAPS_CHAT | AIM_CAPS_BUDDYICON | AIM_CAPS_IMIMAGE;
82 /* static int caps_icq = AIM_CAPS_ICQ; */
83 /* What does AIM_CAPS_ICQ actually mean? -SE */
83 84
84 static fu8_t gaim_features[] = {0x01, 0x01, 0x01, 0x02}; 85 static fu8_t gaim_features[] = {0x01, 0x01, 0x01, 0x02};
85 86
86 struct oscar_data { 87 struct oscar_data {
87 aim_session_t *sess; 88 aim_session_t *sess;
267 static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...); 268 static int conninitdone_bos (aim_session_t *, aim_frame_t *, ...);
268 static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...); 269 static int conninitdone_admin (aim_session_t *, aim_frame_t *, ...);
269 static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...); 270 static int conninitdone_chat (aim_session_t *, aim_frame_t *, ...);
270 static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...); 271 static int conninitdone_chatnav (aim_session_t *, aim_frame_t *, ...);
271 static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...); 272 static int gaim_parse_msgerr (aim_session_t *, aim_frame_t *, ...);
273 static int gaim_parse_mtn (aim_session_t *, aim_frame_t *, ...);
272 static int gaim_parse_locaterights(aim_session_t *, aim_frame_t *, ...); 274 static int gaim_parse_locaterights(aim_session_t *, aim_frame_t *, ...);
273 static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...); 275 static int gaim_parse_buddyrights(aim_session_t *, aim_frame_t *, ...);
274 static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...); 276 static int gaim_parse_locerr (aim_session_t *, aim_frame_t *, ...);
275 static int gaim_icbm_param_info (aim_session_t *, aim_frame_t *, ...); 277 static int gaim_icbm_param_info (aim_session_t *, aim_frame_t *, ...);
276 static int gaim_parse_genericerr (aim_session_t *, aim_frame_t *, ...); 278 static int gaim_parse_genericerr (aim_session_t *, aim_frame_t *, ...);
706 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_ratechange, 0); 708 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_RATECHANGE, gaim_parse_ratechange, 0);
707 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, gaim_parse_evilnotify, 0); 709 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_EVIL, gaim_parse_evilnotify, 0);
708 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, AIM_CB_LOK_ERROR, gaim_parse_searcherror, 0); 710 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, AIM_CB_LOK_ERROR, gaim_parse_searcherror, 0);
709 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, 0x0003, gaim_parse_searchreply, 0); 711 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOK, 0x0003, gaim_parse_searchreply, 0);
710 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_msgerr, 0); 712 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ERROR, gaim_parse_msgerr, 0);
713 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_MTN, gaim_parse_mtn, 0);
711 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_user_info, 0); 714 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_LOC, AIM_CB_LOC_USERINFO, gaim_parse_user_info, 0);
712 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, gaim_parse_msgack, 0); 715 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_MSG, AIM_CB_MSG_ACK, gaim_parse_msgack, 0);
713 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_MOTD, gaim_parse_motd, 0); 716 aim_conn_addhandler(sess, bosconn, AIM_CB_FAM_GEN, AIM_CB_GEN_MOTD, gaim_parse_motd, 0);
714 aim_conn_addhandler(sess, bosconn, 0x0004, 0x0005, gaim_icbm_param_info, 0); 717 aim_conn_addhandler(sess, bosconn, 0x0004, 0x0005, gaim_icbm_param_info, 0);
715 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, gaim_parse_genericerr, 0); 718 aim_conn_addhandler(sess, bosconn, 0x0001, 0x0001, gaim_parse_genericerr, 0);
1184 type |= UC_UNAVAILABLE; 1187 type |= UC_UNAVAILABLE;
1185 if (info->flags & AIM_FLAG_WIRELESS) 1188 if (info->flags & AIM_FLAG_WIRELESS)
1186 type |= UC_WIRELESS; 1189 type |= UC_WIRELESS;
1187 } 1190 }
1188 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) { 1191 if (info->present & AIM_USERINFO_PRESENT_ICQEXTSTATUS) {
1189 type = (info->icqinfo.status << 7); 1192 type = (info->icqinfo.status << 16);
1190 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) && 1193 if (!(info->icqinfo.status & AIM_ICQ_STATE_CHAT) &&
1191 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) { 1194 (info->icqinfo.status != AIM_ICQ_STATE_NORMAL)) {
1192 type |= UC_UNAVAILABLE; 1195 type |= UC_UNAVAILABLE;
1193 } 1196 }
1194 } 1197 }
1402 g_snprintf(tmp+strlen(tmp), BUF_LONG-strlen(tmp), "&#%04x;", uni); 1405 g_snprintf(tmp+strlen(tmp), BUF_LONG-strlen(tmp), "&#%04x;", uni);
1403 } 1406 }
1404 } 1407 }
1405 } else 1408 } else
1406 g_snprintf(tmp, BUF_LONG, "%s", args->msg); 1409 g_snprintf(tmp, BUF_LONG, "%s", args->msg);
1410
1411 if (args->icbmflags & AIM_IMFLAGS_TYPINGNOT) {
1412 struct buddy *b = find_buddy(gc, userinfo->sn);
1413 if (b)
1414 b->uc |= UC_TYPINGNOT;
1415 }
1407 1416
1408 strip_linefeed(tmp); 1417 strip_linefeed(tmp);
1409 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL), -1); 1418 serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL), -1);
1410 g_free(tmp); 1419 g_free(tmp);
1411 1420
1822 destn = va_arg(ap, char *); 1831 destn = va_arg(ap, char *);
1823 va_end(ap); 1832 va_end(ap);
1824 1833
1825 snprintf(buf, sizeof(buf), _("Your message to %s did not get sent:"), destn); 1834 snprintf(buf, sizeof(buf), _("Your message to %s did not get sent:"), destn);
1826 do_error_dialog(buf, (reason < msgerrreasonlen) ? msgerrreason[reason] : _("No reason was given."), GAIM_ERROR); 1835 do_error_dialog(buf, (reason < msgerrreasonlen) ? msgerrreason[reason] : _("No reason was given."), GAIM_ERROR);
1836
1837 return 1;
1838 }
1839
1840 static int gaim_parse_mtn(aim_session_t *sess, aim_frame_t *fr, ...) {
1841 struct gaim_connection *gc = sess->aux_data;
1842 va_list ap;
1843 fu16_t type1, type2;
1844 char *sn;
1845
1846 va_start(ap, fr);
1847 type1 = (fu16_t)va_arg(ap, unsigned int);
1848 sn = va_arg(ap, char *);
1849 type2 = (fu16_t)va_arg(ap, unsigned int);
1850 va_end(ap);
1851
1852 debug_printf("Received an mtn from %s. Type1 is 0x%04d and type2 is 0x%04d.\n", sn, type1, type2);
1853
1854 switch (type2) {
1855 case 0x0000: { /* Text has been cleared */
1856 serv_got_typing_stopped(gc, sn);
1857 } break;
1858
1859 case 0x0001: { /* Paused typing */
1860 serv_got_typing_stopped(gc, sn);
1861 } break;
1862
1863 case 0x0002: { /* Typing */
1864 serv_got_typing(gc, sn, 0);
1865 } break;
1866
1867 default: {
1868 printf("Received unknown typing notification type.\n");
1869 } break;
1870 }
1827 1871
1828 return 1; 1872 return 1;
1829 } 1873 }
1830 1874
1831 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) { 1875 static int gaim_parse_locerr(aim_session_t *sess, aim_frame_t *fr, ...) {
2411 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0, 2455 ((float)params->maxsenderwarn)/10.0, ((float)params->maxrecverwarn)/10.0,
2412 params->minmsginterval); 2456 params->minmsginterval);
2413 */ 2457 */
2414 2458
2415 /* Maybe senderwarn and recverwarn should be user preferences... */ 2459 /* Maybe senderwarn and recverwarn should be user preferences... */
2460 params->flags = 0x0000000b;
2416 params->maxmsglen = 8000; 2461 params->maxmsglen = 8000;
2417 params->minmsginterval = 0; 2462 params->minmsginterval = 0;
2418 2463
2419 aim_seticbmparam(sess, params); 2464 aim_seticbmparam(sess, params);
2420 2465
2589 * message if the third arg is 0 (this seems really gross to me). The 2634 * message if the third arg is 0 (this seems really gross to me). The
2590 * parse-icq-status-message function knows if it is putting it's message in 2635 * parse-icq-status-message function knows if it is putting it's message in
2591 * an info window because the name will _not_ be in od->evilhack. For getting 2636 * an info window because the name will _not_ be in od->evilhack. For getting
2592 * only the away message the contact's UIN is put in od->evilhack. */ 2637 * only the away message the contact's UIN is put in od->evilhack. */
2593 if ((budlight = find_buddy(gc, who))) { 2638 if ((budlight = find_buddy(gc, who))) {
2594 if ((budlight->uc >> 7) & (AIM_ICQ_STATE_AWAY || AIM_ICQ_STATE_DND || AIM_ICQ_STATE_OUT || AIM_ICQ_STATE_BUSY || AIM_ICQ_STATE_CHAT)) { 2639 if ((budlight->uc >> 16) & (AIM_ICQ_STATE_AWAY || AIM_ICQ_STATE_DND || AIM_ICQ_STATE_OUT || AIM_ICQ_STATE_BUSY || AIM_ICQ_STATE_CHAT)) {
2595 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY) 2640 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY)
2596 g_show_info_text(gc, who, 0, buf, NULL); 2641 g_show_info_text(gc, who, 0, buf, NULL);
2597 else { 2642 else {
2598 char *state_msg = gaim_icq_status((budlight->uc & 0xff80) >> 7); 2643 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16);
2599 g_show_info_text(gc, who, 2, buf, "<B>Status:</B> ", state_msg, "<BR>\n<HR><BR><I>Remote client does not support sending status messages.</I><BR>\n", NULL); 2644 g_show_info_text(gc, who, 2, buf, "<B>Status:</B> ", state_msg, "<BR>\n<HR><BR><I>Remote client does not support sending status messages.</I><BR>\n", NULL);
2600 free(state_msg); 2645 free(state_msg);
2601 } 2646 }
2602 } else { 2647 } else {
2603 char *state_msg = gaim_icq_status((budlight->uc & 0xff80) >> 7); 2648 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16);
2604 g_show_info_text(gc, who, 2, buf, "<B>Status:</B> ", state_msg, NULL); 2649 g_show_info_text(gc, who, 2, buf, "<B>Status:</B> ", state_msg, NULL);
2605 free(state_msg); 2650 free(state_msg);
2606 } 2651 }
2607 } else 2652 } else
2608 g_show_info_text(gc, who, 2, buf, NULL); 2653 g_show_info_text(gc, who, 2, buf, NULL);
2724 } 2769 }
2725 2770
2726 static int oscar_send_typing(struct gaim_connection *gc, char *name, int typing) { 2771 static int oscar_send_typing(struct gaim_connection *gc, char *name, int typing) {
2727 struct oscar_data *odata = (struct oscar_data *)gc->proto_data; 2772 struct oscar_data *odata = (struct oscar_data *)gc->proto_data;
2728 struct direct_im *dim = find_direct_im(odata, name); 2773 struct direct_im *dim = find_direct_im(odata, name);
2729 if (!dim) 2774 if (dim)
2730 return 0; 2775 aim_send_typing(odata->sess, dim->conn, typing);
2731 aim_send_typing(odata->sess, dim->conn, typing); 2776 else {
2777 struct buddy *b = find_buddy(gc, name);
2778 if (b && (b->uc & UC_TYPINGNOT)) {
2779 if (typing)
2780 aim_mtn_send(odata->sess, 0x0001, name, 0x0002);
2781 else
2782 aim_mtn_send(odata->sess, 0x0001, name, 0x0000);
2783 }
2784 }
2732 return 0; 2785 return 0;
2733 } 2786 }
2734 static void oscar_ask_direct_im(struct gaim_connection *gc, char *name); 2787 static void oscar_ask_direct_im(struct gaim_connection *gc, char *name);
2735 2788
2736 static int oscar_send_im(struct gaim_connection *gc, char *name, char *message, int len, int imflags) { 2789 static int oscar_send_im(struct gaim_connection *gc, char *name, char *message, int len, int imflags) {
2823 static void oscar_get_away(struct gaim_connection *g, char *who) { 2876 static void oscar_get_away(struct gaim_connection *g, char *who) {
2824 struct oscar_data *odata = (struct oscar_data *)g->proto_data; 2877 struct oscar_data *odata = (struct oscar_data *)g->proto_data;
2825 if (odata->icq) { 2878 if (odata->icq) {
2826 struct buddy *budlight = find_buddy(g, who); 2879 struct buddy *budlight = find_buddy(g, who);
2827 if (budlight) 2880 if (budlight)
2828 if ((budlight->uc & 0xff80) >> 7) 2881 if ((budlight->uc & 0xffff0000) >> 16)
2829 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY) 2882 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY)
2830 aim_send_im_ch2_geticqmessage(odata->sess, who, (budlight->uc & 0xff80) >> 7); 2883 aim_send_im_ch2_geticqmessage(odata->sess, who, (budlight->uc & 0xffff0000) >> 16);
2831 else 2884 else
2832 debug_printf("Error: Remote client does not support retrieval of status messages.\n"); 2885 debug_printf("Error: Remote client does not support retrieval of status messages.\n");
2833 else 2886 else
2834 debug_printf("Error: The user %s has no status message, therefore not requesting.\n", who); 2887 debug_printf("Error: The user %s has no status message, therefore not requesting.\n", who);
2835 else 2888 else
3024 if (!aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) { 3077 if (!aim_ssi_itemlist_finditem(odata->sess->ssi.items, NULL, ((struct buddy*)curbud->data)->name, 0x0000)) {
3025 debug_printf("ssi: adding buddy %s to group %s\n", ((struct buddy*)curbud->data)->name, ((struct group*)curgrp->data)->name); 3078 debug_printf("ssi: adding buddy %s to group %s\n", ((struct buddy*)curbud->data)->name, ((struct group*)curgrp->data)->name);
3026 sns[tmp] = (char *)((struct buddy*)curbud->data)->name; 3079 sns[tmp] = (char *)((struct buddy*)curbud->data)->name;
3027 tmp++; 3080 tmp++;
3028 } 3081 }
3029 aim_ssi_addbuddies(odata->sess, odata->conn, ((struct group*)curgrp->data)->name, sns, tmp); 3082 aim_ssi_addbuddies(odata->sess, odata->conn, ((struct group*)curgrp->data)->name, (const char**)sns, tmp);
3030 free(sns); 3083 free(sns);
3031 } 3084 }
3032 } 3085 }
3033 } 3086 }
3034 } 3087 }
3446 } 3499 }
3447 3500
3448 static char **oscar_list_icon(int uc) { 3501 static char **oscar_list_icon(int uc) {
3449 if (uc == 0) 3502 if (uc == 0)
3450 return (char **)icon_online_xpm; 3503 return (char **)icon_online_xpm;
3451 if (uc & 0xff80) { 3504 if (uc & 0xffff0000) {
3452 uc >>= 7; 3505 uc >>= 16;
3453 if (uc & AIM_ICQ_STATE_INVISIBLE) 3506 if (uc & AIM_ICQ_STATE_INVISIBLE)
3454 return icon_offline_xpm; 3507 return icon_offline_xpm;
3455 if (uc & AIM_ICQ_STATE_CHAT) 3508 if (uc & AIM_ICQ_STATE_CHAT)
3456 return icon_ffc_xpm; 3509 return icon_ffc_xpm;
3457 if (uc & AIM_ICQ_STATE_DND) 3510 if (uc & AIM_ICQ_STATE_DND)
3652 struct oscar_data *od = gc->proto_data; 3705 struct oscar_data *od = gc->proto_data;
3653 od->evilhack = g_slist_append(od->evilhack, g_strdup(normalize(who))); 3706 od->evilhack = g_slist_append(od->evilhack, g_strdup(normalize(who)));
3654 if (od->icq) { 3707 if (od->icq) {
3655 struct buddy *budlight = find_buddy(gc, who); 3708 struct buddy *budlight = find_buddy(gc, who);
3656 if (budlight) 3709 if (budlight)
3657 if ((budlight->uc >> 7) & (AIM_ICQ_STATE_AWAY || AIM_ICQ_STATE_DND || AIM_ICQ_STATE_OUT || AIM_ICQ_STATE_BUSY || AIM_ICQ_STATE_CHAT)) 3710 if ((budlight->uc >> 16) & (AIM_ICQ_STATE_AWAY || AIM_ICQ_STATE_DND || AIM_ICQ_STATE_OUT || AIM_ICQ_STATE_BUSY || AIM_ICQ_STATE_CHAT))
3658 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY) 3711 if (budlight->caps & AIM_CAPS_ICQSERVERRELAY)
3659 aim_send_im_ch2_geticqmessage(od->sess, who, (budlight->uc & 0xff80) >> 7); 3712 aim_send_im_ch2_geticqmessage(od->sess, who, (budlight->uc & 0xffff0000) >> 16);
3660 else { 3713 else {
3661 char *state_msg = gaim_icq_status((budlight->uc & 0xff80) >> 7); 3714 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16);
3662 char *dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<BR><HR><BR><I>Remote client does not support sending status messages.</I><BR>"), who, state_msg); 3715 char *dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<BR><HR><BR><I>Remote client does not support sending status messages.</I><BR>"), who, state_msg);
3663 g_show_info_text(gc, who, 2, dialog_msg, NULL); 3716 g_show_info_text(gc, who, 2, dialog_msg, NULL);
3664 free(state_msg); 3717 free(state_msg);
3665 free(dialog_msg); 3718 free(dialog_msg);
3666 } 3719 }
3667 else { 3720 else {
3668 char *state_msg = gaim_icq_status((budlight->uc & 0xff80) >> 7); 3721 char *state_msg = gaim_icq_status((budlight->uc & 0xffff0000) >> 16);
3669 char *dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<BR><HR><BR><I>User has no status message.</I><BR>"), who, state_msg); 3722 char *dialog_msg = g_strdup_printf(_("<B>UIN:</B> %s<BR><B>Status:</B> %s<BR><HR><BR><I>User has no status message.</I><BR>"), who, state_msg);
3670 g_show_info_text(gc, who, 2, dialog_msg, NULL); 3723 g_show_info_text(gc, who, 2, dialog_msg, NULL);
3671 free(state_msg); 3724 free(state_msg);
3672 free(dialog_msg); 3725 free(dialog_msg);
3673 } 3726 }
3811 if (gc->permdeny != 3) return; 3864 if (gc->permdeny != 3) return;
3812 oscar_set_permit_deny(gc); 3865 oscar_set_permit_deny(gc);
3813 } else { 3866 } else {
3814 debug_printf("ssi: About to delete a permit\n"); 3867 debug_printf("ssi: About to delete a permit\n");
3815 if (od->sess->ssi.received_data) 3868 if (od->sess->ssi.received_data)
3816 aim_ssi_delpord(od->sess, od->conn, &who, 1, AIM_SSI_TYPE_PERMIT); 3869 aim_ssi_delpord(od->sess, od->conn, (const char **) &who, 1, AIM_SSI_TYPE_PERMIT);
3817 } 3870 }
3818 } 3871 }
3819 3872
3820 static void oscar_rem_deny(struct gaim_connection *gc, char *who) { 3873 static void oscar_rem_deny(struct gaim_connection *gc, char *who) {
3821 struct oscar_data *od = (struct oscar_data *)gc->proto_data; 3874 struct oscar_data *od = (struct oscar_data *)gc->proto_data;
3823 if (gc->permdeny != 4) return; 3876 if (gc->permdeny != 4) return;
3824 oscar_set_permit_deny(gc); 3877 oscar_set_permit_deny(gc);
3825 } else { 3878 } else {
3826 debug_printf("ssi: About to delete a deny\n"); 3879 debug_printf("ssi: About to delete a deny\n");
3827 if (od->sess->ssi.received_data) 3880 if (od->sess->ssi.received_data)
3828 aim_ssi_delpord(od->sess, od->conn, &who, 1, AIM_SSI_TYPE_DENY); 3881 aim_ssi_delpord(od->sess, od->conn, (const char **) &who, 1, AIM_SSI_TYPE_DENY);
3829 } 3882 }
3830 } 3883 }
3831 3884
3832 static GList *oscar_away_states(struct gaim_connection *gc) 3885 static GList *oscar_away_states(struct gaim_connection *gc)
3833 { 3886 {