Base code merged to SPIN 2.4
[platform/upstream/curl.git] / docs / examples / multi-uv.c
index 57d712f..0c0f8a2 100644 (file)
@@ -5,7 +5,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 1998 - 2013, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -64,13 +64,13 @@ curl_context_t* create_curl_context(curl_socket_t sockfd)
 
 void curl_close_cb(uv_handle_t *handle)
 {
-  curl_context_t* context = (curl_context_t*) handle->data;
+  curl_context_t *context = (curl_context_t *) handle->data;
   free(context);
 }
 
 void destroy_curl_context(curl_context_t *context)
 {
-  uv_close((uv_handle_t*) &context->poll_handle, curl_close_cb);
+  uv_close((uv_handle_t *) &context->poll_handle, curl_close_cb);
 }
 
 
@@ -83,67 +83,84 @@ void add_download(const char *url, int num)
   sprintf(filename, "%d.download", num);
 
   file = fopen(filename, "w");
-  if (file == NULL) {
+  if(!file) {
     fprintf(stderr, "Error opening %s\n", filename);
     return;
   }
 
   handle = curl_easy_init();
   curl_easy_setopt(handle, CURLOPT_WRITEDATA, file);
+  curl_easy_setopt(handle, CURLOPT_PRIVATE, file);
   curl_easy_setopt(handle, CURLOPT_URL, url);
   curl_multi_add_handle(curl_handle, handle);
   fprintf(stderr, "Added download %s -> %s\n", url, filename);
 }
 
-void curl_perform(uv_poll_t *req, int status, int events)
+static void check_multi_info(void)
 {
   int running_handles;
-  int flags = 0;
-  curl_context_t *context;
   char *done_url;
   CURLMsg *message;
   int pending;
+  FILE *file;
 
-  uv_timer_stop(&timeout);
-
-  if (events & UV_READABLE)
-    flags |= CURL_CSELECT_IN;
-  if (events & UV_WRITABLE)
-    flags |= CURL_CSELECT_OUT;
-
-  context = (curl_context_t*)req;
-
-  curl_multi_socket_action(curl_handle, context->sockfd, flags,
-                           &running_handles);
-
-  while ((message = curl_multi_info_read(curl_handle, &pending))) {
-    switch (message->msg) {
+  while((message = curl_multi_info_read(curl_handle, &pending))) {
+    switch(message->msg) {
     case CURLMSG_DONE:
       curl_easy_getinfo(message->easy_handle, CURLINFO_EFFECTIVE_URL,
                         &done_url);
+      curl_easy_getinfo(message->easy_handle, CURLINFO_PRIVATE, &file);
       printf("%s DONE\n", done_url);
 
       curl_multi_remove_handle(curl_handle, message->easy_handle);
       curl_easy_cleanup(message->easy_handle);
-
+      if(file) {
+        fclose(file);
+      }
       break;
+
     default:
       fprintf(stderr, "CURLMSG default\n");
-      abort();
+      break;
     }
   }
 }
 
+void curl_perform(uv_poll_t *req, int status, int events)
+{
+  int running_handles;
+  int flags = 0;
+  curl_context_t *context;
+  char *done_url;
+  CURLMsg *message;
+  int pending;
+
+  uv_timer_stop(&timeout);
+
+  if(events & UV_READABLE)
+    flags |= CURL_CSELECT_IN;
+  if(events & UV_WRITABLE)
+    flags |= CURL_CSELECT_OUT;
+
+  context = (curl_context_t *) req;
+
+  curl_multi_socket_action(curl_handle, context->sockfd, flags,
+                           &running_handles);
+
+  check_multi_info();
+}
+
 void on_timeout(uv_timer_t *req, int status)
 {
   int running_handles;
   curl_multi_socket_action(curl_handle, CURL_SOCKET_TIMEOUT, 0,
                            &running_handles);
+  check_multi_info();
 }
 
 void start_timeout(CURLM *multi, long timeout_ms, void *userp)
 {
-  if (timeout_ms <= 0)
+  if(timeout_ms <= 0)
     timeout_ms = 1; /* 0 means directly call socket_action, but we'll do it in
                        a bit */
   uv_timer_start(&timeout, on_timeout, timeout_ms, 0);
@@ -153,9 +170,9 @@ int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
                   void *socketp)
 {
   curl_context_t *curl_context;
-  if (action == CURL_POLL_IN || action == CURL_POLL_OUT) {
-    if (socketp) {
-      curl_context = (curl_context_t*) socketp;
+  if(action == CURL_POLL_IN || action == CURL_POLL_OUT) {
+    if(socketp) {
+      curl_context = (curl_context_t *) socketp;
     }
     else {
       curl_context = create_curl_context(s);
@@ -163,7 +180,7 @@ int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
     curl_multi_assign(curl_handle, s, (void *) curl_context);
   }
 
-  switch (action) {
+  switch(action) {
   case CURL_POLL_IN:
     uv_poll_start(&curl_context->poll_handle, UV_READABLE, curl_perform);
     break;
@@ -171,7 +188,7 @@ int handle_socket(CURL *easy, curl_socket_t s, int action, void *userp,
     uv_poll_start(&curl_context->poll_handle, UV_WRITABLE, curl_perform);
     break;
   case CURL_POLL_REMOVE:
-    if (socketp) {
+    if(socketp) {
       uv_poll_stop(&((curl_context_t*)socketp)->poll_handle);
       destroy_curl_context((curl_context_t*) socketp);
       curl_multi_assign(curl_handle, s, NULL);
@@ -188,10 +205,10 @@ int main(int argc, char **argv)
 {
   loop = uv_default_loop();
 
-  if (argc <= 1)
+  if(argc <= 1)
     return 0;
 
-  if (curl_global_init(CURL_GLOBAL_ALL)) {
+  if(curl_global_init(CURL_GLOBAL_ALL)) {
     fprintf(stderr, "Could not init cURL\n");
     return 1;
   }
@@ -202,11 +219,12 @@ int main(int argc, char **argv)
   curl_multi_setopt(curl_handle, CURLMOPT_SOCKETFUNCTION, handle_socket);
   curl_multi_setopt(curl_handle, CURLMOPT_TIMERFUNCTION, start_timeout);
 
-  while (argc-- > 1) {
+  while(argc-- > 1) {
     add_download(argv[argc], argc);
   }
 
   uv_run(loop, UV_RUN_DEFAULT);
   curl_multi_cleanup(curl_handle);
+
   return 0;
 }