dmuratshin 8 years ago
parent
commit
fee31f0ee3

+ 10 - 50
oxygine/src/AsyncTask.cpp

@@ -3,12 +3,8 @@
 #include <typeinfo>
 namespace oxygine
 {
-    const int successID = sysEventID('s', 'c', 'm');
-    //const int customID = sysEventID('s', 'c', 'm');
-    const int runID = sysEventID('r', 'u', 'n');
-    const int errorID = sysEventID('s', 'e', 'r');
 
-    AsyncTask::AsyncTask() : _status(status_not_started), _mainThreadSync(false), _uiThreadSync(false)
+    AsyncTask::AsyncTask() : _status(status_not_started), _mainThreadSync(false)
     {
 
     }
@@ -25,36 +21,10 @@ namespace oxygine
 
         OX_ASSERT(_status == status_not_started);
         _status = status_inprogress;
-        if (!syncEvent(runID))
-            _run();
-    }
-
-    void AsyncTask::threadCB(const ThreadDispatcher::message& msg)
-    {
-        ((AsyncTask*)msg.cbData)->_threadCB(msg);
-    }
-
-    void AsyncTask::_threadCB(const ThreadDispatcher::message& msg)
-    {
-        switch (msg.msgid)
+        sync([ = ]()
         {
-            case successID:
-                _complete();
-                break;
-            case errorID:
-                _error();
-                break;
-            case runID:
-                _run();
-                break;
-            case customID:
-                _custom(msg);
-                break;
-            default:
-                break;
-        }
-        if (msg.msgid != customID)
-            releaseRef();
+            _run();
+        });
     }
 
     void AsyncTask::_complete()
@@ -89,29 +59,19 @@ namespace oxygine
         dispatchEvent(&ev);
     }
 
-
-    bool AsyncTask::syncEvent(int msgid, void* arg1, void* arg2)
-    {
-        if (_mainThreadSync)
-        {
-            if (msgid != customID)
-                addRef();
-            core::getMainThreadDispatcher().postCallback(msgid, arg1, arg2, AsyncTask::threadCB, this);
-            return true;
-        }
-
-        return false;
-    }
-
     void AsyncTask::onComplete()
     {
-        if (!syncEvent(successID, 0, 0))
+        sync([ = ]()
+        {
             _complete();
+        });
     }
 
     void AsyncTask::onError()
     {
-        if (!syncEvent(errorID, 0, 0))
+        sync([ = ]()
+        {
             _error();
+        });
     }
 }

+ 16 - 9
oxygine/src/AsyncTask.h

@@ -55,28 +55,35 @@ namespace oxygine
         friend class AsyncTaskManager;
 
         bool _mainThreadSync;
-        bool _uiThreadSync;
 
         virtual void _prerun() {}
         virtual void _run() = 0;
         virtual void _onError() {}
         virtual void _onComplete() {}
         virtual void _onFinal(bool error) {}
-        virtual void _onCustom(const ThreadDispatcher::message&) {};
         virtual void _finalize(bool error) {}
         virtual void _dispatchComplete();
 
-        enum { customID = sysEventID('s', 'c', 's') };
-        bool syncEvent(int msgid, void* arg1 = 0, void* arg2 = 0);
+
+        template <class F>
+        void sync(const F& f)
+        {
+            if (_mainThreadSync)
+            {
+                addRef();
+                core::getMainThreadDispatcher().postCallback([ = ]()
+                {
+                    f();
+                    releaseRef();
+                });
+                return;
+            }
+            f();
+        }
 
     private:
 
         void _complete();
         void _error();
-        void _custom(const ThreadDispatcher::message& m) { _onCustom(m); }
-
-
-        static void threadCB(const ThreadDispatcher::message&);
-        void _threadCB(const ThreadDispatcher::message&);
     };
 }

+ 63 - 65
oxygine/src/HttpRequestTask.cpp

@@ -21,36 +21,36 @@ namespace oxygine
     void HttpRequestTask::init() {}
     void HttpRequestTask::release() {}
 #endif
-    
+
     static HttpRequestTask::responseCodeChecker _defaultCheckerAny = [](int code)
     {
         return true;
     };
-    
-    
+
+
     static HttpRequestTask::responseCodeChecker _defaultChecker200 = [](int code)
     {
         return code == 200 || code == 206;
     };
-    
+
     HttpRequestTask::HttpRequestTask() :
         _cacheEnabled(true),
         _continueDownload(false),
         _expectedContentSize(0),
         _receivedContentSize(0),
         _fhandle(0),
-		_suitableResponse(false),
+        _suitableResponse(false),
         _responseCodeChecker(_defaultChecker200)
     {
+        _mainThreadSync = true;
 
     }
-    
+
     HttpRequestTask::~HttpRequestTask()
     {
         log::messageln("~HttpRequestTask");
-		if (_fhandle)
-			file::close(_fhandle);
-
+        if (_fhandle)
+            file::close(_fhandle);
     }
 
     void HttpRequestTask::setCustomRequests(createHttpRequestCallback cb)
@@ -72,7 +72,7 @@ namespace oxygine
 
     void HttpRequestTask::setFileName(const std::string& name, bool continueDownload)
     {
-		_continueDownload = continueDownload;
+        _continueDownload = continueDownload;
         _fname = name;
         _setFileName(name);
     }
@@ -87,7 +87,7 @@ namespace oxygine
     {
         _responseCodeChecker = any ? _defaultCheckerAny : _defaultChecker200;
     }
-    
+
     void HttpRequestTask::addHeader(const std::string& key, const std::string& value)
     {
         OX_ASSERT(!key.empty());
@@ -118,7 +118,7 @@ namespace oxygine
 
     void HttpRequestTask::_prerun()
     {
-		_suitableResponse = false;
+        _suitableResponse = false;
         _receivedContentSize = 0;
         _expectedContentSize = 0;
         _responseCode = 0;
@@ -126,22 +126,23 @@ namespace oxygine
         if (_fhandle)
             file::close(_fhandle);
         _fhandle = 0;
-        
+
         if (!_fname.empty())
         {
-			const char *mode = _continueDownload ? "ab" : "wb";
-			_fhandle = file::open(_fname, mode, ep_ignore_error);
-			
-			if (_continueDownload)
-			{
-				file::seek(_fhandle, 0, SEEK_END);
-				unsigned int size = file::tell(_fhandle);
-
-				char str[255];
-				safe_sprintf(str, "bytes=%d-", size);
-				addHeader("Range", str);
+            const char* mode = _continueDownload ? "ab" : "wb";
+            _fhandle = file::open(_fname, mode, ep_ignore_error);
+
+            if (_continueDownload)
+            {
+                file::seek(_fhandle, 0, SEEK_END);
+                unsigned int size = file::tell(_fhandle);
+
+                char str[255];
+                safe_sprintf(str, "bytes=%d-", size);
+                addHeader("Range", str);
+
                 _receivedContentSize = size;
-			}
+            }
         }
     }
 
@@ -153,9 +154,10 @@ namespace oxygine
 
     void HttpRequestTask::asyncProgress(int delta, int loaded, int total)
     {
-		core::getMainThreadDispatcher().postCallback([=]() {
-			dispatchProgress(delta, loaded, total);
-		});
+        sync([ = ]()
+        {
+            dispatchProgress(delta, loaded, total);
+        });
     }
 
     void HttpRequestTask::_onError()
@@ -170,47 +172,43 @@ namespace oxygine
 
     void HttpRequestTask::_dispatchComplete()
     {
-        bool ok = _responseCodeChecker(_responseCode);
-        
-		if (ok)
-			dispatchProgress(0, _expectedContentSize, _expectedContentSize);
-
-        Event ev(ok ? COMPLETE : ERROR);
+        Event ev(_suitableResponse ? COMPLETE : ERROR);
         dispatchEvent(&ev);
     }
 
-	void HttpRequestTask::_finalize(bool error)
-	{
-		if (_fhandle)
-		{
-			file::close(_fhandle);
-			_fhandle = 0;
-
-			if (error && !_continueDownload)
-				file::deleteFile(_fname);
-		}
-		_fhandle = 0;
-	}
-
-	void HttpRequestTask::gotHeaders()
-	{
-		_suitableResponse = _responseCodeChecker(_responseCode);
-	}
-
-	void HttpRequestTask::write(const void *data, unsigned int size)
-	{
-		if (!_suitableResponse)
-			return;
-
-		if (_fhandle)
-			file::write(_fhandle, data, size);
-		else
-		{
-			const char *p = (const char*)data;
-			_response.insert(_response.end(), p, p + size);
-		}
+    void HttpRequestTask::_finalize(bool error)
+    {
+        if (_fhandle)
+        {
+            file::close(_fhandle);
+            _fhandle = 0;
+
+            if (error && !_continueDownload)
+                file::deleteFile(_fname);
+        }
+        _fhandle = 0;
+    }
+
+    void HttpRequestTask::gotHeaders()
+    {
+        _suitableResponse = _responseCodeChecker(_responseCode);
+    }
+
+    void HttpRequestTask::write(const void* data, unsigned int size)
+    {
+        if (!_suitableResponse)
+            return;
+
+        if (_fhandle)
+            file::write(_fhandle, data, size);
+        else
+        {
+            const char* p = (const char*)data;
+            _response.insert(_response.end(), p, p + size);
+        }
+
         _receivedContentSize += size;
         asyncProgress(size, _receivedContentSize, _expectedContentSize);
-	}
+    }
 
 }

+ 9 - 9
oxygine/src/HttpRequestTask.h

@@ -56,8 +56,8 @@ namespace oxygine
         void setUrl(const std::string& url);
         void setFileName(const std::string& name, bool continueDownload = false);
         void setCacheEnabled(bool enabled);
-        
-        void setResponseCodeChecker(const responseCodeChecker &f){_responseCodeChecker = f;}
+
+        void setResponseCodeChecker(const responseCodeChecker& f) {_responseCodeChecker = f;}
         void setSuccessOnAnyResponseCode(bool en);
 
     protected:
@@ -65,10 +65,10 @@ namespace oxygine
         void _onError() override;
         void _onComplete() override;
         void _dispatchComplete() override;
-		void _finalize(bool error) override;
+        void _finalize(bool error) override;
 
-		void gotHeaders();
-		void write(const void *data, unsigned int size);
+        void gotHeaders();
+        void write(const void* data, unsigned int size);
 
         //async
         void asyncProgress(int delta, int loaded, int total);
@@ -83,20 +83,20 @@ namespace oxygine
 
         std::string _url;
         std::string _fname;
-		file::handle _fhandle;
+        file::handle _fhandle;
         bool _cacheEnabled;
         std::vector<unsigned char> _response;
         std::vector<unsigned char> _postData;
-        
+
         responseCodeChecker _responseCodeChecker;
 
-		bool _suitableResponse;
+        bool _suitableResponse;
 
         int _responseCode;
         size_t _expectedContentSize;
         size_t _receivedContentSize;
 
-		bool _continueDownload;
+        bool _continueDownload;
 
         typedef std::vector< std::pair<std::string, std::string> >  headers;
         headers _headers;

+ 46 - 47
oxygine/src/core/android/HttpRequestJavaTask.cpp

@@ -20,8 +20,8 @@ namespace oxygine
         _jHttpRequestsClass = (jclass) env->NewGlobalRef(env->FindClass("org/oxygine/lib/HttpRequests"));
         JNI_NOT_NULL(_jHttpRequestsClass);
 
-        _jCreateRequestMethod = env->GetStaticMethodID(_jHttpRequestsClass, "createRequest", 
-			"(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[BJ)Lorg/oxygine/lib/HttpRequestHolder;");
+        _jCreateRequestMethod = env->GetStaticMethodID(_jHttpRequestsClass, "createRequest",
+                                "(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[BJ)Lorg/oxygine/lib/HttpRequestHolder;");
 
         JNI_NOT_NULL(_jCreateRequestMethod);
 
@@ -58,7 +58,6 @@ namespace oxygine
 
     void HttpRequestJavaTask::_run()
     {
-        _mainThreadSync = true;
         JNIEnv* env = jniGetEnv();
         LOCAL_REF_HOLDER(env);
 
@@ -71,22 +70,22 @@ namespace oxygine
             env->SetByteArrayRegion(jpost, 0, _postData.size(), (jbyte*)&_postData.front());
         }
 
-		jobjectArray jkeys   = (jobjectArray)env->NewObjectArray(_headers.size(), env->FindClass("java/lang/String"), 0);
-		jobjectArray jvalues = (jobjectArray)env->NewObjectArray(_headers.size(), env->FindClass("java/lang/String"), 0);
+        jobjectArray jkeys   = (jobjectArray)env->NewObjectArray(_headers.size(), env->FindClass("java/lang/String"), 0);
+        jobjectArray jvalues = (jobjectArray)env->NewObjectArray(_headers.size(), env->FindClass("java/lang/String"), 0);
 
-		for (size_t i = 0; i < _headers.size(); ++i)
-		{
-			jstring jkey   = env->NewStringUTF(_headers[i].first.c_str());
-			jstring jvalue = env->NewStringUTF(_headers[i].second.c_str());
+        for (size_t i = 0; i < _headers.size(); ++i)
+        {
+            jstring jkey   = env->NewStringUTF(_headers[i].first.c_str());
+            jstring jvalue = env->NewStringUTF(_headers[i].second.c_str());
 
-			env->SetObjectArrayElement(jkeys,   i, jkey);
-			env->SetObjectArrayElement(jvalues, i, jvalue);
-		}
+            env->SetObjectArrayElement(jkeys,   i, jkey);
+            env->SetObjectArrayElement(jvalues, i, jvalue);
+        }
 
 
-		addRef();
-        _handle = env->NewGlobalRef(env->CallStaticObjectMethod(_jHttpRequestsClass, _jCreateRequestMethod, 
-			jurl, jkeys, jvalues, jpost, (jlong)this));
+        addRef();
+        _handle = env->NewGlobalRef(env->CallStaticObjectMethod(_jHttpRequestsClass, _jCreateRequestMethod,
+                                    jurl, jkeys, jvalues, jpost, (jlong)this));
     }
 
     void HttpRequestJavaTask::error_()
@@ -95,22 +94,22 @@ namespace oxygine
         releaseRef();
     }
 
-	void HttpRequestJavaTask::gotHeader_(int respCode, int contentLen)
-	{
-		_responseCode = respCode;
-		_expectedContentSize = contentLen;
-		gotHeaders();
-	}
+    void HttpRequestJavaTask::gotHeader_(int respCode, int contentLen)
+    {
+        _responseCode = respCode;
+        _expectedContentSize = contentLen;
+        gotHeaders();
+    }
 
-	void HttpRequestJavaTask::write_(jbyteArray jdata, int size)
-	{
-		JNIEnv* env = jniGetEnv();
-		jbyte* data = env->GetByteArrayElements(jdata, 0);
+    void HttpRequestJavaTask::write_(jbyteArray jdata, int size)
+    {
+        JNIEnv* env = jniGetEnv();
+        jbyte* data = env->GetByteArrayElements(jdata, 0);
 
-		write(data, size);
+        write(data, size);
 
-		env->ReleaseByteArrayElements(jdata, data, 0);
-	}
+        env->ReleaseByteArrayElements(jdata, data, 0);
+    }
 
     void HttpRequestJavaTask::complete_()
     {
@@ -128,12 +127,12 @@ namespace oxygine
 
 extern "C"
 {
-	/*
-	public static native void nativeHttpRequestSuccess(long handle);
-	public static native void nativeHttpRequestError(long handle);
-	public static native void nativeHttpRequestGotHeader(long handle, int code, int contentLength);
-	public static native void nativeHttpRequestWrite(long handle, byte[] data, int size);
-	*/
+    /*
+    public static native void nativeHttpRequestSuccess(long handle);
+    public static native void nativeHttpRequestError(long handle);
+    public static native void nativeHttpRequestGotHeader(long handle, int code, int contentLength);
+    public static native void nativeHttpRequestWrite(long handle, byte[] data, int size);
+    */
     JNIEnv* Android_JNI_GetEnv(void);
 
     JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestSuccess(JNIEnv* env, jclass, jlong handle)
@@ -148,17 +147,17 @@ extern "C"
         task->error_();
     }
 
-	JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestWrite(JNIEnv* env, jclass,
-		jlong handle, jbyteArray array, jint size)
-	{
-		oxygine::HttpRequestJavaTask* task = (oxygine::HttpRequestJavaTask*)handle;
-		task->write_(array, size);
-	}
-
-	JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestGotHeader(JNIEnv* env, jclass,
-		jlong handle, jint respCode, jint contentLen)
-	{
-		oxygine::HttpRequestJavaTask* task = (oxygine::HttpRequestJavaTask*)handle;
-		task->gotHeader_(respCode, contentLen);
-	}
+    JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestWrite(JNIEnv* env, jclass,
+            jlong handle, jbyteArray array, jint size)
+    {
+        oxygine::HttpRequestJavaTask* task = (oxygine::HttpRequestJavaTask*)handle;
+        task->write_(array, size);
+    }
+
+    JNIEXPORT void JNICALL Java_org_oxygine_lib_HttpRequest_nativeHttpRequestGotHeader(JNIEnv* env, jclass,
+            jlong handle, jint respCode, jint contentLen)
+    {
+        oxygine::HttpRequestJavaTask* task = (oxygine::HttpRequestJavaTask*)handle;
+        task->gotHeader_(respCode, contentLen);
+    }
 }

+ 2 - 2
oxygine/src/core/android/HttpRequestJavaTask.h

@@ -21,8 +21,8 @@ namespace oxygine
 
         void complete_();
         void progress_(int loaded, int total);
-		void gotHeader_(int respCode, int contentLen);
-		void write_(jbyteArray, int size);
+        void gotHeader_(int respCode, int contentLen);
+        void write_(jbyteArray, int size);
         void error_();
 
 

+ 35 - 57
oxygine/src/core/curl/HttpRequestCurlTask.cpp

@@ -32,31 +32,9 @@ namespace oxygine
                 curl_easy_getinfo(easy, CURLINFO_PRIVATE, &task);
 
                 bool ok = (size_t)msg.arg2 == CURLE_OK;
-                if (ok)
-                {
-                    int response = 0;
-                    curl_easy_getinfo(easy, CURLINFO_RESPONSE_CODE, &response);
-                    task->_responseCode = response;
-                    //ok = response == 200;
-                }
-
-#if 0
-                const Uint8* data = SDL_GetKeyboardState(0);
-                static bool fail = false;
-
-                if (data[SDL_SCANCODE_N])
-                    fail = true;
-                if (data[SDL_SCANCODE_M])
-                    fail = false;
-
-                if (fail)
-                    ok = false;
-#endif
 
                 if (ok)
-                {
                     task->onComplete();
-                }
                 else
                     task->onError();
 
@@ -160,54 +138,54 @@ namespace oxygine
     }
 
 
-    size_t HttpRequestTaskCURL::cbWriteFunction(char* d, size_t n, size_t l, HttpRequestTaskCURL* userData)
+    size_t HttpRequestTaskCURL::cbWriteFunction(char* d, size_t n, size_t l, HttpRequestTaskCURL* This)
     {
-        return userData->_cbWriteFunction(d, n, l);
+        return This->_cbWriteFunction(d, n, l);
     }
 
 
     size_t HttpRequestTaskCURL::_cbWriteFunction(char* d, size_t n, size_t l)
     {
-		size_t size = n * l;
+        size_t size = n * l;
 
-		write(d, size);
+        write(d, size);
 
         return size;
     }
 
-	size_t HttpRequestTaskCURL::cbHeaderFunction(char* d, size_t n, size_t l, HttpRequestTaskCURL* userData)
-	{
-		return userData->_cbHeaderFunction(d, n, l);
-	}
+    size_t HttpRequestTaskCURL::cbHeaderFunction(char* d, size_t n, size_t l, HttpRequestTaskCURL* This)
+    {
+        return This->_cbHeaderFunction(d, n, l);
+    }
 
 
-	size_t HttpRequestTaskCURL::_cbHeaderFunction(char* d, size_t n, size_t l)
-	{
-		size_t s = n*l;
-		if (s > 255)//ignore unknown headers
-			return s;
+    size_t HttpRequestTaskCURL::_cbHeaderFunction(char* d, size_t n, size_t l)
+    {
+        size_t s = n * l;
+        if (s > 255)//ignore unknown headers
+            return s;
 
 
-		int contentLength = 0;
-		if (sscanf(d, "Content-Length: %d", &contentLength) == 1)
-		{
-			_expectedContentSize = contentLength;
-		}
+        int contentLength = 0;
+        if (sscanf(d, "Content-Length: %d", &contentLength) == 1)
+        {
+            _expectedContentSize = contentLength;
+        }
 
-		int responseCode = 0;
-		char ver[32];
-		if (sscanf(d, "HTTP/%s %d ", ver, &responseCode) == 2)
-		{
-			_responseCode = responseCode;
-		}
+        int responseCode = 0;
+        char ver[32];
+        if (sscanf(d, "HTTP/%s %d ", ver, &responseCode) == 2)
+        {
+            _responseCode = responseCode;
+        }
 
-		if (d[0] == '\r' && d[1] == '\n')
-		{
-			gotHeaders();
-		}
+        if (d[0] == '\r' && d[1] == '\n')
+        {
+            gotHeaders();
+        }
 
-		return s;
-	}
+        return s;
+    }
 
     HttpRequestTaskCURL::HttpRequestTaskCURL() : _easy(0), _httpHeaders(0)
     {
@@ -230,11 +208,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_HEADERFUNCTION, HttpRequestTaskCURL::cbHeaderFunction);
+        curl_easy_setopt(_easy, CURLOPT_HEADERDATA, this);
 
 
         curl_easy_setopt(_easy, CURLOPT_NOPROGRESS, 0);
@@ -260,5 +238,5 @@ namespace oxygine
 
         addRef();
         _messages.post(0, _easy, 0);
-	}
+    }
 }

+ 4 - 4
oxygine/src/core/curl/HttpRequestCurlTask.h

@@ -23,11 +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, HttpRequestTaskCURL* p);
-		size_t _cbWriteFunction(char* d, size_t n, size_t l);
+        static size_t cbWriteFunction(char* d, size_t n, size_t l, HttpRequestTaskCURL* p);
+        size_t _cbWriteFunction(char* d, size_t n, size_t l);
 
-		static size_t cbHeaderFunction(char* d, size_t n, size_t l, HttpRequestTaskCURL* p);
-		size_t _cbHeaderFunction(char* d, size_t n, size_t l);
+        static size_t cbHeaderFunction(char* d, size_t n, size_t l, HttpRequestTaskCURL* p);
+        size_t _cbHeaderFunction(char* d, size_t n, size_t l);
 
 
         void _run();

+ 0 - 2
oxygine/src/core/ios/HttpRequestCocoaTask.mm

@@ -202,8 +202,6 @@ namespace oxygine
     
     void HttpRequestCocoaTask::_run()
     {
-        _mainThreadSync = true;
-        
         addRef();
         
         NSString *urlString = [NSString stringWithUTF8String:_url.c_str()];