dmuratshin 8 years ago
parent
commit
b0f7abab14

+ 15 - 10
oxygine/src/HttpRequestTask.cpp

@@ -36,6 +36,8 @@ namespace oxygine
     HttpRequestTask::HttpRequestTask() : _loaded(0),
         _cacheEnabled(true),
         _continueDownload(false),
+        _expectedContentSize(0),
+        _receivedContentSize(0),
         _fhandle(0),
         _responseCodeChecker(_defaultChecker200)
     {
@@ -115,9 +117,15 @@ namespace oxygine
 
     void HttpRequestTask::_prerun()
     {
+        _receivedContentSize = 0;
+        _expectedContentSize = 0;
         _responseCode = 0;
         _loaded = 0;
         _response.clear();
+        if (_fhandle)
+            file::close(_fhandle);
+        _fhandle = 0;
+        
         if (!_fname.empty())
         {
 			const char *mode = _continueDownload ? "ab" : "wb";
@@ -132,6 +140,7 @@ namespace oxygine
 				char str[255];
 				safe_sprintf(str, "bytes=%d-", size);
 				addHeader("Range", str);
+                _receivedContentSize = size;
 			}
         }
     }
@@ -169,16 +178,10 @@ namespace oxygine
 
     void HttpRequestTask::_dispatchComplete()
     {
-        if (_responseCodeChecker(_responseCode))
-        {
-            Event ev(COMPLETE);
-            dispatchEvent(&ev);
-        }
-        else
-        {
-            Event ev(ERROR);
-            dispatchEvent(&ev);
-        }
+        bool ok = _responseCodeChecker(_responseCode);
+        
+        Event ev(ok ? COMPLETE : ERROR);
+        dispatchEvent(&ev);
     }
 
 	void HttpRequestTask::_finalize(bool error)
@@ -203,6 +206,8 @@ namespace oxygine
 			const char *p = (const char*)data;
 			_response.insert(_response.end(), p, p + size);
 		}
+        _receivedContentSize += size;
+        progress(_receivedContentSize, _expectedContentSize);
 	}
 
 }

+ 2 - 0
oxygine/src/HttpRequestTask.h

@@ -92,6 +92,8 @@ namespace oxygine
         responseCodeChecker _responseCodeChecker;
 
         int _responseCode;
+        size_t _expectedContentSize;
+        size_t _receivedContentSize;
 
 		bool _continueDownload;
 

+ 1 - 1
oxygine/src/core/ios/HttpRequestCocoaTask.h

@@ -19,7 +19,7 @@ namespace oxygine
         void write(NSData* data);
         void complete_(bool error);
         void progress_(int loaded, int total);
-        void gotResponse(int resp);
+        void gotResponse(int resp, size_t expectedSize);
 
     protected:
         void _run();

+ 12 - 4
oxygine/src/core/ios/HttpRequestCocoaTask.mm

@@ -76,14 +76,18 @@ didReceiveResponse:(NSURLResponse *)response
     if ([response isKindOfClass:[NSHTTPURLResponse class]])
     {
         NSHTTPURLResponse *httpResponse = ((NSHTTPURLResponse *)response);
+        
+        long long size = [httpResponse expectedContentLength];
+        
         int resp = (int)httpResponse.statusCode;
         
         oxygine::HttpRequestCocoaTask* task = [self getTask:dataTask remove:false];
         if (task)
         {
-            task->gotResponse(resp);
+            task->gotResponse(resp, size);
             bool ok = task->getResponseCodeChecker()(resp);
             completionHandler(ok ? NSURLSessionResponseAllow : NSURLSessionResponseCancel);
+            return;
         }
     }
 
@@ -174,8 +178,8 @@ namespace oxygine
         const void *ptr = [data bytes];
         unsigned int len = [data length];
         HttpRequestTask::write(ptr, len);
-        
     }
+    
     void HttpRequestCocoaTask::complete_(bool error)
     {
         if (error)
@@ -186,10 +190,14 @@ namespace oxygine
         releaseRef();
     }
     
-    void HttpRequestCocoaTask::gotResponse(int resp)
+    void HttpRequestCocoaTask::gotResponse(int resp, size_t expectedSize)
     {
         _responseCode = resp;
         
+        _expectedContentSize = _receivedContentSize + expectedSize;
+        
+        progress(_receivedContentSize, _expectedContentSize);
+        
     }
     
     void HttpRequestCocoaTask::_run()
@@ -211,7 +219,7 @@ namespace oxygine
             NSString *key = [NSString stringWithUTF8String:h.first.c_str()];
             NSString *value = [NSString stringWithUTF8String:h.second.c_str()];
             
-            [request setValue:key forHTTPHeaderField:value];
+            [request setValue:value forHTTPHeaderField:key];
         }
         
         if (!_postData.empty())