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