private async Task ApproveSelectedSeries(bool?approve)
        {
            await CancelPipeline();

            if (!approve.GetValueOrDefault() || !SelectedSeries.Any())
            {
                SeriesSelected?.Invoke(this, new Series[] { });
                return;
            }

            DownloadImagesProgress = 0;

            var selectedSeries = SelectedSeries.Select(vm => vm.Series); // unwrap

            var request = new GetSeriesImagesRequest
            {
                Series = selectedSeries
            };

            request.Progress += (s, e) =>
            {
                DownloadImagesProgress = e;
            };

            await _searchService.GetSeriesImagesAsync(request, CancellationToken.None);

            SeriesSelected?.Invoke(this, selectedSeries.ToArray());

            SelectedSeries.Clear();

            DownloadImagesProgress = 0;
        }
Esempio n. 2
0
        public async Task GetSeriesImagesAsync(GetSeriesImagesRequest request, CancellationToken ct)
        {
            foreach (var series in request.Series)
            {
                Validator.ValidateObject(series, new ValidationContext(series), true);
            }

            await GetSeriesImagesImpAsync(request, ct);
        }
Esempio n. 3
0
        internal override async Task GetSeriesImagesImpAsync(GetSeriesImagesRequest request, CancellationToken ct)
        {
            var seriesByReq          = new Dictionary <DicomCMoveRequest, Series>(); // filled below
            var remainingImagesByReq = new Dictionary <DicomCMoveRequest, int>();    // filled below
            var totalImages          = request.Series.Sum(s => s.NumberOfSeriesRelatedInstances);

            object progressLock = new object();

            DicomCMoveRequest.ResponseDelegate handler = (req, resp) =>
            {
                lock (progressLock)
                {
                    remainingImagesByReq[req] = resp.Remaining;
                    var remainingImages = remainingImagesByReq.Sum(kvp => kvp.Value);
                    var progress        = (double)(totalImages - remainingImages) / totalImages;

                    if (progress < 0.99)
                    {
                        request.RaiseProgress((int)(progress * 100));
                    }
                }

                if (resp.Remaining == 0)
                {
                    var series = seriesByReq[req];
                    series.ImagesUri = CStoreScp.GetSeriesImagesUri(series.SeriesInstanceUid);
                    request.RaiseSeriesDone(series);
                }
            };

            foreach (var series in request.Series)
            {
                var cmove = series.CreateCMoveRequest(_settings.DicomSettings);
                cmove.OnResponseReceived   += handler;
                seriesByReq[cmove]          = series;
                remainingImagesByReq[cmove] = series.NumberOfSeriesRelatedInstances;
            }

            var client = _settings.DicomSettings.CreateClient();
            await client.AddRequestsAsync(seriesByReq.Keys);

            await client.SendAsync(ct);

            request.RaiseProgress(100);
        }
Esempio n. 4
0
        internal override async Task GetSeriesImagesImpAsync(GetSeriesImagesRequest request, CancellationToken ct)
        {
            double progress = 0;

            foreach (var ser in request.Series)
            {
                var fsSeries = ser as FileSysSeriesImp;
                if (fsSeries == null)
                {
                    _logger.Warning("{service} got unexpected type of series object {@Series}", GetType(), ser);
                    continue;
                }

                fsSeries.ImagesUri = fsSeries.SeriesDir;

                progress++;

                request.RaiseProgress((int)(progress / request.Series.Count() * 100));
                request.RaiseSeriesDone(fsSeries);
            }

            await Task.FromResult(true);
        }
Esempio n. 5
0
 internal abstract Task GetSeriesImagesImpAsync(GetSeriesImagesRequest request, CancellationToken ct);