Ejemplo n.º 1
0
        /// <summary>
        /// リクエスト作成
        /// </summary>
        public IAssetLoadOperater <T> Create <T>(string path) where T : UnityEngine.Object
        {
            var key = path;

            if (!Path.HasExtension(key))
            {
                //	拡張子の無いリクエストは警告を出す
                ChipstarLog.Log_WarningNotHasExtensions(key);
            }
            else
            {
                //	拡張子があったら削る
                key = path.Replace(Path.GetExtension(key), string.Empty);
            }
            var match = m_regex.Match(key);

            if (!match.Success)
            {
                return(new ResourcesLoadOperation <T>(key));
            }

            //	Resources以下を拾う
            var accessKey = match.Groups[2].Value;

            return(new ResourcesLoadOperation <T>(key));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 初期化
        /// </summary>
        public IEnumerator Initialize(RuntimePlatform platform, AssetBundleConfig config)
        {
            m_saveDirRoot = config.GetSaveStorage(platform);
            m_versionFile = config.GetSaveFile(platform);
            var path = m_versionFile.FullPath;

            ChipstarLog.Log_InitStorageDB(path);

            var isExist = File.Exists(path);

            if (!isExist)
            {
                //	なければ空データ
                BuildEmpty(m_versionFile);
                yield break;
            }
            try
            {
                // あったら読み込んで変換
                var table = m_builder.Read(path);
                m_runtimeTable = table.List
                                 .ToDictionary(
                    c => c.Identifier,
                    c => new CachedFileData(c, m_saveDirRoot)
                    );
            }
            catch (Exception e)
            {
                // 読み込み失敗したのでとりあえず空でつくりなおし
                ChipstarLog.Assert(e.Message);
                BuildEmpty(m_versionFile);
            }
            yield return(null);
        }
Ejemplo n.º 3
0
 protected override void DoDispose()
 {
     m_data?.ReleaseRef();
     ChipstarLog.Log_Dump_RefLog(m_data);
     m_data = null;
     base.DoDispose();
 }
Ejemplo n.º 4
0
 /// <summary>
 ///
 /// </summary>
 public void Create(IAssetManager manager, RuntimePlatform platform, IVersionManifest manifest, AssetBundleConfig config)
 {
     if (!(manifest?.IsValid ?? false))
     {
         ChipstarLog.Log_Database_NotFound();
         CreateResult = ChipstarResult.ClientError("BuildMap Get Error");
         return;
     }
     CreateResult = CreateImpl(manager, platform, manifest, config);
 }
Ejemplo n.º 5
0
        /// <summary>
        /// 保存
        /// </summary>
        public virtual void Apply()
        {
            var path  = m_versionFile.FullPath;
            var table = new TFileTable();

            table.Save(m_runtimeTable.Values);
            m_builder.Write(path, table);
            IsDirty = false;
            ChipstarLog.Log_ApplyLocalSaveFile(path);
        }
Ejemplo n.º 6
0
 /// <summary>
 /// クリーンアップ
 /// 保存先を空にする
 /// </summary>
 public void CleanUp()
 {
     ChipstarLog.Log_CleanupSaveDirectory(m_saveDirRoot);
     //	フォルダごと削除
     if (Directory.Exists(m_saveDirRoot.BasePath))
     {
         Directory.Delete(m_saveDirRoot.BasePath, true);
     }
     m_runtimeTable.Clear();
     IsDirty = true;
 }
Ejemplo n.º 7
0
        /// <summary>
        /// 保存バージョンを破棄
        /// </summary>
        private void RemoveVersion(ICachableBundle data)
        {
            IsDirty = true;
            ChipstarLog.Log_RemoveLocalVersion(data);
            var storageData = Get(data);

            if (storageData == null)
            {
                return;
            }
            m_runtimeTable.Remove(data.Identifier);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Manifest自体の取得
        /// </summary>
        public IEnumerator LoadWait(IManifestAccess manifest)
        {
            if (m_bundle)
            {
                m_bundle.Unload(true);
                m_bundle = null;
            }
            //	manifestのパス
            //	s3 : xxxx // server-version / fileName

            yield return(m_versionLoader.LoadWait( ));

            var version = m_versionLoader.Get();

            while (!m_cache.ready)
            {
                yield return(null);
            }
            var location = manifest.Uri;

            ChipstarLog.Log_RequestVersionManifest(location);

            // 保存先指定
            Caching.currentCacheForWriting = m_cache;
            //	アセットバンドルとしてDL/キャッシュ
            var www = UnityWebRequestAssetBundle.GetAssetBundle(location, version.Hash);

            www.SendWebRequest();
            // DL待ち
            while (!www.isDone)
            {
                yield return(null);

                if (www.isHttpError || www.isNetworkError)
                {
                    throw new Exception(www.error + "\n" + www.url);
                }
            }

            // Manifestの取得
            m_bundle = DownloadHandlerAssetBundle.GetContent(www);
            // 中身のLoad
            var loadMainfestAssets = m_bundle.LoadAllAssetsAsync();

            while (!loadMainfestAssets.isDone)
            {
                yield return(null);
            }
            // 結果の保持
            m_assets = loadMainfestAssets.allAssets;
            // Complete
            yield break;
        }
Ejemplo n.º 9
0
        /// <summary>
        /// ローカルDB取得
        /// </summary>
        public IEnumerator Setup(RuntimePlatform platform, IManifestLoader loader, SoundConfig config)
        {
            m_cacheDB = m_saveBuilder.Read(CacheDbLocation.FullPath);
            yield return(null);

            var manifest = loader.GetManifest(config.BuildMapName);

            m_builtinDatabase = config.BuildDatabase(platform);
            yield return(m_builtinDatabase.Build(platform, manifest));

            ChipstarLog.Log_ReadLocalTable(m_cacheDB, CacheDbLocation);
            yield break;
        }
Ejemplo n.º 10
0
        /// <summary>
        /// アセットバンドルの削除
        /// </summary>
        private void DeleteBundle(ICachableBundle data)
        {
            var location = GetSaveLocation(data);
            var path     = location.FullPath;

            if (!File.Exists(path))
            {
                //	存在しないなら削除しない
                return;
            }
            ChipstarLog.Log_DeleteLocalBundle(data);
            File.Delete(path);
        }
Ejemplo n.º 11
0
 private T Get <T>(string path, T afterLogin, T always) where T : ILoadOperateFactory
 {
     if (afterLogin.CanLoad(path))
     {
         if (!m_isLogin)
         {
             //	ログイン前なので警告を出力
             ChipstarLog.Log_WarningAccessAfterLoginAsset(path);
         }
         return(afterLogin);
     }
     return(always);
 }
Ejemplo n.º 12
0
        private IEnumerator Copy(IAccessLocation source, IAccessLocation dest)
        {
            ChipstarLog.Log_WriteLocalBundle(source, dest);
            if (File.Exists(dest.FullPath))
            {
                ChipstarLog.Log($"Exsists File::{dest}");
                yield break;
            }
            var www     = UnityWebRequest.Get(source.FullPath);
            var handler = new DownloadHandlerFile(dest.FullPath);

            www.downloadHandler = handler;
            yield return(www.SendWebRequest());
        }
Ejemplo n.º 13
0
 /// <summary>
 /// 破棄
 /// </summary>
 public void Unload()
 {
     if (!IsFree)
     {
         ChipstarLog.Log_Unload_Error(this);
         return;
     }
     if (Bundle)
     {
         ChipstarLog.Log_Unload_Bundle(this);
         Bundle.Unload(true);
     }
     Bundle     = null;
     IsOnMemory = false;
 }
Ejemplo n.º 14
0
 /// <summary>
 /// 未使用のモノを破棄
 /// </summary>
 public IEnumerator UnloadUnusedAssets()
 {
     //	参照の無いやつを取得
     GetFreeBudleList(ref m_bufferList);
     using (var scope = StopWatchScope.Create("UnloadProvider.[UnusedBudle.Unload]"))
     {
         //	解放
         foreach (var bundle in m_bufferList)
         {
             bundle.Unload();
         }
     }
     ChipstarLog.Log_DisposeUnused(m_bufferList);
     yield return(CallGC());
 }
Ejemplo n.º 15
0
        public bool IsBreakFile(ICachableBundle bundleData)
        {
            var data = Get(bundleData);

            if (data == null)
            {
                // まだ持ってない
                return(false);
            }
            var isBreak = data.IsBreak(bundleData);

            if (isBreak)
            {
                ChipstarLog.Log_MaybeFileBreak(data.FileInfo, bundleData.PreviewSize);
            }
            return(isBreak);
        }
Ejemplo n.º 16
0
 /// <summary>
 /// ラベル指定Unload
 /// </summary>
 public IEnumerator UnloadUnusedAssets(string[] labels)
 {
     //	参照の無いやつを取得
     GetFreeBudleList(ref m_bufferList);
     foreach (var label in labels)
     {
         // 一致するラベル以外を削除
         m_bufferList.RemoveAll(c => !c.Labels.Contains(label));
     }
     //	解放
     foreach (var bundle in m_bufferList)
     {
         bundle.Unload();
     }
     ChipstarLog.Log_DisposeUnused(m_bufferList);
     yield return(null);
 }
Ejemplo n.º 17
0
        /// <summary>
        /// ロード処理
        /// </summary>
        public ILoadProcess LoadFile(string identifier)
        {
            var data = LoadDatabase.GetBundleData(identifier);

            if (data == null)
            {
                OnError(ChipstarResult.ClientError($"Target Bundle Data is Not Found. == {identifier}"));
                return(SkipLoadProcess.Create(identifier));
            }
            if (data.IsOnMemory)
            {
                //	ロードしてあるならしない
                ChipstarLog.Log_Skip_OnMemory(data.Identifier);
                return(SkipLoadProcess.Create(identifier));
            }
            //	ローカルファイルを開く
            return(CreateLocalFileOpenJob(data));
        }
Ejemplo n.º 18
0
        /// <summary>
        /// バージョンの保存
        /// </summary>
        private void SaveVersion(ICachableBundle data)
        {
            IsDirty = true;
            ChipstarLog.Log_SaveLocalVersion(data);
            //  ストレージにあるかどうか
            var storageData = Get(data);

            if (storageData != null)
            {
                // 情報変更
                storageData.DeleteFile();
                storageData.Update(data, m_saveDirRoot);
                return;
            }
            // 追加
            m_runtimeTable[data.Identifier] = new CachedFileData(
                new LocalBundleData(data.Identifier, data.Path, data.Hash, data.Crc),
                m_saveDirRoot
                );
        }
Ejemplo n.º 19
0
        private ILoadProcess PrepareImpl(string key)
        {
            var database = GetUseDatabase(key);
            //	あったら落とす
            var fileData = database.Find(key);

            if (fileData == null)
            {
                //CriUtils.Warning( "Movie File Key Not Found : {0}", key );
                return(SkipLoadProcess.Create(key));
            }
            if (HasUsm(fileData))
            {
                ChipstarLog.Log($"Cached :: {fileData.Identifier}");
                return(SkipLoadProcess.Create(key));
            }
            //	Usmファイルを落とす
            var url = database.GetServerLocation(fileData);

            return(Download(url, fileData));
        }
Ejemplo n.º 20
0
        //==================================
        //	関数
        //==================================

        /// <summary>
        /// ローカルのファイルを取得
        /// </summary>
        public static CriVersionTableJson ReadLocal(string path, Encoding encoding)
        {
            var isExist = File.Exists(path);

            if (!isExist)
            {
                //なければ空データ
                return(new CriVersionTableJson());
            }
            try
            {
                var contents = File.ReadAllText(path, encoding);
                return(JsonUtility.FromJson <CriVersionTableJson>(contents));
            }
            catch (Exception e)
            {
                // 失敗したらとりあえず空でやり直し
                ChipstarLog.Assert(e.Message);
                return(new CriVersionTableJson());
            }
        }
Ejemplo n.º 21
0
        /// <summary>
        /// キャッシュ保持
        /// </summary>
        public bool HasStorage(ICachableBundle bundleData)
        {
            var data = Get(bundleData);

            if (data == null)
            {
                return(false);
            }
            // 破損チェック / 一旦サイズチェックだけ
            if (IsBreakFile(bundleData))
            {
                return(false);
            }
            // バージョン不一致
            if (!data.IsMatchVersion(bundleData))
            {
                ChipstarLog.Log_MissMatchVersion(bundleData.Path, data.ToString(), bundleData.Hash.ToString());
                return(false);
            }
            //
            return(true);
        }
Ejemplo n.º 22
0
        private ILoadProcess DownloadImpl(ISoundLoadDatabase database, string cueSheetName)
        {
            var fileData = database.Find(cueSheetName);

            if (fileData == null)
            {
                ChipstarLog.Log_RequestCueSheet_Error(cueSheetName);
                return(SkipLoadProcess.Create(cueSheetName));
            }
            ChipstarLog.Log_Download_Sound(fileData);
            ILoadProcess acbJob = SkipLoadProcess.Create(cueSheetName);

            var(acbUrl, awbUrl) = database.GetServerLocation(fileData);
            if (!HasAcb(fileData))
            {
                acbJob = Download(acbUrl, fileData.Acb);
            }
            else
            {
                ChipstarLog.Log($"Cached :: {fileData.Acb.Identifier}");
            }
            if (!fileData.HasAwb())
            {
                //	Awbファイルがないならココまで
                return(acbJob);
            }
            ILoadProcess awbJob = SkipLoadProcess.Create(cueSheetName);

            if (!HasAwb(fileData))
            {
                awbJob = Download(awbUrl, fileData.Awb);
            }
            else
            {
                ChipstarLog.Log($"Cached :: {fileData.Awb.Identifier}");
            }
            return(acbJob.ToJoin(awbJob));
        }
Ejemplo n.º 23
0
        /// <summary>
        /// ダウンロード処理
        /// </summary>
        public ILoadProcess CacheOrDownload(string identifier)
        {
            var data = LoadDatabase.GetBundleData(identifier);

            if (data == null)
            {
                OnError(ChipstarResult.ClientError($"Target Bundle Data is Not Found. == {identifier}"));
                return(SkipLoadProcess.Create(identifier));
            }
            if (data.IsOnMemory)
            {
                //	ロード済みは無視
                ChipstarLog.Log_Skip_OnMemory(data.Identifier);
                return(SkipLoadProcess.Create(data.Identifier));
            }
            if (StorageDatabase.HasStorage(data))
            {
                //	キャッシュ済は無視
                ChipstarLog.Log_Cached(data);
                return(SkipLoadProcess.Create(data.Identifier));
            }
            return(CreateDowloadJob(data.Url, data));
        }
Ejemplo n.º 24
0
        private bool HasFileImpl(ISoundLoadDatabase database, string cueSheetName)
        {
            if (database == null)
            {
                return(false);
            }
            if (!database.Contains(cueSheetName))
            {
                ChipstarLog.Log_NotContains_RemoteDB_Sound(cueSheetName);
                return(false);
            }

            // サウンドデータ
            var data = database.Find(cueSheetName);

            // --- acb-check

            if (!HasAcb(data))
            {
                return(false);
            }

            if (!data.HasAwb())
            {
                //	Awb無いならここまででいい
                return(true);
            }

            // --- awb-check
            //
            if (!HasAwb(data))
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 25
0
        private ResultCode CreateImpl(IAssetManager manager, RuntimePlatform platform, IVersionManifest manifest, AssetBundleConfig config)
        {
            var table = m_parser.Parse(manifest.RawData);

            ChipstarLog.Log_GetBuildMap <TTable, TBundle, TAsset>(table);
            if (table == null)
            {
                return(ChipstarResult.ClientError("Json Parse Error"));
            }
            //  アセットの一覧
            foreach (var asset in table.AssetList)
            {
                var d = new AssetData(asset);
                m_assetsTable.Add(d.Path, d);
            }

            //  バンドルの一覧
            foreach (var bundle in table.BundleList)
            {
                var runtime = m_bundleDataCreater.Create(manager, bundle, platform, config);
                m_bundleTable.Add(bundle.Identifier, runtime);
            }
            //  依存関係とアセットデータを接続
            foreach (var bundle in table.BundleList)
            {
                var runtime      = m_bundleTable[bundle.Identifier];
                var dependencies = CreateDependencies(bundle);
                var assets       = CreateAssets(bundle);
                foreach (var asset in assets)
                {
                    asset.Connect(runtime);
                }
                runtime.Set(dependencies);
            }
            return(ChipstarResult.Success);
        }
Ejemplo n.º 26
0
 /// <summary>
 /// 実行
 /// </summary>
 protected override void DoRun()
 {
     m_request = m_data?.LoadAsync <T>();
     ChipstarLog.AssertNotNull(m_request, $"Bundle Rquest is Null ::{m_data?.Path ?? string.Empty}");
 }
Ejemplo n.º 27
0
        /// <summary>
        /// 更新
        /// </summary>
        public void Update()
        {
            // 更新処理
            var existsNullRun = false;

            for (int i = 0; i < m_runList.Count; i++)
            {
                var r = m_runList[i];
                if (r == null)
                {
                    existsNullRun = true;
                    continue;
                }

                if (r.IsRunning == false)
                {
                    r.Run();
                }

                r.Update();

                if (r.IsDisposed)
                {
                    m_disposedList.Add(r);
                }
                else if (r.IsCompleted)
                {
                    m_completeList.Add(r);
                }
            }

            if (existsNullRun)
            {
                ChipstarLog.Warning("OperationRoutine.Update() exists null-run.");
                m_runList.RemoveAll(n => n == null);
            }

            if (m_completeList.Count > 0)
            {
                for (int i = 0; i < m_completeList.Count; i++)
                {
                    var c = m_completeList[i];
                    if (c.IsDisposed)
                    {
                        m_disposedList.Add(c);
                        continue;
                    }
                    c.Complete();
                }
                m_completeList.Clear();
            }

            if (m_disposedList.Count > 0)
            {
                for (int i = 0; i < m_disposedList.Count; i++)
                {
                    m_disposedList[i].Dispose();
                }
                m_runList.RemoveAll(r => m_disposedList.Contains(r));
                m_disposedList.Clear();
            }
        }
Ejemplo n.º 28
0
 /// <summary>
 /// 初期化処理
 /// </summary>
 public void Init( )
 {
     ChipstarLog.Log_Downloader_StartInit();
     LoadDatabase.Clear();
 }
Ejemplo n.º 29
0
 /// <summary>
 /// 追加
 /// </summary>
 public virtual void Enqueue(ILoadJob job)
 {
     ChipstarLog.Log_AddJob(job);
     m_queue.Enqueue(job);
 }
Ejemplo n.º 30
0
 private void BuildEmpty(IAccessLocation location)
 {
     m_runtimeTable = new Dictionary <string, CachedFileData>();
     ChipstarLog.Log_InitStorageDB_FirstCreate(location);
 }