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