private ICollectionPage <Quaggan> ConvertAsyncResponse(Task <IResponse <ICollection <QuagganDataContract> > > task, int pageIndex)
        {
            Contract.Requires(task != null);
            Contract.Ensures(Contract.Result <ICollectionPage <Quaggan> >() != null);
            var values = this.converterForPageResponse.Convert(task.Result);

            if (values == null)
            {
                return(new CollectionPage <Quaggan>(0));
            }

            PageContextPatchUtility.Patch(values, pageIndex);

            return(values);
        }
        /// <inheritdoc />
        ICollectionPage <Quaggan> IPaginator <Quaggan> .FindPage(int pageIndex)
        {
            var request = new QuagganPageRequest
            {
                Page = pageIndex
            };
            var response = this.serviceClient.Send <ICollection <QuagganDataContract> >(request);
            var values   = this.converterForPageResponse.Convert(response);

            if (values == null)
            {
                return(new CollectionPage <Quaggan>(0));
            }

            PageContextPatchUtility.Patch(values, pageIndex);

            return(values);
        }
        /// <inheritdoc />
        ICollectionPage <TValue> IConverter <IResponse <ICollection <TDTO> >, ICollectionPage <TValue> > .Convert(IResponse <ICollection <TDTO> > value, object state)
        {
            if (value == null)
            {
                return(new CollectionPage <TValue>(0));
            }

            // MEMO: expect the page index as state argument, because we can't parse Link headers yet
            var pageIndex = state as int?;

            if (!pageIndex.HasValue)
            {
                throw new ArgumentException("Precondition: state is int", "state");
            }

            var dataContracts = value.Content;

            if (dataContracts == null)
            {
                return(new CollectionPage <TValue>(0));
            }

            var page = new CollectionPage <TValue>(dataContracts.Count)
            {
                PageSize      = value.GetPageSize(),
                PageCount     = value.GetPageTotal(),
                SubtotalCount = value.GetResultCount(),
                TotalCount    = value.GetResultTotal()
            };

            page.AddRange(dataContracts.Select(dataContract => this.dataContractConverter.Convert(dataContract, value)));

            // TODO: replace this code with an implementation of the Link header
            PageContextPatchUtility.Patch(page, pageIndex.Value);

            return(page);
        }