using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
namespace AssetBundleHub.Tasks
{
///
/// TempのAssetBundleが破損しているかどうかを確認
/// 破損していた場合にはそれをPullContextに報告
///
public class ExtractBrokenBundles : IBundlePullTask
{
IFileHashGenerator hashGenerator;
public ExtractBrokenBundles(IFileHashGenerator hashGenerator)
{
this.hashGenerator = hashGenerator;
}
public UniTask Run(IBundlePullContext context, CancellationToken cancellationToken = default(CancellationToken))
{
var brokenAssetBundles = ExtractAllBrokenAssetBundleOrNull(context);
if (brokenAssetBundles != null)
{
foreach (var assetBundleName in brokenAssetBundles)
{
// Debug.Log($"fileHash not match want {assetBundleInfo.FileHash} got {fileHash}");
context.ReportBrokenAssetBundle(assetBundleName);
}
}
return UniTask.CompletedTask;
}
HashSet ExtractAllBrokenAssetBundleOrNull(IBundlePullContext context)
{
HashSet brokenAssetBundles = null;
foreach (var assetBundleName in context.GetTempAssetBundles())
{
string assetBundlePath = context.GetTempSavePath(assetBundleName);
if (!context.AssetBundleList.Infos.TryGetValue(assetBundleName, out AssetBundleInfo assetBundleInfo))
{
throw new Exception($"AssetBundleInfo not found {assetBundleName}");
}
string fileHash = hashGenerator.ComputeHash(assetBundlePath);
if (fileHash != assetBundleInfo.FileHash)
{
if (brokenAssetBundles == null)
{
brokenAssetBundles = new HashSet();
}
brokenAssetBundles.Add(assetBundleName);
}
}
return brokenAssetBundles;
}
}
}