Mercurial > pidgin
diff src/protocols/oscar/ft.c @ 4826:e6654fab588b
[gaim-migrate @ 5151]
Defibrillator?! I don't even know her!!
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Tue, 18 Mar 2003 22:30:21 +0000 |
parents | c050edba7b83 |
children | edfe778868e2 |
line wrap: on
line diff
--- a/src/protocols/oscar/ft.c Tue Mar 18 17:51:50 2003 +0000 +++ b/src/protocols/oscar/ft.c Tue Mar 18 22:30:21 2003 +0000 @@ -613,6 +613,91 @@ } /** + * Sometimes you just don't know with these kinds of people. + * + * @param sess The session. + * @param conn The ODC connection of the incoming data. + * @param frr The frame allocated for the incoming data. + * @param bs It stands for "bologna sandwich." + * @return Return 0 if no errors, otherwise return the error number. + */ +static int handlehdr_odc(aim_session_t *sess, aim_conn_t *conn, aim_frame_t *frr, aim_bstream_t *bs) +{ + aim_frame_t fr; + aim_rxcallback_t userfunc; + fu32_t payloadlength; + fu16_t flags, encoding; + char *snptr = NULL; + + fr.conn = conn; + + /* AAA - ugly */ + aim_bstream_setpos(bs, 20); + payloadlength = aimbs_get32(bs); + + aim_bstream_setpos(bs, 24); + encoding = aimbs_get16(bs); + + aim_bstream_setpos(bs, 30); + flags = aimbs_get16(bs); + + aim_bstream_setpos(bs, 36); + /* XXX - create an aimbs_getnullstr function? */ + snptr = aimbs_getstr(bs, MAXSNLEN); + + faimdprintf(sess, 2, "faim: OFT frame: handlehdr_odc: %04x / %04x / %s\n", payloadlength, flags, snptr); + + if (flags & 0x0002) { + int ret = 0; + + if (flags & 0x000c) { + if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) + ret = userfunc(sess, &fr, snptr, 1); + return ret; + } + + if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) + ret = userfunc(sess, &fr, snptr, 0); + + return ret; + + } else if (((flags & 0x000f) == 0x0000) && payloadlength) { + char *msg, *msg2; + int ret = 0; + int recvd = 0; + int i; + + if (!(msg = calloc(1, payloadlength+1))) + return -1; + msg2 = msg; + + while (payloadlength - recvd) { + if (payloadlength - recvd >= 1024) + i = aim_recv(conn->fd, msg2, 1024); + else + i = aim_recv(conn->fd, msg2, payloadlength - recvd); + if (i <= 0) { + free(msg); + return -1; + } + recvd = recvd + i; + msg2 = msg2 + i; + if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER))) + userfunc(sess, &fr, snptr, (double)recvd / payloadlength); + } + + if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING)) ) + ret = userfunc(sess, &fr, snptr, msg, payloadlength, encoding); + + free(msg); + + return ret; + } + + return 0; +} + +/** * Creates a listener socket so the other dude can connect to us. * * You'll want to set up some kind of watcher on this socket. @@ -793,6 +878,7 @@ /* apparently 0 is ASCII, 2 is UCS-2 */ /* it is likely that 3 is ISO 8859-1 */ + /* I think "nlanguage" might be the same thing as "subenc" in im.c */ fh->nencode = 0x0000; fh->nlanguage = 0x0000; @@ -821,91 +907,6 @@ } /** - * Sometimes you just don't know with these kinds of people. - * - * @param sess The session. - * @param conn The ODC connection of the incoming data. - * @param frr The frame allocated for the incoming data. - * @param bs It stands for "bologna sandwich." - * @return Return 0 if no errors, otherwise return the error number. - */ -static int handlehdr_odc(aim_session_t *sess, aim_conn_t *conn, aim_frame_t *frr, aim_bstream_t *bs) -{ - aim_frame_t fr; - aim_rxcallback_t userfunc; - fu32_t payloadlength; - fu16_t flags, encoding; - char *snptr = NULL; - - fr.conn = conn; - - /* AAA - ugly */ - aim_bstream_setpos(bs, 20); - payloadlength = aimbs_get32(bs); - - aim_bstream_setpos(bs, 24); - encoding = aimbs_get16(bs); - - aim_bstream_setpos(bs, 30); - flags = aimbs_get16(bs); - - aim_bstream_setpos(bs, 36); - /* XXX - create an aimbs_getnullstr function? */ - snptr = aimbs_getstr(bs, MAXSNLEN); - - faimdprintf(sess, 2, "faim: OFT frame: handlehdr_odc: %04x / %04x / %s\n", payloadlength, flags, snptr); - - if (flags & 0x0002) { - int ret = 0; - - if (flags & 0x000c) { - if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) - ret = userfunc(sess, &fr, snptr, 1); - return ret; - } - - if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMTYPING))) - ret = userfunc(sess, &fr, snptr, 0); - - return ret; - - } else if (((flags & 0x000f) == 0x0000) && payloadlength) { - char *msg, *msg2; - int ret = 0; - int recvd = 0; - int i; - - if (!(msg = calloc(1, payloadlength+1))) - return -1; - msg2 = msg; - - while (payloadlength - recvd) { - if (payloadlength - recvd >= 1024) - i = aim_recv(conn->fd, msg2, 1024); - else - i = aim_recv(conn->fd, msg2, payloadlength - recvd); - if (i <= 0) { - free(msg); - return -1; - } - recvd = recvd + i; - msg2 = msg2 + i; - if ((userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER))) - userfunc(sess, &fr, snptr, (double)recvd / payloadlength); - } - - if ( (userfunc = aim_callhandler(sess, conn, AIM_CB_FAM_OFT, AIM_CB_OFT_DIRECTIMINCOMING)) ) - ret = userfunc(sess, &fr, snptr, msg, payloadlength, encoding); - - free(msg); - - return ret; - } - - return 0; -} - -/** * Handle incoming data on a rendezvous connection. This is analogous to the * consumesnac function in rxhandlers.c, and I really think this should probably * be in rxhandlers.c as well, but I haven't finished cleaning everything up yet. @@ -926,28 +927,7 @@ else faimdprintf(sess, 0, "faim: ODC directim frame unknown, type is %04x\n", fr->hdr.rend.type); - } else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_GETFILE) { - switch (fr->hdr.rend.type) { - case 0x1108: /* getfile listing.txt incoming tx->rx */ - break; - case 0x1209: /* get file listing ack rx->tx */ - break; - case 0x120b: /* get file listing rx confirm */ - break; - case 0x120c: /* getfile request */ - break; - case 0x0101: /* getfile sending data */ - break; - case 0x0202: /* getfile recv data */ - break; - case 0x0204: /* getfile finished */ - break; - default: - faimdprintf(sess, 2, "faim: OFT getfile frame uknown, type is %04x\n", fr->hdr.rend.type); - break; - } - - } else if (conn->subtype == AIM_CONN_SUBTYPE_OFT_SENDFILE) { + } else { aim_rxcallback_t userfunc; struct aim_fileheader_t *header = aim_oft_getheader(&fr->data); aim_oft_dirconvert_fromstupid(header->name); /* XXX - This should be client-side */