Example #1
0
        public NameCrcData(string urlOrNcKey, LocalCacheEntry.CacheType cacheType = LocalCacheEntry.CacheType.Raw)
        {
            Init();

            string name, crc;

            name = crc = string.Empty;
            if (IsUrlOrNcKey(urlOrNcKey, ref name, ref crc))
            {
                // url
                if (string.IsNullOrEmpty(name))
                {
                    _nameCrc = new NameCrc();
                    _nameCrc.SetData(urlOrNcKey, true);
                }
                else // ncKey
                {
                    _nameCrc = new NameCrc(name, crc);
                }
            }
            else
            {
                Debug.LogError("urlOrNcKey is not url or namecrcKey");
            }
            _cacheType = cacheType;
        }
Example #2
0
        public NameCrcData(string name, byte[] data)
        {
            Init();
            _request.SetData(data);

            _cacheType = LocalCacheEntry.CacheType.Raw;
            var crc = Crc32.CountCrc(data);

            _nameCrc = new NameCrc(name, crc.ToString());
        }
Example #3
0
    /// <summary>
    /// 带本地缓存的http文件获取
    /// 本地版本实际上是同步,网络版本是异步
    /// </summary>
    /// ABurl = "http://uploads.pek3a.qingstor.com/v1/1470969096712.zip";
    /// imgUrl = "http://uploads.pek3a.qingstor.com/v1/zhoukou626";
    public void GetFile(string url, LocalCacheEntry.CacheType type, OnHttpGetFileResponse callback)
    {
        var local = URLToLocalPath(url);

        if (File.Exists(local))
        {
            var fakeResp = new HttpResp();
            fakeResp.Error   = HttpResp.ErrorType.None;
            fakeResp.WwwText = "";

            switch (type)
            {
            case LocalCacheEntry.CacheType.Texture:
                var tex      = new Texture2D(2, 2);
                var imgBytes = File.ReadAllBytes(local);
                tex.LoadImage(imgBytes);

                callback(fakeResp, new LocalCacheEntry()
                {
                    Type    = LocalCacheEntry.CacheType.Texture,
                    Texture = tex
                });
                break;

            case LocalCacheEntry.CacheType.Fbx:
                callback(fakeResp, new LocalCacheEntry()
                {
                    Type    = LocalCacheEntry.CacheType.Fbx,
                    FbxPath = local
                });
                break;

            case LocalCacheEntry.CacheType.AssetBundle:
                var ab = AssetBundle.LoadFromFile(local);
                if (null == ab)
                {
                    return;
                }
                callback(fakeResp, new LocalCacheEntry()
                {
                    Type = LocalCacheEntry.CacheType.AssetBundle,
                    AB   = ab
                });

                break;

            case LocalCacheEntry.CacheType.Raw:
                var bytes = File.ReadAllBytes(local);

                callback(fakeResp, new LocalCacheEntry()
                {
                    Type  = LocalCacheEntry.CacheType.Raw,
                    Bytes = bytes
                });

                break;

            default:
                break;
            }
        }
        else
        {
            switch (type)
            {
            case LocalCacheEntry.CacheType.Texture:
                //unity www的设计是:new出来的瞬间,请求就立即发起了
                //由于排队的需求,只能推迟new的时机
                // Dosend:只是检测www的执行状况
                var www = new WWW(url);
                StartCoroutine(DoSend(www, (WWW w) =>
                {
                    var resp = GenerateGetfileResp(w);

                    if (resp.Error != HttpResp.ErrorType.None)
                    {
                        callback(resp, null);
                    }
                    else
                    {
                        File.WriteAllBytes(URLToLocalPath(url), w.bytes);

                        callback(resp, new LocalCacheEntry()
                        {
                            Type    = LocalCacheEntry.CacheType.Texture,
                            Texture = w.texture
                        });
                    }
                }));
                break;

            case LocalCacheEntry.CacheType.Fbx:
                var www2 = new WWW(url);
                StartCoroutine(DoSend(www2, (WWW w) =>
                {
                    var resp = GenerateGetfileResp(w);

                    if (resp.Error != HttpResp.ErrorType.None)
                    {
                        callback(resp, null);
                    }
                    else
                    {
                        var newLocal = URLToLocalPath(url);
                        File.WriteAllBytes(newLocal, w.bytes);

                        callback(resp, new LocalCacheEntry()
                        {
                            Type    = LocalCacheEntry.CacheType.Fbx,
                            FbxPath = newLocal
                        });
                    }
                }));
                break;

            case LocalCacheEntry.CacheType.AssetBundle:
                var www3 = new WWW(url);
                StartCoroutine(DoSend(www3, (WWW w) =>
                {
                    var resp = GenerateGetfileResp(w);

                    if (resp.Error != HttpResp.ErrorType.None)
                    {
                        callback(resp, null);
                    }
                    else
                    {
                        var ab = w.assetBundle;
                        File.WriteAllBytes(URLToLocalPath(url), w.bytes);

                        callback(resp, new LocalCacheEntry()
                        {
                            Type = LocalCacheEntry.CacheType.AssetBundle,
                            AB   = ab
                        });
                    }
                }));
                break;

            case LocalCacheEntry.CacheType.Raw:
                var www4 = new WWW(url);
                StartCoroutine(DoSend(www4, (WWW w) =>
                {
                    var resp = GenerateGetfileResp(w);

                    if (resp.Error != HttpResp.ErrorType.None)
                    {
                        callback(resp, null);
                    }
                    else
                    {
                        var data = w.bytes;
                        File.WriteAllBytes(URLToLocalPath(url), data);

                        callback(resp, new LocalCacheEntry()
                        {
                            Type  = LocalCacheEntry.CacheType.Raw,
                            Bytes = data
                        });
                    }
                }));
                break;

            default:
                break;
            }
        }
    }
Example #4
0
 public NameCrcData(string name, string crc, LocalCacheEntry.CacheType cacheType = LocalCacheEntry.CacheType.Raw)
 {
     Init();
     _nameCrc   = new NameCrc(name, crc);
     _cacheType = cacheType;
 }
Example #5
0
        //Texture2D _dataTexture2D;
        //AssetBundle _dataAB;

        public NameCrcData()
        {
            Init();
            _cacheType = LocalCacheEntry.CacheType.Raw;
            _nameCrc   = new NameCrc();
        }
Example #6
0
        /// <summary>
        /// 带本地缓存的http文件获取
        /// 本地版本实际上是同步,网络版本是异步</summary>
        /// <param name="url"></param>
        /// <param name="type"></param>
        /// <param name="callback"></param>
        /// <param name="fromQY">是否是从青云服务器上下载,区别于:百度API获取街景</param>
        public void GetFile(string url, LocalCacheEntry.CacheType type, OnHttpGetFileResponse callback, bool fromQY = true)
        {
            if (string.IsNullOrEmpty(url))
            {
                throw new ArgumentNullException("Attempt to getfile from an empty URL");
            }

            // 文件缓存之后的文件名
            var local = URLToLocalPath(url);

            InfoTips.LogInfo("[GetFile] related local path:" + local);

            // 缓存中已经存在
            if (File.Exists(local))
            {
                InfoTips.LogInfo("[GetFile] load from local");

                var fakeResp = new HttpResp();
                fakeResp.Error   = HttpResp.ErrorType.None;
                fakeResp.WwwText = "";

                switch (type)
                {
                case LocalCacheEntry.CacheType.Texture:
                    var tex      = new Texture2D(2, 2);
                    var imgBytes = File.ReadAllBytes(local);
                    tex.LoadImage(imgBytes);

                    callback(fakeResp, new LocalCacheEntry()
                    {
                        Type    = LocalCacheEntry.CacheType.Texture,
                        Texture = tex
                    });
                    break;

                case LocalCacheEntry.CacheType.Fbx:
                    callback(fakeResp, new LocalCacheEntry()
                    {
                        Type    = LocalCacheEntry.CacheType.Fbx,
                        FbxPath = local
                    });
                    break;

                case LocalCacheEntry.CacheType.AssetBundle:
                    var ab = AssetBundle.LoadFromFile(local);

                    callback(fakeResp, new LocalCacheEntry()
                    {
                        Type = LocalCacheEntry.CacheType.AssetBundle,
                        AB   = ab
                    });
                    break;

                case LocalCacheEntry.CacheType.Raw:
                    var bytes = File.ReadAllBytes(local);

                    callback(fakeResp, new LocalCacheEntry()
                    {
                        Type  = LocalCacheEntry.CacheType.Raw,
                        Bytes = bytes
                    });

                    break;

                default:
                    break;
                }
            }
            else
            {
                InfoTips.LogInfo("[GetFile] load from remote");

                string realUrl;
                NameValueCollection query;

                if (fromQY)
                {
                    realUrl = GetHttpPrefix() + "entities/download";
                    query   = new NameValueCollection()
                    {
                        { "path", url }
                    };
                }
                else
                {
                    realUrl = url;
                    query   = null;
                }

                GetRaw(realUrl, query, www =>
                {
                    var resp = GenerateGetfileResp(www);

                    if (resp.Error != HttpResp.ErrorType.None)
                    {
                        callback(resp, null);
                    }
                    else
                    {
                        //write cache
                        //TODO: more scientific way: async
                        var localPath = URLToLocalPath(url);

                        if (localPath.Length > 250)
                        {
                            throw new IOException("localpath length overflowwww!!!");
                        }

                        File.WriteAllBytes(localPath, www.bytes);

                        switch (type)
                        {
                        case LocalCacheEntry.CacheType.Texture:
                            callback(resp, new LocalCacheEntry()
                            {
                                Type    = LocalCacheEntry.CacheType.Texture,
                                Texture = www.texture
                            });
                            break;

                        case LocalCacheEntry.CacheType.Fbx:
                            callback(resp, new LocalCacheEntry()
                            {
                                Type    = LocalCacheEntry.CacheType.Fbx,
                                FbxPath = localPath
                            });
                            break;

                        case LocalCacheEntry.CacheType.AssetBundle:
                            callback(resp, new LocalCacheEntry()
                            {
                                Type = LocalCacheEntry.CacheType.AssetBundle,
                                AB   = www.assetBundle
                            });
                            break;

                        case LocalCacheEntry.CacheType.Raw:
                            callback(resp, new LocalCacheEntry()
                            {
                                Type  = LocalCacheEntry.CacheType.Raw,
                                Bytes = www.bytes
                            });
                            break;

                        default:
                            break;
                        }
                    }
                });
            }
        }