WWWDownloadAgentHelper.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. //------------------------------------------------------------
  2. // Game Framework
  3. // Copyright © 2013-2021 loyalsoft. All rights reserved.
  4. // Homepage: http://www.game7000.com/
  5. // Feedback: http://www.game7000.com/
  6. //------------------------------------------------------------
  7. #if !UNITY_2018_3_OR_NEWER
  8. using GameFramework;
  9. using GameFramework.Download;
  10. using System;
  11. using System.Collections.Generic;
  12. using UnityEngine;
  13. namespace UnityGameFramework.Runtime
  14. {
  15. /// <summary>
  16. /// WWW 下载代理辅助器。
  17. /// </summary>
  18. public class WWWDownloadAgentHelper : DownloadAgentHelperBase, IDisposable
  19. {
  20. private WWW m_WWW = null;
  21. private int m_LastDownloadedSize = 0;
  22. private bool m_Disposed = false;
  23. private EventHandler<DownloadAgentHelperUpdateBytesEventArgs> m_DownloadAgentHelperUpdateBytesEventHandler = null;
  24. private EventHandler<DownloadAgentHelperUpdateLengthEventArgs> m_DownloadAgentHelperUpdateLengthEventHandler = null;
  25. private EventHandler<DownloadAgentHelperCompleteEventArgs> m_DownloadAgentHelperCompleteEventHandler = null;
  26. private EventHandler<DownloadAgentHelperErrorEventArgs> m_DownloadAgentHelperErrorEventHandler = null;
  27. /// <summary>
  28. /// 下载代理辅助器更新数据流事件。
  29. /// </summary>
  30. public override event EventHandler<DownloadAgentHelperUpdateBytesEventArgs> DownloadAgentHelperUpdateBytes
  31. {
  32. add
  33. {
  34. m_DownloadAgentHelperUpdateBytesEventHandler += value;
  35. }
  36. remove
  37. {
  38. m_DownloadAgentHelperUpdateBytesEventHandler -= value;
  39. }
  40. }
  41. /// <summary>
  42. /// 下载代理辅助器更新数据大小事件。
  43. /// </summary>
  44. public override event EventHandler<DownloadAgentHelperUpdateLengthEventArgs> DownloadAgentHelperUpdateLength
  45. {
  46. add
  47. {
  48. m_DownloadAgentHelperUpdateLengthEventHandler += value;
  49. }
  50. remove
  51. {
  52. m_DownloadAgentHelperUpdateLengthEventHandler -= value;
  53. }
  54. }
  55. /// <summary>
  56. /// 下载代理辅助器完成事件。
  57. /// </summary>
  58. public override event EventHandler<DownloadAgentHelperCompleteEventArgs> DownloadAgentHelperComplete
  59. {
  60. add
  61. {
  62. m_DownloadAgentHelperCompleteEventHandler += value;
  63. }
  64. remove
  65. {
  66. m_DownloadAgentHelperCompleteEventHandler -= value;
  67. }
  68. }
  69. /// <summary>
  70. /// 下载代理辅助器错误事件。
  71. /// </summary>
  72. public override event EventHandler<DownloadAgentHelperErrorEventArgs> DownloadAgentHelperError
  73. {
  74. add
  75. {
  76. m_DownloadAgentHelperErrorEventHandler += value;
  77. }
  78. remove
  79. {
  80. m_DownloadAgentHelperErrorEventHandler -= value;
  81. }
  82. }
  83. /// <summary>
  84. /// 通过下载代理辅助器下载指定地址的数据。
  85. /// </summary>
  86. /// <param name="downloadUri">下载地址。</param>
  87. /// <param name="userData">用户自定义数据。</param>
  88. public override void Download(string downloadUri, object userData)
  89. {
  90. if (m_DownloadAgentHelperUpdateBytesEventHandler == null || m_DownloadAgentHelperUpdateLengthEventHandler == null || m_DownloadAgentHelperCompleteEventHandler == null || m_DownloadAgentHelperErrorEventHandler == null)
  91. {
  92. Log.Fatal("Download agent helper handler is invalid.");
  93. return;
  94. }
  95. m_WWW = new WWW(downloadUri);
  96. }
  97. /// <summary>
  98. /// 通过下载代理辅助器下载指定地址的数据。
  99. /// </summary>
  100. /// <param name="downloadUri">下载地址。</param>
  101. /// <param name="fromPosition">下载数据起始位置。</param>
  102. /// <param name="userData">用户自定义数据。</param>
  103. public override void Download(string downloadUri, long fromPosition, object userData)
  104. {
  105. if (m_DownloadAgentHelperUpdateBytesEventHandler == null || m_DownloadAgentHelperUpdateLengthEventHandler == null || m_DownloadAgentHelperCompleteEventHandler == null || m_DownloadAgentHelperErrorEventHandler == null)
  106. {
  107. Log.Fatal("Download agent helper handler is invalid.");
  108. return;
  109. }
  110. Dictionary<string, string> header = new Dictionary<string, string>
  111. {
  112. { "Range", Utility.Text.Format("bytes={0}-", fromPosition.ToString()) }
  113. };
  114. m_WWW = new WWW(downloadUri, null, header);
  115. }
  116. /// <summary>
  117. /// 通过下载代理辅助器下载指定地址的数据。
  118. /// </summary>
  119. /// <param name="downloadUri">下载地址。</param>
  120. /// <param name="fromPosition">下载数据起始位置。</param>
  121. /// <param name="toPosition">下载数据结束位置。</param>
  122. /// <param name="userData">用户自定义数据。</param>
  123. public override void Download(string downloadUri, long fromPosition, long toPosition, object userData)
  124. {
  125. if (m_DownloadAgentHelperUpdateBytesEventHandler == null || m_DownloadAgentHelperUpdateLengthEventHandler == null || m_DownloadAgentHelperCompleteEventHandler == null || m_DownloadAgentHelperErrorEventHandler == null)
  126. {
  127. Log.Fatal("Download agent helper handler is invalid.");
  128. return;
  129. }
  130. Dictionary<string, string> header = new Dictionary<string, string>
  131. {
  132. { "Range", Utility.Text.Format("bytes={0}-{1}", fromPosition.ToString(), toPosition.ToString()) }
  133. };
  134. m_WWW = new WWW(downloadUri, null, header);
  135. }
  136. /// <summary>
  137. /// 重置下载代理辅助器。
  138. /// </summary>
  139. public override void Reset()
  140. {
  141. if (m_WWW != null)
  142. {
  143. m_WWW.Dispose();
  144. m_WWW = null;
  145. }
  146. m_LastDownloadedSize = 0;
  147. }
  148. /// <summary>
  149. /// 释放资源。
  150. /// </summary>
  151. public void Dispose()
  152. {
  153. Dispose(true);
  154. GC.SuppressFinalize(this);
  155. }
  156. /// <summary>
  157. /// 释放资源。
  158. /// </summary>
  159. /// <param name="disposing">释放资源标记。</param>
  160. protected virtual void Dispose(bool disposing)
  161. {
  162. if (m_Disposed)
  163. {
  164. return;
  165. }
  166. if (disposing)
  167. {
  168. if (m_WWW != null)
  169. {
  170. m_WWW.Dispose();
  171. m_WWW = null;
  172. }
  173. }
  174. m_Disposed = true;
  175. }
  176. private void Update()
  177. {
  178. if (m_WWW == null)
  179. {
  180. return;
  181. }
  182. int deltaLength = m_WWW.bytesDownloaded - m_LastDownloadedSize;
  183. if (deltaLength > 0)
  184. {
  185. m_LastDownloadedSize = m_WWW.bytesDownloaded;
  186. DownloadAgentHelperUpdateLengthEventArgs downloadAgentHelperUpdateLengthEventArgs = DownloadAgentHelperUpdateLengthEventArgs.Create(deltaLength);
  187. m_DownloadAgentHelperUpdateLengthEventHandler(this, downloadAgentHelperUpdateLengthEventArgs);
  188. ReferencePool.Release(downloadAgentHelperUpdateLengthEventArgs);
  189. }
  190. if (m_WWW == null)
  191. {
  192. return;
  193. }
  194. if (!m_WWW.isDone)
  195. {
  196. return;
  197. }
  198. if (!string.IsNullOrEmpty(m_WWW.error))
  199. {
  200. DownloadAgentHelperErrorEventArgs dodwnloadAgentHelperErrorEventArgs = DownloadAgentHelperErrorEventArgs.Create(m_WWW.error.StartsWith(RangeNotSatisfiableErrorCode.ToString(), StringComparison.Ordinal), m_WWW.error);
  201. m_DownloadAgentHelperErrorEventHandler(this, dodwnloadAgentHelperErrorEventArgs);
  202. ReferencePool.Release(dodwnloadAgentHelperErrorEventArgs);
  203. }
  204. else
  205. {
  206. byte[] bytes = m_WWW.bytes;
  207. DownloadAgentHelperUpdateBytesEventArgs downloadAgentHelperUpdateBytesEventArgs = DownloadAgentHelperUpdateBytesEventArgs.Create(bytes, 0, bytes.Length);
  208. m_DownloadAgentHelperUpdateBytesEventHandler(this, downloadAgentHelperUpdateBytesEventArgs);
  209. ReferencePool.Release(downloadAgentHelperUpdateBytesEventArgs);
  210. DownloadAgentHelperCompleteEventArgs downloadAgentHelperCompleteEventArgs = DownloadAgentHelperCompleteEventArgs.Create(bytes.LongLength);
  211. m_DownloadAgentHelperCompleteEventHandler(this, downloadAgentHelperCompleteEventArgs);
  212. ReferencePool.Release(downloadAgentHelperCompleteEventArgs);
  213. }
  214. }
  215. }
  216. }
  217. #endif