Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/ecore

Dir     : e17/libs/ecore/src/lib/ecore_file


Modified Files:
        Makefile.am ecore_file_download.c 


Log Message:


cedrics ecore_cn_url stuff for file downloads

===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_file/Makefile.am,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- Makefile.am 5 Nov 2007 18:57:11 -0000       1.13
+++ Makefile.am 9 Mar 2008 16:43:32 -0000       1.14
@@ -2,6 +2,7 @@
 
 AM_CPPFLAGS = \
 -I$(top_srcdir)/src/lib/ecore \
+-I$(top_srcdir)/src/lib/ecore_con \
 -I$(top_builddir)/src/lib/ecore \
 @CURL_CFLAGS@
 
@@ -21,7 +22,8 @@
 
 libecore_file_la_LIBADD = \
 $(top_builddir)/src/lib/ecore/libecore.la \
[EMAIL PROTECTED]@ @ecore_file_win32_lib@ @winsock_libs@
+$(top_builddir)/src/lib/ecore_con/libecore_con.la \
[EMAIL PROTECTED]@ @winsock_libs@
 
 libecore_file_la_LDFLAGS = @create_shared_lib@ -version-info @version_info@
 
===================================================================
RCS file: /cvs/e/e17/libs/ecore/src/lib/ecore_file/ecore_file_download.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -3 -r1.18 -r1.19
--- ecore_file_download.c       14 Jan 2008 01:58:43 -0000      1.18
+++ ecore_file_download.c       9 Mar 2008 16:43:32 -0000       1.19
@@ -1,111 +1,98 @@
 /*
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
+#include "Ecore_Con.h"
 #include "ecore_file_private.h"
 
-static int init = 0;
-
-#ifdef HAVE_CURL
-#include <curl/curl.h>
-
-typedef struct _Ecore_File_Download_Job Ecore_File_Download_Job;
+#define ECORE_MAGIC_FILE_DOWNLOAD_JOB  0xf7427cb8
 
+typedef struct _Ecore_File_Download_Job                Ecore_File_Download_Job;
 struct _Ecore_File_Download_Job
 {
-   Ecore_Fd_Handler *fd_handler;
-   CURL *curl;
-   void (*completion_cb)(void *data, const char *file, int status);
-   int (*progress_cb)(void *data, const char *file, long int dltotal, long int 
dlnow, long int ultotal, long int ulnow);
-   void *data;
-   FILE *file;
-   char *dst;
+   ECORE_MAGIC;
+
+   Ecore_Con_Url       *url_con;
+   FILE                        *file;
+
+   char                        *dst;
+
+   void        (*completion_cb)(void *data, const char *file, int status);
+
+   int (*progress_cb)  (void *data, const char *file,
+                        long int dltotal, long int dlnow,
+                        long int ultotal, long int ulnow);
 };
 
+#ifdef HAVE_CURL
 Ecore_File_Download_Job *_ecore_file_download_curl(const char *url, const char 
*dst,
                                                   void (*completion_cb)(void 
*data, const char *file, int status),
                                                   int (*progress_cb)(void 
*data, const char *file, long int dltotal, long int dlnow, long int ultotal, 
long int ulnow),
                                                   void *data);
 static int _ecore_file_download_curl_fd_handler(void *data, Ecore_Fd_Handler 
*fd_handler);
 
-static CURLM *curlm;
-static Ecore_List *_job_list;
-static fd_set _current_fd_set;
+static void _ecore_file_download_abort(Ecore_File_Download_Job *job);
+
+static int _ecore_file_download_url_complete_cb(void *data, int type, void 
*event);
+static int _ecore_file_download_url_progress_cb(void *data, int type, void 
*event);
 #endif
 
-int
+static int                      init = 0;
+static Ecore_Event_Handler     *_url_complete_handler = NULL;
+static Ecore_Event_Handler     *_url_progress_download = NULL;
+static Ecore_List              *_job_list;
+
+EAPI int
 ecore_file_download_init(void)
 {
-   if (++init != 1) return init;
+   ecore_con_url_init();
 
+   if (init++ == 0)
+     {
 #ifdef HAVE_CURL
-   FD_ZERO(&_current_fd_set);
-   _job_list = ecore_list_new();
-   if (!_job_list) return --init;
-
-   if (curl_global_init(CURL_GLOBAL_NOTHING)) return 0;
-
-   curlm = curl_multi_init();
-   if (!curlm)
+       _url_complete_handler = 
ecore_event_handler_add(ECORE_CON_EVENT_URL_COMPLETE, 
_ecore_file_download_url_complete_cb, NULL);
+       _url_progress_download = 
ecore_event_handler_add(ECORE_CON_EVENT_URL_PROGRESS, 
_ecore_file_download_url_progress_cb, NULL);
+#endif 
+     }
+   if (!_job_list)
      {
-       ecore_list_destroy(_job_list);
-       _job_list = NULL;
-       return --init;
+       _job_list = ecore_list_new();
+       if (!_job_list) return 0;
      }
-#endif
-   return init;
+
+   return 1;
 }
 
-int
+EAPI int
 ecore_file_download_shutdown(void)
 {
-   if (--init != 0) return init;
-#ifdef HAVE_CURL
-   Ecore_File_Download_Job *job;
-
-   if (!ecore_list_empty_is(_job_list))
+   if (--init == 0)
      {
-       ecore_list_first_goto(_job_list);
-       while ((job = ecore_list_next(_job_list)))
-         {
-            ecore_main_fd_handler_del(job->fd_handler);
-            curl_multi_remove_handle(curlm, job->curl);
-            curl_easy_cleanup(job->curl);
-            fclose(job->file);
-            free(job->dst);
-            free(job);
-         }
+       ecore_event_handler_del(_url_complete_handler);
+       ecore_event_handler_del(_url_progress_download);
+       _url_complete_handler = NULL;
+       _url_progress_download = NULL;
+
+       ecore_list_destroy(_job_list);
      }
-   ecore_list_destroy(_job_list);
-   curl_multi_cleanup(curlm);
-   curl_global_cleanup();
-#endif
-   return init;
+
+   return ecore_con_url_shutdown();
 }
 
-void
+EAPI void
 ecore_file_download_abort_all(void)
 {
-#ifdef HAVE_CURL
-   Ecore_File_Download_Job *job;
-
-   if (!_job_list)
-     return;
-
-   ecore_list_first_goto(_job_list);
-   while ((job = ecore_list_next(_job_list)))
+   if (!ecore_list_empty_is(_job_list))
      {
-       ecore_main_fd_handler_del(job->fd_handler);
-       curl_multi_remove_handle(curlm, job->curl);
-       curl_easy_cleanup(job->curl);
-       fclose(job->file);
-       free(job->dst);
-       free(job);
+       Ecore_File_Download_Job *job;
+
+       while ((job = ecore_list_first_remove(_job_list)))
+         {
+            _ecore_file_download_abort(job);
+         }
      }
    ecore_list_clear(_job_list);
-#endif
 }
 
-
 /**
  * Download @p url to the given @p dst
  * @param  url The complete url to download
@@ -192,200 +179,108 @@
 }
 
 #ifdef HAVE_CURL
-/* this reports the downloads progress. if we return 0, then download
- * continues, if we return anything else, then the download stops */
 static int
-_ecore_file_download_curl_progress_func(void *clientp, double dltotal, double 
dlnow, double ultotal, double ulnow)
+_ecore_file_download_url_compare_job(const void *data1, const void *data2)
 {
-   Ecore_File_Download_Job *job;
+   const Ecore_File_Download_Job       *job = data1;
+   const Ecore_Con_Url                 *url = data2;
+
+   if (job->url_con == url) return 0;
+   return -1;
+}
+
+static int
+_ecore_file_download_url_complete_cb(void *data, int type, void *event)
+{
+   Ecore_Con_Event_Url_Complete        *ev = event;
+   Ecore_File_Download_Job     *job;
 
-   job = clientp;
+   job = ecore_list_find(_job_list, _ecore_file_download_url_compare_job, 
ev->url_con);
+   if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB)) return 1;
+
+   ecore_list_remove(_job_list);
+
+   if (job->completion_cb)
+     job->completion_cb(ecore_con_url_data_get(job->url_con), job->dst, 
!ev->status);
+
+   _ecore_file_download_abort(job);
+
+   return 0;
+}
+
+static int
+_ecore_file_download_url_progress_cb(void *data, int type, void *event)
+{
+/* this reports the downloads progress. if we return 0, then download
+ * continues, if we return anything else, then the download stops */
+   Ecore_Con_Event_Url_Progress        *ev = event;
+   Ecore_File_Download_Job     *job;
+
+   job = ecore_list_find(_job_list, _ecore_file_download_url_compare_job, 
ev->url_con);
+   if (!ECORE_MAGIC_CHECK(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB)) return 1;
+
+   if (job->progress_cb)
+     if (job->progress_cb(ecore_con_url_data_get(job->url_con), job->dst,
+                         (long int) ev->down.total, (long int) ev->down.now,
+                         (long int) ev->up.total, (long int) ev->up.now) != 0)
+       {
+         ecore_list_remove(_job_list);
+         _ecore_file_download_abort(job);
+       }
 
-   if(job->progress_cb)
-     return job->progress_cb(job->data, job->dst, (long int)dltotal, (long 
int)dlnow, (long int)ultotal, (long int)ulnow);
    return 0;
 }
 
+static void
+_ecore_file_download_abort(Ecore_File_Download_Job *job)
+{
+   ecore_con_url_destroy(job->url_con);
+   fclose(job->file);
+   free(job->dst);
+   free(job);
+}
+
 Ecore_File_Download_Job *
 _ecore_file_download_curl(const char *url, const char *dst,
                          void (*completion_cb)(void *data, const char *file,
                                                int status),
                          int (*progress_cb)(void *data, const char *file,
                                             long int dltotal, long int dlnow,
-                                            long int ultotal,
-                                            long int ulnow),
+                                            long int ultotal, long int ulnow),
                          void *data)
 {
-   CURLMsg *curlmsg;
-   fd_set read_set, write_set, exc_set;
-   int fd_max;
-   int fd;
-   int flags;
-   int n_remaining, still_running;
    Ecore_File_Download_Job *job;
-   double start = 0.0;
 
    job = calloc(1, sizeof(Ecore_File_Download_Job));
    if (!job) return NULL;
 
+   ECORE_MAGIC_SET(job, ECORE_MAGIC_FILE_DOWNLOAD_JOB);
+
    job->file = fopen(dst, "wb");
    if (!job->file)
      {
        free(job);
        return NULL;
      }
-   job->curl = curl_easy_init();
-   if (!job->curl)
+   job->url_con = ecore_con_url_new(url);
+   if (!job->url_con)
      {
        fclose(job->file);
        free(job);
        return NULL;
      }
 
-   curl_easy_setopt(job->curl, CURLOPT_URL, url);
-   curl_easy_setopt(job->curl, CURLOPT_WRITEDATA, job->file);
-   curl_easy_setopt(job->curl, CURLOPT_FOLLOWLOCATION, TRUE);
-   
-   if (progress_cb)
-     {
-       curl_easy_setopt(job->curl, CURLOPT_NOPROGRESS, FALSE);
-       curl_easy_setopt(job->curl, CURLOPT_PROGRESSDATA, job);
-       curl_easy_setopt(job->curl, CURLOPT_PROGRESSFUNCTION, 
_ecore_file_download_curl_progress_func);
-     }
+   ecore_con_url_fd_set(job->url_con, fileno(job->file));
+   ecore_con_url_data_set(job->url_con, data);
+
+   job->dst = strdup(dst);
 
-   job->data = data;
    job->completion_cb = completion_cb;
    job->progress_cb = progress_cb;
-   job->dst = strdup(dst);
    ecore_list_append(_job_list, job);
 
-   curl_multi_add_handle(curlm, job->curl);
-   start = ecore_time_get();
-   while (curl_multi_perform(curlm, &still_running) == 
CURLM_CALL_MULTI_PERFORM)
-     {
-       /* make this 1/100th of a second to keep interactivity high. really
-        * though this needs to somehow get the fd from curl and use an fd 
handler
-        * and thus select
-        */
-       if ((ecore_time_get() - start) > 0.01) break;
-     }
-
-   /* check for completed jobs */
-   while ((curlmsg = curl_multi_info_read(curlm, &n_remaining)) != NULL)
-     {
-       Ecore_File_Download_Job *current;
-
-       if (curlmsg->msg != CURLMSG_DONE) continue;
-
-       /* find the job which is done */
-       ecore_list_first_goto(_job_list);
-       while ((current = ecore_list_current(_job_list)))
-         {
-            if (curlmsg->easy_handle == current->curl)
-              {
-                 /* We have a match -- delete the job */
-                 if (current == job)
-                   job = NULL;
-                 if (current->fd_handler)
-                   {
-                      FD_CLR(ecore_main_fd_handler_fd_get(current->fd_handler),
-                             &_current_fd_set);
-                      ecore_main_fd_handler_del(current->fd_handler);
-                   }
-                 ecore_list_remove(_job_list);
-                 curl_multi_remove_handle(curlm, current->curl);
-                 curl_easy_cleanup(current->curl);
-                 fclose(current->file);
-                 if (current->completion_cb)
-                   current->completion_cb(current->data, current->dst,
-                                          curlmsg->data.result);
-                 free(current->dst);
-                 free(current);
-                 break;
-              }
-            ecore_list_next(_job_list);
-         }
-     }
-
-   if (job)
-     {
-       FD_ZERO(&read_set);
-       FD_ZERO(&write_set);
-       FD_ZERO(&exc_set);
-
-       /* Stupid curl, why can't I get the fd to the current added job? */
-       curl_multi_fdset(curlm, &read_set, &write_set, &exc_set, &fd_max);
-       for (fd = 0; fd <= fd_max; fd++)
-         {
-            if (!FD_ISSET(fd, &_current_fd_set))
-              {
-                 flags = 0;
-                 if (FD_ISSET(fd, &read_set)) flags |= ECORE_FD_READ;
-                 if (FD_ISSET(fd, &write_set)) flags |= ECORE_FD_WRITE;
-                 if (FD_ISSET(fd, &exc_set)) flags |= ECORE_FD_ERROR;
-                 if (flags)
-                   {
-                      FD_SET(fd, &_current_fd_set);
-                      job->fd_handler = ecore_main_fd_handler_add(fd, flags,
-                                                                  
_ecore_file_download_curl_fd_handler,
-                                                                  NULL, NULL, 
NULL);
-                   }
-              }
-         }
-       if (!job->fd_handler)
-         {
-            curl_easy_cleanup(job->curl);
-            fclose(job->file);
-            free(job);
-            job = NULL;
-         }
-     }
+   ecore_con_url_send(job->url_con, NULL, 0, NULL);
 
    return job;
-}
-
-static int
-_ecore_file_download_curl_fd_handler(void *data __UNUSED__, Ecore_Fd_Handler 
*fd_handler __UNUSED__)
-{
-   Ecore_File_Download_Job *job;
-   CURLMsg *curlmsg;
-   int n_remaining, still_running;
-   double start = 0.0;
-
-   start = ecore_time_get();
-   while (curl_multi_perform(curlm, &still_running) == 
CURLM_CALL_MULTI_PERFORM)
-     {
-       if ((ecore_time_get() - start) > 0.2) break;
-     }
-
-   /* Loop jobs and check if any are done */
-   while ((curlmsg = curl_multi_info_read(curlm, &n_remaining)) != NULL)
-     {
-       if (curlmsg->msg != CURLMSG_DONE) continue;
-
-       /* find the job which is done */
-       ecore_list_first_goto(_job_list);
-       while ((job = ecore_list_current(_job_list)))
-         {
-            if (curlmsg->easy_handle == job->curl)
-              {
-                 /* We have a match -- delete the job */
-                 FD_CLR(ecore_main_fd_handler_fd_get(job->fd_handler),
-                       &_current_fd_set);
-                 ecore_list_remove(_job_list);
-                 ecore_main_fd_handler_del(job->fd_handler);
-                 curl_multi_remove_handle(curlm, job->curl);
-                 curl_easy_cleanup(job->curl);
-                 fclose(job->file);
-                 if (job->completion_cb)
-                   job->completion_cb(job->data, job->dst, 
!curlmsg->data.result);
-                 free(job->dst);
-                 free(job);
-                 break;
-              }
-            ecore_list_next(_job_list);
-         }
-     }
-   return 1;
 }
 #endif



-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to