diff options
Diffstat (limited to 'protocols/oscar/im.c')
-rw-r--r-- | protocols/oscar/im.c | 688 |
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, ¶ms); + } 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; } |