/// <summary> /// 指定ファイルのバインド /// </summary> /// <param name="_cpkName"></param> /// <param name="bindId"></param> /// <returns></returns> private IEnumerator BindCPK(string _cpkName, string _versionHashName) { uint bindId = 0; if (m_manager == null) { Debug.LogWarning("Cant Exec Coroutine"); yield break; } string path = CriPackageCacheController.GetOutputPath(_cpkName, _versionHashName); CriFsBinder binder = new CriFsBinder(); CriFsBindRequest request = CriFsUtility.BindCpk(binder, path); bindId = request.bindId; // 待機 yield return(request.WaitForDone(m_manager)); if (string.IsNullOrEmpty(request.error)) { // Succeeded // List に登録 BindDict.Add(_cpkName, new BinderData(bindId, binder)); } else { //Error Debug.LogWarning("Failed to bind CPK. (path=" + path + ")"); Debug.LogWarning("Error:" + request.error); } }
/// <summary> /// CPK のDownload~Bind までの処理 /// LoadFileの途中処理としての利用や、CueSheet取得用などに用いると思われ /// </summary> /// <param name="_cpkName"></param> /// <param name="_onComplete"></param> /// <returns></returns> private IEnumerator LoadCPK(string _cpkName, string _versionHashName, OnCompleteBind _onComplete) { /* * ------------------------------ * フロー * 1. Cache に無ければDownload -> Cache に保存 * 2. Cache にあるCPKファイルをBind * ------------------------------ */ // Cache上に無い if (!CriPackageCacheController.IsCached(_cpkName, _versionHashName)) { // Download すべきか、サーバー上のファイルを直接バインドすべきかは要検討 yield return m_dlCtrl.DonwloadCPK(_cpkName, _versionHashName, null); //TODO: Retry 対応 } // Dictionary未登録であればCache 上にあるCPKファイルをバインド if (!BindDict.ContainsKey(_cpkName)) { yield return(BindCPK(_cpkName, _versionHashName)); } BinderData data = null; bool ret = BindDict.TryGetValue(_cpkName, out data); if (_onComplete != null) { // Load 成功したので参照しているはず if (ret && data != null) { data.SetReference(); } _onComplete.Invoke(ret, data); } }
//-------------------------------------------- // Public API //-------------------------------------------- #region ===== PUBLIC_API ===== /// <summary> /// Download 実行 /// </summary> /// <param name="_cpkName">CPK名</param> /// <param name="_versionHashName">CPKのHash値文字列</param> /// <param name="_onComplete">ダウンロード完了コールバック</param> /// <returns></returns> public IEnumerator DonwloadCPK(string _cpkName, string _versionHashName, OnCompleteDownload _onComplete) { string url = CriPackageUtility.GetPackegeURL(_cpkName); // 無効なURL if (string.IsNullOrEmpty(url)) { if (_onComplete != null) { _onComplete.Invoke(false); } yield break; } // Cache上に存在している if (CriPackageCacheController.IsCached(_cpkName, _versionHashName)) { if (_onComplete != null) { _onComplete.Invoke(true); } yield break; } CriFsWebInstaller installer = GetEmptyInstaller(); // 空くまで待機 while (installer == null) { installer = GetEmptyInstaller(); yield return(null); } string outputPath = CriPackageCacheController.GetOutputPath(_cpkName, _versionHashName); // Directory 生成 CriPackageCacheController.CreateAssetCacheDir(_cpkName); // 古いバージョンのキャッシュがあれば削除 CriPackageCacheController.DeleteTargetOtherVersionPackage(_cpkName, _versionHashName); // Download 開始 installer.Copy(url, outputPath); // 終了まで待機 CriFsWebInstaller.StatusInfo info = installer.GetStatusInfo(); while (info.status == CriFsWebInstaller.Status.Busy) { info = installer.GetStatusInfo(); yield return(null); } info = installer.GetStatusInfo(); switch (info.status) { case CriFsWebInstaller.Status.Error: { //エラーによる失敗 if (_onComplete != null) { _onComplete.Invoke(false); } } break; case CriFsWebInstaller.Status.Stop: { // 誰かに止められた if (_onComplete != null) { _onComplete.Invoke(false); } } break; case CriFsWebInstaller.Status.Complete: { // 成功 if (_onComplete != null) { _onComplete.Invoke(true); } } break; } }