//------------------------------------------------------------ // 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.WebRequest { /// /// Web 请求管理器。 /// internal sealed partial class WebRequestManager : GameFrameworkModule, IWebRequestManager { private readonly TaskPool m_TaskPool; private float m_Timeout; private EventHandler m_WebRequestStartEventHandler; private EventHandler m_WebRequestSuccessEventHandler; private EventHandler m_WebRequestFailureEventHandler; /// /// 初始化 Web 请求管理器的新实例。 /// public WebRequestManager() { m_TaskPool = new TaskPool(); m_Timeout = 30f; } /// /// 获取 Web 请求代理总数量。 /// public int TotalAgentCount { get { return m_TaskPool.TotalAgentCount; } } /// /// 获取可用 Web 请求代理数量。 /// public int FreeAgentCount { get { return m_TaskPool.FreeAgentCount; } } /// /// 获取工作中 Web 请求代理数量。 /// public int WorkingAgentCount { get { return m_TaskPool.WorkingAgentCount; } } /// /// 获取等待 Web 请求数量。 /// public int WaitingTaskCount { get { return m_TaskPool.WaitingTaskCount; } } /// /// 获取或设置 Web 请求超时时长,以秒为单位。 /// public float Timeout { get { return m_Timeout; } set { m_Timeout = value; } } /// /// Web 请求开始事件。 /// public event EventHandler WebRequestStart { add { m_WebRequestStartEventHandler += value; } remove { m_WebRequestStartEventHandler -= value; } } /// /// Web 请求成功事件。 /// public event EventHandler WebRequestSuccess { add { m_WebRequestSuccessEventHandler += value; } remove { m_WebRequestSuccessEventHandler -= value; } } /// /// Web 请求失败事件。 /// public event EventHandler WebRequestFailure { add { m_WebRequestFailureEventHandler += value; } remove { m_WebRequestFailureEventHandler -= value; } } /// /// Web 请求管理器轮询。 /// /// 逻辑流逝时间,以秒为单位。 /// 真实流逝时间,以秒为单位。 internal override void Update(float elapseSeconds, float realElapseSeconds) { m_TaskPool.Update(elapseSeconds, realElapseSeconds); } /// /// 关闭并清理 Web 请求管理器。 /// internal override void Shutdown() { m_TaskPool.Shutdown(); } /// /// 增加 Web 请求代理辅助器。 /// /// 要增加的 Web 请求代理辅助器。 public void AddWebRequestAgentHelper(IWebRequestAgentHelper webRequestAgentHelper) { WebRequestAgent agent = new WebRequestAgent(webRequestAgentHelper); agent.WebRequestAgentStart += OnWebRequestAgentStart; agent.WebRequestAgentSuccess += OnWebRequestAgentSuccess; agent.WebRequestAgentFailure += OnWebRequestAgentFailure; m_TaskPool.AddAgent(agent); } /// /// 根据 Web 请求任务的序列编号获取 Web 请求任务的信息。 /// /// 要获取信息的 Web 请求任务的序列编号。 /// Web 请求任务的信息。 public TaskInfo GetWebRequestInfo(int serialId) { return m_TaskPool.GetTaskInfo(serialId); } /// /// 根据 Web 请求任务的标签获取 Web 请求任务的信息。 /// /// 要获取信息的 Web 请求任务的标签。 /// Web 请求任务的信息。 public TaskInfo[] GetWebRequestInfos(string tag) { return m_TaskPool.GetTaskInfos(tag); } /// /// 根据 Web 请求任务的标签获取 Web 请求任务的信息。 /// /// 要获取信息的 Web 请求任务的标签。 /// Web 请求任务的信息。 public void GetAllWebRequestInfos(string tag, List results) { m_TaskPool.GetTaskInfos(tag, results); } /// /// 获取所有 Web 请求任务的信息。 /// /// 所有 Web 请求任务的信息。 public TaskInfo[] GetAllWebRequestInfos() { return m_TaskPool.GetAllTaskInfos(); } /// /// 获取所有 Web 请求任务的信息。 /// /// 所有 Web 请求任务的信息。 public void GetAllWebRequestInfos(List results) { m_TaskPool.GetAllTaskInfos(results); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri) { return AddWebRequest(webRequestUri, null, null, Constant.DefaultPriority, null); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// 要发送的数据流。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, byte[] postData) { return AddWebRequest(webRequestUri, postData, null, Constant.DefaultPriority, null); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// Web 请求任务的标签。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, string tag) { return AddWebRequest(webRequestUri, null, tag, Constant.DefaultPriority, null); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// Web 请求任务的优先级。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, int priority) { return AddWebRequest(webRequestUri, null, null, priority, null); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// 用户自定义数据。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, object userData) { return AddWebRequest(webRequestUri, null, null, Constant.DefaultPriority, userData); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// 要发送的数据流。 /// Web 请求任务的标签。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, byte[] postData, string tag) { return AddWebRequest(webRequestUri, postData, tag, Constant.DefaultPriority, null); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// 要发送的数据流。 /// Web 请求任务的优先级。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, byte[] postData, int priority) { return AddWebRequest(webRequestUri, postData, null, priority, null); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// 要发送的数据流。 /// 用户自定义数据。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, byte[] postData, object userData) { return AddWebRequest(webRequestUri, postData, null, Constant.DefaultPriority, userData); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// Web 请求任务的标签。 /// Web 请求任务的优先级。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, string tag, int priority) { return AddWebRequest(webRequestUri, null, tag, priority, null); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// Web 请求任务的标签。 /// 用户自定义数据。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, string tag, object userData) { return AddWebRequest(webRequestUri, null, tag, Constant.DefaultPriority, userData); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// Web 请求任务的优先级。 /// 用户自定义数据。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, int priority, object userData) { return AddWebRequest(webRequestUri, null, null, priority, userData); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// 要发送的数据流。 /// Web 请求任务的标签。 /// Web 请求任务的优先级。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, byte[] postData, string tag, int priority) { return AddWebRequest(webRequestUri, postData, tag, priority, null); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// 要发送的数据流。 /// Web 请求任务的标签。 /// 用户自定义数据。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, byte[] postData, string tag, object userData) { return AddWebRequest(webRequestUri, postData, tag, Constant.DefaultPriority, userData); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// 要发送的数据流。 /// Web 请求任务的优先级。 /// 用户自定义数据。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, byte[] postData, int priority, object userData) { return AddWebRequest(webRequestUri, postData, null, priority, userData); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// Web 请求任务的标签。 /// Web 请求任务的优先级。 /// 用户自定义数据。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, string tag, int priority, object userData) { return AddWebRequest(webRequestUri, null, tag, priority, userData); } /// /// 增加 Web 请求任务。 /// /// Web 请求地址。 /// 要发送的数据流。 /// Web 请求任务的标签。 /// Web 请求任务的优先级。 /// 用户自定义数据。 /// 新增 Web 请求任务的序列编号。 public int AddWebRequest(string webRequestUri, byte[] postData, string tag, int priority, object userData) { if (string.IsNullOrEmpty(webRequestUri)) { throw new GameFrameworkException("Web request uri is invalid."); } if (TotalAgentCount <= 0) { throw new GameFrameworkException("You must add web request agent first."); } WebRequestTask webRequestTask = WebRequestTask.Create(webRequestUri, postData, tag, priority, m_Timeout, userData); m_TaskPool.AddTask(webRequestTask); return webRequestTask.SerialId; } /// /// 根据 Web 请求任务的序列编号移除 Web 请求任务。 /// /// 要移除 Web 请求任务的序列编号。 /// 是否移除 Web 请求任务成功。 public bool RemoveWebRequest(int serialId) { return m_TaskPool.RemoveTask(serialId); } /// /// 根据 Web 请求任务的标签移除 Web 请求任务。 /// /// 要移除 Web 请求任务的标签。 /// 移除 Web 请求任务的数量。 public int RemoveWebRequests(string tag) { return m_TaskPool.RemoveTasks(tag); } /// /// 移除所有 Web 请求任务。 /// /// 移除 Web 请求任务的数量。 public int RemoveAllWebRequests() { return m_TaskPool.RemoveAllTasks(); } private void OnWebRequestAgentStart(WebRequestAgent sender) { if (m_WebRequestStartEventHandler != null) { WebRequestStartEventArgs webRequestStartEventArgs = WebRequestStartEventArgs.Create(sender.Task.SerialId, sender.Task.WebRequestUri, sender.Task.UserData); m_WebRequestStartEventHandler(this, webRequestStartEventArgs); ReferencePool.Release(webRequestStartEventArgs); } } private void OnWebRequestAgentSuccess(WebRequestAgent sender, byte[] webResponseBytes) { if (m_WebRequestSuccessEventHandler != null) { WebRequestSuccessEventArgs webRequestSuccessEventArgs = WebRequestSuccessEventArgs.Create(sender.Task.SerialId, sender.Task.WebRequestUri, webResponseBytes, sender.Task.UserData); m_WebRequestSuccessEventHandler(this, webRequestSuccessEventArgs); ReferencePool.Release(webRequestSuccessEventArgs); } } private void OnWebRequestAgentFailure(WebRequestAgent sender, string errorMessage) { if (m_WebRequestFailureEventHandler != null) { WebRequestFailureEventArgs webRequestFailureEventArgs = WebRequestFailureEventArgs.Create(sender.Task.SerialId, sender.Task.WebRequestUri, errorMessage, sender.Task.UserData); m_WebRequestFailureEventHandler(this, webRequestFailureEventArgs); ReferencePool.Release(webRequestFailureEventArgs); } } } }