Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}