DCFSLoadPackageManifestOperation.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using System.IO;
  2. namespace YooAsset
  3. {
  4. internal class DCFSLoadPackageManifestOperation : FSLoadPackageManifestOperation
  5. {
  6. private enum ESteps
  7. {
  8. None,
  9. DownloadPackageHash,
  10. DownloadPackageManifest,
  11. LoadCachePackageHash,
  12. LoadCachePackageManifest,
  13. Done,
  14. }
  15. private readonly DefaultCacheFileSystem _fileSystem;
  16. private readonly string _packageVersion;
  17. private readonly int _timeout;
  18. private DownloadPackageHashOperation _downloadPackageHashOp;
  19. private DownloadPackageManifestOperation _downloadPackageManifestOp;
  20. private LoadCachePackageHashOperation _loadCachePackageHashOp;
  21. private LoadCachePackageManifestOperation _loadCachePackageManifestOp;
  22. private ESteps _steps = ESteps.None;
  23. internal DCFSLoadPackageManifestOperation(DefaultCacheFileSystem fileSystem, string packageVersion, int timeout)
  24. {
  25. _fileSystem = fileSystem;
  26. _packageVersion = packageVersion;
  27. _timeout = timeout;
  28. }
  29. internal override void InternalStart()
  30. {
  31. _steps = ESteps.DownloadPackageHash;
  32. }
  33. internal override void InternalUpdate()
  34. {
  35. if (_steps == ESteps.None || _steps == ESteps.Done)
  36. return;
  37. if (_steps == ESteps.DownloadPackageHash)
  38. {
  39. if (_downloadPackageHashOp == null)
  40. {
  41. _downloadPackageHashOp = new DownloadPackageHashOperation(_fileSystem, _packageVersion, _timeout);
  42. _downloadPackageHashOp.StartOperation();
  43. AddChildOperation(_downloadPackageHashOp);
  44. }
  45. _downloadPackageHashOp.UpdateOperation();
  46. if (_downloadPackageHashOp.IsDone == false)
  47. return;
  48. if (_downloadPackageHashOp.Status == EOperationStatus.Succeed)
  49. {
  50. _steps = ESteps.DownloadPackageManifest;
  51. }
  52. else
  53. {
  54. _steps = ESteps.Done;
  55. Status = EOperationStatus.Failed;
  56. Error = _downloadPackageHashOp.Error;
  57. }
  58. }
  59. if (_steps == ESteps.DownloadPackageManifest)
  60. {
  61. if (_downloadPackageManifestOp == null)
  62. {
  63. _downloadPackageManifestOp = new DownloadPackageManifestOperation(_fileSystem, _packageVersion, _timeout);
  64. _downloadPackageManifestOp.StartOperation();
  65. AddChildOperation(_downloadPackageManifestOp);
  66. }
  67. _downloadPackageManifestOp.UpdateOperation();
  68. if (_downloadPackageManifestOp.IsDone == false)
  69. return;
  70. if (_downloadPackageManifestOp.Status == EOperationStatus.Succeed)
  71. {
  72. _steps = ESteps.LoadCachePackageHash;
  73. }
  74. else
  75. {
  76. _steps = ESteps.Done;
  77. Status = EOperationStatus.Failed;
  78. Error = _downloadPackageManifestOp.Error;
  79. }
  80. }
  81. if (_steps == ESteps.LoadCachePackageHash)
  82. {
  83. if (_loadCachePackageHashOp == null)
  84. {
  85. _loadCachePackageHashOp = new LoadCachePackageHashOperation(_fileSystem, _packageVersion);
  86. _loadCachePackageHashOp.StartOperation();
  87. AddChildOperation(_loadCachePackageHashOp);
  88. }
  89. _loadCachePackageHashOp.UpdateOperation();
  90. if (_loadCachePackageHashOp.IsDone == false)
  91. return;
  92. if (_loadCachePackageHashOp.Status == EOperationStatus.Succeed)
  93. {
  94. _steps = ESteps.LoadCachePackageManifest;
  95. }
  96. else
  97. {
  98. _steps = ESteps.Done;
  99. Status = EOperationStatus.Failed;
  100. Error = _loadCachePackageHashOp.Error;
  101. ClearCacheFatalFile();
  102. }
  103. }
  104. if (_steps == ESteps.LoadCachePackageManifest)
  105. {
  106. if (_loadCachePackageManifestOp == null)
  107. {
  108. string packageHash = _loadCachePackageHashOp.PackageHash;
  109. _loadCachePackageManifestOp = new LoadCachePackageManifestOperation(_fileSystem, _packageVersion, packageHash);
  110. _loadCachePackageManifestOp.StartOperation();
  111. AddChildOperation(_loadCachePackageManifestOp);
  112. }
  113. _loadCachePackageManifestOp.UpdateOperation();
  114. Progress = _loadCachePackageManifestOp.Progress;
  115. if (_loadCachePackageManifestOp.IsDone == false)
  116. return;
  117. if (_loadCachePackageManifestOp.Status == EOperationStatus.Succeed)
  118. {
  119. _steps = ESteps.Done;
  120. Manifest = _loadCachePackageManifestOp.Manifest;
  121. Status = EOperationStatus.Succeed;
  122. }
  123. else
  124. {
  125. _steps = ESteps.Done;
  126. Status = EOperationStatus.Failed;
  127. Error = _loadCachePackageManifestOp.Error;
  128. ClearCacheFatalFile();
  129. }
  130. }
  131. }
  132. private void ClearCacheFatalFile()
  133. {
  134. // 注意:如果加载沙盒内的清单报错,为了避免流程被卡住,主动把损坏的文件删除。
  135. string manifestFilePath = _fileSystem.GetCachePackageManifestFilePath(_packageVersion);
  136. if (File.Exists(manifestFilePath))
  137. {
  138. YooLogger.Warning($"Invalid cache manifest file have been removed : {manifestFilePath}");
  139. File.Delete(manifestFilePath);
  140. }
  141. string hashFilePath = _fileSystem.GetCachePackageHashFilePath(_packageVersion);
  142. if (File.Exists(hashFilePath))
  143. {
  144. File.Delete(hashFilePath);
  145. }
  146. }
  147. }
  148. }