//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ using System; using System.Collections.Generic; namespace GameFramework.Download { /// /// 下载管理器。 /// internal sealed partial class DownloadManager : GameFrameworkModule, IDownloadManager { private const int OneMegaBytes = 1024 * 1024; private readonly TaskPool m_TaskPool; private readonly DownloadCounter m_DownloadCounter; private int m_FlushSize; private float m_Timeout; private EventHandler m_DownloadStartEventHandler; private EventHandler m_DownloadUpdateEventHandler; private EventHandler m_DownloadSuccessEventHandler; private EventHandler m_DownloadFailureEventHandler; /// /// 初始化下载管理器的新实例。 /// public DownloadManager() { m_TaskPool = new TaskPool(); m_DownloadCounter = new DownloadCounter(1f, 10f); m_FlushSize = OneMegaBytes; m_Timeout = 30f; m_DownloadStartEventHandler = null; m_DownloadUpdateEventHandler = null; m_DownloadSuccessEventHandler = null; m_DownloadFailureEventHandler = null; } /// /// 获取游戏框架模块优先级。 /// /// 优先级较高的模块会优先轮询,并且关闭操作会后进行。 internal override int Priority { get { return 5; } } /// /// 获取或设置下载是否被暂停。 /// public bool Paused { get { return m_TaskPool.Paused; } set { m_TaskPool.Paused = value; } } /// /// 获取下载代理总数量。 /// public int TotalAgentCount { get { return m_TaskPool.TotalAgentCount; } } /// /// 获取可用下载代理数量。 /// public int FreeAgentCount { get { return m_TaskPool.FreeAgentCount; } } /// /// 获取工作中下载代理数量。 /// public int WorkingAgentCount { get { return m_TaskPool.WorkingAgentCount; } } /// /// 获取等待下载任务数量。 /// public int WaitingTaskCount { get { return m_TaskPool.WaitingTaskCount; } } /// /// 获取或设置将缓冲区写入磁盘的临界大小。 /// public int FlushSize { get { return m_FlushSize; } set { m_FlushSize = value; } } /// /// 获取或设置下载超时时长,以秒为单位。 /// public float Timeout { get { return m_Timeout; } set { m_Timeout = value; } } /// /// 获取当前下载速度。 /// public float CurrentSpeed { get { return m_DownloadCounter.CurrentSpeed; } } /// /// 下载开始事件。 /// public event EventHandler DownloadStart { add { m_DownloadStartEventHandler += value; } remove { m_DownloadStartEventHandler -= value; } } /// /// 下载更新事件。 /// public event EventHandler DownloadUpdate { add { m_DownloadUpdateEventHandler += value; } remove { m_DownloadUpdateEventHandler -= value; } } /// /// 下载成功事件。 /// public event EventHandler DownloadSuccess { add { m_DownloadSuccessEventHandler += value; } remove { m_DownloadSuccessEventHandler -= value; } } /// /// 下载失败事件。 /// public event EventHandler DownloadFailure { add { m_DownloadFailureEventHandler += value; } remove { m_DownloadFailureEventHandler -= value; } } /// /// 下载管理器轮询。 /// /// 逻辑流逝时间,以秒为单位。 /// 真实流逝时间,以秒为单位。 internal override void Update(float elapseSeconds, float realElapseSeconds) { m_TaskPool.Update(elapseSeconds, realElapseSeconds); m_DownloadCounter.Update(elapseSeconds, realElapseSeconds); } /// /// 关闭并清理下载管理器。 /// internal override void Shutdown() { m_TaskPool.Shutdown(); m_DownloadCounter.Shutdown(); } /// /// 增加下载代理辅助器。 /// /// 要增加的下载代理辅助器。 public void AddDownloadAgentHelper(IDownloadAgentHelper downloadAgentHelper) { DownloadAgent agent = new DownloadAgent(downloadAgentHelper); agent.DownloadAgentStart += OnDownloadAgentStart; agent.DownloadAgentUpdate += OnDownloadAgentUpdate; agent.DownloadAgentSuccess += OnDownloadAgentSuccess; agent.DownloadAgentFailure += OnDownloadAgentFailure; m_TaskPool.AddAgent(agent); } /// /// 根据下载任务的序列编号获取下载任务的信息。 /// /// 要获取信息的下载任务的序列编号。 /// 下载任务的信息。 public TaskInfo GetDownloadInfo(int serialId) { return m_TaskPool.GetTaskInfo(serialId); } /// /// 根据下载任务的标签获取下载任务的信息。 /// /// 要获取信息的下载任务的标签。 /// 下载任务的信息。 public TaskInfo[] GetDownloadInfos(string tag) { return m_TaskPool.GetTaskInfos(tag); } /// /// 根据下载任务的标签获取下载任务的信息。 /// /// 要获取信息的下载任务的标签。 /// 下载任务的信息。 public void GetDownloadInfos(string tag, List results) { m_TaskPool.GetTaskInfos(tag, results); } /// /// 获取所有下载任务的信息。 /// /// 所有下载任务的信息。 public TaskInfo[] GetAllDownloadInfos() { return m_TaskPool.GetAllTaskInfos(); } /// /// 获取所有下载任务的信息。 /// /// 所有下载任务的信息。 public void GetAllDownloadInfos(List results) { m_TaskPool.GetAllTaskInfos(results); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri) { return AddDownload(downloadPath, downloadUri, null, Constant.DefaultPriority, null); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的标签。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, string tag) { return AddDownload(downloadPath, downloadUri, tag, Constant.DefaultPriority, null); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的优先级。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, int priority) { return AddDownload(downloadPath, downloadUri, null, priority, null); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 用户自定义数据。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, object userData) { return AddDownload(downloadPath, downloadUri, null, Constant.DefaultPriority, userData); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的标签。 /// 下载任务的优先级。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, string tag, int priority) { return AddDownload(downloadPath, downloadUri, tag, priority, null); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的标签。 /// 用户自定义数据。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, string tag, object userData) { return AddDownload(downloadPath, downloadUri, tag, Constant.DefaultPriority, userData); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的优先级。 /// 用户自定义数据。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, int priority, object userData) { return AddDownload(downloadPath, downloadUri, null, priority, userData); } /// /// 增加下载任务。 /// /// 下载后存放路径。 /// 原始下载地址。 /// 下载任务的标签。 /// 下载任务的优先级。 /// 用户自定义数据。 /// 新增下载任务的序列编号。 public int AddDownload(string downloadPath, string downloadUri, string tag, int priority, object userData) { if (string.IsNullOrEmpty(downloadPath)) { throw new GameFrameworkException("Download path is invalid."); } if (string.IsNullOrEmpty(downloadUri)) { throw new GameFrameworkException("Download uri is invalid."); } if (TotalAgentCount <= 0) { throw new GameFrameworkException("You must add download agent first."); } DownloadTask downloadTask = DownloadTask.Create(downloadPath, downloadUri, tag, priority, m_FlushSize, m_Timeout, userData); m_TaskPool.AddTask(downloadTask); return downloadTask.SerialId; } /// /// 根据下载任务的序列编号移除下载任务。 /// /// 要移除下载任务的序列编号。 /// 是否移除下载任务成功。 public bool RemoveDownload(int serialId) { return m_TaskPool.RemoveTask(serialId); } /// /// 根据下载任务的标签移除下载任务。 /// /// 要移除下载任务的标签。 /// 移除下载任务的数量。 public int RemoveDownloads(string tag) { return m_TaskPool.RemoveTasks(tag); } /// /// 移除所有下载任务。 /// /// 移除下载任务的数量。 public int RemoveAllDownloads() { return m_TaskPool.RemoveAllTasks(); } private void OnDownloadAgentStart(DownloadAgent sender) { if (m_DownloadStartEventHandler != null) { DownloadStartEventArgs downloadStartEventArgs = DownloadStartEventArgs.Create(sender.Task.SerialId, sender.Task.DownloadPath, sender.Task.DownloadUri, sender.CurrentLength, sender.Task.UserData); m_DownloadStartEventHandler(this, downloadStartEventArgs); ReferencePool.Release(downloadStartEventArgs); } } private void OnDownloadAgentUpdate(DownloadAgent sender, int deltaLength) { m_DownloadCounter.RecordDeltaLength(deltaLength); if (m_DownloadUpdateEventHandler != null) { DownloadUpdateEventArgs downloadUpdateEventArgs = DownloadUpdateEventArgs.Create(sender.Task.SerialId, sender.Task.DownloadPath, sender.Task.DownloadUri, sender.CurrentLength, sender.Task.UserData); m_DownloadUpdateEventHandler(this, downloadUpdateEventArgs); ReferencePool.Release(downloadUpdateEventArgs); } } private void OnDownloadAgentSuccess(DownloadAgent sender, long length) { if (m_DownloadSuccessEventHandler != null) { DownloadSuccessEventArgs downloadSuccessEventArgs = DownloadSuccessEventArgs.Create(sender.Task.SerialId, sender.Task.DownloadPath, sender.Task.DownloadUri, sender.CurrentLength, sender.Task.UserData); m_DownloadSuccessEventHandler(this, downloadSuccessEventArgs); ReferencePool.Release(downloadSuccessEventArgs); } } private void OnDownloadAgentFailure(DownloadAgent sender, string errorMessage) { if (m_DownloadFailureEventHandler != null) { DownloadFailureEventArgs downloadFailureEventArgs = DownloadFailureEventArgs.Create(sender.Task.SerialId, sender.Task.DownloadPath, sender.Task.DownloadUri, errorMessage, sender.Task.UserData); m_DownloadFailureEventHandler(this, downloadFailureEventArgs); ReferencePool.Release(downloadFailureEventArgs); } } } }