⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messages.c

📁 AnyQ服务端源代码(2004/10/28)源码
💻 C
字号:
/** Jabber AIM-Transport libfaim interface**/#include "aimtrans.h"#include "utf8.h"int at_parse_incoming_im(aim_session_t *ass,                         aim_frame_t *command, ...){    int channel;    va_list ap;    aim_userinfo_t *userinfo;    at_session s;    ati ti;    at_buddy buddy;    unsigned int idle;    char *utf8_str, *msg_plain, *msg_xhtml;    utf8_str = malloc(8192);  // don't forget to free this!    msg_plain = malloc(8192);    msg_xhtml = malloc(8192);    s = (at_session)ass->aux_data;    ti = s->ti;    va_start(ap, command);    channel = va_arg(ap, int);    userinfo = va_arg(ap, aim_userinfo_t *);    buddy = xhash_get(s->buddies, at_normalize(userinfo->sn));    //how long since buddy sent an im?    if (buddy != NULL)        idle = ((unsigned int)time(NULL) - (unsigned int)buddy->lastactivity);    /*    * Channel 1: Standard Message    */    if (channel == 1)    {        struct aim_incomingim_ch1_args *args;        char *msg;        char *fullmsg, *fullmsg_xhtml;        int i;        u_int icbmflags = 0;        u_short flag1, flag2;        jpacket jp;        xmlnode par;        xmlnode node, node_xhtml;        jid from;        args = va_arg(ap, struct aim_incomingim_ch1_args *);        va_end(ap);#if 0        if (args->icbmflags & AIM_IMFLAG_HASICON)        {            if (args->iconstamp > buddy->iconstamp)            {                // Send the IM to req it?            }        }#endif        par = xmlnode_new_tag("message");        xmlnode_put_attrib(par, "type", "chat");        xmlnode_put_attrib(par, "to", jid_full(s->cur));        xmlnode_put_attrib(par, "from", ti->i->id);        jp = jpacket_new(par);        msg = args->msg;        icbmflags = args->icbmflags; // this seemed to be missing?        // only convert if AIM        if (!s->icq)        {            if (icbmflags & AIM_IMFLAGS_UNICODE)            {                unicode_to_utf8(msg, (args->msglen) / 2, utf8_str, 8192);                msg = utf8_str;            }            else            {                msg = (char *)str_to_UTF8(jp->p, (unsigned char*)msg);            }            msgconv_aim2plain(msg, msg_plain, 8192);            msgconv_aim2xhtml(msg, msg_xhtml, 8192);        }        else        {            msg = (char *)str_to_UTF8(jp->p, (unsigned char *)msg);            strncpy(msg_plain, msg, 8191);            strncpy(msg_xhtml, msg, 8191);            msg_plain[8191] = 0;            msg_xhtml[8191] = 0;        }        node = xmlnode_insert_tag(jp->x, "body");        //node_xhtml = xmlnode_insert_tag(jp->x, "html");        fullmsg = pmalloco(xmlnode_pool(node), strlen(msg_plain) + 30);        //fullmsg_xhtml = pmalloco(xmlnode_pool(node_xhtml), strlen(msg_xhtml) + 30);        fullmsg[0] = 0;        //fullmsg_xhtml[0] = 0;        // Autoreply?        if (icbmflags & AIM_IMFLAGS_AWAY)        {            strcat(fullmsg, "(AutoReply) ");            //strcat(fullmsg_xhtml, "(AutoReply) ");        }        strcat(fullmsg, msg_plain);        //strcat(fullmsg_xhtml, msg_xhtml);        // Sending autoreply?        if (s->away && buddy != NULL &&                ((s->awaysetat != buddy->sawawaymsg) || (idle > 300)) &&                (!(icbmflags & AIM_IMFLAGS_AWAY)) &&                !s->icq)        {            struct aim_sendimext_args args;            unsigned char *unistr;            unsigned short unilen;            unistr = malloc(8192);            args.destsn = userinfo->sn;            args.flags = s->icq ? AIM_IMFLAGS_OFFLINE : 0;            args.flags |= AIM_IMFLAGS_AWAY;            //aim user will now see away msg:            buddy->sawawaymsg = s->awaysetat;            // simple enough to be ascii ?            if (isAscii(s->status))            {                args.msg = s->status;                args.msglen = strlen(s->status);            }            // unicode            else            {                unilen = utf8_to_unicode(s->status, unistr, 8192);                args.flags |= AIM_IMFLAGS_UNICODE;                args.msg = unistr;                args.msglen = unilen * 2;  // length has to be in bytes, not wchars            }            aim_send_im_ext(ass, &args);            free(unistr);            strcat(fullmsg, " (Sent AutoReply)");            //strcat(fullmsg_xhtml, " (Sent AutoReply)");        }        //now it's been zero seconds since the last im from the aim user:        if (buddy != NULL)            buddy->lastactivity = time(NULL);        // attach the body        xmlnode_insert_cdata(node, fullmsg, strlen(fullmsg));        // attach xhtml        //xmlnode_put_attrib(node_xhtml, "xmlns", "http://www.w3.org/1999/xhtml");        //xmlnode_insert_cdata(node_xhtml, fullmsg_xhtml, strlen(fullmsg_xhtml));        jid_set(jp->from, at_normalize((char *)userinfo->sn), JID_USER);        xmlnode_put_attrib(jp->x, "from", jid_full(jp->from));        log_debug(ZONE, "[AIM] Sending: %s\n", xmlnode2str(jp->x));        at_deliver(ti,jp->x);        pth_wait(NULL);    }    else if (channel == 2)    {        /* XXX decide how to handle groupchat requests */        /* XXX Actualy parse and use this */        struct aim_incomingim_ch2_args *args;        args = va_arg(ap, struct aim_incomingim_ch2_args *);        va_end(ap);#if 0        switch (args->reqclass)        {        case AIM_CAPS_BUDDYICON:            if (buddy->icon != NULL)                free(buddy->icon);            memcpy(buddy->icon, args->info.icon.icon);            buddy->iconlen = args->info.icon.length;            break;        }#endif    }    // free!    free(utf8_str);    free(msg_plain);    free(msg_xhtml);    return 1;}int at_offlinemsg(aim_session_t *sess,                  aim_frame_t *command, ...){    va_list ap;    struct aim_icq_offlinemsg *msg;    struct gaim_connection *gc = sess->aux_data;    at_session s;    ati ti;    va_start(ap, command);    msg = va_arg(ap, struct aim_icq_offlinemsg *);    va_end(ap);    s = (at_session)sess->aux_data;    ti = s->ti;    if (msg->type == 0x0001)    {        xmlnode x;        xmlnode body;        jpacket jp;        char *cmsg;        char *fmsg;        char sender[128];        snprintf(sender, sizeof(sender), "%lu@%s", msg->sender, ti->i->id);        x = xmlnode_new_tag("message");        xmlnode_put_attrib(x, "to", jid_full(s->cur));        xmlnode_put_attrib(x, "from", sender);        jp = jpacket_new(x);        body = xmlnode_insert_tag(jp->x, "body");        cmsg = strip_html(msg->msg, jp->p);        cmsg = (char *)str_to_UTF8(jp->p, (unsigned char *)cmsg);        fmsg = pmalloco(xmlnode_pool(body), strlen(cmsg) + 3);        strcat(fmsg, cmsg);        xmlnode_insert_cdata(body, fmsg, strlen(fmsg));        at_deliver(ti,x);    }    else    {        log_debug(ZONE, "[AIM] unknown offline message type 0x%04x\n", msg->type);    }    return 1;}int at_offlinemsgdone(aim_session_t *sess,                      aim_frame_t *command, ...){    aim_icq_ackofflinemsgs(sess);    return 1;}int at_icq_smsresponse(aim_session_t *sess,                       aim_frame_t *command, ...){    va_list ap;    struct aim_icq_smsresponse *msg;    struct gaim_connection *gc = sess->aux_data;    at_session s;    ati ti;    va_start(ap, command);    msg = va_arg(ap, struct aim_icq_smsresponse *);    va_end(ap);    s = (at_session)sess->aux_data;    ti = s->ti;    if (msg->type == 150)    {        xmlnode x;        xmlnode body;        jpacket jp;        char *smsg = "SMS has been sent.";        char *fmsg;        x = xmlnode_new_tag("message");        xmlnode_put_attrib(x, "to", jid_full(s->cur));        xmlnode_put_attrib(x, "from", ti->i->id);        jp = jpacket_new(x);        body = xmlnode_insert_tag(jp->x, "body");        fmsg = pmalloco(xmlnode_pool(body), strlen(smsg) + 3);        strcat(fmsg, smsg);        xmlnode_insert_cdata(body, fmsg, strlen(fmsg));        at_deliver(ti,x);    }    return 1;}int at_parse_misses(aim_session_t *sess,                    aim_frame_t *command, ...){    xmlnode x;    xmlnode body;    at_session s;    ati ti;    static char *missedreasons[] = {                                       "Unknown",                                       "Message too large",                                       "Rate limit exceeded",                                       "Sender is too evil",                                       "You are too evil"};    static int missedreasonslen = 5;    va_list ap;    unsigned short chan, nummissed, reason;    aim_userinfo_t *userinfo;    char msg[1024];    s = (at_session)sess->aux_data;    ti = s->ti;    x = xmlnode_new_tag("message");    xmlnode_put_attrib(x, "to", jid_full(s->cur));    xmlnode_put_attrib(x, "from", jid_full(s->from));    xmlnode_put_attrib(x, "type", "error");    body = xmlnode_insert_tag(x, "error");    va_start(ap, command);    chan = va_arg(ap, u_int);    userinfo = va_arg(ap, aim_userinfo_t *);    nummissed = va_arg(ap, u_int);    reason = va_arg(ap, u_int);    va_end(ap);    memset(&msg, '\0', 1024);    snprintf((char *)&msg, 1024, "Missed %d messages from %s (reason %d: %s)",             nummissed, userinfo->sn, reason,             (reason < missedreasonslen) ? missedreasons[reason] : "unknown");    xmlnode_insert_cdata(body, (char *)&msg, strlen((char *)&msg));    at_deliver(ti,x);    return 1;}int at_parse_msgerr(aim_session_t *sess, aim_frame_t *command, ...){    xmlnode x;    xmlnode body;    jpacket jp;    at_session s;    ati ti;    char msg[1024];    va_list ap;    char *destsn;    unsigned short reason;    va_start(ap, command);    reason = va_arg(ap, u_int);    destsn = va_arg(ap, char *);    va_end(ap);    memset((char *)&msg, '\0', 1024);    snprintf((char *)&msg, 1024,             "faimtest: message to %s bounced (reason 0x%04x: %s)\n",             destsn, reason,             (reason < msgerrreasonslen) ? msgerrreasons[reason] : "unknown");    s = (at_session)sess->aux_data;    ti = s->ti;    x = xmlnode_new_tag("message");    xmlnode_put_attrib(x, "to", jid_full(s->cur));    xmlnode_put_attrib(x, "from", jid_full(s->from));    xmlnode_put_attrib(x, "type", "error");    body = xmlnode_insert_tag(x, "error");    xmlnode_insert_cdata(body, (char *)&msg, strlen((char *)&msg));    at_deliver(ti,x);    return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -