dmuratshin 8 years ago
parent
commit
0ab6c0159e

+ 10 - 17
oxygine/src/HttpRequestTask.cpp

@@ -33,7 +33,7 @@ namespace oxygine
         return code == 200 || code == 206;
         return code == 200 || code == 206;
     };
     };
     
     
-    HttpRequestTask::HttpRequestTask() : _loaded(0),
+    HttpRequestTask::HttpRequestTask() :
         _cacheEnabled(true),
         _cacheEnabled(true),
         _continueDownload(false),
         _continueDownload(false),
         _expectedContentSize(0),
         _expectedContentSize(0),
@@ -120,7 +120,6 @@ namespace oxygine
         _receivedContentSize = 0;
         _receivedContentSize = 0;
         _expectedContentSize = 0;
         _expectedContentSize = 0;
         _responseCode = 0;
         _responseCode = 0;
-        _loaded = 0;
         _response.clear();
         _response.clear();
         if (_fhandle)
         if (_fhandle)
             file::close(_fhandle);
             file::close(_fhandle);
@@ -131,7 +130,6 @@ namespace oxygine
 			const char *mode = _continueDownload ? "ab" : "wb";
 			const char *mode = _continueDownload ? "ab" : "wb";
 			_fhandle = file::open(_fname, mode, ep_ignore_error);
 			_fhandle = file::open(_fname, mode, ep_ignore_error);
 			
 			
-			//return;
 			if (_continueDownload)
 			if (_continueDownload)
 			{
 			{
 				file::seek(_fhandle, 0, SEEK_END);
 				file::seek(_fhandle, 0, SEEK_END);
@@ -145,25 +143,17 @@ namespace oxygine
         }
         }
     }
     }
 
 
-    void HttpRequestTask::dispatchProgress(int loaded, int total)
+    void HttpRequestTask::dispatchProgress(int delta, int loaded, int total)
     {
     {
-        int delta = loaded - _loaded;
-        _loaded = loaded;
         ProgressEvent event(delta, loaded, total);
         ProgressEvent event(delta, loaded, total);
         dispatchEvent(&event);
         dispatchEvent(&event);
     }
     }
 
 
-    void HttpRequestTask::_onCustom(const ThreadDispatcher::message& msg)
+    void HttpRequestTask::asyncProgress(int delta, int loaded, int total)
     {
     {
-        dispatchProgress((int)(size_t)msg.arg1, (int)(size_t)msg.arg2);
-    }
-
-    void HttpRequestTask::progress(int loaded, int total)
-    {
-        if (!syncEvent(customID, (void*)(size_t)loaded, (void*)(size_t)total))
-        {
-            dispatchProgress(loaded, total);
-        }
+		core::getMainThreadDispatcher().postCallback([=]() {
+			dispatchProgress(delta, loaded, total);
+		});
     }
     }
 
 
     void HttpRequestTask::_onError()
     void HttpRequestTask::_onError()
@@ -180,6 +170,9 @@ namespace oxygine
     {
     {
         bool ok = _responseCodeChecker(_responseCode);
         bool ok = _responseCodeChecker(_responseCode);
         
         
+		if (ok)
+			dispatchProgress(0, _expectedContentSize, _expectedContentSize);
+
         Event ev(ok ? COMPLETE : ERROR);
         Event ev(ok ? COMPLETE : ERROR);
         dispatchEvent(&ev);
         dispatchEvent(&ev);
     }
     }
@@ -207,7 +200,7 @@ namespace oxygine
 			_response.insert(_response.end(), p, p + size);
 			_response.insert(_response.end(), p, p + size);
 		}
 		}
         _receivedContentSize += size;
         _receivedContentSize += size;
-        progress(_receivedContentSize, _expectedContentSize);
+        asyncProgress(size, _receivedContentSize, _expectedContentSize);
 	}
 	}
 
 
 }
 }

+ 2 - 4
oxygine/src/HttpRequestTask.h

@@ -70,10 +70,9 @@ namespace oxygine
 		void write(const void *data, unsigned int size);
 		void write(const void *data, unsigned int size);
 
 
         //async
         //async
-        void progress(int loaded, int total);
+        void asyncProgress(int delta, int loaded, int total);
 
 
-        void _onCustom(const ThreadDispatcher::message& msg) override;
-        void dispatchProgress(int loaded, int total);
+        void dispatchProgress(int delta, int loaded, int total);
 
 
         virtual void _setFileName(const std::string& name) {}
         virtual void _setFileName(const std::string& name) {}
         virtual void _setUrl(const std::string& url) {}
         virtual void _setUrl(const std::string& url) {}
@@ -81,7 +80,6 @@ namespace oxygine
         virtual void _setCacheEnabled(bool enabled) {}
         virtual void _setCacheEnabled(bool enabled) {}
         virtual void _addHeader(const std::string& key, const std::string& value) {}
         virtual void _addHeader(const std::string& key, const std::string& value) {}
 
 
-        int _loaded;
         std::string _url;
         std::string _url;
         std::string _fname;
         std::string _fname;
 		file::handle _fhandle;
 		file::handle _fhandle;

+ 20 - 41
oxygine/src/core/curl/HttpRequestCurlTask.cpp

@@ -18,7 +18,7 @@ namespace oxygine
     }
     }
 
 
     const unsigned int ID_DONE = sysEventID('C', 'D', 'N');
     const unsigned int ID_DONE = sysEventID('C', 'D', 'N');
-    const unsigned int ID_PROGRESS = sysEventID('C', 'P', 'R');
+
 
 
     void mainThreadFunc(const ThreadDispatcher::message& msg)
     void mainThreadFunc(const ThreadDispatcher::message& msg)
     {
     {
@@ -62,12 +62,6 @@ namespace oxygine
 
 
                 task->releaseRef();
                 task->releaseRef();
             } break;
             } break;
-
-            case ID_PROGRESS:
-            {
-                HttpRequestTaskCURL* task = (HttpRequestTaskCURL*)msg.cbData;
-                //task->dispatchProgress((int)(size_t)msg.arg2, (int)(size_t)msg.arg1);
-            } break;
         }
         }
 
 
     }
     }
@@ -131,6 +125,7 @@ namespace oxygine
                     {
                     {
                         if (msg->msg == CURLMSG_DONE)
                         if (msg->msg == CURLMSG_DONE)
                         {
                         {
+
 #ifdef OX_HAS_CPP11 //msg broken in VS2010
 #ifdef OX_HAS_CPP11 //msg broken in VS2010
                             curl_multi_remove_handle(multi_handle, msg->easy_handle);
                             curl_multi_remove_handle(multi_handle, msg->easy_handle);
                             core::getMainThreadDispatcher().postCallback(ID_DONE, msg->easy_handle, (void*)msg->data.result, mainThreadFunc, 0);
                             core::getMainThreadDispatcher().postCallback(ID_DONE, msg->easy_handle, (void*)msg->data.result, mainThreadFunc, 0);
@@ -164,23 +159,6 @@ namespace oxygine
         multi_handle = 0;
         multi_handle = 0;
     }
     }
 
 
-    size_t HttpRequestTaskCURL::cbXRefInfoFunction(void* userData, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
-    {
-        return ((HttpRequestTaskCURL*)userData)->_cbXRefInfoFunction(dltotal, dlnow);
-    }
-
-    size_t HttpRequestTaskCURL::_cbXRefInfoFunction(curl_off_t dltotal, curl_off_t dlnow)
-    {
-        core::getMainThreadDispatcher().postCallback(ID_PROGRESS, (void*)dltotal, (void*)dlnow, mainThreadFunc, this);
-
-        return 0;
-    }
-
-
-    int HttpRequestTaskCURL::cbProgressFunction(void* userData, double dltotal, double dlnow, double ultotal, double ulnow)
-    {
-        return ((HttpRequestTaskCURL*)userData)->_cbXRefInfoFunction((curl_off_t) dltotal, (curl_off_t)dlnow);
-    }
 
 
     size_t HttpRequestTaskCURL::cbWriteFunction(char* d, size_t n, size_t l, void* userData)
     size_t HttpRequestTaskCURL::cbWriteFunction(char* d, size_t n, size_t l, void* userData)
     {
     {
@@ -191,7 +169,8 @@ namespace oxygine
     size_t HttpRequestTaskCURL::_cbWriteFunction(char* d, size_t n, size_t l)
     size_t HttpRequestTaskCURL::_cbWriteFunction(char* d, size_t n, size_t l)
     {
     {
 		size_t size = n * l;
 		size_t size = n * l;
-		if (!_continueDownload || _ok)
+
+		if (_ok)
 			write(d, size);
 			write(d, size);
 
 
         return size;
         return size;
@@ -206,17 +185,24 @@ namespace oxygine
 	size_t HttpRequestTaskCURL::_cbHeaderFunction(char* d, size_t n, size_t l)
 	size_t HttpRequestTaskCURL::_cbHeaderFunction(char* d, size_t n, size_t l)
 	{
 	{
 		size_t s = n*l;
 		size_t s = n*l;
-		if (_continueDownload && !_ok)
+		if (s > 255)//ignore unknown headers
+			return s;
+
+
+		int contentLength = 0;
+		if (sscanf(d, "Content-Length: %d", &contentLength) == 1)
+		{
+			_expectedContentSize = contentLength;
+		}
+
+		int responseCode = 0;
+		if (sscanf(d, "HTTP/1.1 %d ", &responseCode) == 1 || 
+			sscanf(d, "HTTP/1.0 %d ", &responseCode) == 1)
 		{
 		{
-			const char *GOOD1 = "HTTP/1.1 200 ";
-			const char *GOOD2 = "HTTP/1.1 206 ";
-			if (s >= sizeof(GOOD1) && (
-				memcmp(d, GOOD1, sizeof(GOOD1)) == 0 ||
-				memcmp(d, GOOD2, sizeof(GOOD2)) == 0))
-			{ 
-				_ok = true;
-			}
+			_responseCode = responseCode;
+			_ok = _responseCodeChecker(_responseCode);
 		}
 		}
+
 		return s;
 		return s;
 	}
 	}
 
 
@@ -250,14 +236,7 @@ namespace oxygine
 
 
         curl_easy_setopt(_easy, CURLOPT_NOPROGRESS, 0);
         curl_easy_setopt(_easy, CURLOPT_NOPROGRESS, 0);
 
 
-#ifdef CURLOPT_XFERINFOFUNCTION
-        curl_easy_setopt(_easy, CURLOPT_XFERINFOFUNCTION, HttpRequestTaskCURL::cbXRefInfoFunction);
-        curl_easy_setopt(_easy, CURLOPT_XFERINFODATA, this);
-#else
 
 
-        curl_easy_setopt(_easy, CURLOPT_PROGRESSFUNCTION, HttpRequestTaskCURL::cbProgressFunction);
-        curl_easy_setopt(_easy, CURLOPT_PROGRESSDATA, this);
-#endif
         curl_easy_setopt(_easy, CURLOPT_FOLLOWLOCATION, true);
         curl_easy_setopt(_easy, CURLOPT_FOLLOWLOCATION, true);
 
 
 
 

+ 0 - 5
oxygine/src/core/curl/HttpRequestCurlTask.h

@@ -29,11 +29,6 @@ namespace oxygine
 		static size_t cbHeaderFunction(char* d, size_t n, size_t l, void* p);
 		static size_t cbHeaderFunction(char* d, size_t n, size_t l, void* p);
 		size_t _cbHeaderFunction(char* d, size_t n, size_t l);
 		size_t _cbHeaderFunction(char* d, size_t n, size_t l);
 
 
-        static size_t cbXRefInfoFunction(void* clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow);
-        size_t _cbXRefInfoFunction(curl_off_t dltotal, curl_off_t dlnow);
-
-        static int cbProgressFunction(void* clientp, double dltotal, double dlnow, double ultotal, double ulnow);
-
 
 
         void _run();
         void _run();