From: Mark D. <the...@us...> - 2003-12-08 05:41:08
|
Update of /cvsroot/gaim/gaim/src/protocols/oscar In directory sc8-pr-cvs1:/tmp/cvs-serv1702/src/protocols/oscar Modified Files: aim.h aim_internal.h rxhandlers.c rxqueue.c txqueue.c Log Message: I modified some of the libfaim connection stuff. I dunno, it seems cleaner this way. I like to be comfortable with what's going on. It's possible that FT and DC won't work now (although, they should), but I'll get to making them suck less pretty soon. Also upgraded the Doxyfile to 1 version newer. It mostly just moved some things around, but also removed the CGI_BLEH lines from the end. Index: aim.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/oscar/aim.h,v retrieving revision 1.127 retrieving revision 1.128 diff -u -d -p -r1.127 -r1.128 --- aim.h 21 Nov 2003 04:13:29 -0000 1.127 +++ aim.h 8 Dec 2003 05:41:04 -0000 1.128 @@ -283,9 +283,9 @@ struct client_info_s { #define AIM_CONN_TYPE_BOS 0x0002 #define AIM_CONN_TYPE_ADS 0x0005 #define AIM_CONN_TYPE_AUTH 0x0007 -#define AIM_CONN_TYPE_CHATNAV 0x000d +#define AIM_CONN_TYPE_CHATNAV 0x000d #define AIM_CONN_TYPE_CHAT 0x000e -#define AIM_CONN_TYPE_SEARCH 0x000f +#define AIM_CONN_TYPE_SEARCH 0x000f #define AIM_CONN_TYPE_ICON 0x0010 #define AIM_CONN_TYPE_EMAIL 0x0018 @@ -300,7 +300,7 @@ struct client_info_s { #define AIM_CONN_SUBTYPE_OFT_GETFILE 0x0002 #define AIM_CONN_SUBTYPE_OFT_SENDFILE 0x0003 #define AIM_CONN_SUBTYPE_OFT_BUDDYICON 0x0004 -#define AIM_CONN_SUBTYPE_OFT_VOICE 0x0005 +#define AIM_CONN_SUBTYPE_OFT_VOICE 0x0005 /* * Status values returned from aim_conn_new(). ORed together. @@ -354,19 +354,18 @@ typedef struct aim_frame_s { fu8_t hdrtype; /* defines which piece of the union to use */ union { struct { - fu8_t type; + fu8_t channel; flap_seqnum_t seqnum; } flap; struct { - fu8_t magic[4]; /* ODC2 or OFT2 */ + fu8_t magic[4]; /* ODC2 or OFT2 */ fu16_t hdrlen; fu16_t type; } rend; } hdr; - aim_bstream_t data; /* payload stream */ - fu8_t handled; /* 0 = new, !0 = been handled */ - fu8_t nofree; /* 0 = free data on purge, 1 = only unlink */ - aim_conn_t *conn; /* the connection it came in on... */ + aim_bstream_t data; /* payload stream */ + aim_conn_t *conn; /* the connection it came in on/is going out on */ + fu8_t handled; /* 0 = new, !0 = been handled */ struct aim_frame_s *next; } aim_frame_t; @@ -472,18 +471,18 @@ typedef struct aim_session_s { } aim_session_t; /* Valid for calling aim_icq_setstatus() and for aim_userinfo_t->icqinfo.status */ -#define AIM_ICQ_STATE_NORMAL 0x00000000 -#define AIM_ICQ_STATE_AWAY 0x00000001 -#define AIM_ICQ_STATE_DND 0x00000002 -#define AIM_ICQ_STATE_OUT 0x00000004 -#define AIM_ICQ_STATE_BUSY 0x00000010 -#define AIM_ICQ_STATE_CHAT 0x00000020 -#define AIM_ICQ_STATE_INVISIBLE 0x00000100 -#define AIM_ICQ_STATE_WEBAWARE 0x00010000 -#define AIM_ICQ_STATE_HIDEIP 0x00020000 -#define AIM_ICQ_STATE_BIRTHDAY 0x00080000 +#define AIM_ICQ_STATE_NORMAL 0x00000000 +#define AIM_ICQ_STATE_AWAY 0x00000001 +#define AIM_ICQ_STATE_DND 0x00000002 +#define AIM_ICQ_STATE_OUT 0x00000004 +#define AIM_ICQ_STATE_BUSY 0x00000010 +#define AIM_ICQ_STATE_CHAT 0x00000020 +#define AIM_ICQ_STATE_INVISIBLE 0x00000100 +#define AIM_ICQ_STATE_WEBAWARE 0x00010000 +#define AIM_ICQ_STATE_HIDEIP 0x00020000 +#define AIM_ICQ_STATE_BIRTHDAY 0x00080000 #define AIM_ICQ_STATE_DIRECTDISABLED 0x00100000 -#define AIM_ICQ_STATE_ICQHOMEPAGE 0x00200000 +#define AIM_ICQ_STATE_ICQHOMEPAGE 0x00200000 #define AIM_ICQ_STATE_DIRECTREQUIREAUTH 0x10000000 #define AIM_ICQ_STATE_DIRECTCONTACTLIST 0x20000000 Index: aim_internal.h =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/oscar/aim_internal.h,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -p -r1.27 -r1.28 --- aim_internal.h 25 Nov 2003 07:16:11 -0000 1.27 +++ aim_internal.h 8 Dec 2003 05:41:04 -0000 1.28 @@ -110,11 +110,8 @@ faim_internal void aim_frame_destroy(aim /* txqueue.c */ faim_internal aim_frame_t *aim_tx_new(aim_session_t *sess, aim_conn_t *conn, fu8_t framing, fu16_t chan, int datalen); faim_internal int aim_tx_enqueue(aim_session_t *, aim_frame_t *); -faim_internal flap_seqnum_t aim_get_next_txseqnum(aim_conn_t *); faim_internal int aim_tx_sendframe(aim_session_t *sess, aim_frame_t *cur); faim_internal void aim_tx_cleanqueue(aim_session_t *, aim_conn_t *); - -/* XXX - What is this? faim_internal int aim_tx_printqueue(aim_session_t *); */ /* * Generic SNAC structure. Rarely if ever used. Index: rxhandlers.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/oscar/rxhandlers.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -p -r1.11 -r1.12 --- rxhandlers.c 5 Oct 2003 23:50:40 -0000 1.11 +++ rxhandlers.c 8 Dec 2003 05:41:04 -0000 1.12 @@ -370,21 +370,21 @@ faim_internal int bleck(aim_session_t *s maxf = sizeof(literals) / sizeof(literals[0]); maxs = sizeof(literals[0]) / sizeof(literals[0][0]); - if (frame->hdr.flap.type == 0x02) { + if (frame->hdr.flap.channel == 0x02) { family = aimbs_get16(&frame->data); subtype = aimbs_get16(&frame->data); if ((family < maxf) && (subtype+1 < maxs) && (literals[family][subtype] != NULL)) - faimdprintf(sess, 0, "bleck: channel %s: null handler for %04x/%04x (%s)\n", channels[frame->hdr.flap.type], family, subtype, literals[family][subtype+1]); + faimdprintf(sess, 0, "bleck: channel %s: null handler for %04x/%04x (%s)\n", channels[frame->hdr.flap.channel], family, subtype, literals[family][subtype+1]); else - faimdprintf(sess, 0, "bleck: channel %s: null handler for %04x/%04x (no literal)\n", channels[frame->hdr.flap.type], family, subtype); + faimdprintf(sess, 0, "bleck: channel %s: null handler for %04x/%04x (no literal)\n", channels[frame->hdr.flap.channel], family, subtype); } else { - if (frame->hdr.flap.type <= maxchannels) - faimdprintf(sess, 0, "bleck: channel %s (0x%02x)\n", channels[frame->hdr.flap.type], frame->hdr.flap.type); + if (frame->hdr.flap.channel <= maxchannels) + faimdprintf(sess, 0, "bleck: channel %s (0x%02x)\n", channels[frame->hdr.flap.channel], frame->hdr.flap.channel); else - faimdprintf(sess, 0, "bleck: unknown channel 0x%02x\n", frame->hdr.flap.type); + faimdprintf(sess, 0, "bleck: unknown channel 0x%02x\n", frame->hdr.flap.channel); } @@ -517,19 +517,19 @@ faim_export void aim_rxdispatch(aim_sess continue; if (cur->hdrtype == AIM_FRAMETYPE_FLAP) { - if (cur->hdr.flap.type == 0x01) { + if (cur->hdr.flap.channel == 0x01) { cur->handled = aim_callhandler_noparam(sess, cur->conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_FLAPVER, cur); /* XXX use consumenonsnac */ continue; - } else if (cur->hdr.flap.type == 0x02) { + } else if (cur->hdr.flap.channel == 0x02) { if ((cur->handled = consumesnac(sess, cur))) continue; - } else if (cur->hdr.flap.type == 0x04) { + } else if (cur->hdr.flap.channel == 0x04) { cur->handled = negchan_middle(sess, cur); continue; - } else if (cur->hdr.flap.type == 0x05) { + } else if (cur->hdr.flap.channel == 0x05) { } Index: rxqueue.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/oscar/rxqueue.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -p -r1.11 -r1.12 --- rxqueue.c 20 Jun 2003 04:16:23 -0000 1.11 +++ rxqueue.c 8 Dec 2003 05:41:04 -0000 1.12 @@ -64,11 +64,10 @@ faim_internal int aim_bstream_recv(aim_b } /** - * aim_frame_destroy - free aim_frame_t - * @frame: the frame to free - * - * returns -1 on error; 0 on success. + * Free an aim_frame_t * + * @param frame The frame to free. + * @return -1 on error; 0 on success. */ faim_internal void aim_frame_destroy(aim_frame_t *frame) { @@ -80,88 +79,94 @@ faim_internal void aim_frame_destroy(aim } /* - * Read a FLAP header from conn into fr, and return the number of bytes in the payload. + * Read a FLAP header from conn into fr, and return the number of + * bytes in the payload. + * + * @return -1 on error, otherwise return the length of the payload. */ static int aim_get_command_flap(aim_session_t *sess, aim_conn_t *conn, aim_frame_t *fr) { - fu8_t flaphdr_raw[6]; - aim_bstream_t flaphdr; - fu16_t payloadlen; + fu8_t hdr_raw[6]; + aim_bstream_t hdr; - aim_bstream_init(&flaphdr, flaphdr_raw, sizeof(flaphdr_raw)); + fr->hdrtype = AIM_FRAMETYPE_FLAP; /* - * Read FLAP header. Six bytes: - * 0 char -- Always 0x2a - * 1 char -- Channel ID. Usually 2 -- 1 and 4 are used during login. - * 2 short -- Sequence number - * 4 short -- Number of data bytes that follow. + * Read FLAP header. Six bytes total. + * + * Byte # | Description + * -------|------------- + * 0x00 | Always 0x2a + * 0x01 | Channel number, usually "2." "1" is used during login, + * | 4 is used during logoff. + * 0x02 | Sequence number, 2 bytes. + * 0x04 | Number of data bytes that follow, 2 bytes. */ - if (aim_bstream_recv(&flaphdr, conn->fd, 6) < 6) { + aim_bstream_init(&hdr, hdr_raw, sizeof(hdr_raw)); + if (aim_bstream_recv(&hdr, conn->fd, 6) < 6) { aim_conn_close(conn); return -1; } - aim_bstream_rewind(&flaphdr); + aim_bstream_rewind(&hdr); /* * This shouldn't happen unless the socket breaks, the server breaks, * or we break. We must handle it just in case. */ - if (aimbs_get8(&flaphdr) != 0x2a) { - fu8_t start; - - aim_bstream_rewind(&flaphdr); - start = aimbs_get8(&flaphdr); - faimdprintf(sess, 0, "FLAP framing disrupted (0x%02x)", start); + if (aimbs_get8(&hdr) != 0x2a) { + faimdprintf(sess, 0, "Invalid FLAP frame received on FLAP connection!"); aim_conn_close(conn); return -1; } - /* we're doing FLAP if we're here */ - fr->hdrtype = AIM_FRAMETYPE_FLAP; - - fr->hdr.flap.type = aimbs_get8(&flaphdr); - fr->hdr.flap.seqnum = aimbs_get16(&flaphdr); - payloadlen = aimbs_get16(&flaphdr); /* length of payload */ + fr->hdr.flap.channel = aimbs_get8(&hdr); + fr->hdr.flap.seqnum = aimbs_get16(&hdr); - return payloadlen; + return aimbs_get16(&hdr); } /* - * Read a rendezvous header from conn into fr, and return the number of bytes in the payload. + * Read a rendezvous header from conn into fr, and return the number of + * bytes in the payload. + * + * @return -1 on error, otherwise return the length of the payload. */ static int aim_get_command_rendezvous(aim_session_t *sess, aim_conn_t *conn, aim_frame_t *fr) { - fu8_t rendhdr_raw[8]; - aim_bstream_t rendhdr; + fu8_t hdr_raw[8]; + aim_bstream_t hdr; - aim_bstream_init(&rendhdr, rendhdr_raw, sizeof(rendhdr_raw)); + fr->hdrtype = AIM_FRAMETYPE_OFT; - if (aim_bstream_recv(&rendhdr, conn->fd, 8) < 8) { + /* + * Read rendezvous header + */ + aim_bstream_init(&hdr, hdr_raw, sizeof(hdr_raw)); + if (aim_bstream_recv(&hdr, conn->fd, 8) < 8) { aim_conn_close(conn); return -1; } - aim_bstream_rewind(&rendhdr); - - fr->hdrtype = AIM_FRAMETYPE_OFT; /* a misnomer--rendezvous */ + aim_bstream_rewind(&hdr); - aimbs_getrawbuf(&rendhdr, fr->hdr.rend.magic, 4); - fr->hdr.rend.hdrlen = aimbs_get16(&rendhdr) - 8; - fr->hdr.rend.type = aimbs_get16(&rendhdr); + aimbs_getrawbuf(&hdr, fr->hdr.rend.magic, 4); + fr->hdr.rend.hdrlen = aimbs_get16(&hdr); + fr->hdr.rend.type = aimbs_get16(&hdr); - return fr->hdr.rend.hdrlen; + return fr->hdr.rend.hdrlen - 8; } /* * Grab a single command sequence off the socket, and enqueue it in the incoming event queue * in a separate struct. + * + * @return 0 on success, otherwise return the error number. */ faim_export int aim_get_command(aim_session_t *sess, aim_conn_t *conn) { - aim_frame_t *newrx; - fu16_t payloadlen; + aim_frame_t *fr; + int payloadlen; if (!sess || !conn) return -EINVAL; @@ -175,81 +180,67 @@ faim_export int aim_get_command(aim_sess if (conn->status & AIM_CONN_STATUS_INPROGRESS) return aim_conn_completeconnect(sess, conn); - if (!(newrx = (aim_frame_t *)calloc(sizeof(aim_frame_t), 1))) + if (!(fr = (aim_frame_t *)calloc(sizeof(aim_frame_t), 1))) return -ENOMEM; /* * Rendezvous (client to client) connections do not speak FLAP, so this * function will break on them. */ - if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) { - int ret = aim_get_command_rendezvous(sess, conn, newrx); - - if (ret < 0) { - free(newrx); - return -1; - } - - payloadlen = ret; - } else if (conn->type == AIM_CONN_TYPE_LISTENER) { + if (conn->type == AIM_CONN_TYPE_RENDEZVOUS) + payloadlen = aim_get_command_rendezvous(sess, conn, fr); + else if (conn->type == AIM_CONN_TYPE_LISTENER) { faimdprintf(sess, 0, "AIM_CONN_TYPE_LISTENER on fd %d\n", conn->fd); - free(newrx); + free(fr); return -1; } else - payloadlen = aim_get_command_flap(sess, conn, newrx); + payloadlen = aim_get_command_flap(sess, conn, fr); - newrx->nofree = 0; /* free by default */ + if (payloadlen < 0) { + free(fr); + return -1; + } - if (payloadlen) { + if (payloadlen > 0) { fu8_t *payload = NULL; if (!(payload = (fu8_t *) malloc(payloadlen))) { - aim_frame_destroy(newrx); + aim_frame_destroy(fr); return -1; } - aim_bstream_init(&newrx->data, payload, payloadlen); + aim_bstream_init(&fr->data, payload, payloadlen); /* read the payload */ - if (aim_bstream_recv(&newrx->data, conn->fd, payloadlen) < payloadlen) { - aim_frame_destroy(newrx); /* free's payload */ + if (aim_bstream_recv(&fr->data, conn->fd, payloadlen) < payloadlen) { + aim_frame_destroy(fr); /* free's payload */ aim_conn_close(conn); return -1; } } else - aim_bstream_init(&newrx->data, NULL, 0); - - - aim_bstream_rewind(&newrx->data); + aim_bstream_init(&fr->data, NULL, 0); - newrx->conn = conn; + aim_bstream_rewind(&fr->data); - newrx->next = NULL; /* this will always be at the bottom */ + fr->conn = conn; - if (!sess->queue_incoming) - sess->queue_incoming = newrx; + /* Enqueue this puppy */ + fr->next = NULL; /* this will always be at the bottom */ + if (sess->queue_incoming == NULL) + sess->queue_incoming = fr; else { aim_frame_t *cur; - - for (cur = sess->queue_incoming; cur->next; cur = cur->next) - ; - cur->next = newrx; + for (cur = sess->queue_incoming; cur->next; cur = cur->next); + cur->next = fr; } - newrx->conn->lastactivity = time(NULL); + fr->conn->lastactivity = time(NULL); return 0; } /* - * Purge recieve queue of all handled commands (->handled==1). Also - * allows for selective freeing using ->nofree so that the client can - * keep the data for various purposes. - * - * If ->nofree is nonzero, the frame will be delinked from the global list, - * but will not be free'ed. The client _must_ keep a pointer to the - * data -- libfaim will not! If the client marks ->nofree but - * does not keep a pointer, it's lost forever. + * Purge recieve queue of all handled commands (->handled==1). * */ faim_export void aim_purge_rxqueue(aim_session_t *sess) @@ -258,12 +249,8 @@ faim_export void aim_purge_rxqueue(aim_s for (prev = &sess->queue_incoming; (cur = *prev); ) { if (cur->handled) { - *prev = cur->next; - - if (!cur->nofree) - aim_frame_destroy(cur); - + aim_frame_destroy(cur); } else prev = &cur->next; } @@ -286,5 +273,6 @@ faim_internal void aim_rxqueue_cleanbyco if ((!currx->handled) && (currx->conn == conn)) currx->handled = 1; } + return; } Index: txqueue.c =================================================================== RCS file: /cvsroot/gaim/gaim/src/protocols/oscar/txqueue.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -p -r1.8 -r1.9 --- txqueue.c 26 Feb 2003 05:01:36 -0000 1.8 +++ txqueue.c 8 Dec 2003 05:41:04 -0000 1.9 @@ -30,8 +30,8 @@ faim_internal aim_frame_t *aim_tx_new(ai { aim_frame_t *fr; - if (!conn) { - faimdprintf(sess, 0, "aim_tx_new: ERROR: no connection specified\n"); + if (!sess || !conn) { + faimdprintf(sess, 0, "aim_tx_new: No session or no connection specified!\n"); return NULL; } @@ -48,23 +48,16 @@ faim_internal aim_frame_t *aim_tx_new(ai } } - if (!(fr = (aim_frame_t *)malloc(sizeof(aim_frame_t)))) + if (!(fr = (aim_frame_t *)calloc(1, sizeof(aim_frame_t)))) return NULL; - memset(fr, 0, sizeof(aim_frame_t)); fr->conn = conn; - fr->hdrtype = framing; - - if (fr->hdrtype == AIM_FRAMETYPE_FLAP) { - - fr->hdr.flap.type = chan; - - } else if (fr->hdrtype == AIM_FRAMETYPE_OFT) { - + if (fr->hdrtype == AIM_FRAMETYPE_FLAP) + fr->hdr.flap.channel = chan; + else if (fr->hdrtype == AIM_FRAMETYPE_OFT) fr->hdr.rend.type = chan; - - } else + else faimdprintf(sess, 0, "tx_new: unknown framing\n"); if (datalen > 0) { @@ -81,9 +74,22 @@ faim_internal aim_frame_t *aim_tx_new(ai return fr; } +/* + * This increments the tx command count, and returns the seqnum + * that should be stamped on the next FLAP packet sent. This is + * normally called during the final step of packet preparation + * before enqueuement (in aim_tx_enqueue()). + */ +static flap_seqnum_t aim_get_next_txseqnum(aim_conn_t *conn) +{ + flap_seqnum_t ret; + + ret = ++conn->seqnum; + + return ret; +} + /* - * aim_tx_enqeue__queuebased() - * * The overall purpose here is to enqueue the passed in command struct * into the outgoing (tx) queue. Basically... * 1) Make a scope-irrelevent copy of the struct @@ -115,9 +121,7 @@ static int aim_tx_enqueue__queuebased(ai sess->queue_outgoing = fr; else { aim_frame_t *cur; - - for (cur = sess->queue_outgoing; cur->next; cur = cur->next) - ; + for (cur = sess->queue_outgoing; cur->next; cur = cur->next); cur->next = fr; } @@ -125,8 +129,6 @@ static int aim_tx_enqueue__queuebased(ai } /* - * aim_tx_enqueue__immediate() - * * Parallel to aim_tx_enqueue__queuebased, however, this bypasses * the whole queue mess when you want immediate writes to happen. * @@ -177,7 +179,7 @@ faim_internal int aim_tx_enqueue(aim_ses { /* - * If we want to send a connection thats inprogress, we have to force + * If we want to send on a connection that is inprogress, we have to force * them to use the queue based version. Otherwise, use whatever they * want. */ @@ -189,24 +191,6 @@ faim_internal int aim_tx_enqueue(aim_ses return (*sess->tx_enqueue)(sess, fr); } -/* - * aim_get_next_txseqnum() - * - * This increments the tx command count, and returns the seqnum - * that should be stamped on the next FLAP packet sent. This is - * normally called during the final step of packet preparation - * before enqueuement (in aim_tx_enqueue()). - * - */ -faim_internal flap_seqnum_t aim_get_next_txseqnum(aim_conn_t *conn) -{ - flap_seqnum_t ret; - - ret = ++conn->seqnum; - - return ret; -} - static int aim_send(int fd, const void *buf, size_t count) { int left, cur; @@ -215,6 +199,7 @@ static int aim_send(int fd, const void * int ret; ret = send(fd, ((unsigned char *)buf)+cur, left, 0); + if (ret == -1) return -1; else if (ret == 0) @@ -230,45 +215,38 @@ static int aim_send(int fd, const void * static int aim_bstream_send(aim_bstream_t *bs, aim_conn_t *conn, size_t count) { int wrote = 0; + if (!bs || !conn || (count < 0)) return -EINVAL; + /* Make sure we don't send paste the end of the bs */ if (count > aim_bstream_empty(bs)) count = aim_bstream_empty(bs); /* truncate to remaining space */ if (count) { + /* + * If we're sending a large direct IM (maybe it contains an + * image or something), then we want to break it up into chunks + * of 1024 and update the UI between sending each one. This is + * kind of ugly. Ideally, if the client wants to send a large + * amount of data it should just write to the fd directly--we're + * not multithreaded and this is just a stop-gap thingy. + */ if ((conn->type == AIM_CONN_TYPE_RENDEZVOUS) && (conn->subtype == AIM_CONN_SUBTYPE_OFT_DIRECTIM)) { - /* I strongly suspect that this is a horrible thing to do - * and I feel really guilty doing it. */ const char *sn = aim_odc_getsn(conn); aim_rxcallback_t userfunc; + while (count - wrote > 1024) { wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, 1024); - if ((userfunc=aim_callhandler(conn->sessv, conn, - AIM_CB_FAM_SPECIAL, - AIM_CB_SPECIAL_IMAGETRANSFER))) - userfunc(conn->sessv, NULL, sn, - count-wrote>1024 ? ((double)wrote / count) : 1); + if ((userfunc=aim_callhandler(conn->sessv, conn, AIM_CB_FAM_SPECIAL, AIM_CB_SPECIAL_IMAGETRANSFER))) + userfunc(conn->sessv, NULL, sn, count-wrote>1024 ? ((double)wrote / count) : 1); } } + if (count - wrote) { wrote = wrote + aim_send(conn->fd, bs->data + bs->offset + wrote, count - wrote); } - - } - - if (((aim_session_t *)conn->sessv)->debug >= 2) { - int i; - aim_session_t *sess = (aim_session_t *)conn->sessv; - - faimdprintf(sess, 2, "\nOutgoing data: (%d bytes)", wrote); - for (i = 0; i < wrote; i++) { - if (!(i % 8)) - faimdprintf(sess, 2, "\n\t"); - faimdprintf(sess, 2, "0x%02x ", *(bs->data + bs->offset + i)); - } - faimdprintf(sess, 2, "\n"); } bs->offset += wrote; @@ -278,33 +256,33 @@ static int aim_bstream_send(aim_bstream_ static int sendframe_flap(aim_session_t *sess, aim_frame_t *fr) { - aim_bstream_t obs; - fu8_t *obs_raw; - int payloadlen, err = 0, obslen; + aim_bstream_t bs; + fu8_t *bs_raw; + int payloadlen, err = 0, bslen; payloadlen = aim_bstream_curpos(&fr->data); - if (!(obs_raw = malloc(6 + payloadlen))) + if (!(bs_raw = malloc(6 + payloadlen))) return -ENOMEM; - aim_bstream_init(&obs, obs_raw, 6 + payloadlen); + aim_bstream_init(&bs, bs_raw, 6 + payloadlen); /* FLAP header */ - aimbs_put8(&obs, 0x2a); - aimbs_put8(&obs, fr->hdr.flap.type); - aimbs_put16(&obs, fr->hdr.flap.seqnum); - aimbs_put16(&obs, payloadlen); + aimbs_put8(&bs, 0x2a); + aimbs_put8(&bs, fr->hdr.flap.channel); + aimbs_put16(&bs, fr->hdr.flap.seqnum); + aimbs_put16(&bs, payloadlen); /* payload */ aim_bstream_rewind(&fr->data); - aimbs_putbs(&obs, &fr->data, payloadlen); + aimbs_putbs(&bs, &fr->data, payloadlen); - obslen = aim_bstream_curpos(&obs); - aim_bstream_rewind(&obs); - if (aim_bstream_send(&obs, fr->conn, obslen) != obslen) + bslen = aim_bstream_curpos(&bs); + aim_bstream_rewind(&bs); + if (aim_bstream_send(&bs, fr->conn, bslen) != bslen) err = -errno; - free(obs_raw); /* XXX aim_bstream_free */ + free(bs_raw); /* XXX aim_bstream_free */ fr->handled = 1; fr->conn->lastactivity = time(NULL); @@ -316,25 +294,27 @@ static int sendframe_rendezvous(aim_sess { aim_bstream_t bs; fu8_t *bs_raw; - int err = 0; - int totlen = 8 + aim_bstream_curpos(&fr->data); + int payloadlen, err = 0, bslen; - if (!(bs_raw = malloc(totlen))) - return -1; + payloadlen = aim_bstream_curpos(&fr->data); - aim_bstream_init(&bs, bs_raw, totlen); + if (!(bs_raw = malloc(8 + payloadlen))) + return -ENOMEM; + + aim_bstream_init(&bs, bs_raw, 8 + payloadlen); + /* Rendezvous header */ aimbs_putraw(&bs, fr->hdr.rend.magic, 4); - aimbs_put16(&bs, 8 + fr->hdr.rend.hdrlen); + aimbs_put16(&bs, fr->hdr.rend.hdrlen); aimbs_put16(&bs, fr->hdr.rend.type); /* payload */ aim_bstream_rewind(&fr->data); - aimbs_putbs(&bs, &fr->data, totlen - 8); + aimbs_putbs(&bs, &fr->data, payloadlen); + bslen = aim_bstream_curpos(&bs); aim_bstream_rewind(&bs); - - if (aim_bstream_send(&bs, fr->conn, totlen) != totlen) + if (aim_bstream_send(&bs, fr->conn, bslen) != bslen) err = -errno; free(bs_raw); /* XXX aim_bstream_free */ @@ -351,6 +331,7 @@ faim_internal int aim_tx_sendframe(aim_s return sendframe_flap(sess, fr); else if (fr->hdrtype == AIM_FRAMETYPE_OFT) return sendframe_rendezvous(sess, fr); + return -1; } @@ -392,24 +373,18 @@ faim_export int aim_tx_flushqueue(aim_se } /* - * aim_tx_purgequeue() - * * This is responsable for removing sent commands from the transmit * queue. This is not a required operation, but it of course helps * reduce memory footprint at run time! - * */ faim_export void aim_tx_purgequeue(aim_session_t *sess) { aim_frame_t *cur, **prev; for (prev = &sess->queue_outgoing; (cur = *prev); ) { - if (cur->handled) { *prev = cur->next; - aim_frame_destroy(cur); - } else prev = &cur->next; } @@ -418,13 +393,12 @@ faim_export void aim_tx_purgequeue(aim_s } /** - * aim_tx_cleanqueue - get rid of packets waiting for tx on a dying conn - * @sess: session - * @conn: connection that's dying - * - * for now this simply marks all packets as sent and lets them - * disappear without warning. + * Get rid of packets waiting for tx on a dying conn. For now this + * simply marks all packets as sent and lets them disappear without + * warning. * + * @param sess A session. + * @param conn Connection that's dying. */ faim_internal void aim_tx_cleanqueue(aim_session_t *sess, aim_conn_t *conn) { |