/// <summary> /// Creates a subscription that can be used to recieve data change or event notifications. /// </summary> public CreateSubscriptionResponseMessage CreateSubscription(CreateSubscriptionMessage request) { try { lock (m_lock) { // verify the session. Session session = VerifySession(request.RequestHeader, false); // create a new subscription. Subscription subscription = new Subscription(); uint subscriptionId; double publishingInterval; uint lifetimeCount; uint keepAliveCount; // the subscription validates the parameters and throws exceptions on error. subscription.Create( session, m_nodeManager, request.RequestedPublishingInterval, request.RequestedLifetimeCount, request.RequestedMaxKeepAliveCount, request.MaxNotificationsPerPublish, request.PublishingEnabled, request.Priority, out subscriptionId, out publishingInterval, out lifetimeCount, out keepAliveCount); // save the subscription. m_subscriptions.Add(subscriptionId, subscription); // start the publish thread if it has not already been started. if (m_subscriptions.Count == 1) { ThreadPool.QueueUserWorkItem(PublishSubscriptions); } // return the response. CreateSubscriptionResponseMessage response = new CreateSubscriptionResponseMessage(); response.ResponseHeader = CreateResponseHeader(request.RequestHeader); response.SubscriptionId = subscriptionId; response.RevisedPublishingInterval = publishingInterval; response.RevisedLifetimeCount = lifetimeCount; response.RevisedMaxKeepAliveCount = keepAliveCount; return response; } } catch (Exception e) { throw CreateSoapFault(request.RequestHeader, e); } }