using Milimoe.FunGame.Core.Interface.Sockets;
using Milimoe.FunGame.Core.Library.Common.Architecture;
using Milimoe.FunGame.Core.Library.Common.Network;
namespace Milimoe.FunGame.Core.Controller
{
///
/// 继承 AsyncAwaiter 用法:
/// 1、调用Socket.Send()前,请设置为等待状态:SetWorking();
/// 2、调用Socket.Send() == Success后,请等待任务完成:WaitForWorkDone();
/// 3、在其他任何地方修改Working状态,均会使任务终止。
///
public class SocketHandlerController : AsyncAwaiter, ISocketHandler, IDisposable
{
///
/// 接收到的SocketObject实例
///
protected override SocketObject Work { get; set; }
///
/// Socket
///
private readonly Socket? _Socket;
///
/// WebSocket
///
private readonly HTTPClient? _WebSocket;
///
/// 继承请调用base构造
///
/// Socket
public SocketHandlerController(Socket? socket)
{
if (socket != null)
{
_Socket = socket;
socket.AddSocketObjectHandler(SocketHandler);
}
else throw new SocketCreateReceivingException();
}
///
/// 继承请调用base构造
///
/// Socket
public SocketHandlerController(HTTPClient? websocket)
{
if (websocket != null)
{
_WebSocket = websocket;
websocket.AddSocketObjectHandler(SocketHandler);
}
else throw new SocketCreateReceivingException();
}
///
/// 继承请重写此方法
///
/// SocketObject
public virtual void SocketHandler(SocketObject SocketObject)
{
}
///
/// 判断是否已经Disposed
///
private bool IsDisposed = false;
///
/// 公开的Dispose方法
///
public void Dispose()
{
OnDisposed();
Dispose(true);
GC.SuppressFinalize(this);
}
///
/// 关闭时
///
///
protected void Dispose(bool Disposing)
{
if (!IsDisposed)
{
if (Disposing)
{
_Socket?.RemoveSocketObjectHandler(SocketHandler);
_WebSocket?.RemoveSocketObjectHandler(SocketHandler);
}
}
IsDisposed = true;
}
///
/// 关闭事件
///
protected delegate void DisposedEvent();
///
/// Controller关闭时事件
/// 不建议new Dispose()方法,建议使用事件
/// 事件会在base.Dispose()执行前触发
///
protected event DisposedEvent? Disposed;
///
/// 触发关闭事件
///
protected void OnDisposed()
{
Disposed?.Invoke();
}
}
}