Ejemplo n.º 1
0
        private Task OnRequestAssetBundleComplete(UnityWebRequest request, float startTime, string saveFileFullPath, HttpCallback callback, string matchMd5 = null)
        {
            Dictionary <string, object> dict = new Dictionary <string, object>();
            int respCode = (int)request.responseCode;

            dict.Add("status", respCode);

            bool succeed = !request.isHttpError && !request.isNetworkError;

            if (succeed)   //success and save assetBundle to disk.
            {
                float endTime = Time.realtimeSinceStartup;

                ulong size  = request.downloadedBytes;
                float speed = size / (endTime - startTime);
                dict.Add("size", size);
                dict.Add("speed", speed);

                string data = "";

                // get assetBundle bytes
                byte[] downloadBytes = request.downloadHandler.data;

                // compare md5
                if (matchMd5 != null && StringUtils.BytesToMD5(downloadBytes) != matchMd5)
                {
                    data = string.Format("{{\"code\":5,\"message\":\"{0}\"}}", "assetBundle md5 not match");
                    dict.Add("data", data);
                }
                else
                {
                    data = "ok";
                    dict.Add("data", data);

                    AssetBundle assetBundle = AssetBundle.LoadFromMemory(downloadBytes);
                    dict.Add("assetBundle", assetBundle);

                    // save assetBundle to disk.
                    Task threadTask = new Task((bytes) =>
                    {
                        SaveFile(saveFileFullPath, (byte[])bytes);
                    }, downloadBytes);

                    lock ( _ioTaskList )
                    {
                        IOTask newTask = new IOTask();
                        newTask.threadTask = threadTask;
                        newTask.callback   = (status) =>
                        {
                            if (status != IOTask.RESULT_SUCCESS)
                            {
                                StringBuilder sb = new StringBuilder();
                                foreach (var ex in threadTask.Exception.InnerExceptions)
                                {
                                    sb.Append(ex.Message);
                                    sb.Append("\n");
                                }
                                Debug.LogError(sb.ToString());
                            }
                        };

                        _ioTaskList.Add(newTask);
                    }

                    // no need to wait after assetBundle is saved to disk.
                    callback(dict);

                    DisposeWebRequesat(request);

                    return(threadTask);
                }
            }
            else
            {
                if (request.error != null)
                {
                    dict.Add("data", request.error);
                }
                else
                {
                    dict.Add("data", "request error, respCode: " + respCode.ToString());
                }
            }

            callback(dict);

            DisposeWebRequesat(request);

            return(null);
        }
Ejemplo n.º 2
0
        public void UploadFile(string url, string fullFilePath, bool needUnZip, int timeout, HttpCallback callback)
        {
            if (!File.Exists(fullFilePath))
            {
                Dictionary <string, object> dict = new Dictionary <string, object>();
                dict.Add("data", "file not exists !");
                dict.Add("status", IO_RESULT_FAIL);
                callback(dict);
                return;
            }

            byte[] fileData = null;

            //read file data
            Task threadTask = new Task(() =>
            {
                using (FileStream fileStream = new FileStream(fullFilePath, FileMode.Open))
                {
                    int dataLen = (int)fileStream.Length;
                    if (dataLen > 0)
                    {
                        fileData = new byte[dataLen];
                        fileStream.Read(fileData, 0, dataLen);
                    }
                }
            });

            //add to io task queue
            lock ( _ioTaskList )
            {
                IOTask newTask = new IOTask();
                newTask.threadTask = threadTask;
                newTask.callback   = (status) =>
                {
                    if (status == IOTask.RESULT_SUCCESS)
                    {
                        if (fileData == null)
                        {
                            Dictionary <string, object> dict = new Dictionary <string, object>();
                            dict.Add("data", "file data is empty!");
                            dict.Add("status", IO_RESULT_FAIL);
                            callback(dict);
                        }
                        else
                        {
                            UnityWebRequest request = UnityWebRequest.Put(url, fileData);
                            if (timeout > 0)
                            {
                                request.timeout = timeout;
                            }
                            AddRequestTask(request, url, "", needUnZip, callback);
                        }
                    }
                    else
                    {
                        StringBuilder sb = new StringBuilder();
                        foreach (var ex in threadTask.Exception.InnerExceptions)
                        {
                            sb.Append(ex.Message);
                            sb.Append("\n");
                        }

                        string data = string.Format("{{\"code\":0,\"message\":\"read error:{0}\"}}", sb.ToString());

                        Dictionary <string, object> dict = new Dictionary <string, object>();
                        dict.Add("data", data);
                        dict.Add("status", IO_RESULT_FAIL);

                        callback(dict);
                    }
                };

                _ioTaskList.Add(newTask);
            }
        }
Ejemplo n.º 3
0
        private Task OnRequestComplete(UnityWebRequest request, float startTime, bool needUnZip, string saveFileFullPath, HttpCallback callback, string matchMd5 = null)
        {
            Dictionary <string, object> dict = new Dictionary <string, object>();
            int respCode = (int)request.responseCode;

            dict.Add("status", respCode);

            bool succeed = !request.isHttpError && !request.isNetworkError;

            if (succeed)
            {
                float endTime = Time.realtimeSinceStartup;

                ulong size  = request.downloadedBytes;
                float speed = size / (endTime - startTime);

                dict.Add("size", size);
                dict.Add("speed", speed);

                string data = "";

                if (needUnZip)
                {
                    int ret = TryGetHttpData(request.downloadHandler.data, out data, true);
                    if (ret != IO_RESULT_SUCCESS)
                    {
                        data = "{\"code\":0,\"data\":\"data unzip fail\"}";
                    }
                }
                else
                {
                    // no need to save.
                    if (string.IsNullOrEmpty(saveFileFullPath))
                    {
                        data = request.downloadHandler.text;
                    }
                    else
                    {
                        byte[] downloadBytes = request.downloadHandler.data;

                        //compare md5
                        if (matchMd5 != null && StringUtils.BytesToMD5(downloadBytes) != matchMd5)
                        {
                            data = string.Format("{{\"code\":5,\"message\":\"{0}\"}}", "md5 not match");
                        }
                        else
                        {
                            Task threadTask = new Task((bytes) =>
                            {
                                SaveFile(saveFileFullPath, (byte[])bytes);
                            }, downloadBytes);

                            lock ( _ioTaskList )
                            {
                                IOTask newTask = new IOTask();
                                newTask.threadTask = threadTask;
                                newTask.callback   = (status) =>
                                {
                                    if (status == IOTask.RESULT_SUCCESS)
                                    {
                                        data = "ok";
                                        dict.Add("data", data);
                                    }
                                    else
                                    {
                                        StringBuilder sb = new StringBuilder();
                                        foreach (var ex in threadTask.Exception.InnerExceptions)
                                        {
                                            string s = ex.Message.Replace("\\", "\\\\");
                                            sb.Append(s.Replace("\"", "\\\""));
                                            sb.Append("\n");
                                        }
                                        data = string.Format("{{\"code\":0,\"message\":\"{0}\"}}", sb.ToString());
                                        Debug.LogError(data);

                                        dict.Add("data", data);
                                    }

                                    callback(dict);
                                };

                                _ioTaskList.Add(newTask);
                            }

                            DisposeWebRequesat(request);

                            return(threadTask);
                        }
                    }
                }

                dict.Add("data", data);
            }
            else
            {
                if (request.error != null)
                {
                    dict.Add("data", request.error);
                }
                else
                {
                    dict.Add("data", "request error, respCode:" + respCode.ToString());
                }
            }

            callback(dict);

            DisposeWebRequesat(request);

            return(null);
        }
Ejemplo n.º 4
0
        void Update()
        {
            if (_ioTaskList.Count > 0)
            {
                int  runningCount = 0;
                Task canRunTask   = null;

                //倒序删除
                for (int i = _ioTaskList.Count - 1; i >= 0; i--)
                {
                    IOTask ioTask = _ioTaskList[i];
                    if (ioTask.threadTask.IsCompleted)
                    {
                        _ioTaskList[i] = _ioTaskList[_ioTaskList.Count - 1];
                        _ioTaskList.RemoveAt(_ioTaskList.Count - 1);

                        if (ioTask.threadTask.Status == TaskStatus.RanToCompletion)
                        {
                            ioTask.callback(IOTask.RESULT_SUCCESS);
                        }
                        else
                        {
                            ioTask.callback(IOTask.RESULT_FAIL);
                        }

                        continue;
                    }

                    if (ioTask.threadTask.Status == TaskStatus.Created)
                    {
                        if (canRunTask == null)
                        {
                            canRunTask = ioTask.threadTask;
                        }
                        else
                        {
                            runningCount++;
                        }
                    }
                }

                if (canRunTask != null && runningCount < MaxIOTask)
                {
                    canRunTask.Start();
                }
            }

            //请求管理
            if (_httpRequestList.Count > 0)
            {
                RequestTask canRunRequest = null;
                int         runningCount  = 0;

                for (int i = _httpRequestList.Count - 1; i >= 0; i--)
                {
                    var requestTask = _httpRequestList[i];
                    if (requestTask.status == RequestTask.EStatus.Completed || requestTask.status == RequestTask.EStatus.Canceled)
                    {
                        _httpRequestList[i] = _httpRequestList[_httpRequestList.Count - 1];
                        _httpRequestList.RemoveAt(_httpRequestList.Count - 1);
                        continue;
                    }

                    if (requestTask.status == RequestTask.EStatus.Running)
                    {
                        if (requestTask.ioTask != null && requestTask.ioTask.IsCompleted)
                        {
                            requestTask.status = RequestTask.EStatus.Completed;
                        }
                        else
                        {
                            runningCount++;
                        }
                    }
                    else
                    {
                        if (canRunRequest == null)
                        {
                            canRunRequest = requestTask;
                        }
                    }
                }

                if (canRunRequest != null && runningCount < MaxRequestTask)
                {
                    canRunRequest.run(canRunRequest);
                }
            }
        }