UpdatePackageManifestOperation.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. namespace YooAsset
  5. {
  6. /// <summary>
  7. /// 向远端请求并更新清单
  8. /// </summary>
  9. public abstract class UpdatePackageManifestOperation : AsyncOperationBase
  10. {
  11. /// <summary>
  12. /// 保存当前清单的版本,用于下次启动时自动加载的版本。
  13. /// </summary>
  14. public virtual void SavePackageVersion() { }
  15. }
  16. /// <summary>
  17. /// 编辑器下模拟运行的更新清单操作
  18. /// </summary>
  19. internal sealed class EditorPlayModeUpdatePackageManifestOperation : UpdatePackageManifestOperation
  20. {
  21. public EditorPlayModeUpdatePackageManifestOperation()
  22. {
  23. }
  24. internal override void InternalOnStart()
  25. {
  26. Status = EOperationStatus.Succeed;
  27. }
  28. internal override void InternalOnUpdate()
  29. {
  30. }
  31. }
  32. /// <summary>
  33. /// 离线模式的更新清单操作
  34. /// </summary>
  35. internal sealed class OfflinePlayModeUpdatePackageManifestOperation : UpdatePackageManifestOperation
  36. {
  37. public OfflinePlayModeUpdatePackageManifestOperation()
  38. {
  39. }
  40. internal override void InternalOnStart()
  41. {
  42. Status = EOperationStatus.Succeed;
  43. }
  44. internal override void InternalOnUpdate()
  45. {
  46. }
  47. }
  48. /// <summary>
  49. /// 联机模式的更新清单操作
  50. /// 注意:优先加载沙盒里缓存的清单文件,如果缓存没找到就下载远端清单文件,并保存到本地。
  51. /// </summary>
  52. internal sealed class HostPlayModeUpdatePackageManifestOperation : UpdatePackageManifestOperation
  53. {
  54. private enum ESteps
  55. {
  56. None,
  57. CheckParams,
  58. CheckActiveManifest,
  59. TryLoadCacheManifest,
  60. DownloadManifest,
  61. LoadCacheManifest,
  62. CheckDeserializeManifest,
  63. Done,
  64. }
  65. private readonly HostPlayModeImpl _impl;
  66. private readonly string _packageVersion;
  67. private readonly bool _autoSaveVersion;
  68. private readonly int _timeout;
  69. private LoadCacheManifestOperation _tryLoadCacheManifestOp;
  70. private LoadCacheManifestOperation _loadCacheManifestOp;
  71. private DownloadManifestOperation _downloadManifestOp;
  72. private ESteps _steps = ESteps.None;
  73. internal HostPlayModeUpdatePackageManifestOperation(HostPlayModeImpl impl, string packageVersion, bool autoSaveVersion, int timeout)
  74. {
  75. _impl = impl;
  76. _packageVersion = packageVersion;
  77. _autoSaveVersion = autoSaveVersion;
  78. _timeout = timeout;
  79. }
  80. internal override void InternalOnStart()
  81. {
  82. _steps = ESteps.CheckParams;
  83. }
  84. internal override void InternalOnUpdate()
  85. {
  86. if (_steps == ESteps.None || _steps == ESteps.Done)
  87. return;
  88. if (_steps == ESteps.CheckParams)
  89. {
  90. if (string.IsNullOrEmpty(_packageVersion))
  91. {
  92. _steps = ESteps.Done;
  93. Status = EOperationStatus.Failed;
  94. Error = "Package version is null or empty.";
  95. return;
  96. }
  97. _steps = ESteps.CheckActiveManifest;
  98. }
  99. if (_steps == ESteps.CheckActiveManifest)
  100. {
  101. // 检测当前激活的清单对象
  102. if (_impl.ActiveManifest != null && _impl.ActiveManifest.PackageVersion == _packageVersion)
  103. {
  104. _steps = ESteps.Done;
  105. Status = EOperationStatus.Succeed;
  106. }
  107. else
  108. {
  109. _steps = ESteps.TryLoadCacheManifest;
  110. }
  111. }
  112. if (_steps == ESteps.TryLoadCacheManifest)
  113. {
  114. if (_tryLoadCacheManifestOp == null)
  115. {
  116. _tryLoadCacheManifestOp = new LoadCacheManifestOperation(_impl.Persistent, _packageVersion);
  117. OperationSystem.StartOperation(_impl.PackageName, _tryLoadCacheManifestOp);
  118. }
  119. if (_tryLoadCacheManifestOp.IsDone == false)
  120. return;
  121. if (_tryLoadCacheManifestOp.Status == EOperationStatus.Succeed)
  122. {
  123. _impl.ActiveManifest = _tryLoadCacheManifestOp.Manifest;
  124. if (_autoSaveVersion)
  125. SavePackageVersion();
  126. _steps = ESteps.Done;
  127. Status = EOperationStatus.Succeed;
  128. }
  129. else
  130. {
  131. _steps = ESteps.DownloadManifest;
  132. }
  133. }
  134. if (_steps == ESteps.DownloadManifest)
  135. {
  136. if (_downloadManifestOp == null)
  137. {
  138. _downloadManifestOp = new DownloadManifestOperation(_impl.Persistent, _impl.RemoteServices, _packageVersion, _timeout);
  139. OperationSystem.StartOperation(_impl.PackageName, _downloadManifestOp);
  140. }
  141. if (_downloadManifestOp.IsDone == false)
  142. return;
  143. if (_downloadManifestOp.Status == EOperationStatus.Succeed)
  144. {
  145. _steps = ESteps.LoadCacheManifest;
  146. }
  147. else
  148. {
  149. _steps = ESteps.Done;
  150. Status = EOperationStatus.Failed;
  151. Error = _downloadManifestOp.Error;
  152. }
  153. }
  154. if (_steps == ESteps.LoadCacheManifest)
  155. {
  156. if (_loadCacheManifestOp == null)
  157. {
  158. _loadCacheManifestOp = new LoadCacheManifestOperation(_impl.Persistent, _packageVersion);
  159. OperationSystem.StartOperation(_impl.PackageName, _loadCacheManifestOp);
  160. }
  161. if (_loadCacheManifestOp.IsDone == false)
  162. return;
  163. if (_loadCacheManifestOp.Status == EOperationStatus.Succeed)
  164. {
  165. _impl.ActiveManifest = _loadCacheManifestOp.Manifest;
  166. if (_autoSaveVersion)
  167. SavePackageVersion();
  168. _steps = ESteps.Done;
  169. Status = EOperationStatus.Succeed;
  170. }
  171. else
  172. {
  173. _steps = ESteps.Done;
  174. Status = EOperationStatus.Failed;
  175. Error = _loadCacheManifestOp.Error;
  176. }
  177. }
  178. }
  179. public override void SavePackageVersion()
  180. {
  181. _impl.FlushManifestVersionFile();
  182. }
  183. }
  184. /// <summary>
  185. /// WebGL模式的更新清单操作
  186. /// </summary>
  187. internal sealed class WebPlayModeUpdatePackageManifestOperation : UpdatePackageManifestOperation
  188. {
  189. private enum ESteps
  190. {
  191. None,
  192. CheckParams,
  193. CheckActiveManifest,
  194. LoadRemoteManifest,
  195. Done,
  196. }
  197. private readonly WebPlayModeImpl _impl;
  198. private readonly string _packageVersion;
  199. private readonly int _timeout;
  200. private LoadRemoteManifestOperation _loadCacheManifestOp;
  201. private ESteps _steps = ESteps.None;
  202. internal WebPlayModeUpdatePackageManifestOperation(WebPlayModeImpl impl, string packageVersion, int timeout)
  203. {
  204. _impl = impl;
  205. _packageVersion = packageVersion;
  206. _timeout = timeout;
  207. }
  208. internal override void InternalOnStart()
  209. {
  210. _steps = ESteps.CheckParams;
  211. }
  212. internal override void InternalOnUpdate()
  213. {
  214. if (_steps == ESteps.None || _steps == ESteps.Done)
  215. return;
  216. if (_steps == ESteps.CheckParams)
  217. {
  218. if (string.IsNullOrEmpty(_packageVersion))
  219. {
  220. _steps = ESteps.Done;
  221. Status = EOperationStatus.Failed;
  222. Error = "Package version is null or empty.";
  223. return;
  224. }
  225. _steps = ESteps.CheckActiveManifest;
  226. }
  227. if (_steps == ESteps.CheckActiveManifest)
  228. {
  229. // 检测当前激活的清单对象
  230. if (_impl.ActiveManifest != null && _impl.ActiveManifest.PackageVersion == _packageVersion)
  231. {
  232. _steps = ESteps.Done;
  233. Status = EOperationStatus.Succeed;
  234. }
  235. else
  236. {
  237. _steps = ESteps.LoadRemoteManifest;
  238. }
  239. }
  240. if (_steps == ESteps.LoadRemoteManifest)
  241. {
  242. if (_loadCacheManifestOp == null)
  243. {
  244. _loadCacheManifestOp = new LoadRemoteManifestOperation(_impl.RemoteServices, _impl.PackageName, _packageVersion, _timeout);
  245. OperationSystem.StartOperation(_impl.PackageName, _loadCacheManifestOp);
  246. }
  247. if (_loadCacheManifestOp.IsDone == false)
  248. return;
  249. if (_loadCacheManifestOp.Status == EOperationStatus.Succeed)
  250. {
  251. _impl.ActiveManifest = _loadCacheManifestOp.Manifest;
  252. _steps = ESteps.Done;
  253. Status = EOperationStatus.Succeed;
  254. }
  255. else
  256. {
  257. _steps = ESteps.Done;
  258. Status = EOperationStatus.Failed;
  259. Error = _loadCacheManifestOp.Error;
  260. }
  261. }
  262. }
  263. }
  264. }