//------------------------------------------------------------
// 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);
}
}
}
}