//public static void RegisterListener(object listeningObject) //{ // if (listenerLookup.ContainsKey(listeningObject)) // throw new ArgumentException("Supplied object has already been registered as a listener.", "listeningObject"); // var listeners = new List<SessionListener>(); // listenerLookup.Add(listeningObject, listeners); // // // // Find all methods decorated with TraitListenerAttributes // // // MethodInfo[] methodInfos = listeningObject.GetType().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); // foreach (var method in methodInfos) // if (method.IsDefined(typeof(SessionListenerAttribute), true)) // { // var listenerAttribute = (SessionListenerAttribute)method.GetCustomAttributes(typeof(SessionListenerAttribute), true)[0]; // var listener = listenerAttribute.BroadcastingType == null // ? new SessionListener(listenerAttribute.NotificationType, listeningObject, listenerAttribute.BroadcastingPath) // : new SessionListener(listenerAttribute.NotificationType, listenerAttribute.BroadcastingType, listenerAttribute.Matchsession); // listener.Initialize((EventHandler)Delegate.CreateDelegate(typeof(EventHandler),listeningObject, method)); // listeners.Add(listener); // if (listener.UsePath) // { // var pathInfo = listener.PathInfo; // if (!pathInfo.IsPathValid) // throw new ArgumentException("The path supplied to session listener was not valid.", pathInfo.PathTosession); // var session = pathInfo.Rootsession; // if (session != null) // RegisterPathListener(session, listener); // } // else // { // // // // If we are here, we are listening for a session type to become available. // // // RegisterTypeListener(listener); // } // } //} public static void RegisterListener(object listeningObject, Action <ListenerBuilder> buildListeners) { if (listenerLookup.ContainsKey(listeningObject)) { throw new ArgumentException("Supplied object has already been registered as a listener.", "listeningObject"); } var listeners = new List <SessionListener>(); listenerLookup.Add(listeningObject, listeners); var builder = new ListenerBuilder(listeningObject); buildListeners(builder); foreach (SessionListener listener in builder.Listeners) { listeners.Add(listener); if (listener.UsePath) { var pathInfo = listener.PathInfo; if (!pathInfo.IsPathValid) { throw new ArgumentException("The path supplied to session listener was not valid.", pathInfo.PathTosession); } var session = pathInfo.Rootsession; if (session != null) { RegisterPathListener(session, listener); } } else { // // If we are here, we are listening for a session type to become available. // RegisterTypeListener(listener); } } //// //// Find all methods decorated with TraitListenerAttributes //// //MethodInfo[] methodInfos = listeningObject.GetType().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); //foreach (var method in methodInfos) // if (method.IsDefined(typeof(SessionListenerAttribute), true)) { // var listenerAttribute = (SessionListenerAttribute)method.GetCustomAttributes(typeof(SessionListenerAttribute), true)[0]; // var listener = listenerAttribute.BroadcastingType == null // ? new SessionListener(listenerAttribute.NotificationType, listeningObject, listenerAttribute.BroadcastingPath) // : new SessionListener(listenerAttribute.NotificationType, listenerAttribute.BroadcastingType, listenerAttribute.Matchsession); // listener.Initialize((EventHandler)Delegate.CreateDelegate(typeof(EventHandler), listeningObject, method)); // listeners.Add(listener); // if (listener.UsePath) { // var pathInfo = listener.PathInfo; // if (!pathInfo.IsPathValid) // throw new ArgumentException("The path supplied to session listener was not valid.", pathInfo.PathTosession); // var session = pathInfo.Rootsession; // if (session != null) // RegisterPathListener(session, listener); // } // else { // // // // If we are here, we are listening for a session type to become available. // // // RegisterTypeListener(listener); // } // } }
protected virtual void OnBuildListeners(ListenerBuilder builder) { }