// Token: 0x0600512D RID: 20781 RVA: 0x001BB4F8 File Offset: 0x001B98F8 private IEnumerator DownloadAndLoadLocalPluginCoroutine(AssetBundleDownload download) { if (!string.IsNullOrEmpty(download.pluginUrl)) { WWW www = new WWW(download.pluginUrl); www.threadPriority = UnityEngine.ThreadPriority.Normal; while (!www.isDone) { yield return(null); } if (string.IsNullOrEmpty(www.error)) { if (this.CheckForCancellation(download)) { yield break; } try { PluginManager.Instance.Load(download.pluginUrl, www.bytes); } catch (Exception ex) { download.OnPluginLoadError(ex.Message); } } else { Debug.LogError("Error loading plugin from " + download.pluginUrl + ": " + www.error); download.OnDownloadError("Error loading plugin from " + download.pluginUrl + ": " + www.error, LoadErrorReason.PluginLoadFailed); } } yield break; }
// Token: 0x06005125 RID: 20773 RVA: 0x001BB024 File Offset: 0x001B9424 private void RetryRequestRemoteAssetBundle(AssetBundleDownload download) { download.currentState = AssetBundleDownload.State.Error; if (false && download.retryCount < 3) { VRC.Core.Logger.Log("[" + download.downloadId + "] RETRYING DOWNLOAD", DebugLevel.AssetBundleDownloadManager); this.mAssetBundleDownloads.Remove(download.assetUrl); download.retryCount++; base.StartCoroutine(this.DownloadAndUnpackAssetBundleCoroutine(download)); } else { VRC.Core.Logger.Log("[" + download.downloadId + "] REACHED MAX RETRY COUNT!!", DebugLevel.AssetBundleDownloadManager); download.OnDownloadError("[" + download.downloadId + "] Invalid assetbundle url", LoadErrorReason.InvalidURL); } }
// Token: 0x06005120 RID: 20768 RVA: 0x001BAED8 File Offset: 0x001B92D8 private void Unpack(AssetBundleDownload download) { try { base.StartCoroutine(this.UnpackAssetBundleCoroutine(download)); } catch (Exception ex) { VRC.Core.Logger.LogWarning(string.Concat(new object[] { "[", download.downloadId, "] Error unpacking ab - ", ex.Message }), DebugLevel.AssetBundleDownloadManager); download.OnDownloadError(ex.Message, LoadErrorReason.Unknown); } }
// Token: 0x06005139 RID: 20793 RVA: 0x001BB674 File Offset: 0x001B9A74 private bool CheckForCancellation(AssetBundleDownload download) { if (download == null) { return(false); } if (download.isCancelled) { download.Unload(); this.mAssetBundleDownloads.Remove(download.assetUrl); if (download.currentState != AssetBundleDownload.State.Error && download.currentState != AssetBundleDownload.State.Done) { download.OnDownloadError("Download cancelled!", LoadErrorReason.Cancelled); } return(true); } return(false); }
// Token: 0x06005130 RID: 20784 RVA: 0x001BB564 File Offset: 0x001B9964 private IEnumerator RequestRemoteAssetBundleCoroutine(AssetBundleDownload download) { bool error = false; HTTPRequest request = null; try { request = new HTTPRequest(new Uri(download.assetUrl), null); request.OnProgress = new OnDownloadProgressDelegate(download.OnDownloadProgress); request.Timeout = TimeSpan.FromDays(10.0); if (download.forceRefreshCache) { HTTPCacheService.DeleteEntity(request.CurrentUri, true); } request.Send(); if (Player.Instance != null && Player.Instance.isInternal) { Debug.Log(string.Concat(new object[] { "[", download.downloadId, "] Sending request : ", Json.Encode(request) })); } download.currentState = AssetBundleDownload.State.HttpRequestSent; } catch (Exception) { error = true; } if (error) { string message = (request == null) ? "Bad request url." : request.Exception.Message; download.OnDownloadError(message, LoadErrorReason.InvalidURL); } else { yield return(base.StartCoroutine(request)); this.OnHttpAssetBundleRequestCompleted(request, request.Response); } yield break; }
// Token: 0x0600512F RID: 20783 RVA: 0x001BB540 File Offset: 0x001B9940 private IEnumerator RequestLocalAssetBundleCoroutine(AssetBundleDownload download) { WWW www = new WWW(download.assetUrl); www.threadPriority = UnityEngine.ThreadPriority.Normal; while (!www.isDone) { download.OnDownloadProgress(null, www.bytesDownloaded, www.size); yield return(null); } download.currentState = AssetBundleDownload.State.HttpResponseReceived; if (!string.IsNullOrEmpty(www.error) || !this.mAssetBundleDownloads.ContainsKey(www.url)) { download.OnDownloadError(www.error, LoadErrorReason.ConnectionError); } else { this.OnLocalAssetBundleRequestCompleted(www); } yield break; }
// Token: 0x06005131 RID: 20785 RVA: 0x001BB588 File Offset: 0x001B9988 private IEnumerator WaitForRemoteAssetRequest(AssetBundleDownload download) { if (download == null) { yield break; } if (AssetBundleDownloadManager.Instance == null) { download.currentState = AssetBundleDownload.State.Error; yield break; } if (AssetBundleDownloadManager.Instance.mAssetBundleDownloads.ContainsKey(download.assetUrl)) { download.currentState = AssetBundleDownload.State.WaitingForDuplicateToBeDone; yield return(new WaitWhile(() => AssetBundleDownloadManager.Instance != null && download != null && AssetBundleDownloadManager.Instance.mAssetBundleDownloads.ContainsKey(download.assetUrl) && AssetBundleDownloadManager.Instance.mAssetBundleDownloads[download.assetUrl] != null && AssetBundleDownloadManager.Instance.mAssetBundleDownloads[download.assetUrl].currentState != AssetBundleDownload.State.Done && AssetBundleDownloadManager.Instance.mAssetBundleDownloads[download.assetUrl].currentState != AssetBundleDownload.State.Error)); if (AssetBundleDownloadManager.Instance == null || download == null || !AssetBundleDownloadManager.Instance.mAssetBundleDownloads.ContainsKey(download.assetUrl) || AssetBundleDownloadManager.Instance.mAssetBundleDownloads[download.assetUrl] == null) { if (download != null) { download.currentState = AssetBundleDownload.State.Error; } yield break; } if (AssetBundleDownloadManager.Instance.mAssetBundleDownloads[download.assetUrl].currentState == AssetBundleDownload.State.Done) { download.asset = this.GetLoadedAsset(download.assetUrl); download.currentState = AssetBundleDownload.State.Done; VRC.Core.Logger.Log("[" + download.downloadId + "] Duplicate finished!", DebugLevel.AssetBundleDownloadManager); } else { VRC.Core.Logger.Log("[" + download.downloadId + "] Duplicate failed to load because original failed!", DebugLevel.AssetBundleDownloadManager); download.OnDownloadError("Duplicate failed to load because original failed!", LoadErrorReason.DuplicateLoadFailed); } } yield break; }
// Token: 0x06005135 RID: 20789 RVA: 0x001BB608 File Offset: 0x001B9A08 private IEnumerator CreateAsyncCoroutine(AssetBundleDownload download) { yield return(base.StartCoroutine(this.AttemptLzmaDecompressionCoroutine(download))); AssetBundleCreateRequest assetBundleCreateRequest = AssetBundle.LoadFromMemoryAsync(download.assetBundleBytes); yield return(assetBundleCreateRequest); download.assetBundle = assetBundleCreateRequest.assetBundle; if (this.CheckForCancellation(download)) { yield break; } if (download.assetBundle == null) { if (!download.forceRefreshCache && !download.assetUrl.StartsWith("file")) { Debug.LogError(string.Concat(new object[] { "[", download.downloadId, "] cached asset bundle was corrupt, redownloading.. - ", download.assetUrl })); download.forceRefreshCache = true; download.currentState = AssetBundleDownload.State.WaitingForRequestToBeSent; this.mAssetBundleDownloads.Remove(download.assetUrl); base.StartCoroutine(this.DownloadAndUnpackAssetBundleCoroutine(download)); } else { download.OnDownloadError("AssetBundle.LoadFromMemoryAsync failed!", LoadErrorReason.AssetBundleCorrupt); } } yield break; }
// Token: 0x06005136 RID: 20790 RVA: 0x001BB62C File Offset: 0x001B9A2C private IEnumerator LoadAsyncCoroutine(AssetBundleDownload download) { if (download.currentState == AssetBundleDownload.State.Error) { yield break; } download.currentState = AssetBundleDownload.State.LoadingAssetFromAssetBundle; if (download.assetBundle != null) { string mainAssetName = AssetBundleDownloadManager.GetMainAssetName(download.assetBundle); AssetBundleRequest asyncRequest = null; UnityEngine.Object asset = null; if (string.IsNullOrEmpty(mainAssetName)) { VRC.Core.Logger.Log(string.Concat(new object[] { "[", download.downloadId, "] Loading asset ", download.assetUrl, " synchronously." }), DebugLevel.AssetBundleDownloadManager); asset = download.assetBundle.mainAsset; } else { VRC.Core.Logger.Log(string.Concat(new object[] { "[", download.downloadId, "] Loading asset ", download.assetUrl, " aynchronously." }), DebugLevel.AssetBundleDownloadManager); asyncRequest = download.assetBundle.LoadAssetWithSubAssetsAsync(mainAssetName); yield return(asyncRequest); asset = asyncRequest.asset; } if (asset != null) { AssetBundleDownloadManager.Instance.mLoadedAssets[download.assetUrl] = asset; download.asset = asset; download.currentState = AssetBundleDownload.State.Done; } else { VRC.Core.Logger.Log("[" + download.downloadId + "] Error unpacking asset from asset bundle.", DebugLevel.AssetBundleDownloadManager); download.OnDownloadError("Error unpacking asset from asset bundle.", LoadErrorReason.AssetBundleInvalidOrNull); } VRC.Core.Logger.Log(string.Concat(new object[] { "[", download.downloadId, "] UNLOADING ASSET BUNDLE ", download.assetUrl }), DebugLevel.AssetBundleDownloadManager); download.assetBundle.Unload(false); } else { VRC.Core.Logger.Log(string.Concat(new object[] { "[", download.downloadId, "] Asset bundle for url ", download.assetUrl, " is invalid (and null)" }), DebugLevel.AssetBundleDownloadManager); download.OnDownloadError("LoadAsyncCoroutine: Asset bundle is null.", LoadErrorReason.AssetBundleInvalidOrNull); } yield break; }
// Token: 0x0600512E RID: 20782 RVA: 0x001BB51C File Offset: 0x001B991C private IEnumerator DownloadAndLoadRemotePluginCoroutine(AssetBundleDownload download) { if (Player.Instance != null && Player.Instance.isInternal) { Debug.Log(string.Concat(new object[] { "[", download.downloadId, "] Requires plugin. About to download ", download.pluginUrl })); } if (!PluginManager.IsAllowedUrl(download.pluginUrl)) { yield break; } HTTPRequest pluginReq = null; try { pluginReq = new HTTPRequest(new Uri(download.pluginUrl), null); } catch (Exception ex) { download.OnDownloadError("Bad plugin url: " + ex.Message, LoadErrorReason.InvalidURL); yield break; } if (download.forceRefreshCache) { HTTPCacheService.DeleteEntity(pluginReq.CurrentUri, true); } pluginReq.OnProgress = new OnDownloadProgressDelegate(download.OnDownloadProgress); pluginReq.Send(); yield return(base.StartCoroutine(pluginReq)); VRC.Network.ValidateCompletedHTTPRequest(pluginReq, delegate(HTTPResponse response) { if (!this.CheckForCancellation(download)) { VRC.Core.Logger.Log("[" + download.downloadId + "] Downloaded and loading plugin...", DebugLevel.AssetBundleDownloadManager); try { PluginManager.Instance.Load(download.pluginUrl, pluginReq.Response.Data); } catch (Exception ex2) { download.OnPluginLoadError(ex2.Message); } } }, delegate(string errorStr) { string text = "Failed to download plugin from " + download.pluginUrl + " - " + errorStr; VRC.Core.Logger.LogError(string.Concat(new object[] { "[", download.downloadId, "] ", text }), DebugLevel.AssetBundleDownloadManager); download.OnDownloadError(text, LoadErrorReason.ConnectionError); }); yield break; }
// Token: 0x06005129 RID: 20777 RVA: 0x001BB3F0 File Offset: 0x001B97F0 private IEnumerator DownloadAndUnpackAssetBundleCoroutine(string url, string assetId, int assetVersion, string pluginUrl, OnDownloadProgressDelegate onProgress, AssetBundleDownloadManager.OnDownloadCompleted onSuccess, AssetBundleDownloadManager.OnDownloadError onError, AssetBundleDownloadManager.UnpackType unpackType, int retryCount = 0, int downloadId = 0, bool forceRefreshCache = false) { AssetBundleDownload download = new AssetBundleDownload(url, unpackType); download.onDownloadCompleted = onSuccess; download.onDownloadError = onError; download.onProgress = onProgress; download.retryCount = retryCount; download.forceRefreshCache = forceRefreshCache; download.assetId = assetId; download.assetVersion = assetVersion; download.pluginUrl = pluginUrl; download.onPluginLoadError = delegate(string message) { Debug.LogError("Plugin failed to load: " + message); if (!download.forceRefreshCache) { download.forceRefreshCache = true; this.StartCoroutine(this.DownloadAndUnpackAssetBundleCoroutine(download)); } else { download.OnDownloadError("Plugin failed to load: " + message, LoadErrorReason.PluginLoadFailed); } }; if (Player.Instance != null && Player.Instance.isInternal) { Debug.Log(string.Concat(new object[] { "[", download.downloadId, "] Downloading asset: '", download.assetUrl, "'" })); } if (string.IsNullOrEmpty(download.assetUrl)) { download.OnDownloadError("URL is empty", LoadErrorReason.InvalidURL); yield break; } if (downloadId > 0) { download.downloadId = downloadId; } bool hasExistingDownload = this.mAssetBundleDownloads.ContainsKey(download.assetUrl); if (!hasExistingDownload) { this.mAssetBundleDownloads[download.assetUrl] = download; } if (download.assetUrl.StartsWith("file")) { if (!string.IsNullOrEmpty(download.pluginUrl)) { yield return(this.DownloadAndLoadLocalPlugin(download)); } if (download.currentState == AssetBundleDownload.State.Error) { yield break; } if (this.CheckForCancellation(download)) { yield break; } if (!string.IsNullOrEmpty(download.assetUrl)) { yield return(this.RequestLocalAssetBundle(download, hasExistingDownload)); } yield return(this.WaitForAssetToLoad(download)); } else { UnityEngine.Object asset = AssetBundleDownloadManager.Instance.GetLoadedAsset(download.assetUrl); if (asset == null) { download.currentState = AssetBundleDownload.State.WaitingForRequestToBeSent; if (!string.IsNullOrEmpty(download.pluginUrl) && PluginManager.IsAllowedUrl(download.pluginUrl)) { yield return(this.DownloadAndLoadRemotePlugin(download)); } else { download.pluginUrl = null; } if (download.currentState == AssetBundleDownload.State.Error) { yield break; } if (this.CheckForCancellation(download)) { yield break; } if (!string.IsNullOrEmpty(download.assetUrl)) { yield return(this.RequestRemoteAssetBundle(download, hasExistingDownload)); } yield return(this.WaitForAssetToLoad(download)); } else { VRC.Core.Logger.Log(string.Concat(new object[] { "[", download.downloadId, "] Asset: ", download.assetUrl, " already loaded." }), DebugLevel.AssetBundleDownloadManager); download.asset = asset; download.OnDownloadCompleted(); } } yield break; }
// Token: 0x06005127 RID: 20775 RVA: 0x001BB130 File Offset: 0x001B9530 private void OnHttpAssetBundleRequestCompleted(HTTPRequest request, HTTPResponse response) { string originalString = request.Uri.OriginalString; if (!this.mAssetBundleDownloads.ContainsKey(originalString)) { return; } AssetBundleDownload assetBundleDownload = this.mAssetBundleDownloads[originalString]; if (this.CheckForCancellation(assetBundleDownload)) { return; } assetBundleDownload.currentState = AssetBundleDownload.State.Error; switch (request.State) { case HTTPRequestStates.Queued: VRC.Core.Logger.Log("[" + assetBundleDownload.downloadId + "] Queued request.", DebugLevel.AssetBundleDownloadManager); request.Callback = new OnRequestFinishedDelegate(this.OnHttpAssetBundleRequestCompleted); return; case HTTPRequestStates.Finished: if (request.Response.IsSuccess) { if (Player.Instance != null && Player.Instance.isInternal) { Debug.Log(string.Format(string.Concat(new object[] { "[", assetBundleDownload.downloadId, "] AssetBundle [", assetBundleDownload.assetUrl, "] downloaded! Loaded from local cache: {0}, with size: {1}" }), request.Response.IsFromCache.ToString(), response.Data.Length)); } assetBundleDownload.assetBundleBytes = response.Data; AssetBundleDownloadManager.Instance.QueueAssetBundleDownload(assetBundleDownload); assetBundleDownload.currentState = AssetBundleDownload.State.HttpResponseReceived; } else { string message = string.Format(string.Concat(new object[] { "[", assetBundleDownload.downloadId, "] Request [", originalString, "] finished Successfully, but the server sent an error. Status Code: {0}-{1} Message: {2}" }), request.Response.StatusCode, request.Response.Message, request.Response.DataAsText); VRC.Core.Logger.LogError(message, DebugLevel.AssetBundleDownloadManager); assetBundleDownload.OnDownloadError(message, LoadErrorReason.ServerReturnedError); } return; case HTTPRequestStates.Error: VRC.Core.Logger.Log(string.Concat(new object[] { "[", assetBundleDownload.downloadId, "] Request completed with state: ", request.State, " and message: ", request.Exception.Message }), DebugLevel.AssetBundleDownloadManager); this.RetryRequestRemoteAssetBundle(assetBundleDownload); return; case HTTPRequestStates.Aborted: assetBundleDownload.OnDownloadError("[" + assetBundleDownload.downloadId + "] Download aborted. Server closed the connection.", LoadErrorReason.ConnectionError); return; } assetBundleDownload.OnDownloadError(string.Concat(new object[] { "[", assetBundleDownload.assetUrl, "] Error Downloading AssetBundle: ", request.State }), LoadErrorReason.ConnectionError); }