/// <summary> /// Registers an action handler, based on a event type ID and subtype ID /// </summary> public void RegisterHandler(int eventTypeID, int eventSubType, Action <arg1, arg2> handlerMethod) { Dictionary <int, Action <arg1, arg2> > map; // the map we store the handler in Action <arg1, arg2> handler = GetHandlerDelegate(eventTypeID, eventSubType); if (handler == null) { handler = handlerMethod; if (eventSubType == 0) { lock (PrimaryHandlerMap) { PrimaryHandlerMap.Add(eventTypeID, handlerMethod); } } else { lock (SubtypeHandlerMap) { if (!SubtypeHandlerMap.TryGetValue(eventTypeID, out map)) { map = new Dictionary <int, Action <arg1, arg2> >(); // map doesnt exist yet. add it. SubtypeHandlerMap.Add(eventTypeID, map); } map.Add(eventSubType, handler); } } } else // handler exists, append it { handler += handlerMethod; if (eventSubType == 0) { lock (PrimaryHandlerMap) { PrimaryHandlerMap.Remove(eventTypeID); PrimaryHandlerMap.Add(eventTypeID, handler); } } else { lock (SubtypeHandlerMap) { // this lookup shouldn't fail because if the handler exists (i.e. we're in this else block) then the dictionary exists map = SubtypeHandlerMap[eventTypeID]; map.Remove(eventSubType); map.Add(eventSubType, handler); } } } }
/// <summary> /// Removes a previously registered delegate from the handler map /// </summary> public void UnregisterHandler(int eventTypeID, int eventSubTypeID, Action <arg1, arg2> handlerMethod) { Action <arg1, arg2> handler = GetHandlerDelegate(eventTypeID); if (handler == null) { return; } handler -= handlerMethod; if (eventSubTypeID == 0) { lock (PrimaryHandlerMap) { PrimaryHandlerMap.Remove(eventTypeID); if (handler.GetInvocationList().Length > 0) { PrimaryHandlerMap.Add(eventTypeID, handler); } } } else { lock (SubtypeHandlerMap) { Dictionary <int, Action <arg1, arg2> > map; if (SubtypeHandlerMap.TryGetValue(eventTypeID, out map)) { map.Remove(eventSubTypeID); if (handler.GetInvocationList().Length > 0) { map.Add(eventSubTypeID, handler); } if (map.Count < 1) { SubtypeHandlerMap.Remove(eventTypeID); } } } } }
/// <summary> /// Removes a previously registered delegate from the handler map /// </summary> public void UnregisterHandler(int typeID, int subTypeID, PacketCreationDelegate handlerMethod) { PacketCreationDelegate handler = GetHandlerDelegate(typeID); if (handler == null) { return; } handler -= handlerMethod; if (subTypeID == 0) { lock (PrimaryHandlerMap) { PrimaryHandlerMap.Remove(typeID); if (handler.GetInvocationList().Length > 0) { PrimaryHandlerMap.Add(typeID, handler); } } } else { lock (SubtypeHandlerMap) { Dictionary <int, PacketCreationDelegate> map; if (SubtypeHandlerMap.TryGetValue(typeID, out map)) { map.Remove(subTypeID); if (handler.GetInvocationList().Length > 0) { map.Add(subTypeID, handler); } if (map.Count < 1) { SubtypeHandlerMap.Remove(typeID); } } } } }