Browse Source

create WebImage from existing http request

[email protected] 8 years ago
parent
commit
856f9803a1

+ 5 - 0
oxygine/src/HttpRequestTask.cpp

@@ -116,6 +116,11 @@ namespace oxygine
         return _fname;
         return _fname;
     }
     }
 
 
+    const std::string& HttpRequestTask::getUrl() const
+    {
+        return _url;
+    }
+
     bool HttpRequestTask::_prerun()
     bool HttpRequestTask::_prerun()
     {
     {
         _progressDeltaDelayed = 0;
         _progressDeltaDelayed = 0;

+ 1 - 0
oxygine/src/HttpRequestTask.h

@@ -44,6 +44,7 @@ namespace oxygine
         const std::vector<unsigned char>&   getResponse() const;
         const std::vector<unsigned char>&   getResponse() const;
         const std::vector<unsigned char>&   getPostData() const;
         const std::vector<unsigned char>&   getPostData() const;
         const std::string&                  getFileName() const;
         const std::string&                  getFileName() const;
+        const std::string&                  getUrl() const;
 
 
 
 
         /**swap version of getResponse if you want to modify result buffer inplace*/
         /**swap version of getResponse if you want to modify result buffer inplace*/

+ 56 - 16
oxygine/src/WebImage.cpp

@@ -15,7 +15,7 @@ namespace oxygine
     }
     }
 
 
 
 
-    WebImage::WebImage() : _http(0)
+    WebImage::WebImage() : _http(0), _allowSwap(false)
     {
     {
         setSize(64, 64);
         setSize(64, 64);
         _image = new Sprite;
         _image = new Sprite;
@@ -30,39 +30,65 @@ namespace oxygine
 
 
     void WebImage::load(const std::string& url)
     void WebImage::load(const std::string& url)
     {
     {
+        _allowSwap = true;
         _image->setResAnim(0);
         _image->setResAnim(0);
 
 
-        _http = HttpRequestTask::create();
-        if (!_http)
+        spHttpRequestTask task = HttpRequestTask::create();
+        if (!task)
             return;
             return;
-        _http->setUrl(url);
-        _http->run();
+        task->setUrl(url);
+        task->run();
 
 
-        addRef();//protect actor for delete
-        _http->addEventListener(AsyncTask::COMPLETE, CLOSURE(this, &WebImage::loaded));
-        _http->addEventListener(AsyncTask::ERROR, CLOSURE(this, &WebImage::error));
+        _load(task);
     }
     }
 
 
-    void WebImage::error(Event* e)
+    void WebImage::load(spHttpRequestTask task)
     {
     {
-        dispatchEvent(e);
-        releaseRef();
-        _http = 0;
+        _allowSwap = false;
+        _image->setResAnim(0);
+        _load(task);
     }
     }
 
 
-    void WebImage::loaded(Event* e)
+    void WebImage::_load(spHttpRequestTask task)
     {
     {
-        if (_ref_counter <= 1)//if it is already dead
+        _http = task;
+
+        if (task->getStatus() == HttpRequestTask::status_completed)
         {
         {
-            releaseRef();
+            init();
             return;
             return;
         }
         }
 
 
+        if (task->getStatus() == HttpRequestTask::status_failed)
+        {
+            return;
+        }
+
+
+        addRef();//protect actor from delete
+        _http->addEventListener(AsyncTask::COMPLETE, CLOSURE(this, &WebImage::loaded));
+        _http->addEventListener(AsyncTask::ERROR, CLOSURE(this, &WebImage::error));
+    }
 
 
+    void WebImage::error(Event* e)
+    {
         dispatchEvent(e);
         dispatchEvent(e);
+        releaseRef();
+        _http = 0;
+    }
 
 
+    void WebImage::init()
+    {
         file::buffer bf;
         file::buffer bf;
-        _http->getResponseSwap(bf.data);
+        if (_allowSwap)
+        {
+            _http->getResponseSwap(bf.data);
+            _allowSwap = false;
+        }
+        else
+        {
+            bf.data = _http->getResponse();
+        }
 
 
         Image mt;
         Image mt;
         if (mt.init(bf, true))
         if (mt.init(bf, true))
@@ -72,7 +98,21 @@ namespace oxygine
 
 
             fit();
             fit();
         }
         }
+        _http = 0;
+    }
+
+    void WebImage::loaded(Event* e)
+    {
+        if (_ref_counter <= 1)//if it is already dead
+        {
+            releaseRef();
+            return;
+        }
+
+
+        dispatchEvent(e);
 
 
+        init();
         _http = 0;
         _http = 0;
         releaseRef();
         releaseRef();
     }
     }

+ 6 - 0
oxygine/src/WebImage.h

@@ -17,19 +17,25 @@ namespace oxygine
         ~WebImage();
         ~WebImage();
 
 
         void load(const std::string& url);
         void load(const std::string& url);
+        void load(spHttpRequestTask task);
         void unload();
         void unload();
 
 
     private:
     private:
+        void _load(spHttpRequestTask task);
+
         void loaded(Event*);
         void loaded(Event*);
         void error(Event*);
         void error(Event*);
         void sizeChanged(const Vector2& size) override;
         void sizeChanged(const Vector2& size) override;
         void fit();
         void fit();
 
 
+        void init();
+
         ResAnim _rs;
         ResAnim _rs;
 
 
         spSprite _image;
         spSprite _image;
 
 
         spHttpRequestTask _http;
         spHttpRequestTask _http;
+        bool _allowSwap;
     };
     };
 }
 }