private void UnsubscribeEvents(HandshakingInfo subscriber) { foreach (var eventInfor in subscriber.UnsubscribeEventList) { foreach (var dic in eventInfor.Value) { if (dic.Value) { object qObj = ServerDictionaries.GetObjectFromTheDictionary(eventInfor.Key); System.Reflection.EventInfo ei = qObj.GetType().GetEvent(dic.Key); // Find corresponding CQG delegate Type delType = QueryHandler.FindDelegateType(QueryHandler.CQGAssembly, dic.Key); // Instantiate the delegate with our own handler string handlerName = string.Concat("_ICQGCELEvents_", dic.Key, "EventHandlerImpl"); MethodInfo handlerInfo = typeof(CQGEventHandlers).GetMethod(handlerName); Delegate d = Delegate.CreateDelegate(delType, handlerInfo); // Unsubscribe our handler from CQG event ei.RemoveEventHandler(qObj, d); } } } }
private void Listener_SubscribersAdded(HandshakingEventArgs args) { var subscribersArray = new HandshakingInfo[ServerDictionaries.RealtimeIds.Count]; ServerDictionaries.RealtimeIds.CopyTo(subscribersArray); ServerDictionaries.RealtimeIds.Clear(); if (!args.NoSubscribers) { var subscribersList = new List <HandshakingInfo>(subscribersArray); for (int i = 0; i < args.Subscribers.Count; i++) { subscribersList.Remove(args.Subscribers[i]); ServerDictionaries.RealtimeIds.Add(args.Subscribers[i]); } if (subscribersList.Count > 0) { // Handle last queries for unsubscribe items QueryHandler.ReadQueries(); QueryHandler.ProcessEntireQueryList(); for (int i = 0; i < subscribersList.Count; i++) { UnsubscribeEvents(subscribersList[i]); ServerDictionaries.DeleteFromServerDictionaries(subscribersList[i]); Listener.DeleteUnsubscriber(subscribersList[i].ID); } } HandshakingTimer.Stop(); } else { HandshakingTimer.Start(); } }
public static void DeleteFromServerDictionaries(HandshakingInfo subscriber) { foreach (string key in subscriber.ObjectKeys) { RemoveObjectFromTheDictionary(key); } RealtimeIds.Remove(subscriber); }