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;
 }