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.c688
1 files changed, 378 insertions, 310 deletions
diff --git a/protocols/oscar/im.c b/protocols/oscar/im.c
index 05e06e91..2ddf35ed 100644
--- a/protocols/oscar/im.c
+++ b/protocols/oscar/im.c
@@ -24,7 +24,7 @@
#include "info.h"
/*
- * Send an ICBM (instant message).
+ * Send an ICBM (instant message).
*
*
* Possible flags:
@@ -38,12 +38,12 @@
* this, you'd better be damn sure you know
* what you're doing.
* AIM_IMFLAGS_ISO_8859_1 -- The message contains the ASCII8 subset
- * known as ISO-8859-1.
+ * known as ISO-8859-1.
*
* Generally, you should use the lowest encoding possible to send
* your message. If you only use basic punctuation and the generic
* Latin alphabet, use ASCII7 (no flags). If you happen to use non-ASCII7
- * characters, but they are all clearly defined in ISO-8859-1, then
+ * characters, but they are all clearly defined in ISO-8859-1, then
* use that. Keep in mind that not all characters in the PC ASCII8
* character set are defined in the ISO standard. For those cases (most
* notably when the (r) symbol is used), you must use the full UNICODE
@@ -55,16 +55,16 @@
* I strongly discourage the use of UNICODE mode, mainly because none
* of the clients I use can parse those messages (and besides that,
* wchars are difficult and non-portable to handle in most UNIX environments).
- * If you really need to include special characters, use the HTML UNICODE
- * entities. These are of the form ߪ where 2026 is the hex
- * representation of the UNICODE index (in this case, UNICODE
+ * If you really need to include special characters, use the HTML UNICODE
+ * entities. These are of the form ߪ where 2026 is the hex
+ * representation of the UNICODE index (in this case, UNICODE
* "Horizontal Ellipsis", or 133 in in ASCII8).
*
* Implementation note: Since this is one of the most-used functions
* in all of libfaim, it is written with performance in mind. As such,
* it is not as clear as it could be in respect to how this message is
- * supposed to be layed out. Most obviously, tlvlists should be used
- * instead of writing out the bytes manually.
+ * supposed to be layed out. Most obviously, tlvlists should be used
+ * instead of writing out the bytes manually.
*
* XXX more precise verification that we never send SNACs larger than 8192
* XXX check SNAC size for multipart
@@ -80,30 +80,36 @@ int aim_send_im_ext(aim_session_t *sess, struct aim_sendimext_args *args)
aim_frame_t *fr;
aim_snacid_t snacid;
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
+ if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004))) {
return -EINVAL;
+ }
- if (!args)
+ if (!args) {
return -EINVAL;
+ }
if (args->flags & AIM_IMFLAGS_MULTIPART) {
- if (args->mpmsg->numparts <= 0)
+ if (args->mpmsg->numparts <= 0) {
return -EINVAL;
+ }
} else {
- if (!args->msg || (args->msglen <= 0))
+ if (!args->msg || (args->msglen <= 0)) {
return -EINVAL;
+ }
- if (args->msglen >= MAXMSGLEN)
+ if (args->msglen >= MAXMSGLEN) {
return -E2BIG;
+ }
}
/* Painfully calculate the size of the message TLV */
msgtlvlen = 1 + 1; /* 0501 */
- if (args->flags & AIM_IMFLAGS_CUSTOMFEATURES)
+ if (args->flags & AIM_IMFLAGS_CUSTOMFEATURES) {
msgtlvlen += 2 + args->featureslen;
- else
+ } else {
msgtlvlen += 2 + sizeof(deffeatures);
+ }
if (args->flags & AIM_IMFLAGS_MULTIPART) {
aim_mpmsg_section_t *sec;
@@ -119,24 +125,26 @@ int aim_send_im_ext(aim_session_t *sess, struct aim_sendimext_args *args)
}
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, msgtlvlen+128)))
+ if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, msgtlvlen + 128))) {
return -ENOMEM;
+ }
- /* XXX should be optional */
- snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, args->destsn, strlen(args->destsn)+1);
+ /* XXX should be optional */
+ snacid = aim_cachesnac(sess, 0x0004, 0x0006, 0x0000, args->destsn, strlen(args->destsn) + 1);
aim_putsnac(&fr->data, 0x0004, 0x0006, 0x0000, snacid);
- /*
- * Generate a random message cookie
+ /*
+ * Generate a random message cookie
*
- * We could cache these like we do SNAC IDs. (In fact, it
- * might be a good idea.) In the message error functions,
- * the 8byte message cookie is returned as well as the
+ * We could cache these like we do SNAC IDs. (In fact, it
+ * might be a good idea.) In the message error functions,
+ * the 8byte message cookie is returned as well as the
* SNAC ID.
*
*/
- for (i = 0; i < 8; i++)
+ for (i = 0; i < 8; i++) {
aimbs_put8(&fr->data, (guint8) rand());
+ }
/*
* Channel ID
@@ -147,7 +155,7 @@ int aim_send_im_ext(aim_session_t *sess, struct aim_sendimext_args *args)
* Destination SN (prepended with byte length)
*/
aimbs_put8(&fr->data, strlen(args->destsn));
- aimbs_putraw(&fr->data, (guint8 *)args->destsn, strlen(args->destsn));
+ aimbs_putraw(&fr->data, (guint8 *) args->destsn, strlen(args->destsn));
/*
* Message TLV (type 2).
@@ -156,7 +164,7 @@ int aim_send_im_ext(aim_session_t *sess, struct aim_sendimext_args *args)
aimbs_put16(&fr->data, msgtlvlen);
/*
- * Features
+ * Features
*
*/
aimbs_put8(&fr->data, 0x05);
@@ -185,7 +193,7 @@ int aim_send_im_ext(aim_session_t *sess, struct aim_sendimext_args *args)
aimbs_put16(&fr->data, 0x0101);
- /*
+ /*
* Message block length.
*/
aimbs_put16(&fr->data, args->msglen + 0x04);
@@ -199,12 +207,13 @@ int aim_send_im_ext(aim_session_t *sess, struct aim_sendimext_args *args)
aimbs_put16(&fr->data, args->charsubset);
} else {
- if (args->flags & AIM_IMFLAGS_UNICODE)
+ if (args->flags & AIM_IMFLAGS_UNICODE) {
aimbs_put16(&fr->data, 0x0002);
- else if (args->flags & AIM_IMFLAGS_ISO_8859_1)
+ } else if (args->flags & AIM_IMFLAGS_ISO_8859_1) {
aimbs_put16(&fr->data, 0x0003);
- else
+ } else {
aimbs_put16(&fr->data, 0x0000);
+ }
aimbs_put16(&fr->data, 0x0000);
}
@@ -212,11 +221,11 @@ int aim_send_im_ext(aim_session_t *sess, struct aim_sendimext_args *args)
/*
* Message. Not terminated.
*/
- aimbs_putraw(&fr->data, (guint8 *)args->msg, args->msglen);
+ aimbs_putraw(&fr->data, (guint8 *) args->msg, args->msglen);
}
/*
- * Set the Request Acknowledge flag.
+ * Set the Request Acknowledge flag.
*/
if (args->flags & AIM_IMFLAGS_ACK) {
aimbs_put16(&fr->data, 0x0003);
@@ -258,14 +267,15 @@ int aim_send_im_ext(aim_session_t *sess, struct aim_sendimext_args *args)
aim_tx_enqueue(sess, fr);
- if (!(sess->flags & AIM_SESS_FLAGS_DONTTIMEOUTONICBM))
+ if (!(sess->flags & AIM_SESS_FLAGS_DONTTIMEOUTONICBM)) {
aim_cleansnacs(sess, 60); /* clean out SNACs over 60sec old */
+ }
return 0;
}
/*
- * Simple wrapper for aim_send_im_ext()
+ * Simple wrapper for aim_send_im_ext()
*
* You cannot use aim_send_im if you need the HASICON flag. You must
* use aim_send_im_ext directly for that.
@@ -299,64 +309,66 @@ int aim_send_im(aim_session_t *sess, const char *destsn, guint16 flags, const ch
* @return 0 if no error
*/
int aim_send_im_ch2_statusmessage(aim_session_t *sess, const char *sender, const guint8 *cookie,
- const char *message, const guint8 state, const guint16 dc)
+ const char *message, const guint8 state, const guint16 dc)
{
- aim_conn_t *conn;
- aim_frame_t *fr;
- aim_snacid_t snacid;
-
- 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)+2+0x1d+0x10+9+strlen(message)+1)))
- 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));
-
- aimbs_put16(&fr->data, 0x0003); /* reason: channel specific */
-
- aimbs_putle16(&fr->data, 0x001b); /* length of data SEQ1 */
- aimbs_putle16(&fr->data, 0x0008); /* protocol version */
-
- aimbs_putle32(&fr->data, 0x0000); /* no plugin -> 16 times 0x00 */
- aimbs_putle32(&fr->data, 0x0000);
- aimbs_putle32(&fr->data, 0x0000);
- aimbs_putle32(&fr->data, 0x0000);
-
- aimbs_putle16(&fr->data, 0x0000); /* unknown */
- aimbs_putle32(&fr->data, 0x0003); /* client features */
- aimbs_putle8(&fr->data, 0x00); /* unknown */
- aimbs_putle16(&fr->data, dc); /* Sequence number? XXX - This should decrement by 1 with each request */
- /* end of SEQ1 */
-
- aimbs_putle16(&fr->data, 0x000e); /* Length of SEQ2 */
- aimbs_putle16(&fr->data, dc); /* Sequence number? same as above
- * 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 */
- /* end of SEQ2 */
-
- /* now for the real fun */
- aimbs_putle8(&fr->data, state); /* away state */
- aimbs_putle8(&fr->data, 0x03); /* msg-flag: 03 for states */
- aimbs_putle16(&fr->data, 0x0000); /* status code ? */
- aimbs_putle16(&fr->data, 0x0000); /* priority code */
- aimbs_putle16(&fr->data, strlen(message) + 1); /* message length + termination */
- aimbs_putraw(&fr->data, (guint8 *) message, strlen(message) + 1); /* null terminated string */
-
- aim_tx_enqueue(sess, fr);
-
-
- return 0;
+ aim_conn_t *conn;
+ aim_frame_t *fr;
+ aim_snacid_t snacid;
+
+ 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) + 2 + 0x1d + 0x10 + 9 + strlen(message) + 1))) {
+ 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));
+
+ aimbs_put16(&fr->data, 0x0003); /* reason: channel specific */
+
+ aimbs_putle16(&fr->data, 0x001b); /* length of data SEQ1 */
+ aimbs_putle16(&fr->data, 0x0008); /* protocol version */
+
+ aimbs_putle32(&fr->data, 0x0000); /* no plugin -> 16 times 0x00 */
+ aimbs_putle32(&fr->data, 0x0000);
+ aimbs_putle32(&fr->data, 0x0000);
+ aimbs_putle32(&fr->data, 0x0000);
+
+ aimbs_putle16(&fr->data, 0x0000); /* unknown */
+ aimbs_putle32(&fr->data, 0x0003); /* client features */
+ aimbs_putle8(&fr->data, 0x00); /* unknown */
+ aimbs_putle16(&fr->data, dc); /* Sequence number? XXX - This should decrement by 1 with each request */
+ /* end of SEQ1 */
+
+ aimbs_putle16(&fr->data, 0x000e); /* Length of SEQ2 */
+ aimbs_putle16(&fr->data, dc); /* Sequence number? same as above
+ * 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 */
+ /* end of SEQ2 */
+
+ /* now for the real fun */
+ aimbs_putle8(&fr->data, state); /* away state */
+ aimbs_putle8(&fr->data, 0x03); /* msg-flag: 03 for states */
+ aimbs_putle16(&fr->data, 0x0000); /* status code ? */
+ aimbs_putle16(&fr->data, 0x0000); /* priority code */
+ aimbs_putle16(&fr->data, strlen(message) + 1); /* message length + termination */
+ aimbs_putraw(&fr->data, (guint8 *) message, strlen(message) + 1); /* null terminated string */
+
+ aim_tx_enqueue(sess, fr);
+
+
+ return 0;
}
@@ -374,8 +386,9 @@ static int outgoingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
aim_tlv_t *msgblock;
/* ICBM Cookie. */
- for (i = 0; i < 8; i++)
+ for (i = 0; i < 8; i++) {
aimbs_get8(bs);
+ }
/* Channel ID */
channel = aimbs_get16(bs);
@@ -390,10 +403,12 @@ static int outgoingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
tlvlist = aim_readtlvchain(bs);
- if (aim_gettlv(tlvlist, 0x0003, 1))
+ if (aim_gettlv(tlvlist, 0x0003, 1)) {
icbmflags |= AIM_IMFLAGS_ACK;
- if (aim_gettlv(tlvlist, 0x0004, 1))
+ }
+ if (aim_gettlv(tlvlist, 0x0004, 1)) {
icbmflags |= AIM_IMFLAGS_AWAY;
+ }
if ((msgblock = aim_gettlv(tlvlist, 0x0002, 1))) {
aim_bstream_t mbs;
@@ -403,8 +418,9 @@ static int outgoingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
aimbs_get8(&mbs);
aimbs_get8(&mbs);
- for (featurelen = aimbs_get16(&mbs); featurelen; featurelen--)
+ for (featurelen = aimbs_get16(&mbs); featurelen; featurelen--) {
aimbs_get8(&mbs);
+ }
aimbs_get8(&mbs);
aimbs_get8(&mbs);
@@ -416,8 +432,9 @@ static int outgoingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
msg = aimbs_getstr(&mbs, msglen);
}
- if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
+ if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) {
ret = userfunc(sess, rx, channel, sn, msg, icbmflags, flag1, flag2);
+ }
g_free(sn);
aim_freetlvchain(&tlvlist);
@@ -429,13 +446,13 @@ static int outgoingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
* Ahh, the joys of nearly ridiculous over-engineering.
*
* Not only do AIM ICBM's support multiple channels. Not only do they
- * support multiple character sets. But they support multiple character
+ * support multiple character sets. But they support multiple character
* sets / encodings within the same ICBM.
*
* These multipart messages allow for complex space savings techniques, which
* seem utterly unnecessary by today's standards. In fact, there is only
* one client still in popular use that still uses this method: AOL for the
- * Macintosh, Version 5.0. Obscure, yes, I know.
+ * Macintosh, Version 5.0. Obscure, yes, I know.
*
* In modern (non-"legacy") clients, if the user tries to send a character
* that is not ISO-8859-1 or ASCII, the client will send the entire message
@@ -443,7 +460,7 @@ static int outgoingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
* full 16 bit UNICODE field, even if the high order byte would be zero.
* Multipart messages prevent this wasted space by allowing the client to
* only send the characters in UNICODE that need to be sent that way, and
- * the rest of the message can be sent in whatever the native character
+ * the rest of the message can be sent in whatever the native character
* set is (probably ASCII).
*
* An important note is that sections will be displayed in the order that
@@ -470,12 +487,14 @@ int aim_mpmsg_init(aim_session_t *sess, aim_mpmsg_t *mpm)
return 0;
}
-static int mpmsg_addsection(aim_session_t *sess, aim_mpmsg_t *mpm, guint16 charset, guint16 charsubset, guint8 *data, guint16 datalen)
+static int mpmsg_addsection(aim_session_t *sess, aim_mpmsg_t *mpm, guint16 charset, guint16 charsubset, guint8 *data,
+ guint16 datalen)
{
- aim_mpmsg_section_t *sec;
-
- if (!(sec = g_new0(aim_mpmsg_section_t,1)))
+ aim_mpmsg_section_t *sec;
+
+ if (!(sec = g_new0(aim_mpmsg_section_t, 1))) {
return -1;
+ }
sec->charset = charset;
sec->charsubset = charsubset;
@@ -483,13 +502,14 @@ static int mpmsg_addsection(aim_session_t *sess, aim_mpmsg_t *mpm, guint16 chars
sec->datalen = datalen;
sec->next = NULL;
- if (!mpm->parts)
+ if (!mpm->parts) {
mpm->parts = sec;
- else {
+ } else {
aim_mpmsg_section_t *cur;
- for (cur = mpm->parts; cur->next; cur = cur->next)
+ for (cur = mpm->parts; cur->next; cur = cur->next) {
;
+ }
cur->next = sec;
}
@@ -504,13 +524,13 @@ void aim_mpmsg_free(aim_session_t *sess, aim_mpmsg_t *mpm)
for (cur = mpm->parts; cur; ) {
aim_mpmsg_section_t *tmp;
-
+
tmp = cur->next;
g_free(cur->data);
g_free(cur);
cur = tmp;
}
-
+
mpm->numparts = 0;
mpm->parts = NULL;
@@ -518,7 +538,7 @@ void aim_mpmsg_free(aim_session_t *sess, aim_mpmsg_t *mpm)
}
/*
- * Start by building the multipart structures, then pick the first
+ * Start by building the multipart structures, then pick the first
* human-readable section and stuff it into args->msg so no one gets
* suspicious.
*
@@ -568,7 +588,7 @@ static int incomingim_ch1_parsemsgs(aim_session_t *sess, guint8 *data, int len,
*
*/
msgbuf = aimbs_getstr(&mbs, msglen);
- mpmsg_addsection(sess, &args->mpmsg, flag1, flag2, (guint8 *)msgbuf, (guint16) msglen);
+ mpmsg_addsection(sess, &args->mpmsg, flag1, flag2, (guint8 *) msgbuf, (guint16) msglen);
} /* while */
@@ -589,8 +609,9 @@ static int incomingim_ch1_parsemsgs(aim_session_t *sess, guint8 *data, int len,
for (i = 0; i < charsetpricount; i++) {
for (sec = args->mpmsg.parts; sec; sec = sec->next) {
- if (sec->charset != charsetpri[i])
+ if (sec->charset != charsetpri[i]) {
continue;
+ }
/* Great. We found one. Fill it in. */
args->charset = sec->charset;
@@ -598,35 +619,38 @@ static int incomingim_ch1_parsemsgs(aim_session_t *sess, guint8 *data, int len,
args->icbmflags |= AIM_IMFLAGS_CUSTOMCHARSET;
/* Set up the simple flags */
- if (args->charset == 0x0000)
+ if (args->charset == 0x0000) {
; /* ASCII */
- else if (args->charset == 0x0002)
+ } else if (args->charset == 0x0002) {
args->icbmflags |= AIM_IMFLAGS_UNICODE;
- else if (args->charset == 0x0003)
+ } else if (args->charset == 0x0003) {
args->icbmflags |= AIM_IMFLAGS_ISO_8859_1;
- else if (args->charset == 0xffff)
+ } else if (args->charset == 0xffff) {
; /* no encoding (yeep!) */
- if (args->charsubset == 0x0000)
+ }
+ if (args->charsubset == 0x0000) {
; /* standard subencoding? */
- else if (args->charsubset == 0x000b)
+ } else if (args->charsubset == 0x000b) {
args->icbmflags |= AIM_IMFLAGS_SUBENC_MACINTOSH;
- else if (args->charsubset == 0xffff)
+ } else if (args->charsubset == 0xffff) {
; /* no subencoding */
+ }
#if 0
- /* XXX this isn't really necesary... */
- if ( ((args.flag1 != 0x0000) &&
- (args.flag1 != 0x0002) &&
- (args.flag1 != 0x0003) &&
- (args.flag1 != 0xffff)) ||
- ((args.flag2 != 0x0000) &&
- (args.flag2 != 0x000b) &&
- (args.flag2 != 0xffff))) {
- faimdprintf(sess, 0, "icbm: **warning: encoding flags are being used! {%04x, %04x}\n", args.flag1, args.flag2);
+ /* XXX this isn't really necesary... */
+ if (((args.flag1 != 0x0000) &&
+ (args.flag1 != 0x0002) &&
+ (args.flag1 != 0x0003) &&
+ (args.flag1 != 0xffff)) ||
+ ((args.flag2 != 0x0000) &&
+ (args.flag2 != 0x000b) &&
+ (args.flag2 != 0xffff))) {
+ faimdprintf(sess, 0, "icbm: **warning: encoding flags are being used! {%04x, %04x}\n",
+ args.flag1, args.flag2);
}
#endif
- args->msg = (char *)sec->data;
+ args->msg = (char *) sec->data;
args->msglen = sec->datalen;
return 0;
@@ -641,7 +665,8 @@ static int incomingim_ch1_parsemsgs(aim_session_t *sess, guint8 *data, int len,
return 0;
}
-static int incomingim_ch1(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, guint16 channel, aim_userinfo_t *userinfo, aim_bstream_t *bs, guint8 *cookie)
+static int incomingim_ch1(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, guint16 channel,
+ aim_userinfo_t *userinfo, aim_bstream_t *bs, guint8 *cookie)
{
guint16 type, length;
aim_rxcallback_t userfunc;
@@ -689,7 +714,8 @@ static int incomingim_ch1(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
* The rest of the TLV contains one or more message
* blocks...
*/
- incomingim_ch1_parsemsgs(sess, bs->data + bs->offset /* XXX evil!!! */, length - 2 - 2 - args.featureslen, &args);
+ incomingim_ch1_parsemsgs(sess, bs->data + bs->offset /* XXX evil!!! */,
+ length - 2 - 2 - args.featureslen, &args);
} else if (type == 0x0003) { /* Server Ack Requested */
@@ -719,10 +745,11 @@ static int incomingim_ch1(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
*
* You really shouldn't advertise a zero-length icon
* anyway.
- *
+ *
*/
- if (args.iconlen)
+ if (args.iconlen) {
args.icbmflags |= AIM_IMFLAGS_HASICON;
+ }
} else if (type == 0x0009) {
@@ -749,8 +776,9 @@ static int incomingim_ch1(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
}
- if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
+ if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) {
ret = userfunc(sess, rx, channel, userinfo, &args);
+ }
aim_mpmsg_free(sess, &args.mpmsg);
g_free(args.extdata);
@@ -768,16 +796,18 @@ static void incomingim_ch2_chat_free(aim_session_t *sess, struct aim_incomingim_
return;
}
-static void incomingim_ch2_chat(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_bstream_t *servdata)
+static void incomingim_ch2_chat(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac,
+ aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_bstream_t *servdata)
{
/*
* Chat room info.
*/
- if (servdata)
+ if (servdata) {
aim_chat_readroominfo(servdata, &args->info.chat.roominfo);
+ }
- args->destructor = (void *)incomingim_ch2_chat_free;
+ args->destructor = (void *) incomingim_ch2_chat_free;
return;
}
@@ -785,13 +815,13 @@ static void incomingim_ch2_chat(aim_session_t *sess, aim_module_t *mod, aim_fram
static void incomingim_ch2_icqserverrelay_free(aim_session_t *sess, struct aim_incomingim_ch2_args *args)
{
- g_free((char *)args->info.rtfmsg.rtfmsg);
+ g_free((char *) args->info.rtfmsg.rtfmsg);
return;
}
/*
- * The relationship between AIM_CAPS_ICQSERVERRELAY and AIM_CAPS_ICQRTF is
+ * The relationship between AIM_CAPS_ICQSERVERRELAY and AIM_CAPS_ICQRTF is
* kind of odd. This sends the client ICQRTF since that is all that I've seen
* SERVERRELAY used for.
*
@@ -800,79 +830,84 @@ static void incomingim_ch2_icqserverrelay_free(aim_session_t *sess, struct aim_i
* This cap is used for auto status message replies, too [ft]
*
*/
-static void incomingim_ch2_icqserverrelay(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args, aim_bstream_t *servdata)
+static void incomingim_ch2_icqserverrelay(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac,
+ aim_userinfo_t *userinfo, struct aim_incomingim_ch2_args *args,
+ aim_bstream_t *servdata)
{
guint16 hdrlen, msglen, dc;
guint8 msgtype;
- guint8 *plugin;
- int i = 0, tmp = 0;
- struct im_connection *ic = sess->aux_data;
+ guint8 *plugin;
+ int i = 0, tmp = 0;
+ struct im_connection *ic = sess->aux_data;
- /* at the moment we just can deal with requests, not with cancel or accept */
- if (args->status != 0) return;
+ /* at the moment we just can deal with requests, not with cancel or accept */
+ if (args->status != 0) {
+ return;
+ }
hdrlen = aimbs_getle16(servdata);
- aim_bstream_advance(servdata, 0x02); /* protocol version */
- plugin = aimbs_getraw(servdata, 0x10); /* following data is a message or
- something plugin specific */
- /* as there is no plugin handling, just skip the rest */
- aim_bstream_advance(servdata, hdrlen - 0x12);
+ aim_bstream_advance(servdata, 0x02); /* protocol version */
+ plugin = aimbs_getraw(servdata, 0x10); /* following data is a message or
+ something plugin specific */
+ /* as there is no plugin handling, just skip the rest */
+ aim_bstream_advance(servdata, hdrlen - 0x12);
hdrlen = aimbs_getle16(servdata);
- dc = aimbs_getle16(servdata); /* save the sequence number */
+ dc = aimbs_getle16(servdata); /* save the sequence number */
aim_bstream_advance(servdata, hdrlen - 0x02);
- /* TODO is it a message or something for a plugin? */
- for (i = 0; i < 0x10; i++) {
- tmp |= plugin[i];
- }
+ /* TODO is it a message or something for a plugin? */
+ for (i = 0; i < 0x10; i++) {
+ tmp |= plugin[i];
+ }
- if (!tmp) { /* message follows */
+ if (!tmp) { /* message follows */
- msgtype = aimbs_getle8(servdata);
- aimbs_getle8(servdata); /* msgflags */
+ msgtype = aimbs_getle8(servdata);
+ aimbs_getle8(servdata); /* msgflags */
- aim_bstream_advance(servdata, 0x04); /* status code and priority code */
+ aim_bstream_advance(servdata, 0x04); /* status code and priority code */
- msglen = aimbs_getle16(servdata); /* message string length */
- args->info.rtfmsg.rtfmsg = aimbs_getstr(servdata, msglen);
+ msglen = aimbs_getle16(servdata); /* message string length */
+ args->info.rtfmsg.rtfmsg = aimbs_getstr(servdata, msglen);
- switch(msgtype) {
- case AIM_MTYPE_PLAIN:
+ switch (msgtype) {
+ case AIM_MTYPE_PLAIN:
- args->info.rtfmsg.fgcolor = aimbs_getle32(servdata);
- args->info.rtfmsg.bgcolor = aimbs_getle32(servdata);
+ args->info.rtfmsg.fgcolor = aimbs_getle32(servdata);
+ args->info.rtfmsg.bgcolor = aimbs_getle32(servdata);
- hdrlen = aimbs_getle32(servdata);
- aim_bstream_advance(servdata, hdrlen);
+ hdrlen = aimbs_getle32(servdata);
+ aim_bstream_advance(servdata, hdrlen);
- /* XXX This is such a hack. */
- args->reqclass = AIM_CAPS_ICQRTF;
- break;
+ /* XXX This is such a hack. */
+ args->reqclass = AIM_CAPS_ICQRTF;
+ break;
- case AIM_MTYPE_AUTOAWAY:
- case AIM_MTYPE_AUTOBUSY:
- case AIM_MTYPE_AUTONA:
- case AIM_MTYPE_AUTODND:
- case AIM_MTYPE_AUTOFFC:
- case 0x9c: /* ICQ 5 seems to send this */
- aim_send_im_ch2_statusmessage(sess, userinfo->sn, args->cookie,
- ic->away ? ic->away : "", sess->aim_icq_state, dc);
- break;
+ case AIM_MTYPE_AUTOAWAY:
+ case AIM_MTYPE_AUTOBUSY:
+ case AIM_MTYPE_AUTONA:
+ case AIM_MTYPE_AUTODND:
+ case AIM_MTYPE_AUTOFFC:
+ case 0x9c: /* ICQ 5 seems to send this */
+ aim_send_im_ch2_statusmessage(sess, userinfo->sn, args->cookie,
+ ic->away ? ic->away : "", sess->aim_icq_state, dc);
+ break;
- }
- } /* message or plugin specific */
+ }
+ } /* message or plugin specific */
- g_free(plugin);
- args->destructor = (void *)incomingim_ch2_icqserverrelay_free;
+ g_free(plugin);
+ args->destructor = (void *) incomingim_ch2_icqserverrelay_free;
return;
}
typedef void (*ch2_args_destructor_t)(aim_session_t *sess, struct aim_incomingim_ch2_args *args);
-static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, guint16 channel, aim_userinfo_t *userinfo, aim_tlvlist_t *tlvlist, guint8 *cookie)
+static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, guint16 channel,
+ aim_userinfo_t *userinfo, aim_tlvlist_t *tlvlist, guint8 *cookie)
{
aim_rxcallback_t userfunc;
aim_tlv_t *block1, *servdatatlv;
@@ -882,14 +917,14 @@ static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
guint8 *cookie2;
int ret = 0;
- char clientip1[30] = {""};
- char clientip2[30] = {""};
- char verifiedip[30] = {""};
+ char clientip1[30] = { "" };
+ char clientip2[30] = { "" };
+ char verifiedip[30] = { "" };
memset(&args, 0, sizeof(args));
/*
- * There's another block of TLVs embedded in the type 5 here.
+ * There's another block of TLVs embedded in the type 5 here.
*/
block1 = aim_gettlv(tlvlist, 0x0005, 1);
aim_bstream_init(&bbs, block1->value, block1->length);
@@ -898,15 +933,16 @@ static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
* First two bytes represent the status of the connection.
*
* 0 is a request, 1 is a deny (?), 2 is an accept
- */
+ */
args.status = aimbs_get16(&bbs);
/*
* Next comes the cookie. Should match the ICBM cookie.
*/
cookie2 = aimbs_getraw(&bbs, 8);
- if (memcmp(cookie, cookie2, 8) != 0)
+ if (memcmp(cookie, cookie2, 8) != 0) {
imcb_error(sess->aux_data, "rend: warning cookies don't match!");
+ }
memcpy(args.cookie, cookie2, 8);
g_free(cookie2);
@@ -916,7 +952,7 @@ static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
*/
args.reqclass = aim_getcap(sess, &bbs, 0x10);
- /*
+ /*
* What follows may be TLVs or nothing, depending on the
* purpose of the message.
*
@@ -933,10 +969,10 @@ static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
iptlv = aim_gettlv(list2, 0x0002, 1);
g_snprintf(clientip1, sizeof(clientip1), "%d.%d.%d.%d",
- aimutil_get8(iptlv->value+0),
- aimutil_get8(iptlv->value+1),
- aimutil_get8(iptlv->value+2),
- aimutil_get8(iptlv->value+3));
+ aimutil_get8(iptlv->value + 0),
+ aimutil_get8(iptlv->value + 1),
+ aimutil_get8(iptlv->value + 2),
+ aimutil_get8(iptlv->value + 3));
}
/*
@@ -948,10 +984,10 @@ static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
iptlv = aim_gettlv(list2, 0x0003, 1);
g_snprintf(clientip2, sizeof(clientip2), "%d.%d.%d.%d",
- aimutil_get8(iptlv->value+0),
- aimutil_get8(iptlv->value+1),
- aimutil_get8(iptlv->value+2),
- aimutil_get8(iptlv->value+3));
+ aimutil_get8(iptlv->value + 0),
+ aimutil_get8(iptlv->value + 1),
+ aimutil_get8(iptlv->value + 2),
+ aimutil_get8(iptlv->value + 3));
}
/*
@@ -965,56 +1001,66 @@ static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
iptlv = aim_gettlv(list2, 0x0004, 1);
g_snprintf(verifiedip, sizeof(verifiedip), "%d.%d.%d.%d",
- aimutil_get8(iptlv->value+0),
- aimutil_get8(iptlv->value+1),
- aimutil_get8(iptlv->value+2),
- aimutil_get8(iptlv->value+3));
+ aimutil_get8(iptlv->value + 0),
+ aimutil_get8(iptlv->value + 1),
+ aimutil_get8(iptlv->value + 2),
+ aimutil_get8(iptlv->value + 3));
}
/*
* Port number for something.
*/
- if (aim_gettlv(list2, 0x0005, 1))
+ if (aim_gettlv(list2, 0x0005, 1)) {
args.port = aim_gettlv16(list2, 0x0005, 1);
+ }
/*
* Error code.
*/
- if (aim_gettlv(list2, 0x000b, 1))
+ if (aim_gettlv(list2, 0x000b, 1)) {
args.errorcode = aim_gettlv16(list2, 0x000b, 1);
+ }
/*
* Invitation message / chat description.
*/
- if (aim_gettlv(list2, 0x000c, 1))
+ if (aim_gettlv(list2, 0x000c, 1)) {
args.msg = aim_gettlv_str(list2, 0x000c, 1);
+ }
/*
* Character set.
*/
- if (aim_gettlv(list2, 0x000d, 1))
+ if (aim_gettlv(list2, 0x000d, 1)) {
args.encoding = aim_gettlv_str(list2, 0x000d, 1);
-
+ }
+
/*
* Language.
*/
- if (aim_gettlv(list2, 0x000e, 1))
+ if (aim_gettlv(list2, 0x000e, 1)) {
args.language = aim_gettlv_str(list2, 0x000e, 1);
+ }
/* Unknown -- two bytes = 0x0001 */
- if (aim_gettlv(list2, 0x000a, 1))
+ if (aim_gettlv(list2, 0x000a, 1)) {
;
+ }
/* Unknown -- no value */
- if (aim_gettlv(list2, 0x000f, 1))
+ if (aim_gettlv(list2, 0x000f, 1)) {
;
+ }
- if (strlen(clientip1))
- args.clientip = (char *)clientip1;
- if (strlen(clientip2))
- args.clientip2 = (char *)clientip2;
- if (strlen(verifiedip))
- args.verifiedip = (char *)verifiedip;
+ if (strlen(clientip1)) {
+ args.clientip = (char *) clientip1;
+ }
+ if (strlen(clientip2)) {
+ args.clientip2 = (char *) clientip2;
+ }
+ if (strlen(verifiedip)) {
+ args.verifiedip = (char *) verifiedip;
+ }
/*
* This is must be present in PROPOSALs, but will probably not
@@ -1028,29 +1074,33 @@ static int incomingim_ch2(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
sdbsptr = &sdbs;
}
- if (args.reqclass & AIM_CAPS_ICQSERVERRELAY)
+ if (args.reqclass & AIM_CAPS_ICQSERVERRELAY) {
incomingim_ch2_icqserverrelay(sess, mod, rx, snac, userinfo, &args, sdbsptr);
- else if (args.reqclass & AIM_CAPS_CHAT)
+ } else if (args.reqclass & AIM_CAPS_CHAT) {
incomingim_ch2_chat(sess, mod, rx, snac, userinfo, &args, sdbsptr);
+ }
- if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
+ if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) {
ret = userfunc(sess, rx, channel, userinfo, &args);
+ }
- if (args.destructor)
- ((ch2_args_destructor_t)args.destructor)(sess, &args);
+ if (args.destructor) {
+ ((ch2_args_destructor_t) args.destructor)(sess, &args);
+ }
- g_free((char *)args.msg);
- g_free((char *)args.encoding);
- g_free((char *)args.language);
+ g_free((char *) args.msg);
+ g_free((char *) args.encoding);
+ g_free((char *) args.language);
aim_freetlvchain(&list2);
return ret;
}
-static int incomingim_ch4(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, guint16 channel, aim_userinfo_t *userinfo, aim_tlvlist_t *tlvlist, guint8 *cookie)
+static int incomingim_ch4(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, guint16 channel,
+ aim_userinfo_t *userinfo, aim_tlvlist_t *tlvlist, guint8 *cookie)
{
aim_bstream_t meat;
aim_rxcallback_t userfunc;
@@ -1061,16 +1111,18 @@ static int incomingim_ch4(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
/*
* Make a bstream for the meaty part. Yum. Meat.
*/
- if (!(block = aim_gettlv(tlvlist, 0x0005, 1)))
+ if (!(block = aim_gettlv(tlvlist, 0x0005, 1))) {
return -1;
+ }
aim_bstream_init(&meat, block->value, block->length);
args.uin = aimbs_getle32(&meat);
args.type = aimbs_getle16(&meat);
- args.msg = (char *)aimbs_getraw(&meat, aimbs_getle16(&meat));
+ args.msg = (char *) aimbs_getraw(&meat, aimbs_getle16(&meat));
- if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
+ if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) {
ret = userfunc(sess, rx, channel, userinfo, &args);
+ }
g_free(args.msg);
@@ -1100,22 +1152,23 @@ static int incomingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
/*
* Read ICBM Cookie. And throw away.
*/
- for (i = 0; i < 8; i++)
+ for (i = 0; i < 8; i++) {
cookie[i] = aimbs_get8(bs);
+ }
/*
* Channel ID.
*
- * Channel 0x0001 is the message channel. There are
+ * Channel 0x0001 is the message channel. There are
* other channels for things called "rendevous"
* which represent chat and some of the other new
- * features of AIM2/3/3.5.
+ * features of AIM2/3/3.5.
*
* Channel 0x0002 is the Rendevous channel, which
* is where Chat Invitiations and various client-client
* connection negotiations come from.
*
- * Channel 0x0004 is used for ICQ authorization, or
+ * Channel 0x0004 is used for ICQ authorization, or
* possibly any system notice.
*
*/
@@ -1130,12 +1183,12 @@ static int incomingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
* information, the rest are not even though there is no seperation.
* aim_extractuserinfo() returns the number of bytes used by the
* userinfo tlvs, so you can start reading the rest of them right
- * afterward.
+ * afterward.
*
* That also means that TLV types can be duplicated between the
* userinfo block and the rest of the message, however there should
* never be two TLVs of the same type in one block.
- *
+ *
*/
aim_extractuserinfo(sess, bs, &userinfo);
@@ -1154,7 +1207,7 @@ static int incomingim(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
aim_tlvlist_t *tlvlist;
/*
- * Read block of TLVs (not including the userinfo data). All
+ * Read block of TLVs (not including the userinfo data). All
* further data is derived from what is parsed here.
*/
tlvlist = aim_readtlvchain(bs);
@@ -1190,8 +1243,9 @@ int aim_reqicbmparams(aim_session_t *sess)
{
aim_conn_t *conn;
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
+ if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004))) {
return -EINVAL;
+ }
return aim_genericreq_n(sess, conn, 0x0004, 0x0004);
}
@@ -1200,7 +1254,7 @@ int aim_reqicbmparams(aim_session_t *sess)
*
* I definitly recommend sending this. If you don't, you'll be stuck
* with the rather unreasonable defaults. You don't want those. Send this.
- *
+ *
*/
int aim_seticbmparam(aim_session_t *sess, struct aim_icbmparameters *params)
{
@@ -1208,14 +1262,17 @@ int aim_seticbmparam(aim_session_t *sess, struct aim_icbmparameters *params)
aim_frame_t *fr;
aim_snacid_t snacid;
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004)))
+ if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0004))) {
return -EINVAL;
+ }
- if (!params)
+ if (!params) {
return -EINVAL;
+ }
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+16)))
+ if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 16))) {
return -ENOMEM;
+ }
snacid = aim_cachesnac(sess, 0x0004, 0x0002, 0x0000, NULL, 0);
aim_putsnac(&fr->data, 0x0004, 0x0002, 0x0000, snacid);
@@ -1224,10 +1281,10 @@ int aim_seticbmparam(aim_session_t *sess, struct aim_icbmparameters *params)
aimbs_put16(&fr->data, 0x0000);
/* These are all read-write */
- aimbs_put32(&fr->data, params->flags);
+ aimbs_put32(&fr->data, params->flags);
aimbs_put16(&fr->data, params->maxmsglen);
- aimbs_put16(&fr->data, params->maxsenderwarn);
- aimbs_put16(&fr->data, params->maxrecverwarn);
+ aimbs_put16(&fr->data, params->maxsenderwarn);
+ aimbs_put16(&fr->data, params->maxrecverwarn);
aimbs_put32(&fr->data, params->minmsginterval);
aim_tx_enqueue(sess, fr);
@@ -1246,9 +1303,10 @@ static int paraminfo(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, ai
params.maxsenderwarn = aimbs_get16(bs);
params.maxrecverwarn = aimbs_get16(bs);
params.minmsginterval = aimbs_get32(bs);
-
- if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
+
+ if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) {
return userfunc(sess, rx, &params);
+ }
return 0;
}
@@ -1260,25 +1318,27 @@ static int missedcall(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, a
guint16 channel, nummissed, reason;
aim_userinfo_t userinfo;
- while (aim_bstream_empty(bs)) {
+ while (aim_bstream_empty(bs)) {
channel = aimbs_get16(bs);
aim_extractuserinfo(sess, bs, &userinfo);
nummissed = aimbs_get16(bs);
reason = aimbs_get16(bs);
- if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
- ret = userfunc(sess, rx, channel, &userinfo, nummissed, reason);
+ if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) {
+ ret = userfunc(sess, rx, channel, &userinfo, nummissed, reason);
+ }
}
return ret;
}
/*
- * Receive the response from an ICQ status message request. This contains the
+ * Receive the response from an ICQ status message request. This contains the
* ICQ status message. Go figure.
*/
-static int clientautoresp(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
+static int clientautoresp(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac,
+ aim_bstream_t *bs)
{
int ret = 0;
aim_rxcallback_t userfunc;
@@ -1293,56 +1353,58 @@ static int clientautoresp(aim_session_t *sess, aim_module_t *mod, aim_frame_t *r
reason = aimbs_get16(bs);
switch (reason) {
- case 0x0003: { /* ICQ status message. Maybe other stuff too, you never know with these people. */
- guint8 statusmsgtype, *msg;
- guint16 len;
- guint32 state;
-
- len = aimbs_getle16(bs); /* Should be 0x001b */
- aim_bstream_advance(bs, len); /* Unknown */
-
- len = aimbs_getle16(bs); /* Should be 0x000e */
- aim_bstream_advance(bs, len); /* Unknown */
-
- statusmsgtype = aimbs_getle8(bs);
- switch (statusmsgtype) {
- case 0xe8:
- state = AIM_ICQ_STATE_AWAY;
- break;
- case 0xe9:
- state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY;
- break;
- case 0xea:
- state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_OUT;
- break;
- case 0xeb:
- state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY;
- break;
- case 0xec:
- state = AIM_ICQ_STATE_CHAT;
- break;
- default:
- state = 0;
- break;
- }
+ case 0x0003: { /* ICQ status message. Maybe other stuff too, you never know with these people. */
+ guint8 statusmsgtype, *msg;
+ guint16 len;
+ guint32 state;
+
+ len = aimbs_getle16(bs); /* Should be 0x001b */
+ aim_bstream_advance(bs, len); /* Unknown */
+
+ len = aimbs_getle16(bs); /* Should be 0x000e */
+ aim_bstream_advance(bs, len); /* Unknown */
+
+ statusmsgtype = aimbs_getle8(bs);
+ switch (statusmsgtype) {
+ case 0xe8:
+ state = AIM_ICQ_STATE_AWAY;
+ break;
+ case 0xe9:
+ state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_BUSY;
+ break;
+ case 0xea:
+ state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_OUT;
+ break;
+ case 0xeb:
+ state = AIM_ICQ_STATE_AWAY | AIM_ICQ_STATE_DND | AIM_ICQ_STATE_BUSY;
+ break;
+ case 0xec:
+ state = AIM_ICQ_STATE_CHAT;
+ break;
+ default:
+ state = 0;
+ break;
+ }
- aimbs_getle8(bs); /* Unknown - 0x03 Maybe this means this is an auto-reply */
- aimbs_getle16(bs); /* Unknown - 0x0000 */
- aimbs_getle16(bs); /* Unknown - 0x0000 */
+ aimbs_getle8(bs); /* Unknown - 0x03 Maybe this means this is an auto-reply */
+ aimbs_getle16(bs); /* Unknown - 0x0000 */
+ aimbs_getle16(bs); /* Unknown - 0x0000 */
- len = aimbs_getle16(bs);
- msg = aimbs_getraw(bs, len);
+ len = aimbs_getle16(bs);
+ msg = aimbs_getraw(bs, len);
- if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
- ret = userfunc(sess, rx, channel, sn, reason, state, msg);
+ if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) {
+ ret = userfunc(sess, rx, channel, sn, reason, state, msg);
+ }
- g_free(msg);
- } break;
+ g_free(msg);
+ } break;
- default: {
- if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
- ret = userfunc(sess, rx, channel, sn, reason);
- } break;
+ default: {
+ if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) {
+ ret = userfunc(sess, rx, channel, sn, reason);
+ }
+ } break;
} /* end switch */
g_free(ck);
@@ -1364,8 +1426,9 @@ static int msgack(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_m
snlen = aimbs_get8(bs);
sn = aimbs_getstr(bs, snlen);
- if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
+ if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) {
ret = userfunc(sess, rx, type, sn);
+ }
g_free(sn);
g_free(ck);
@@ -1376,7 +1439,7 @@ static int msgack(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_m
/*
* Subtype 0x0014 - Send a mini typing notification (mtn) packet.
*
- * This is supported by winaim5 and newer, MacAIM bleh and newer, iChat bleh and newer,
+ * This is supported by winaim5 and newer, MacAIM bleh and newer, iChat bleh and newer,
* and Gaim 0.60 and newer.
*
*/
@@ -1386,14 +1449,17 @@ int aim_im_sendmtn(aim_session_t *sess, guint16 type1, const char *sn, guint16 t
aim_frame_t *fr;
aim_snacid_t snacid;
- if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0002)))
+ if (!sess || !(conn = aim_conn_findbygroup(sess, 0x0002))) {
return -EINVAL;
+ }
- if (!sn)
+ if (!sn) {
return -EINVAL;
+ }
- if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10+11+strlen(sn)+2)))
+ if (!(fr = aim_tx_new(sess, conn, AIM_FRAMETYPE_FLAP, 0x02, 10 + 11 + strlen(sn) + 2))) {
return -ENOMEM;
+ }
snacid = aim_cachesnac(sess, 0x0004, 0x0014, 0x0000, NULL, 0);
aim_putsnac(&fr->data, 0x0004, 0x0014, 0x0000, snacid);
@@ -1416,7 +1482,7 @@ int aim_im_sendmtn(aim_session_t *sess, guint16 type1, const char *sn, guint16 t
* Dest sn
*/
aimbs_put8(&fr->data, strlen(sn));
- aimbs_putraw(&fr->data, (const guint8*)sn, strlen(sn));
+ aimbs_putraw(&fr->data, (const guint8 *) sn, strlen(sn));
/*
* Type 2 (should be 0x0000, 0x0001, or 0x0002 for mtn)
@@ -1431,7 +1497,7 @@ int aim_im_sendmtn(aim_session_t *sess, guint16 type1, const char *sn, guint16 t
/*
* Subtype 0x0014 - Receive a mini typing notification (mtn) packet.
*
- * This is supported by winaim5 and newer, MacAIM bleh and newer, iChat bleh and newer,
+ * This is supported by winaim5 and newer, MacAIM bleh and newer, iChat bleh and newer,
* and Gaim 0.60 and newer.
*
*/
@@ -1449,8 +1515,9 @@ static int mtn_receive(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx,
sn = aimbs_getstr(bs, snlen);
type2 = aimbs_get16(bs);
- if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype)))
+ if ((userfunc = aim_callhandler(sess, rx->conn, snac->family, snac->subtype))) {
ret = userfunc(sess, rx, type1, sn, type2);
+ }
g_free(sn);
@@ -1460,20 +1527,21 @@ static int mtn_receive(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx,
static int snachandler(aim_session_t *sess, aim_module_t *mod, aim_frame_t *rx, aim_modsnac_t *snac, aim_bstream_t *bs)
{
- if (snac->subtype == 0x0005)
+ if (snac->subtype == 0x0005) {
return paraminfo(sess, mod, rx, snac, bs);
- else if (snac->subtype == 0x0006)
+ } else if (snac->subtype == 0x0006) {
return outgoingim(sess, mod, rx, snac, bs);
- else if (snac->subtype == 0x0007)
+ } else if (snac->subtype == 0x0007) {
return incomingim(sess, mod, rx, snac, bs);
- else if (snac->subtype == 0x000a)
+ } else if (snac->subtype == 0x000a) {
return missedcall(sess, mod, rx, snac, bs);
- else if (snac->subtype == 0x000b)
+ } else if (snac->subtype == 0x000b) {
return clientautoresp(sess, mod, rx, snac, bs);
- else if (snac->subtype == 0x000c)
+ } else if (snac->subtype == 0x000c) {
return msgack(sess, mod, rx, snac, bs);
- else if (snac->subtype == 0x0014)
+ } else if (snac->subtype == 0x0014) {
return mtn_receive(sess, mod, rx, snac, bs);
+ }
return 0;
}