Sfoglia il codice sorgente

continue download http file wip

dmuratshin 8 anni fa
parent
commit
7b4b2f7925

+ 12 - 3
oxygine/src/HttpRequestTask.cpp

@@ -1,6 +1,7 @@
 #include "HttpRequestTask.h"
 #include "core/file.h"
 #include "core/oxygine.h"
+#include "utils/stringUtils.h"
 
 namespace oxygine
 {
@@ -20,7 +21,7 @@ namespace oxygine
     void HttpRequestTask::init() {}
     void HttpRequestTask::release() {}
 #endif
-    HttpRequestTask::HttpRequestTask() : _loaded(0), _cacheEnabled(true), _successOnAnyResponceCode(false)
+    HttpRequestTask::HttpRequestTask() : _loaded(0), _cacheEnabled(true), _successOnAnyResponceCode(false), _continueDownload(false)
     {
 
     }
@@ -46,8 +47,9 @@ namespace oxygine
         _setUrl(url);
     }
 
-    void HttpRequestTask::setFileName(const std::string& name)
+    void HttpRequestTask::setFileName(const std::string& name, bool continueDownload)
     {
+		_continueDownload = continueDownload;
         _fname = name;
         _setFileName(name);
     }
@@ -93,7 +95,14 @@ namespace oxygine
         _response.clear();
         if (!_fname.empty())
         {
-            file::deleteFile(_fname, ep_ignore_error);
+			if (_continueDownload)
+			{
+				char str[255];
+				safe_sprintf(str, "bytes=%d", 1);
+				addHeader("Range", str);
+			}
+			else
+				file::deleteFile(_fname, ep_ignore_error);
         }
     }
 

+ 3 - 1
oxygine/src/HttpRequestTask.h

@@ -51,7 +51,7 @@ namespace oxygine
 
         void setPostData(const std::vector<unsigned char>& data);
         void setUrl(const std::string& url);
-        void setFileName(const std::string& name);
+        void setFileName(const std::string& name, bool continueDownload = false);
         void setCacheEnabled(bool enabled);
         void setSuccessOnAnyResponseCode(bool en) { _successOnAnyResponceCode = en; }
 
@@ -83,6 +83,8 @@ namespace oxygine
         int _responseCode;
         bool _successOnAnyResponceCode;
 
+		bool _continueDownload;
+
         typedef std::vector< std::pair<std::string, std::string> >  headers;
         headers _headers;
     };

+ 16 - 2
oxygine/src/core/curl/HttpRequestCurlTask.cpp

@@ -208,6 +208,17 @@ namespace oxygine
         return size;
     }
 
+	size_t HttpRequestTaskCURL::cbHeaderFunction(char* d, size_t n, size_t l, void* userData)
+	{
+		return ((HttpRequestTaskCURL*)userData)->_cbHeaderFunction(d, n, l);
+	}
+
+
+	size_t HttpRequestTaskCURL::_cbHeaderFunction(char* d, size_t n, size_t l)
+	{
+		return n*l;
+	}
+
     HttpRequestTaskCURL::HttpRequestTaskCURL() : _easy(0), _handle(0), _httpHeaders(0)
     {
         _easy = curl_easy_init();
@@ -232,8 +243,11 @@ namespace oxygine
     {
         curl_easy_setopt(_easy, CURLOPT_URL, _url.c_str());
         curl_easy_setopt(_easy, CURLOPT_PRIVATE, this);
-        curl_easy_setopt(_easy, CURLOPT_WRITEFUNCTION, HttpRequestTaskCURL::cbWriteFunction);
-        curl_easy_setopt(_easy, CURLOPT_WRITEDATA, this);
+		curl_easy_setopt(_easy, CURLOPT_WRITEFUNCTION, HttpRequestTaskCURL::cbWriteFunction);
+		curl_easy_setopt(_easy, CURLOPT_WRITEDATA, this);
+
+		curl_easy_setopt(_easy, CURLOPT_HEADERFUNCTION, HttpRequestTaskCURL::cbHeaderFunction);
+		curl_easy_setopt(_easy, CURLOPT_HEADERDATA, this);
 
 
         curl_easy_setopt(_easy, CURLOPT_NOPROGRESS, 0);

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

@@ -23,8 +23,11 @@ namespace oxygine
         friend void* thread(void*);
         friend void mainThreadFunc(const ThreadDispatcher::message& msg);
 
-        static size_t cbWriteFunction(char* d, size_t n, size_t l, void* p);
-        size_t _cbWriteFunction(char* d, size_t n, size_t l);
+		static size_t cbWriteFunction(char* d, size_t n, size_t l, void* p);
+		size_t _cbWriteFunction(char* d, size_t n, size_t l);
+
+		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);
 
         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);
@@ -35,6 +38,7 @@ namespace oxygine
         void _run();
         void _finalize(bool error);
 
+
         file::handle _handle;
         void* _easy;
         curl_slist* _httpHeaders;