Hi guys,

I have implemented a new interface in downloader to be able to query the status of a download. I changed cget to use this new interface. cget is working again, and with this patch SVN head should compile again.

Please review the patch, if there is no problem with the patch I will commit it to subversion

Thanks,
Rodrigo


Index: cherokee/downloader-protected.h
===================================================================
--- cherokee/downloader-protected.h	(revision 258)
+++ cherokee/downloader-protected.h	(working copy)
@@ -71,6 +71,8 @@
 		uint32_t post_sent;
 		uint32_t body_recv;
 	} info;
+
+	cherokee_downloader_status_t status;
 };
 
 
Index: cherokee/downloader.c
===================================================================
--- cherokee/downloader.c	(revision 258)
+++ cherokee/downloader.c	(working copy)
@@ -105,6 +105,8 @@
 	n->info.post_sent    = 0;
 	n->info.body_recv    = 0;
 
+	n->status = downloader_status_none;
+
 	return ret_ok;
 }
 
@@ -409,6 +411,7 @@
 		ret = downloader_send_buffer (downloader, &downloader->request_header);
 		if (unlikely(ret != ret_ok)) return ret;
 
+		downloader->status = downloader_status_headers_sent;
 		downloader->phase = downloader_phase_send_post;
 
 	case downloader_phase_send_post:
@@ -422,6 +425,7 @@
 			if (unlikely(ret != ret_ok)) return ret;
 		}
 
+		downloader->status = downloader->status | downloader_status_post_sent;
 		downloader->phase = downloader_phase_read_headers;
 		break;
 
@@ -433,11 +437,13 @@
 
 		/* We have the header parsed, continue..
 		 */
+		downloader->status = downloader->status | downloader_status_headers_received;
 		downloader->phase = downloader_phase_step;
 
 		/* Does it read the full reply in the first received chunk?
 		 */
 		if (downloader->info.body_recv >= downloader->content_length) {
+			downloader->status = downloader->status | downloader_status_data_available | downloader_status_finished;
 			return ret_eof_have_data;
 		}
 
@@ -445,11 +451,28 @@
 		TRACE(ENTRIES, "Phase %s\n", "step");
 
 		ret = downloader_step (downloader);
-		if (ret != ret_ok) return ret;
+		switch (ret) {
+		case ret_error:
+			break;
+		case ret_ok:
+			downloader->status = downloader->status | downloader_status_data_available;
+			break;
+		case ret_eof_have_data:
+			downloader->status = downloader->status | downloader_status_data_available | downloader_status_finished;
+			break;
+		case ret_eof:
+			downloader->status = downloader->status & ~downloader_status_data_available | downloader_status_finished;
+			break;
+		case ret_eagain:
+			downloader->status = downloader->status & ~downloader_status_data_available;
+			break;
+		}
+		return ret;
 
 	case downloader_phase_finished:
 		TRACE(ENTRIES, "Phase %s\n", "finished");
 
+		downloader->status = downloader->status & ~downloader_status_data_available & downloader_status_finished;
 		return ret_ok;
 
 	default:
@@ -496,3 +519,35 @@
 
 	return ret_deny;
 }
+
+ret_t 
+cherokee_downloader_headers_available(cherokee_downloader_t *downloader)
+{
+	return (downloader->phase == downloader_phase_step) ? ret_ok: ret_deny;
+}
+ret_t 
+cherokee_downloader_data_available(cherokee_downloader_t *downloader)
+{
+	return (downloader->phase == downloader_phase_step) ? ret_ok: ret_deny;
+}
+
+ret_t
+cherokee_downloader_finished(cherokee_downloader_t *downloader) 
+{
+	ret_t ret = ret_deny;
+
+	if (downloader->info.body_recv >= downloader->content_length) {
+		ret = ret_ok;
+	} else 	if (downloader->phase == downloader_phase_finished) {
+		ret = ret_ok;
+	}
+	return ret;
+}
+
+ret_t
+cherokee_downloader_get_status(cherokee_downloader_t *downloader, cherokee_downloader_status_t *status)
+{
+	if (status != NULL) {
+		*status = downloader->status;
+	}
+}
Index: cherokee/downloader.h
===================================================================
--- cherokee/downloader.h	(revision 258)
+++ cherokee/downloader.h	(working copy)
@@ -41,6 +41,14 @@
 typedef struct cherokee_downloader cherokee_downloader_t;
 #define DOWNLOADER(d) ((cherokee_downloader_t *)(d))
 
+typedef enum {
+	downloader_status_none = 0x0,
+	downloader_status_headers_sent = 0x1,
+	downloader_status_post_sent = 0x2,
+	downloader_status_headers_received = 0x4,
+	downloader_status_data_available = 0x8,
+	downloader_status_finished = 0x10
+} cherokee_downloader_status_t;
 
 ret_t cherokee_downloader_new             (cherokee_downloader_t **downloader);
 ret_t cherokee_downloader_free            (cherokee_downloader_t  *downloader);
@@ -56,6 +64,8 @@
 ret_t cherokee_downloader_reuse           (cherokee_downloader_t *downloader);
 ret_t cherokee_downloader_connect         (cherokee_downloader_t *downloader);
 
+ret_t cherokee_downloader_get_status      (cherokee_downloader_t *downloader, cherokee_downloader_status_t *status);
+
 ret_t cherokee_downloader_is_request_sent (cherokee_downloader_t *downloader);
 
 CHEROKEE_END_DECLS
Index: cget/main.c
===================================================================
--- cget/main.c	(revision 258)
+++ cget/main.c	(working copy)
@@ -53,6 +53,7 @@
 #include "request.h"
 #include "downloader.h"
 #include "downloader-protected.h"
+#include "socket.h"
 #include "header-protected.h"      /* FIXME! */
 
 #define EXIT_OK    0
@@ -261,32 +262,73 @@
 {
 	int   num;
 	ret_t ret;
-	
+	cherokee_downloader_status_t status;
+	int headers_are_read = 0;
+	int reading = 0;
+
+	do_download__init(downloader,NULL);
+
+	/* 
+	 * add socket to fdpoll in write mode
+	 */
+	cherokee_fdpoll_add(fdpoll, downloader->socket.socket, 1);
 	for (;;) {
 		/* Inspect the file descriptors
 		 */ 
-		num = cherokee_fdpoll_watch (downloader->fdpoll, POLL_TIME);
+		if ( cherokee_fdpoll_watch (fdpoll, POLL_TIME) > 0 ) {
 
-		/* Do some work
-		 */
-		ret = cherokee_downloader_step (downloader);
 
-		switch (ret) {
-		case ret_ok:
-		case ret_eagain:
-			/* it is go.. continue
+			/* Do some work
 			 */
-			break;
+			ret = cherokee_downloader_step (downloader);
+
+			cherokee_downloader_get_status(downloader, &status);
+			switch (ret) {
+			case ret_ok:
+				if ( !reading && (status & downloader_status_post_sent)) {
+					/*	
+					 * the headers and post have been sent,
+					 * switch socket to read
+					 */
+					cherokee_fdpoll_set_mode (fdpoll, downloader->socket.socket, 0);
+					reading = 1;
+				}
 			
-		case ret_eof:
-		case ret_error:
-			/* Finished or critical error
-			 */
-			return ret;
+				if ( (status & downloader_status_headers_received) && !headers_are_read) {
+					do_download__has_headers(downloader, NULL);
+					headers_are_read = 1;
+				}
+
+				if (status & downloader_status_data_available) {
+					do_download__read_body(downloader, NULL);
+				}
+
+				if (status & downloader_status_finished) {
+					do_download__finish(downloader, NULL);
+				}
+
+			case ret_eagain:
+				/* it is go.. continue
+				 */
+				break;
 			
-		default:
-			SHOULDNT_HAPPEN;
-			return ret_error;
+			case ret_eof_have_data:
+				if (status & downloader_status_data_available) {
+					do_download__read_body(downloader, NULL);
+				}
+			case ret_eof:
+				if (status & downloader_status_finished) {
+					do_download__finish(downloader, NULL);
+				}
+			case ret_error:
+				/* Finished or critical error
+				 */
+				return ret;
+			
+			default:
+				SHOULDNT_HAPPEN;
+				return ret_error;
+			}
 		}
 	}
 
@@ -394,22 +436,15 @@
 		ret = cherokee_downloader_new (&downloader);
 		if (ret != ret_ok) return EXIT_ERROR;
 
-		ret = cherokee_downloader_set_url (downloader, url);
+		ret = cherokee_downloader_init(downloader);
 		if (ret != ret_ok) return EXIT_ERROR;
 
-		ret = cherokee_downloader_set_fdpoll (downloader, fdpoll);
+		ret = cherokee_downloader_set_url (downloader, url);
 		if (ret != ret_ok) return EXIT_ERROR;
 
 		ret = cherokee_downloader_connect (downloader);
 		if (ret != ret_ok) return EXIT_ERROR;
 
-		/* Set the callbacks
-		 */
-		cherokee_downloader_connect_event (downloader, downloader_event_init,        do_download__init,        NULL);
-		cherokee_downloader_connect_event (downloader, downloader_event_has_headers, do_download__has_headers, NULL);
-		cherokee_downloader_connect_event (downloader, downloader_event_read_body,   do_download__read_body,   NULL);
-		cherokee_downloader_connect_event (downloader, downloader_event_finish,      do_download__finish,      NULL);
-
 		/* Download it!
 		 */
 		ret = do_download (downloader, fdpoll);
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 258)
+++ ChangeLog	(working copy)
@@ -1,3 +1,18 @@
+2006-04-08  Rodrigo Fernandez-Vizarra  <[EMAIL PROTECTED]>
+
+	* cget/main.c: Modified cget not to use the event interface of the
+	download and to use the new interface to query the status of a
+	download
+
+	* cherokee/downloader-protected.h: Added field the
+	cherokee_downloader struct to store the status of the download
+
+	* cherokee/downloader.c: Implemented the interface to query the
+	status of a download
+
+	* cherokee/downloader.h: Added interface to query the status of a
+	download
+
 2006-04-03  Alvaro Lopez Ortega  <[EMAIL PROTECTED]>
 
 	* cherokee/main_admin.c, cherokee/Makefile.am: Added file to build
_______________________________________________
Cherokee mailing list
[email protected]
http://www.0x50.org/cgi-bin/mailman/listinfo/cherokee

Reply via email to