Files
YooAsset/Assets/YooAsset/Runtime/ResourcePackage/Operation/Internal/LoadCacheManifestOperation.cs

141 lines
3.7 KiB
C#
Raw Normal View History

2022-12-18 21:55:49 +08:00
using System.IO;
namespace YooAsset
{
2022-12-20 16:17:01 +08:00
internal class LoadCacheManifestOperation : AsyncOperationBase
2022-12-18 21:55:49 +08:00
{
private enum ESteps
{
None,
2022-12-24 22:09:14 +08:00
QueryCachePackageHash,
VerifyFileHash,
LoadCacheManifest,
2022-12-18 21:55:49 +08:00
CheckDeserializeManifest,
Done,
}
2023-09-20 16:09:52 +08:00
private readonly PersistentManager _persistent;
2022-12-24 22:09:14 +08:00
private readonly string _packageVersion;
private QueryCachePackageHashOperation _queryCachePackageHashOp;
2022-12-18 21:55:49 +08:00
private DeserializeManifestOperation _deserializer;
private string _manifestFilePath;
2022-12-20 16:17:01 +08:00
private ESteps _steps = ESteps.None;
2022-12-18 21:55:49 +08:00
/// <summary>
2022-12-24 22:09:14 +08:00
/// 加载的清单实例
2022-12-18 21:55:49 +08:00
/// </summary>
public PackageManifest Manifest { private set; get; }
2022-12-18 21:55:49 +08:00
2023-09-20 16:09:52 +08:00
public LoadCacheManifestOperation(PersistentManager persistent, string packageVersion)
2022-12-18 21:55:49 +08:00
{
2023-09-20 16:09:52 +08:00
_persistent = persistent;
2022-12-24 22:09:14 +08:00
_packageVersion = packageVersion;
2022-12-18 21:55:49 +08:00
}
2023-10-10 12:17:01 +08:00
internal override void InternalOnStart()
2022-12-18 21:55:49 +08:00
{
2022-12-24 22:09:14 +08:00
_steps = ESteps.QueryCachePackageHash;
2022-12-18 21:55:49 +08:00
}
2023-10-10 12:17:01 +08:00
internal override void InternalOnUpdate()
2022-12-18 21:55:49 +08:00
{
if (_steps == ESteps.None || _steps == ESteps.Done)
return;
2022-12-24 22:09:14 +08:00
if (_steps == ESteps.QueryCachePackageHash)
2022-12-18 21:55:49 +08:00
{
2022-12-24 22:09:14 +08:00
if (_queryCachePackageHashOp == null)
{
2023-09-20 16:09:52 +08:00
_queryCachePackageHashOp = new QueryCachePackageHashOperation(_persistent, _packageVersion);
OperationSystem.StartOperation(_persistent.PackageName, _queryCachePackageHashOp);
2022-12-24 22:09:14 +08:00
}
if (_queryCachePackageHashOp.IsDone == false)
return;
if (_queryCachePackageHashOp.Status == EOperationStatus.Succeed)
{
_steps = ESteps.VerifyFileHash;
}
else
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = _queryCachePackageHashOp.Error;
ClearCacheFile();
}
}
if (_steps == ESteps.VerifyFileHash)
{
2023-09-20 16:09:52 +08:00
_manifestFilePath = _persistent.GetSandboxPackageManifestFilePath(_packageVersion);
2022-12-18 21:55:49 +08:00
if (File.Exists(_manifestFilePath) == false)
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
2022-12-24 22:09:14 +08:00
Error = $"Not found cache manifest file : {_manifestFilePath}";
ClearCacheFile();
2022-12-18 21:55:49 +08:00
return;
}
string fileHash = HashUtility.FileMD5(_manifestFilePath);
2022-12-24 22:09:14 +08:00
if (fileHash != _queryCachePackageHashOp.PackageHash)
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = "Failed to verify cache manifest file hash !";
ClearCacheFile();
}
else
{
_steps = ESteps.LoadCacheManifest;
}
}
if (_steps == ESteps.LoadCacheManifest)
{
2022-12-18 21:55:49 +08:00
byte[] bytesData = File.ReadAllBytes(_manifestFilePath);
_deserializer = new DeserializeManifestOperation(bytesData);
2023-09-20 16:09:52 +08:00
OperationSystem.StartOperation(_persistent.PackageName, _deserializer);
2022-12-18 21:55:49 +08:00
_steps = ESteps.CheckDeserializeManifest;
}
if (_steps == ESteps.CheckDeserializeManifest)
{
Progress = _deserializer.Progress;
if (_deserializer.IsDone == false)
return;
if (_deserializer.Status == EOperationStatus.Succeed)
{
Manifest = _deserializer.Manifest;
2022-12-24 22:09:14 +08:00
_steps = ESteps.Done;
2022-12-18 21:55:49 +08:00
Status = EOperationStatus.Succeed;
}
else
{
_steps = ESteps.Done;
Status = EOperationStatus.Failed;
Error = _deserializer.Error;
2022-12-24 22:09:14 +08:00
ClearCacheFile();
2022-12-18 21:55:49 +08:00
}
}
}
2022-12-24 22:09:14 +08:00
private void ClearCacheFile()
{
// 注意:如果加载沙盒内的清单报错,为了避免流程被卡住,主动把损坏的文件删除。
if (File.Exists(_manifestFilePath))
{
YooLogger.Warning($"Failed to load cache manifest file : {Error}");
YooLogger.Warning($"Invalid cache manifest file have been removed : {_manifestFilePath}");
File.Delete(_manifestFilePath);
}
2023-09-20 16:09:52 +08:00
string hashFilePath = _persistent.GetSandboxPackageHashFilePath(_packageVersion);
2022-12-24 22:09:14 +08:00
if (File.Exists(hashFilePath))
{
File.Delete(hashFilePath);
}
}
2022-12-18 21:55:49 +08:00
}
}