dmuratshin 8 years ago
parent
commit
5f0598bc8a

+ 37 - 5
oxygine/src/HttpRequestTask.cpp

@@ -21,13 +21,16 @@ namespace oxygine
     void HttpRequestTask::init() {}
     void HttpRequestTask::release() {}
 #endif
-    HttpRequestTask::HttpRequestTask() : _loaded(0), _cacheEnabled(true), _successOnAnyResponceCode(false), _continueDownload(false)
+    HttpRequestTask::HttpRequestTask() : _loaded(0), _cacheEnabled(true), _successOnAnyResponceCode(false), _continueDownload(false), _fhandle(0)
     {
 
     }
     HttpRequestTask::~HttpRequestTask()
     {
         log::messageln("~HttpRequestTask");
+		if (_fhandle)
+			file::close(_fhandle);
+
     }
 
     void HttpRequestTask::setCustomRequests(createHttpRequestCallback cb)
@@ -95,14 +98,19 @@ namespace oxygine
         _response.clear();
         if (!_fname.empty())
         {
+			const char *mode = _continueDownload ? "ab" : "wb";
+			_fhandle = file::open(_fname, mode, ep_ignore_error);
+			
+			//return;
 			if (_continueDownload)
 			{
+				file::seek(_fhandle, 0, SEEK_END);
+				unsigned int size = file::tell(_fhandle);
+
 				char str[255];
-				safe_sprintf(str, "bytes=%d", 1);
+				safe_sprintf(str, "bytes=%d-", size);
 				addHeader("Range", str);
 			}
-			else
-				file::deleteFile(_fname, ep_ignore_error);
         }
     }
 
@@ -139,7 +147,7 @@ namespace oxygine
 
     void HttpRequestTask::_dispatchComplete()
     {
-        if (_responseCode == 200 || _successOnAnyResponceCode)
+        if (_responseCode == 200 || _responseCode == 206 || _successOnAnyResponceCode)
         {
             Event ev(COMPLETE);
             dispatchEvent(&ev);
@@ -151,4 +159,28 @@ namespace oxygine
         }
     }
 
+	void HttpRequestTask::_finalize(bool error)
+	{
+		if (_fhandle)
+		{
+			file::close(_fhandle);
+			_fhandle = 0;
+
+			if (error && !_continueDownload)
+				file::deleteFile(_fname);
+		}
+		_fhandle = 0;
+	}
+
+	void HttpRequestTask::write(const void *data, unsigned int size)
+	{
+		if (_fhandle)
+			file::write(_fhandle, data, size);
+		else
+		{
+			const char *p = (const char*)data;
+			_response.insert(_response.end(), p, p + size);
+		}
+	}
+
 }

+ 5 - 0
oxygine/src/HttpRequestTask.h

@@ -3,6 +3,7 @@
 #include "AsyncTask.h"
 #include <vector>
 #include <string>
+#include "core/file.h"
 
 namespace oxygine
 {
@@ -60,6 +61,9 @@ namespace oxygine
         void _onError() override;
         void _onComplete() override;
         void _dispatchComplete() override;
+		void _finalize(bool error) override;
+
+		void write(const void *data, unsigned int size);
 
         //async
         void progress(int loaded, int total);
@@ -76,6 +80,7 @@ namespace oxygine
         int _loaded;
         std::string _url;
         std::string _fname;
+		file::handle _fhandle;
         bool _cacheEnabled;
         std::vector<unsigned char> _response;
         std::vector<unsigned char> _postData;

+ 18 - 31
oxygine/src/core/curl/HttpRequestCurlTask.cpp

@@ -190,20 +190,9 @@ namespace oxygine
 
     size_t HttpRequestTaskCURL::_cbWriteFunction(char* d, size_t n, size_t l)
     {
-        if (!_handle && !_fname.empty())
-        {
-            _handle = file::open(_fname, "wb");
-        }
-
-        size_t size = n * l;
-        if (!_fname.empty())
-        {
-            file::write(_handle, d, (unsigned int)size);
-        }
-        else
-        {
-            _response.insert(_response.end(), d, d + size);
-        }
+		size_t size = n * l;
+		if (!_continueDownload || _ok)
+			write(d, size);
 
         return size;
     }
@@ -216,19 +205,28 @@ namespace oxygine
 
 	size_t HttpRequestTaskCURL::_cbHeaderFunction(char* d, size_t n, size_t l)
 	{
-		return n*l;
+		size_t s = n*l;
+		if (_continueDownload && !_ok)
+		{
+			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;
+			}
+		}
+		return s;
 	}
 
-    HttpRequestTaskCURL::HttpRequestTaskCURL() : _easy(0), _handle(0), _httpHeaders(0)
+    HttpRequestTaskCURL::HttpRequestTaskCURL() : _easy(0), _httpHeaders(0), _ok(false)
     {
         _easy = curl_easy_init();
     }
 
     HttpRequestTaskCURL::~HttpRequestTaskCURL()
     {
-        if (_handle)
-            file::close(_handle);
-        _handle = 0;
 
         if (_easy)
             curl_easy_cleanup(_easy);
@@ -280,16 +278,5 @@ namespace oxygine
 
         addRef();
         _messages.post(0, _easy, 0);
-    }
-
-    void HttpRequestTaskCURL::_finalize(bool error)
-    {
-        if (_handle)
-        {
-            file::close(_handle);
-            if (error)
-                file::deleteFile(_fname);
-        }
-        _handle = 0;
-    }
+	}
 }

+ 1 - 2
oxygine/src/core/curl/HttpRequestCurlTask.h

@@ -36,10 +36,9 @@ namespace oxygine
 
 
         void _run();
-        void _finalize(bool error);
 
+		bool _ok;
 
-        file::handle _handle;
         void* _easy;
         curl_slist* _httpHeaders;
     };