public PullResponse Pull(PullRequest request) { //TODO: Check URI PullSubscription subsciption; if (request.EnumerationContext == null || !_subscriptions.TryGetValue(request.EnumerationContext.Text, out subsciption)) { throw Faults.InvalidEnumerationContext.Create(); } EnumerationModeExtension.Activate(EnumerationMode.EnumerateObjectAndEPR, subsciption.EventType); int maxElements = request.MaxElements != null ? request.MaxElements.Value : 1; TimeSpan maxTime = request.MaxTime != null ? request.MaxTime.Value : TimeSpan.FromSeconds(10); EnumerationItemList items = new EnumerationItemList(PullItems(subsciption.Buffer.FetchNotifications(maxElements, maxTime))); //R7.2.13-5 if (items.Items.Count() == 0) { throw Faults.TimedOut.Create(); } return(new PullResponse { Items = items, EndOfSequence = null, EnumerationContext = request.EnumerationContext }); }
private OutgoingMessage Pull(IncomingMessage requestMessage) { var response = CreatePullResponse(); var request = requestMessage.GetPayload<PullRequest>(); IPullHandler handler; var context = request.EnumerationContext.Text; lock (_handlers) { if (!_handlers.TryGetValue(context, out handler)) { throw new InvalidEnumerationContextFaultException(); } } var maxElements = GetMaxElements(request); var maxTime = GetMaxTime(request); var pullResult = handler.Pull(maxElements, maxTime, context); var items = new EnumerationItemList(pullResult.Items, pullResult.EnumerationMode); if (pullResult.EndOfSequence) { handler.Dispose(); lock (_handlers) { _handlers.Remove(context); } } response.SetBody( new SerializerBodyWriter(new PullResponse { Items = items, EndOfSequence = pullResult.EndOfSequence ? new EndOfSequence() : null, EnumerationContext = pullResult.EndOfSequence ? null : request.EnumerationContext })); return response; }