ret_t cherokee_downloader_async_step (cherokee_downloader_async_t *adownloader) { int re; int fd; int rw; cherokee_downloader_t *down = DOWNLOADER(adownloader); cherokee_fdpoll_t *fdpoll = adownloader->fdpoll_ref; TRACE(ENTRIES, "Enters obj=%p fdpoll=%p\n", adownloader, fdpoll); return_if_fail ((fdpoll != NULL), ret_error); /* Watch the fd poll */ re = cherokee_fdpoll_watch (fdpoll, WATCH_SLEEP); TRACE(ENTRIES, "watch = %d\n", re); if (re <= 0) return ret_eagain; /* Check whether we are reading or writting */ if (down->phase <= downloader_phase_send_post) rw = FDPOLL_MODE_WRITE; else rw = FDPOLL_MODE_READ; TRACE(ENTRIES, "rw = %d\n", rw); /* Check the downloader fd */ fd = down->socket.socket; re = cherokee_fdpoll_check (fdpoll, fd, rw); switch (re) { case -1: PRINT_ERROR("Error polling fd=%d rw=%d\n", fd, rw); return ret_error; case 0: TRACE(ENTRIES, "fd=%d rw=%d, not ready\n", fd, rw); /* return ret_eagain; */ } /* If there's something to do, go for it.. */ TRACE(ENTRIES, "fd=%d rw=%d is active\n", fd, rw); return cherokee_downloader_step (down, NULL, NULL); }
static ret_t do_download (cherokee_downloader_t *downloader) { ret_t ret; cherokee_downloader_status_t status; cherokee_boolean_t got_headers = false; cherokee_boolean_t reading = false; do_download__init(downloader,NULL); for (;;) { /* Do some real work */ ret = cherokee_downloader_step (downloader, NULL, NULL); cherokee_downloader_get_status(downloader, &status); TRACE(ENTRIES, "ret=%d status=%d\n", ret, status); switch (ret) { case ret_ok: if ( !reading && (status & downloader_status_post_sent)) { reading = true; } if ( (status & downloader_status_headers_received) && !got_headers) { do_download__has_headers (downloader, NULL); got_headers = true; } if (status & downloader_status_data_available) { do_download__read_body (downloader, NULL); } if (status & downloader_status_finished) { do_download__finish (downloader, NULL); } break; case ret_eagain: /* It's going on.. */ break; case ret_eof_have_data: if ((status & downloader_status_headers_received) && !got_headers) { do_download__has_headers (downloader, NULL); got_headers = true; } if (status & downloader_status_data_available) { do_download__read_body (downloader, NULL); } /* fall down */ case ret_eof: if (status & downloader_status_finished) { do_download__finish (downloader, NULL); } /* fall down */ case ret_error: /* Finished or critical error */ return ret; default: SHOULDNT_HAPPEN; return ret_error; } } return ret_ok; }