aboutsummaryrefslogtreecommitdiffstats
path: root/protocols/oscar/im.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/oscar/im.c')
-rw-r--r--protocols/oscar/im.c586
1 files changed, 0 insertions, 586 deletions
diff --git a/protocols/oscar/im.c b/protocols/oscar/im.c
index a01a2614..05e06e91 100644
--- a/protocols/oscar/im.c
+++ b/protocols/oscar/im.c
@@ -23,22 +23,6 @@
#include "im.h"
#include "info.h"
-/* This should be endian-safe now... but who knows... */
-guint16 aim_iconsum(const guint8 *buf, int buflen)
-{
- guint32 sum;
- int i;
-
- for (i = 0, sum = 0; i + 1 < buflen; i += 2)
- sum += (buf[i+1] << 8) + buf[i];
- if (i < buflen)
- sum += buf[i];
-
- sum = ((sum & 0xffff0000) >> 16) + (sum & 0x0000ffff);
-
- return (guint16)sum;
-}
-
/*
* Send an ICBM (instant message).
*
@@ -305,483 +289,6 @@ int aim_send_im(aim_session_t *sess, const char *destsn, guint16 flags, const ch
return aim_send_im_ext(sess, &args);
}
-/*
- * This is also performance sensitive. (If you can believe it...)
- *
- */
-int aim_send_icon(aim_session_t *sess, const char *sn, const guint8 *icon, int iconlen, time_t stamp, guint16 iconsum)
-{
- aim_conn_t *conn;
- int i;
- guint8 ck[8];
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
- return -EINVAL;
-
- if (!sn || !icon || (iconlen <= 0) || (iconlen >= MAXICONLEN))
- return -EINVAL;
-
- for (i = 0; i < 8; i++)
- aimutil_put8(ck+i, (guint8) rand());
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sn)+2+2+2+8+16+2+2+2+2+2+2+2+4+4+4+iconlen+strlen(AIM_ICONIDENT)+2+2)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
-
- /*
- * Cookie
- */
- aimbs_putraw(&fr->data, ck, 8);
-
- /*
- * Channel (2)
- */
- aimbs_put16(&fr->data, 0x0002);
-
- /*
- * Dest sn
- */
- aimbs_put8(&fr->data, strlen(sn));
- aimbs_putraw(&fr->data, (guint8 *)sn, strlen(sn));
-
- /*
- * TLV t(0005)
- *
- * Encompasses everything below.
- */
- aimbs_put16(&fr->data, 0x0005);
- aimbs_put16(&fr->data, 2+8+16+6+4+4+iconlen+4+4+4+strlen(AIM_ICONIDENT));
-
- aimbs_put16(&fr->data, 0x0000);
- aimbs_putraw(&fr->data, ck, 8);
- aim_putcap(&fr->data, AIM_CAPS_BUDDYICON);
-
- /* TLV t(000a) */
- aimbs_put16(&fr->data, 0x000a);
- aimbs_put16(&fr->data, 0x0002);
- aimbs_put16(&fr->data, 0x0001);
-
- /* TLV t(000f) */
- aimbs_put16(&fr->data, 0x000f);
- aimbs_put16(&fr->data, 0x0000);
-
- /* TLV t(2711) */
- aimbs_put16(&fr->data, 0x2711);
- aimbs_put16(&fr->data, 4+4+4+iconlen+strlen(AIM_ICONIDENT));
- aimbs_put16(&fr->data, 0x0000);
- aimbs_put16(&fr->data, iconsum);
- aimbs_put32(&fr->data, iconlen);
- aimbs_put32(&fr->data, stamp);
- aimbs_putraw(&fr->data, icon, iconlen);
- aimbs_putraw(&fr->data, (guint8 *)AIM_ICONIDENT, strlen(AIM_ICONIDENT));
-
- /* TLV t(0003) */
- aimbs_put16(&fr->data, 0x0003);
- aimbs_put16(&fr->data, 0x0000);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-/*
- * This only works for ICQ 2001b (thats 2001 not 2000). Better, only
- * send it to clients advertising the RTF capability. In fact, if you send
- * it to a client that doesn't support that capability, the server will gladly
- * bounce it back to you.
- *
- * You'd think this would be in icq.c, but, well, I'm trying to stick with
- * the one-group-per-file scheme as much as possible. This could easily
- * be an exception, since Rendezvous IMs are external of the Oscar core,
- * and therefore are undefined. Really I just need to think of a good way to
- * make an interface similar to what AOL actually uses. But I'm not using COM.
- *
- */
-int aim_send_rtfmsg(aim_session_t *sess, struct aim_sendrtfmsg_args *args)
-{
- const char rtfcap[] = {"{97B12751-243C-4334-AD22-D6ABF73F1492}"}; /* AIM_CAPS_ICQRTF capability in string form */
- aim_conn_t *conn;
- int i;
- guint8 ck[8];
- aim_frame_t *fr;
- aim_snacid_t snacid;
- int servdatalen;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
- return -EINVAL;
-
- if (!args || !args->destsn || !args->rtfmsg)
- return -EINVAL;
-
- servdatalen = 2+2+16+2+4+1+2 + 2+2+4+4+4 + 2+4+2+strlen(args->rtfmsg)+1 + 4+4+4+strlen(rtfcap)+1;
-
- for (i = 0; i < 8; i++)
- aimutil_put8(ck+i, (guint8) rand());
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+128+servdatalen)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
-
- /*
- * Cookie
- */
- aimbs_putraw(&fr->data, ck, 8);
-
- /*
- * Channel (2)
- */
- aimbs_put16(&fr->data, 0x0002);
-
- /*
- * Dest sn
- */
- aimbs_put8(&fr->data, strlen(args->destsn));
- aimbs_putraw(&fr->data, (guint8 *)args->destsn, strlen(args->destsn));
-
- /*
- * TLV t(0005)
- *
- * Encompasses everything below.
- */
- aimbs_put16(&fr->data, 0x0005);
- aimbs_put16(&fr->data, 2+8+16 + 2+2+2 + 2+2 + 2+2+servdatalen);
-
- aimbs_put16(&fr->data, 0x0000);
- aimbs_putraw(&fr->data, ck, 8);
- aim_putcap(&fr->data, AIM_CAPS_ICQSERVERRELAY);
-
- /*
- * t(000a) l(0002) v(0001)
- */
- aimbs_put16(&fr->data, 0x000a);
- aimbs_put16(&fr->data, 0x0002);
- aimbs_put16(&fr->data, 0x0001);
-
- /*
- * t(000f) l(0000) v()
- */
- aimbs_put16(&fr->data, 0x000f);
- aimbs_put16(&fr->data, 0x0000);
-
- /*
- * Service Data TLV
- */
- aimbs_put16(&fr->data, 0x2711);
- aimbs_put16(&fr->data, servdatalen);
-
- aimbs_putle16(&fr->data, 11 + 16 /* 11 + (sizeof CLSID) */);
- aimbs_putle16(&fr->data, 9);
- aim_putcap(&fr->data, AIM_CAPS_EMPTY);
- aimbs_putle16(&fr->data, 0);
- aimbs_putle32(&fr->data, 0);
- aimbs_putle8(&fr->data, 0);
- aimbs_putle16(&fr->data, 0x03ea); /* trid1 */
-
- aimbs_putle16(&fr->data, 14);
- aimbs_putle16(&fr->data, 0x03eb); /* trid2 */
- aimbs_putle32(&fr->data, 0);
- aimbs_putle32(&fr->data, 0);
- aimbs_putle32(&fr->data, 0);
-
- aimbs_putle16(&fr->data, 0x0001);
- aimbs_putle32(&fr->data, 0);
- aimbs_putle16(&fr->data, strlen(args->rtfmsg)+1);
- aimbs_putraw(&fr->data, (guint8 *)args->rtfmsg, strlen(args->rtfmsg)+1);
-
- aimbs_putle32(&fr->data, args->fgcolor);
- aimbs_putle32(&fr->data, args->bgcolor);
- aimbs_putle32(&fr->data, strlen(rtfcap)+1);
- aimbs_putraw(&fr->data, (guint8 *)rtfcap, strlen(rtfcap)+1);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-int aim_request_directim(aim_session_t *sess, const char *destsn, guint8 *ip, guint16 port, guint8 *ckret)
-{
- aim_conn_t *conn;
- guint8 ck[8];
- aim_frame_t *fr;
- aim_snacid_t snacid;
- aim_tlvlist_t *tl = NULL, *itl = NULL;
- int hdrlen, i;
- guint8 *hdr;
- aim_bstream_t hdrbs;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 256+strlen(destsn))))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
-
- /*
- * Generate a random message cookie
- *
- * This cookie needs to be alphanumeric and NULL-terminated to be
- * TOC-compatible.
- *
- * XXX have I mentioned these should be generated in msgcookie.c?
- *
- */
- for (i = 0; i < 7; i++)
- ck[i] = 0x30 + ((guint8) rand() % 10);
- ck[7] = '\0';
-
- if (ckret)
- memcpy(ckret, ck, 8);
-
- /* Cookie */
- aimbs_putraw(&fr->data, ck, 8);
-
- /* Channel */
- aimbs_put16(&fr->data, 0x0002);
-
- /* Destination SN */
- aimbs_put8(&fr->data, strlen(destsn));
- aimbs_putraw(&fr->data, (guint8 *)destsn, strlen(destsn));
-
- aim_addtlvtochain_noval(&tl, 0x0003);
-
- hdrlen = 2+8+16+6+8+6+4;
- hdr = g_malloc(hdrlen);
- aim_bstream_init(&hdrbs, hdr, hdrlen);
-
- aimbs_put16(&hdrbs, 0x0000);
- aimbs_putraw(&hdrbs, ck, 8);
- aim_putcap(&hdrbs, AIM_CAPS_IMIMAGE);
-
- aim_addtlvtochain16(&itl, 0x000a, 0x0001);
- aim_addtlvtochain_raw(&itl, 0x0003, 4, ip);
- aim_addtlvtochain16(&itl, 0x0005, port);
- aim_addtlvtochain_noval(&itl, 0x000f);
-
- aim_writetlvchain(&hdrbs, &itl);
-
- aim_addtlvtochain_raw(&tl, 0x0005, aim_bstream_curpos(&hdrbs), hdr);
-
- aim_writetlvchain(&fr->data, &tl);
-
- g_free(hdr);
- aim_freetlvchain(&itl);
- aim_freetlvchain(&tl);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-int aim_request_sendfile(aim_session_t *sess, const char *sn, const char *filename, guint16 numfiles, guint32 totsize, guint8 *ip, guint16 port, guint8 *ckret)
-{
- aim_conn_t *conn;
- int i;
- guint8 ck[8];
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
- return -EINVAL;
-
- if (!sn || !filename)
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sn)+2+2+2+8+16+6+8+6+4+2+2+2+2+4+strlen(filename)+4)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
-
- for (i = 0; i < 7; i++)
- aimutil_put8(ck+i, 0x30 + ((guint8) rand() % 10));
- ck[7] = '\0';
-
- if (ckret)
- memcpy(ckret, ck, 8);
-
- /*
- * Cookie
- */
- aimbs_putraw(&fr->data, ck, 8);
-
- /*
- * Channel (2)
- */
- aimbs_put16(&fr->data, 0x0002);
-
- /*
- * Dest sn
- */
- aimbs_put8(&fr->data, strlen(sn));
- aimbs_putraw(&fr->data, (guint8 *)sn, strlen(sn));
-
- /*
- * TLV t(0005)
- *
- * Encompasses everything below. Gee.
- */
- aimbs_put16(&fr->data, 0x0005);
- aimbs_put16(&fr->data, 2+8+16+6+8+6+4+2+2+2+2+4+strlen(filename)+4);
-
- aimbs_put16(&fr->data, 0x0000);
- aimbs_putraw(&fr->data, ck, 8);
- aim_putcap(&fr->data, AIM_CAPS_SENDFILE);
-
- /* TLV t(000a) */
- aimbs_put16(&fr->data, 0x000a);
- aimbs_put16(&fr->data, 0x0002);
- aimbs_put16(&fr->data, 0x0001);
-
- /* TLV t(0003) (IP) */
- aimbs_put16(&fr->data, 0x0003);
- aimbs_put16(&fr->data, 0x0004);
- aimbs_putraw(&fr->data, ip, 4);
-
- /* TLV t(0005) (port) */
- aimbs_put16(&fr->data, 0x0005);
- aimbs_put16(&fr->data, 0x0002);
- aimbs_put16(&fr->data, port);
-
- /* TLV t(000f) */
- aimbs_put16(&fr->data, 0x000f);
- aimbs_put16(&fr->data, 0x0000);
-
- /* TLV t(2711) */
- aimbs_put16(&fr->data, 0x2711);
- aimbs_put16(&fr->data, 2+2+4+strlen(filename)+4);
-
- /* ? */
- aimbs_put16(&fr->data, 0x0001);
- aimbs_put16(&fr->data, numfiles);
- aimbs_put32(&fr->data, totsize);
- aimbs_putraw(&fr->data, (guint8 *)filename, strlen(filename));
-
- /* ? */
- aimbs_put32(&fr->data, 0x00000000);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-/**
- * Request the status message of the given ICQ user.
- *
- * @param sess The oscar session.
- * @param sn The UIN of the user of whom you wish to request info.
- * @param type The type of info you wish to request. This should be the current
- * state of the user, as one of the AIM_ICQ_STATE_* defines.
- * @return Return 0 if no errors, otherwise return the error number.
- */
-int aim_send_im_ch2_geticqmessage(aim_session_t *sess, const char *sn, int type)
-{
- aim_conn_t *conn;
- int i;
- guint8 ck[8];
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)) || !sn)
- return -EINVAL;
-
- for (i = 0; i < 8; i++)
- aimutil_put8(ck+i, (guint8) rand());
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sn) + 4+0x5e + 4)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
-
- /* Cookie */
- aimbs_putraw(&fr->data, ck, 8);
-
- /* Channel (2) */
- aimbs_put16(&fr->data, 0x0002);
-
- /* Dest sn */
- aimbs_put8(&fr->data, strlen(sn));
- aimbs_putraw(&fr->data, (guint8 *)sn, strlen(sn));
-
- /* TLV t(0005) - Encompasses almost everything below. */
- aimbs_put16(&fr->data, 0x0005); /* T */
- aimbs_put16(&fr->data, 0x005e); /* L */
- { /* V */
- aimbs_put16(&fr->data, 0x0000);
-
- /* Cookie */
- aimbs_putraw(&fr->data, ck, 8);
-
- /* Put the 16 byte server relay capability */
- aim_putcap(&fr->data, AIM_CAPS_ICQSERVERRELAY);
-
- /* TLV t(000a) */
- aimbs_put16(&fr->data, 0x000a);
- aimbs_put16(&fr->data, 0x0002);
- aimbs_put16(&fr->data, 0x0001);
-
- /* TLV t(000f) */
- aimbs_put16(&fr->data, 0x000f);
- aimbs_put16(&fr->data, 0x0000);
-
- /* TLV t(2711) */
- aimbs_put16(&fr->data, 0x2711);
- aimbs_put16(&fr->data, 0x0036);
- { /* V */
- aimbs_putle16(&fr->data, 0x001b); /* L */
- aimbs_putle16(&fr->data, 0x0008); /* AAA - Protocol version */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle16(&fr->data, 0x0000); /* Unknown */
- aimbs_putle16(&fr->data, 0x0003); /* Client features? */
- aimbs_putle16(&fr->data, 0x0000); /* Unknown */
- aimbs_putle8(&fr->data, 0x00); /* Unkizown */
- aimbs_putle16(&fr->data, 0xffff); /* Sequence number? XXX - This should decrement by 1 with each request */
-
- aimbs_putle16(&fr->data, 0x000e); /* L */
- aimbs_putle16(&fr->data, 0xffff); /* Sequence number? XXX - This should decrement by 1 with each request */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
- aimbs_putle32(&fr->data, 0x00000000); /* Unknown */
-
- /* The type of status message being requested */
- if (type & AIM_ICQ_STATE_CHAT)
- aimbs_putle16(&fr->data, 0x03ec);
- else if(type & AIM_ICQ_STATE_DND)
- aimbs_putle16(&fr->data, 0x03eb);
- else if(type & AIM_ICQ_STATE_OUT)
- aimbs_putle16(&fr->data, 0x03ea);
- else if(type & AIM_ICQ_STATE_BUSY)
- aimbs_putle16(&fr->data, 0x03e9);
- else if(type & AIM_ICQ_STATE_AWAY)
- aimbs_putle16(&fr->data, 0x03e8);
-
- aimbs_putle16(&fr->data, 0x0000); /* Status? */
- aimbs_putle16(&fr->data, 0x0001); /* Priority of this message? */
- aimbs_putle16(&fr->data, 0x0001); /* L? */
- aimbs_putle8(&fr->data, 0x00); /* Null termination? */
- } /* End TLV t(2711) */
- } /* End TLV t(0005) */
-
- /* TLV t(0003) */
- aimbs_put16(&fr->data, 0x0003);
- aimbs_put16(&fr->data, 0x0000);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
/**
* answers status message requests
* @param sess the oscar session
@@ -991,61 +498,6 @@ static int mpmsg_addsection(aim_session_t *sess, aim_mpmsg_t *mpm, guint16 chars
return 0;
}
-int aim_mpmsg_addraw(aim_session_t *sess, aim_mpmsg_t *mpm, guint16 charset, guint16 charsubset, const guint8 *data, guint16 datalen)
-{
- guint8 *dup;
-
- if (!(dup = g_malloc(datalen)))
- return -1;
- memcpy(dup, data, datalen);
-
- if (mpmsg_addsection(sess, mpm, charset, charsubset, dup, datalen) == -1) {
- g_free(dup);
- return -1;
- }
-
- return 0;
-}
-
-/* XXX should provide a way of saying ISO-8859-1 specifically */
-int aim_mpmsg_addascii(aim_session_t *sess, aim_mpmsg_t *mpm, const char *ascii)
-{
- char *dup;
-
- if (!(dup = g_strdup(ascii)))
- return -1;
-
- if (mpmsg_addsection(sess, mpm, 0x0000, 0x0000, (guint8 *)dup, (guint16) strlen(ascii)) == -1) {
- g_free(dup);
- return -1;
- }
-
- return 0;
-}
-
-int aim_mpmsg_addunicode(aim_session_t *sess, aim_mpmsg_t *mpm, const guint16 *unicode, guint16 unicodelen)
-{
- guint8 *buf;
- aim_bstream_t bs;
- int i;
-
- if (!(buf = g_malloc(unicodelen * 2)))
- return -1;
-
- aim_bstream_init(&bs, buf, unicodelen * 2);
-
- /* We assume unicode is in /host/ byte order -- convert to network */
- for (i = 0; i < unicodelen; i++)
- aimbs_put16(&bs, unicode[i]);
-
- if (mpmsg_addsection(sess, mpm, 0x0002, 0x0000, buf, aim_bstream_curpos(&bs)) == -1) {
- g_free(buf);
- return -1;
- }
-
- return 0;
-}
-
void aim_mpmsg_free(aim_session_t *sess, aim_mpmsg_t *mpm)
{
aim_mpmsg_section_t *cur;
@@ -1729,44 +1181,6 @@ static int incomingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
}
/*
- * Possible codes:
- * AIM_TRANSFER_DENY_NOTSUPPORTED -- "client does not support"
- * AIM_TRANSFER_DENY_DECLINE -- "client has declined transfer"
- * AIM_TRANSFER_DENY_NOTACCEPTING -- "client is not accepting transfers"
- *
- */
-int aim_denytransfer(aim_session_t *sess, const char *sender, const guint8 *cookie, guint16 code)
-{
- aim_conn_t *conn;
- aim_frame_t *fr;
- aim_snacid_t snacid;
- aim_tlvlist_t *tl = NULL;
-
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
- return -EINVAL;
-
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+8+2+1+strlen(sender)+6)))
- return -ENOMEM;
-
- snacid = aim_cachesnac(sess, 0x0004, 0x000b, 0x0000, NULL, 0);
- aim_putsnac(&fr->data, 0x0004, 0x000b, 0x0000, snacid);
-
- aimbs_putraw(&fr->data, cookie, 8);
-
- aimbs_put16(&fr->data, 0x0002); /* channel */
- aimbs_put8(&fr->data, strlen(sender));
- aimbs_putraw(&fr->data, (guint8 *)sender, strlen(sender));
-
- aim_addtlvtochain16(&tl, 0x0003, code);
- aim_writetlvchain(&fr->data, &tl);
- aim_freetlvchain(&tl);
-
- aim_tx_enqueue(sess, fr);
-
- return 0;
-}
-
-/*
* aim_reqicbmparaminfo()
*
* Request ICBM parameter information.