| 55 |
55 |
| 56 /* |
56 /* |
| 57 * Read into a byte stream. Will not read more than count, but may read |
57 * Read into a byte stream. Will not read more than count, but may read |
| 58 * less if there is not enough room in the stream buffer. |
58 * less if there is not enough room in the stream buffer. |
| 59 */ |
59 */ |
| 60 faim_internal int aim_bstream_recv(aim_bstream_t *bs, int fd, size_t count) |
60 faim_internal int aim_bstream_recv(ByteStream *bs, int fd, size_t count) |
| 61 { |
61 { |
| 62 int red = 0; |
62 int red = 0; |
| 63 |
63 |
| 64 if (!bs || (fd < 0)) |
64 if (!bs || (fd < 0)) |
| 65 return -1; |
65 return -1; |
| 99 * Read a FLAP header from conn into fr, and return the number of |
99 * Read a FLAP header from conn into fr, and return the number of |
| 100 * bytes in the payload. |
100 * bytes in the payload. |
| 101 * |
101 * |
| 102 * @return -1 on error, otherwise return the length of the payload. |
102 * @return -1 on error, otherwise return the length of the payload. |
| 103 */ |
103 */ |
| 104 static int aim_get_command_flap(aim_session_t *sess, aim_conn_t *conn, aim_frame_t *fr) |
104 static int aim_get_command_flap(OscarSession *sess, OscarConnection *conn, FlapFrame *fr) |
| 105 { |
105 { |
| 106 guint8 hdr_raw[6]; |
106 guint8 hdr_raw[6]; |
| 107 aim_bstream_t hdr; |
107 ByteStream hdr; |
| 108 |
108 |
| 109 fr->hdrtype = AIM_FRAMETYPE_FLAP; |
109 fr->hdrtype = AIM_FRAMETYPE_FLAP; |
| 110 |
110 |
| 111 /* |
111 /* |
| 112 * Read FLAP header. Six bytes total. |
112 * Read FLAP header. Six bytes total. |
| 147 * Read a rendezvous header from conn into fr, and return the number of |
147 * Read a rendezvous header from conn into fr, and return the number of |
| 148 * bytes in the payload. |
148 * bytes in the payload. |
| 149 * |
149 * |
| 150 * @return -1 on error, otherwise return the length of the payload. |
150 * @return -1 on error, otherwise return the length of the payload. |
| 151 */ |
151 */ |
| 152 static int aim_get_command_rendezvous(aim_session_t *sess, aim_conn_t *conn, aim_frame_t *fr) |
152 static int aim_get_command_rendezvous(OscarSession *sess, OscarConnection *conn, FlapFrame *fr) |
| 153 { |
153 { |
| 154 guint8 hdr_raw[8]; |
154 guint8 hdr_raw[8]; |
| 155 aim_bstream_t hdr; |
155 ByteStream hdr; |
| 156 |
156 |
| 157 fr->hdrtype = AIM_FRAMETYPE_OFT; |
157 fr->hdrtype = AIM_FRAMETYPE_OFT; |
| 158 |
158 |
| 159 /* |
159 /* |
| 160 * Read rendezvous header |
160 * Read rendezvous header |
| 180 * |
180 * |
| 181 * @return 0 on success, otherwise return the error number. |
181 * @return 0 on success, otherwise return the error number. |
| 182 * "Success" doesn't mean we have new data, it just means |
182 * "Success" doesn't mean we have new data, it just means |
| 183 * the connection isn't dead. |
183 * the connection isn't dead. |
| 184 */ |
184 */ |
| 185 faim_export int aim_get_command(aim_session_t *sess, aim_conn_t *conn) |
185 faim_export int aim_get_command(OscarSession *sess, OscarConnection *conn) |
| 186 { |
186 { |
| 187 aim_frame_t *fr; |
187 FlapFrame *fr; |
| 188 int payloadlen; |
188 int payloadlen; |
| 189 |
189 |
| 190 if (!sess || !conn) |
190 if (!sess || !conn) |
| 191 return -EINVAL; |
191 return -EINVAL; |
| 192 |
192 |
| 199 */ |
199 */ |
| 200 |
200 |
| 201 if (conn->status & AIM_CONN_STATUS_INPROGRESS) |
201 if (conn->status & AIM_CONN_STATUS_INPROGRESS) |
| 202 return aim_conn_completeconnect(sess, conn); |
202 return aim_conn_completeconnect(sess, conn); |
| 203 |
203 |
| 204 if (!(fr = (aim_frame_t *)calloc(sizeof(aim_frame_t), 1))) |
204 if (!(fr = (FlapFrame *)calloc(sizeof(FlapFrame), 1))) |
| 205 return -ENOMEM; |
205 return -ENOMEM; |
| 206 |
206 |
| 207 /* |
207 /* |
| 208 * Rendezvous (client to client) connections do not speak FLAP, so this |
208 * Rendezvous (client to client) connections do not speak FLAP, so this |
| 209 * function will break on them. |
209 * function will break on them. |
| 248 /* Enqueue this puppy */ |
248 /* Enqueue this puppy */ |
| 249 fr->next = NULL; /* this will always be at the bottom */ |
249 fr->next = NULL; /* this will always be at the bottom */ |
| 250 if (sess->queue_incoming == NULL) |
250 if (sess->queue_incoming == NULL) |
| 251 sess->queue_incoming = fr; |
251 sess->queue_incoming = fr; |
| 252 else { |
252 else { |
| 253 aim_frame_t *cur; |
253 FlapFrame *cur; |
| 254 for (cur = sess->queue_incoming; cur->next; cur = cur->next); |
254 for (cur = sess->queue_incoming; cur->next; cur = cur->next); |
| 255 cur->next = fr; |
255 cur->next = fr; |
| 256 } |
256 } |
| 257 |
257 |
| 258 fr->conn->lastactivity = time(NULL); |
258 fr->conn->lastactivity = time(NULL); |
| 262 |
262 |
| 263 /* |
263 /* |
| 264 * Purge receive queue of all handled commands (->handled==1). |
264 * Purge receive queue of all handled commands (->handled==1). |
| 265 * |
265 * |
| 266 */ |
266 */ |
| 267 faim_export void aim_purge_rxqueue(aim_session_t *sess) |
267 faim_export void aim_purge_rxqueue(OscarSession *sess) |
| 268 { |
268 { |
| 269 aim_frame_t *cur, **prev; |
269 FlapFrame *cur, **prev; |
| 270 |
270 |
| 271 for (prev = &sess->queue_incoming; (cur = *prev); ) { |
271 for (prev = &sess->queue_incoming; (cur = *prev); ) { |
| 272 if (cur->handled) { |
272 if (cur->handled) { |
| 273 *prev = cur->next; |
273 *prev = cur->next; |
| 274 aim_frame_destroy(cur); |
274 aim_frame_destroy(cur); |
| 284 * to clean up the rxqueue of unprocessed connections on that socket. |
284 * to clean up the rxqueue of unprocessed connections on that socket. |
| 285 * |
285 * |
| 286 * XXX: this is something that was handled better in the old connection |
286 * XXX: this is something that was handled better in the old connection |
| 287 * handling method, but eh. |
287 * handling method, but eh. |
| 288 */ |
288 */ |
| 289 faim_internal void aim_rxqueue_cleanbyconn(aim_session_t *sess, aim_conn_t *conn) |
289 faim_internal void aim_rxqueue_cleanbyconn(OscarSession *sess, OscarConnection *conn) |
| 290 { |
290 { |
| 291 aim_frame_t *currx; |
291 FlapFrame *currx; |
| 292 |
292 |
| 293 for (currx = sess->queue_incoming; currx; currx = currx->next) { |
293 for (currx = sess->queue_incoming; currx; currx = currx->next) { |
| 294 if ((!currx->handled) && (currx->conn == conn)) |
294 if ((!currx->handled) && (currx->conn == conn)) |
| 295 currx->handled = 1; |
295 currx->handled = 1; |
| 296 } |
296 } |