From 6850a909557b488c624a50324d1b806d8d013380 Mon Sep 17 00:00:00 2001
From: "Nicolas \"Pixel\" Noble" <pixel@nobis-crew.org>
Date: Thu, 19 Jun 2014 08:23:17 -0700
Subject: More work on integrating cURL in Balau.

---
 src/CurlTask.cc |  4 ++++
 src/TaskMan.cc  | 35 ++++++++++++++++++++++++++---------
 2 files changed, 30 insertions(+), 9 deletions(-)

(limited to 'src')

diff --git a/src/CurlTask.cc b/src/CurlTask.cc
index 3dce322..5ff8b97 100644
--- a/src/CurlTask.cc
+++ b/src/CurlTask.cc
@@ -25,3 +25,7 @@ int Balau::CurlTask::debugFunctionStatic(CURL * easy, curl_infotype info, char *
     IAssert(easy == curlTask->m_curlHandle, "Got a debug callback for a handle that isn't our own.");
     return curlTask->debugFunction(info, str, str_len);
 }
+
+void Balau::CurlTask::curlDone(CURLcode result) {
+
+}
diff --git a/src/TaskMan.cc b/src/TaskMan.cc
index 5f028ae..00ce0f2 100644
--- a/src/TaskMan.cc
+++ b/src/TaskMan.cc
@@ -14,7 +14,7 @@
 #include <curl/curl.h>
 
 static Balau::AsyncManager s_async;
-static CURLSH * s_curlshared = NULL;
+static CURLSH * s_curlShared = NULL;
 
 namespace {
 
@@ -73,16 +73,17 @@ class CurlSharedManager : public Balau::AtStart, Balau::AtExit {
     void doStart() {
         curl_global_init(CURL_GLOBAL_ALL);
         static SharedLocks locks;
-        s_curlshared = curl_share_init();
-        curl_share_setopt(s_curlshared, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
-        curl_share_setopt(s_curlshared, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
-        curl_share_setopt(s_curlshared, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
-        curl_share_setopt(s_curlshared, CURLSHOPT_USERDATA, &locks);
-        curl_share_setopt(s_curlshared, CURLSHOPT_LOCKFUNC, lock_function);
-        curl_share_setopt(s_curlshared, CURLSHOPT_UNLOCKFUNC, lock_function);
+        s_curlShared = curl_share_init();
+        curl_share_setopt(s_curlShared, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
+        curl_share_setopt(s_curlShared, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
+        curl_share_setopt(s_curlShared, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION);
+        curl_share_setopt(s_curlShared, CURLSHOPT_USERDATA, &locks);
+        curl_share_setopt(s_curlShared, CURLSHOPT_LOCKFUNC, lock_function);
+        curl_share_setopt(s_curlShared, CURLSHOPT_UNLOCKFUNC, lock_function);
     }
     void doExit() {
-        curl_share_cleanup(s_curlshared);
+        curl_share_cleanup(s_curlShared);
+        curl_global_cleanup();
     }
 };
 
@@ -478,6 +479,8 @@ int Balau::TaskMan::mainLoop() {
             CurlTask * curlTask = dynamic_cast<CurlTask *>(t);
             if (curlTask) {
                 curlGotHandle = true;
+                curl_easy_setopt(curlTask->m_curlHandle, CURLOPT_SHARE, s_curlShared);
+                curl_easy_setopt(curlTask->m_curlHandle, CURLOPT_PRIVATE, curlTask);
                 curl_multi_add_handle(m_curlMulti, curlTask->m_curlHandle);
             }
         }
@@ -485,6 +488,20 @@ int Balau::TaskMan::mainLoop() {
         if (curlGotHandle || curlNeedsSpin)
             curl_multi_socket_all(m_curlMulti, &m_curlStillRunning);
 
+        CURLMsg * curlMsg = NULL;
+        int curlMsgInQueue;
+
+        while ((curlMsg = curl_multi_info_read(m_curlMulti, &curlMsgInQueue))) {
+            if (curlMsg->msg != CURLMSG_DONE)
+                continue;
+            Task * maybeCurlTask = NULL;
+            curl_easy_getinfo(curlMsg->easy_handle, CURLINFO_PRIVATE, &maybeCurlTask);
+            IAssert(maybeCurlTask, "curl easy handle didn't have any private data...");
+            CurlTask * curlTask = dynamic_cast<CurlTask *>(maybeCurlTask);
+            IAssert(curlTask, "curl easy handle had corrupted private data...");
+            curlTask->curlDone(curlMsg->data.result);
+        }
+
         // Finally, let's destroy tasks that no longer are necessary.
         bool didDelete;
         do {
-- 
cgit v1.2.3