예제 #1
0
        /// <summary>
        ///  Registers an action handler, based on a event type ID and subtype ID
        /// </summary>
        public bool RegisterHandler(int typeID, int subType, PacketCreationDelegate handlerMethod)
        {
            Dictionary <int, PacketCreationDelegate> map; // the map we store the handler in
            PacketCreationDelegate handler = GetHandlerDelegate(typeID, subType);

            if (handler == null)
            {
                handler = handlerMethod;
                if (subType == 0)
                {
                    lock (PrimaryHandlerMap)
                    {
                        PrimaryHandlerMap.Add(typeID, handlerMethod);
                    }
                }
                else
                {
                    lock (SubtypeHandlerMap)
                    {
                        if (!SubtypeHandlerMap.TryGetValue(typeID, out map))
                        {
                            map = new Dictionary <int, PacketCreationDelegate>();
                            // map doesnt exist yet. add it.
                            SubtypeHandlerMap.Add(typeID, map);
                        }
                        map.Add(subType, handler);
                    }
                }
                return(true);
            }

            return(false);
        }
예제 #2
0
        /// <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);
                    }
                }
            }
        }
예제 #3
0
        /// <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);
                        }
                    }
                }
            }
        }
예제 #4
0
        /// <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);
                        }
                    }
                }
            }
        }