/// <summary> /// Processes the messages received from the event client. /// </summary> /// <param name="message">Message received from the client.</param> private void ProcessMessage(string message) { // Turn the message into an xml document. XmlDocument document = new XmlDocument(); document.LoadXml(message); // Find out what type of request message was sent. if (IProcEventRegistration.IsValidRequest(document)) { IProcEventRegistration er = new IProcEventRegistration(document); // Make sure that the host address is loopback for now. if (!IPAddress.IsLoopback(er.RemoteAddress)) { log.Error(String.Format("An invalid address was specified in the registration message {0}.", er.RemoteAddress)); eventSocket.Shutdown(SocketShutdown.Both); eventSocket.Close(); subscriberTable.Remove(port); } // See if the client is registering or deregistering. if (er.Registering) { // Create the event subscribers. simiasNodeEventSubscriber = new EventSubscriber(); simiasSyncEventSubscriber = new SyncEventSubscriber(); simiasNotifyEventSubscriber = new NotifyEventSubscriber(); log.Debug("Client {0}:{1} has registered for interprocess events", er.RemoteAddress, er.Port); } else { DisposeSubscribers(); log.Debug("Client {0}:{1} has deregistered for interprocess events", er.RemoteAddress, er.Port); } } else if (IProcEventListener.IsValidRequest(document)) { // Make sure that registration has occurred. if ((simiasNodeEventSubscriber == null) || (simiasSyncEventSubscriber == null) || (simiasNodeEventSubscriber == null)) { log.Error("Client must be registered before subscribing for events."); throw new SimiasException("Client must be registered before subscribing for events."); } IProcEventListener el = new IProcEventListener(document); ProcessEventListener(el); } else { log.Debug("{0} : An invalid request message was received.", port); throw new SimiasException("An invalid request message was received."); } }
/// <summary> /// Processes event add, delete and filter requests. /// </summary> /// <param name="document">Document that contains the event message.</param> private void ProcessEventListener(IProcEventListener document) { // See if there are any filter events to set. IEnumerator e = document.GetFilterEnumerator(); while (e.MoveNext()) { IProcEventFilter filter = e.Current as IProcEventFilter; switch (filter.Type) { case IProcFilterType.Collection: { simiasNodeEventSubscriber.CollectionId = filter.Data; break; } case IProcFilterType.NodeID: { simiasNodeEventSubscriber.NodeIDFilter = filter.Data; break; } case IProcFilterType.NodeType: { simiasNodeEventSubscriber.NodeTypeFilter = filter.Data; break; } } } // See if there are any events to add or delete. e = document.GetEventEnumerator(); while (e.MoveNext()) { switch (( IProcEventAction )Enum.Parse(typeof(IProcEventAction), e.Current as string)) { case IProcEventAction.AddNodeChanged: { if (nodeChangedHandler == null) { log.Debug("{0} : Added node change event.", port); nodeChangedHandler = new NodeEventHandler(NodeEventCallback); simiasNodeEventSubscriber.NodeChanged += nodeChangedHandler; } break; } case IProcEventAction.AddNodeCreated: { if (nodeCreatedHandler == null) { log.Debug("{0} : Added node create event.", port); nodeCreatedHandler = new NodeEventHandler(NodeEventCallback); simiasNodeEventSubscriber.NodeCreated += nodeCreatedHandler; } break; } case IProcEventAction.AddNodeDeleted: { if (nodeDeletedHandler == null) { log.Debug("{0} : Added node delete event.", port); nodeDeletedHandler = new NodeEventHandler(NodeEventCallback); simiasNodeEventSubscriber.NodeDeleted += nodeDeletedHandler; } break; } case IProcEventAction.AddCollectionSync: { if (collectionSyncHandler == null) { log.Debug("{0} : Added collection sync event.", port); collectionSyncHandler = new CollectionSyncEventHandler(CollectionSyncEventCallback); simiasSyncEventSubscriber.CollectionSync += collectionSyncHandler; } break; } case IProcEventAction.AddFileSync: { if (fileSyncHandler == null) { log.Debug("{0} : Added file sync event.", port); fileSyncHandler = new FileSyncEventHandler(FileSyncEventCallback); simiasSyncEventSubscriber.FileSync += fileSyncHandler; } break; } case IProcEventAction.AddNotifyMessage: { if (notifyHandler == null) { log.Debug("{0} : Added notify event.", port); notifyHandler = new NotifyEventHandler(NotifyEventCallback); simiasNotifyEventSubscriber.NotifyEvent += notifyHandler; } break; } case IProcEventAction.RemoveNodeChanged: { if (nodeChangedHandler != null) { log.Debug("{0} : Removed node change event.", port); simiasNodeEventSubscriber.NodeChanged -= nodeChangedHandler; nodeChangedHandler = null; } break; } case IProcEventAction.RemoveNodeCreated: { if (nodeCreatedHandler != null) { log.Debug("{0} : Removed node created event.", port); simiasNodeEventSubscriber.NodeCreated -= nodeCreatedHandler; nodeCreatedHandler = null; } break; } case IProcEventAction.RemoveNodeDeleted: { if (nodeDeletedHandler != null) { log.Debug("{0} : Removed node deleted event.", port); simiasNodeEventSubscriber.NodeDeleted -= nodeDeletedHandler; nodeDeletedHandler = null; } break; } case IProcEventAction.RemoveCollectionSync: { if (collectionSyncHandler != null) { log.Debug("{0} : Removed collection sync event.", port); simiasSyncEventSubscriber.CollectionSync -= collectionSyncHandler; collectionSyncHandler = null; } break; } case IProcEventAction.RemoveFileSync: { if (fileSyncHandler != null) { log.Debug("{0} : Removed file sync event.", port); simiasSyncEventSubscriber.FileSync -= fileSyncHandler; fileSyncHandler = null; } break; } case IProcEventAction.RemoveNotifyMessage: { if (notifyHandler != null) { log.Debug("{0} : Removed notify event.", port); simiasNotifyEventSubscriber.NotifyEvent -= notifyHandler; notifyHandler = null; } break; } } } }