Преглед изворни кода

Merge branch 'dev' into new-render

# Conflicts:
#	oxygine/src/oxygine/Serialize.cpp
#	oxygine/src/oxygine/actor/WebImage.h
[email protected] пре 8 година
родитељ
комит
d6953cd259

+ 1 - 1
oxygine/src/ox/MemoryTexture.hpp

@@ -1 +1 @@
-#include "oxygine/MemoryTexture.h"
+#include "oxygine/Image.h"

+ 18 - 1
oxygine/src/oxygine/HttpRequestTask.cpp

@@ -35,6 +35,7 @@ namespace oxygine
 
     HttpRequestTask::HttpRequestTask() :
         _cacheEnabled(true),
+        _progressOnWrite(true),
         _continueDownload(false),
         _expectedContentSize(0),
         _receivedContentSize(0),
@@ -121,8 +122,19 @@ namespace oxygine
         return _url;
     }
 
+    size_t HttpRequestTask::getReceivedSize() const
+    {
+        return _receivedContentSize;
+    }
+
+    size_t HttpRequestTask::getExpectedSize() const
+    {
+        return _expectedContentSize;
+    }
+
     bool HttpRequestTask::_prerun()
     {
+        _firstTimeProgressDispatched = false;
         _progressDeltaDelayed = 0;
         _progressDispatched = false;
         _suitableResponse = false;
@@ -163,7 +175,9 @@ namespace oxygine
 
     void HttpRequestTask::dispatchProgress(size_t delta, size_t loaded, size_t total)
     {
-        ProgressEvent event(delta, loaded, total);
+        ProgressEvent event(delta, loaded, total, !_firstTimeProgressDispatched);
+        _firstTimeProgressDispatched = true;
+
         dispatchEvent(&event);
     }
 
@@ -246,6 +260,9 @@ namespace oxygine
             _response.insert(_response.end(), p, p + size);
         }
 
+        if (!_progressOnWrite)
+            return;
+
         _receivedContentSize += size;
         asyncProgress(size, _receivedContentSize, _expectedContentSize);
     }

+ 7 - 2
oxygine/src/oxygine/HttpRequestTask.h

@@ -31,11 +31,12 @@ namespace oxygine
         {
         public:
             enum {EVENT = PROGRESS};
-            ProgressEvent(size_t Delta, size_t Loaded, size_t Total) : Event(PROGRESS), delta(Delta), loaded(Loaded), total(Total) {};
+            ProgressEvent(size_t Delta, size_t Loaded, size_t Total, bool First) : Event(PROGRESS), delta(Delta), loaded(Loaded), total(Total), first(First) {};
 
             size_t delta;
             size_t loaded;
             size_t total;
+            bool first;
         };
 
         HttpRequestTask();
@@ -45,7 +46,8 @@ namespace oxygine
         const std::vector<unsigned char>&   getPostData() const;
         const std::string&                  getFileName() const;
         const std::string&                  getUrl() const;
-
+        size_t                              getReceivedSize() const;
+        size_t                              getExpectedSize() const;
 
         /**swap version of getResponse if you want to modify result buffer inplace*/
         void getResponseSwap(std::vector<unsigned char>&);
@@ -62,6 +64,7 @@ namespace oxygine
         void setResponseCodeChecker(const responseCodeChecker& f) {_responseCodeChecker = f;}
         /**by default only response code == 200 is succeded, other codes are dispatching Event::ERROR*/
         void setSuccessOnAnyResponseCode(bool en);
+        void setExpectedSize(size_t size) { _expectedContentSize = size; }
 
     protected:
         bool _prerun() override;
@@ -91,6 +94,8 @@ namespace oxygine
         file::handle _fhandle;
         bool _writeFileError;
         bool _cacheEnabled;
+        bool _firstTimeProgressDispatched;
+        bool _progressOnWrite;
 
         bool _progressDispatched;
         unsigned int _progressDeltaDelayed;

+ 2 - 0
oxygine/src/oxygine/Serialize.cpp

@@ -8,6 +8,7 @@
 #include "actor/Polygon.h"
 #include "actor/MaskedSprite.h"
 #include "actor/Box9Sprite.h"
+#include "actor/WebImage.h"
 
 namespace oxygine
 {
@@ -27,6 +28,7 @@ namespace oxygine
         CREATE(ClipRectActor);
         CREATE(Polygon);
         CREATE(MaskedSprite);
+        CREATE(WebImage);
 
 
         return 0;

+ 3 - 0
oxygine/src/oxygine/actor/TextField.cpp

@@ -320,6 +320,9 @@ namespace oxygine
             rd.bounds = (rd.bounds.cast<RectF>() / rd.getScale()).cast<Rect>();
 
             _textRect = rd.bounds;
+
+            Event ev(EVENT_REBUILD);
+            dispatchEvent(&ev);
         }
 
         return _root;

+ 2 - 0
oxygine/src/oxygine/actor/TextField.h

@@ -14,6 +14,8 @@ namespace oxygine
         static void setDefaultFont(ResFont*);
         static ResFont* getDefaultFont();
 
+        enum {EVENT_REBUILD = sysEventID('T', 'F', 'r') };
+
         DECLARE_COPYCLONE_NEW(TextField);
         TextField();
         ~TextField();

+ 15 - 3
oxygine/src/oxygine/actor/WebImage.cpp

@@ -3,13 +3,14 @@
 #include "../Image.h"
 #include "../HttpRequestTask.h"
 #include "Sprite.h"
+#include "Serialize.h"
 #include <vector>
 
 namespace oxygine
 {
-
-    WebImage::WebImage(const WebImage& src, copyOptions opt) : Actor(src, opt)
+    void WebImage::copyFrom(const WebImage& src, cloneOptions opt)
     {
+        inherited::copyFrom(src, opt);
         _http = 0;
         _image = getChildT<Sprite>("_child_");
     }
@@ -138,4 +139,15 @@ namespace oxygine
     {
         fit();
     }
-}
+
+    void WebImage::serialize(serializedata* data)
+    {
+        inherited::serialize(data);
+        data->node.set_name("WebImage");
+    }
+
+    void WebImage::deserialize(const deserializedata* data)
+    {
+        inherited::deserialize(data);
+    }
+}

+ 5 - 1
oxygine/src/oxygine/actor/WebImage.h

@@ -2,6 +2,7 @@
 #include "../oxygine-include.h"
 #include "Actor.h"
 #include "../res/ResAnim.h"
+#include "../HttpRequestTask.h"
 #include <string>
 
 namespace oxygine
@@ -11,7 +12,7 @@ namespace oxygine
     {
         INHERITED(Actor);
     public:
-        DECLARE_COPYCLONE(WebImage);
+        DECLARE_COPYCLONE_NEW(WebImage);
 
         WebImage();
         ~WebImage();
@@ -20,6 +21,9 @@ namespace oxygine
         void load(spHttpRequestTask task);
         void unload();
 
+        void serialize(serializedata*) override;
+        void deserialize(const deserializedata*) override;
+
     private:
         void _load(spHttpRequestTask task);
 

+ 12 - 6
oxygine/src/oxygine/core/STDFileSystem.cpp

@@ -171,16 +171,19 @@ namespace oxygine
 
 
 
-        int remove_directory(const char *path)
+#ifdef OXYGINE_EDITOR
+        int remove_directory(const char* path) {return -1;}
+#else
+        int remove_directory(const char* path)
         {
 #ifndef WIN32
-            DIR *d = opendir(path);
+            DIR* d = opendir(path);
             size_t path_len = strlen(path);
             int r = -1;
 
             if (d)
             {
-                struct dirent *p;
+                struct dirent* p;
 
                 r = 0;
 
@@ -236,7 +239,7 @@ namespace oxygine
             hFile = ::FindFirstFile(strPattern.c_str(), &FileInformation);
             if (hFile == INVALID_HANDLE_VALUE)
                 return -1;
-            
+
             do
             {
                 if (FileInformation.cFileName[0] != '.')
@@ -253,7 +256,8 @@ namespace oxygine
                         DeleteFile(strFilePath.c_str());
                     }
                 }
-            } while (::FindNextFile(hFile, &FileInformation) == TRUE);
+            }
+            while (::FindNextFile(hFile, &FileInformation) == TRUE);
 
             // Close handle
             ::FindClose(hFile);
@@ -262,6 +266,8 @@ namespace oxygine
 #endif
         }
 
+#endif
+
 
 
 
@@ -363,7 +369,7 @@ namespace oxygine
         FileSystem::status STDFileSystem::_deleteDirectory(const char* path)
         {
             char buff[512];
-            _getFullPath(path, buff);           
+            _getFullPath(path, buff);
 
             return remove_directory(buff) != -1 ? status_ok : status_error;
         }

+ 8 - 3
oxygine/src/oxygine/core/curl/HttpRequestCurlTask.cpp

@@ -174,21 +174,26 @@ namespace oxygine
         if (s > 255)//ignore unknown headers
             return s;
 
+        char buff[512];
+        int i = 0;
+        for (; i < s; ++i)
+            buff[i] = tolower(d[i]);
+        buff[i] = 0;
 
         int contentLength = 0;
-        if (sscanf(d, "Content-Length: %d", &contentLength) == 1)
+        if (sscanf(buff, "content-length: %d", &contentLength) == 1)
         {
             _expectedContentSize = contentLength;
         }
 
         int responseCode = 0;
         char ver[32];
-        if (sscanf(d, "HTTP/%s %d ", ver, &responseCode) == 2)
+        if (sscanf(buff, "http/%s %d ", ver, &responseCode) == 2)
         {
             _responseCode = responseCode;
         }
 
-        if (d[0] == '\r' && d[1] == '\n')
+        if (buff[0] == '\r' && buff[1] == '\n')
         {
             gotHeaders();
         }

+ 11 - 3
oxygine/src/oxygine/core/emscripten/HttpRequestEmscriptenTask.cpp

@@ -19,6 +19,11 @@ namespace oxygine
     {
     }
 
+    HttpRequestEmscriptenTask::HttpRequestEmscriptenTask()
+    {
+        _progressOnWrite = false;//manual send
+    }
+
     void HttpRequestEmscriptenTask::_onload(void* data, unsigned size)
     {
         _responseCode = 200;
@@ -35,10 +40,13 @@ namespace oxygine
         releaseRef();
     }
 
-    void HttpRequestEmscriptenTask::_onprogress(int, int)
+    void HttpRequestEmscriptenTask::_onprogress(int a, int b)
     {
-        Event ev(HttpRequestTask::PROGRESS);
-        dispatchEvent(&ev);
+        log::messageln(" HttpRequestEmscriptenTask::_onprogress %d %d", a, b);
+        int delta = a - _receivedContentSize;
+        _receivedContentSize = a;
+        _expectedContentSize = b;
+        dispatchProgress(delta, _receivedContentSize, b);
     }
 
     void HttpRequestEmscriptenTask::_run()

+ 1 - 0
oxygine/src/oxygine/core/emscripten/HttpRequestEmscriptenTask.h

@@ -7,6 +7,7 @@ namespace oxygine
     class HttpRequestEmscriptenTask: public HttpRequestTask
     {
     public:
+        HttpRequestEmscriptenTask();
 
     private:
         /*

+ 20 - 0
oxygine/src/oxygine/core/file.cpp

@@ -245,6 +245,26 @@ namespace oxygine
             return _nfs.makeDirectory(path.c_str()) == FileSystem::status_ok;
         }
 
+        void makeDirectories(const std::string& path_)
+        {
+            std::string path = path::normalize(path_);
+
+            std::string folder;
+            std::string str = path;
+            do
+            {
+                size_t pos = str.find('/');
+                if (pos == str.npos)
+                    break;
+
+                folder += str.substr(0, pos) + "/";
+                makeDirectory(folder.c_str());
+                str = str.substr(pos + 1, str.size() - pos);
+
+            }
+            while (1);
+        }
+
         void deleteDirectory(const std::string& path)
         {
             _nfs.deleteDirectory(path.c_str());

+ 1 - 0
oxygine/src/oxygine/core/file.h

@@ -92,6 +92,7 @@ namespace oxygine
 
         /**Makes directory. Not recursive*/
         bool makeDirectory(const std::string& path);
+        void makeDirectories(const std::string& path);
 
         /**Deletes empty directory*/
         void deleteDirectory(const std::string& path);

+ 2 - 0
oxygine/src/oxygine/core/oxygine.cpp

@@ -793,7 +793,9 @@ namespace oxygine
         {
             log::messageln("core::release");
 
+#ifndef OXYGINE_EDITOR
             InputText::stopAnyInput();
+#endif
 
             _threadMessages.clear();
             _uiMessages.clear();