public async Task SpecifyingQueues()
        {
            ClientConfiguration clientConfiguration = null; // As initialized earlier
            var directClient = new DirectClient(clientConfiguration);

            var organizationNumber = "123456789";
            var sender             = new Sender(organizationNumber, new PollingQueue("CustomPollingQueue"));

            Document documentToSign = null; // As initialized earlier
            ExitUrls exitUrls       = null; // As initialized earlier

            var signer = new PersonalIdentificationNumber("00000000000");

            var job = new Job(
                documentToSign,
                new List <Signer> {
                new Signer(signer)
            },
                "SendersReferenceToSignatureJob",
                exitUrls,
                sender,
                StatusRetrievalMethod.Polling
                );

            await directClient.Create(job);

            var changedJob = await directClient.GetStatusChange(sender);
        }
        private JobStatusResponse GetCurrentReceipt(long jobId, Sender sender = null)
        {
            if (_status != null)
            {
                SleepToAvoidTooEagerPolling(_status.NextPermittedPollTime);
            }

            while (true)
            {
                var jobStatusResponse = _directClient.GetStatusChange(sender).Result;

                var isNoChanges = jobStatusResponse.Status == NoChanges;
                if (isNoChanges)
                {
                    return(jobStatusResponse);
                }

                var isCurrentReceipt = jobStatusResponse.JobId == jobId;
                if (isCurrentReceipt)
                {
                    return(jobStatusResponse);
                }

                ConfirmExcessReceipt(jobStatusResponse);

                var allowedToGetNextReceipt = jobStatusResponse.NextPermittedPollTime < DateTime.Now;
                if (allowedToGetNextReceipt)
                {
                    continue;
                }

                SleepToAvoidTooEagerPolling(jobStatusResponse.NextPermittedPollTime);
            }
        }
            public async Task Throws_too_eager_polling_exception_on_too_many_requests()
            {
                var directClient = new DirectClient(GetClientConfiguration())
                {
                    HttpClient = GetHttpClientWithHandler(new FakeHttpClientHandlerForTooManyRequestsResponse())
                };

                await Assert.ThrowsAsync <TooEagerPollingException>(async() => await directClient.GetStatusChange().ConfigureAwait(false)).ConfigureAwait(false);
            }
            public async Task Cant_get_signature_job_id_from_empty_response()
            {
                var directClient = new DirectClient(GetClientConfiguration())
                {
                    HttpClient = GetHttpClientWithHandler(new FakeHttpClientHandlerForEmptyQueueResponse())
                };

                var statusChange = await directClient.GetStatusChange().ConfigureAwait(false);

                Assert.Throws <InvalidOperationException>(() => statusChange.JobId);
            }
            public async Task Returns_status_response()
            {
                var directClient = new DirectClient(GetClientConfiguration())
                {
                    HttpClient = GetHttpClientWithHandler(new FakeHttpClientHandlerGetStatusResponse())
                };

                var result = await directClient.GetStatusChange().ConfigureAwait(false);

                Assert.NotNull(result);
            }
            public async Task Returns_empty_object_on_empty_queue()
            {
                var fakeEmptyQueueResponse = new FakeHttpClientHandlerForEmptyQueueResponse();
                var directClient           = new DirectClient(GetClientConfiguration())
                {
                    HttpClient = GetHttpClientWithHandler(fakeEmptyQueueResponse)
                };

                var actualResponse = await directClient.GetStatusChange().ConfigureAwait(false);

                Assert.Throws <InvalidOperationException>(() => actualResponse.JobId);
                Assert.Null(actualResponse.JobReference);
            }
        public async Task PollForStatus()
        {
            ClientConfiguration clientConfiguration = null; // As initialized earlier
            var directClient = new DirectClient(clientConfiguration);

            // Repeat the polling until signer signs the document, but ensure to do this at a
            // reasonable interval. If you are processing the result a few times a day in your
            // system, only poll a few times a day.
            var change = await directClient.GetStatusChange();

            switch (change.Status)
            {
            case JobStatus.NoChanges:
                // Queue is empty. Additional polling will result in blocking for a defined period.
                break;

            case JobStatus.CompletedSuccessfully:
                // Get PAdES
                // Get XAdES
                break;

            case JobStatus.Failed:
                break;

            case JobStatus.InProgress:
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            // Confirm status change to avoid receiving it again
            await directClient.Confirm(change.References.Confirmation);

            var pollingWillResultInBlock = change.NextPermittedPollTime > DateTime.Now;

            if (pollingWillResultInBlock)
            {
                //Wait until next permitted poll time has passed before polling again.
            }
        }
        public async Task PollForStatus()
        {
            ClientConfiguration clientConfiguration = null; // As initialized earlier
            var directClient = new DirectClient(clientConfiguration);

            Document documentToSign = null; // As initialized earlier
            ExitUrls exitUrls = null; // As initialized earlier

            var job = new Job(
                documentToSign,
                new Signer(new PersonalIdentificationNumber("12345678910")),
                "SendersReferenceToSignatureJob",
                exitUrls,
                statusRetrievalMethod: StatusRetrievalMethod.Polling
                );

            await directClient.Create(job);

            var changedJob = await directClient.GetStatusChange();

            if (changedJob.Status == JobStatus.NoChanges)
            {
                // Queue is empty. Additional polling will result in blocking for a defined period.
            }

            // Repeat the above until signer signs the document

            changedJob = await directClient.GetStatusChange();

            if (changedJob.Status == JobStatus.Signed)
            {
                // Get XAdES and/or PAdES
            }

            // Confirm status change to avoid receiving it again
            await directClient.Confirm(changedJob.References.Confirmation);
        }