123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- #if !BESTHTTP_DISABLE_SOCKETIO
- using System.Collections.Generic;
- namespace BestHTTP.SocketIO.Events
- {
-
-
-
- internal sealed class EventTable
- {
- #region Privates
-
-
-
- private Socket Socket { get; set; }
-
-
-
- private Dictionary<string, List<EventDescriptor>> Table = new Dictionary<string, List<EventDescriptor>>();
- #endregion
-
-
-
- public EventTable(Socket socket)
- {
- this.Socket = socket;
- }
-
-
-
- public void Register(string eventName, SocketIOCallback callback, bool onlyOnce, bool autoDecodePayload)
- {
- List<EventDescriptor> events;
- if (!Table.TryGetValue(eventName, out events))
- Table.Add(eventName, events = new List<EventDescriptor>(1));
-
- var desc = events.Find((d) => d.OnlyOnce == onlyOnce && d.AutoDecodePayload == autoDecodePayload);
-
- if (desc == null)
- events.Add(new EventDescriptor(onlyOnce, autoDecodePayload, callback));
- else
- desc.Callbacks.Add(callback);
- }
-
-
-
- public void Unregister(string eventName)
- {
- Table.Remove(eventName);
- }
-
-
-
- public void Unregister(string eventName, SocketIOCallback callback)
- {
- List<EventDescriptor> events;
- if (Table.TryGetValue(eventName, out events))
- for (int i = 0; i < events.Count; ++i)
- events[i].Callbacks.Remove(callback);
- }
-
-
-
- public void Call(string eventName, Packet packet, params object[] args)
- {
- if (HTTPManager.Logger.Level <= BestHTTP.Logger.Loglevels.All)
- HTTPManager.Logger.Verbose("EventTable", "Call - " + eventName);
- List<EventDescriptor> events;
- if (Table.TryGetValue(eventName, out events))
- for (int i = 0; i < events.Count; ++i)
- events[i].Call(Socket, packet, args);
- }
-
-
-
- public void Call(Packet packet)
- {
- string eventName = packet.DecodeEventName();
- string typeName = packet.SocketIOEvent != SocketIOEventTypes.Unknown ? EventNames.GetNameFor(packet.SocketIOEvent) : EventNames.GetNameFor(packet.TransportEvent);
- object[] args = null;
- if (!HasSubsciber(eventName) && !HasSubsciber(typeName))
- return;
-
-
- if (packet.TransportEvent == TransportEventTypes.Message && (packet.SocketIOEvent == SocketIOEventTypes.Event || packet.SocketIOEvent == SocketIOEventTypes.BinaryEvent) && ShouldDecodePayload(eventName))
- args = packet.Decode(Socket.Manager.Encoder);
-
- if (!string.IsNullOrEmpty(eventName))
- Call(eventName, packet, args);
- if (!packet.IsDecoded && ShouldDecodePayload(typeName))
- args = packet.Decode(Socket.Manager.Encoder);
-
- if (!string.IsNullOrEmpty(typeName))
- Call(typeName, packet, args);
- }
-
-
-
- public void Clear()
- {
- Table.Clear();
- }
- #region Private Helpers
-
-
-
-
-
- private bool ShouldDecodePayload(string eventName)
- {
- List<EventDescriptor> events;
-
-
- if (Table.TryGetValue(eventName, out events))
- for (int i = 0; i < events.Count; ++i)
- if (events[i].AutoDecodePayload && events[i].Callbacks.Count > 0)
- return true;
- return false;
- }
- private bool HasSubsciber(string eventName)
- {
- return Table.ContainsKey(eventName);
- }
- #endregion
- }
- }
- #endif
|