/// <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);
            }
        }
Ejemplo n.º 3
0
        //--------------------------------------------
        // 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;
            }
        }