/// <inheritdoc />
        public async Task <Tuple <FileStream, ErrorMessageResponse> > RetrieveDownloadStream(FileTicketResponse ticket, CancellationToken cancellationToken)
        {
            if (ticket == null)
            {
                throw new ArgumentNullException(nameof(ticket));
            }

            FileDownloadProvider downloadProvider;

            lock (downloadTickets)
            {
                if (!downloadTickets.TryGetValue(ticket.FileTicket, out downloadProvider))
                {
                    logger.LogTrace("Download ticket {0} not found!", ticket.FileTicket);
                    return(Tuple.Create <FileStream, ErrorMessageResponse>(null, null));
                }

                downloadTickets.Remove(ticket.FileTicket);
            }

            var errorCode = downloadProvider.ActivationCallback();

            if (errorCode.HasValue)
            {
                logger.LogDebug("Download ticket {0} failed activation!", ticket.FileTicket);
                return(Tuple.Create <FileStream, ErrorMessageResponse>(null, new ErrorMessageResponse(errorCode.Value)));
            }

            FileStream stream;

            try
            {
                if (downloadProvider.FileStreamProvider != null)
                {
                    stream = await downloadProvider.FileStreamProvider(cancellationToken).ConfigureAwait(false);
                }
                else
                {
                    stream = ioManager.GetFileStream(downloadProvider.FilePath, downloadProvider.ShareWrite);
                }
            }
            catch (IOException ex)
            {
                return(Tuple.Create <FileStream, ErrorMessageResponse>(
                           null,
                           new ErrorMessageResponse(ErrorCode.IOError)
                {
                    AdditionalData = ex.ToString()
                }));
            }

            try
            {
                logger.LogTrace("Ticket {0} downloading...", ticket.FileTicket);
                return(Tuple.Create <FileStream, ErrorMessageResponse>(stream, null));
            }
            catch
            {
                stream.Dispose();
                throw;
            }
        }