using System; using System.Collections.Generic; using XGame.Framework.Interfaces; namespace XGame.Framework.Network { public class MsgContextCache : IReset, IDisposable { private Dictionary _mapContext = new Dictionary(); public void Push(int instanceID, int protocol, object context) { MsgContextInfo info = ObjectPool.Acquire(); info.protocolID = protocol; info.context = context; _mapContext[instanceID] = info; } public bool Pop(int instanceID, out int protocol, out object context) { if (_mapContext.TryGetValue(instanceID, out MsgContextInfo info)) { _mapContext.Remove(instanceID); protocol = info.protocolID; context = info.context; ObjectPool.Recycle(info); return true; } protocol = 0; context = null; return false; } public void Reset() { foreach (var item in _mapContext) { ObjectPool.Recycle(item.Value); } _mapContext.Clear(); } //public void CheckRecv(IMessage message) //{ // if (message is IMsgPush) // { // var args = ObjectPool.Acquire(); // args.protocolID = message.ProtocolID; // args.PushMsg = message; // node.Notify(EventDefine.SESSION_PUSH_RECVED, args); // ObjectPool.Recycle(args); // } // else // { // var args = ObjectPool.Acquire(); // args.protocolID = message.ProtocolID; // args.context = message.Context; // args.seq = message.InstanceID; // args.ResponseMsg = message; // if (LastID == message.InstanceID) // { // CanSend = true; // args.IsFilter = true; // } // else // { // args.IsFilter = false; // } // node.Notify(EventDefine.SESSION_RESPONSE_RECVED, args); // ObjectPool.Recycle(args); // } //} public void Dispose() { Reset(); } public class MsgContextInfo : IReference { public int protocolID; public object context; public void Clear() { protocolID = 0; context = null; } } } }