예제 #1
0
        /// <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.");
            }
        }
예제 #2
0
        /// <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;
                }
                }
            }
        }