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