Exemple #1
0
        private static bool Filter(HashSet <string> whitelistIfAny, DicomCFindResponse response)
        {
            var dataset = response.Dataset;

            //ignore responses where there are no dataset record being returned
            if (dataset == null)
            {
                return(false);
            }

            //if there is a whitelist
            if (whitelistIfAny != null)
            {
                //get the response dataset patientId
                var patientId = dataset.GetSingleValue <string>(DicomTag.PatientID);

                //if the patientId is empty or not on our whitelist
                if (patientId == null)
                {
                    return(false);
                }

                return(whitelistIfAny.Contains(patientId.Trim()));
            }
            //No WhiteList just add
            return(true);
        }
Exemple #2
0
        public async Task OnCFindRequestAsync_ImmediateSuccess_ShouldRespond()
        {
            var port = Ports.GetNext();

            using (DicomServerFactory.Create <ImmediateSuccessAsyncDicomCFindProvider>(port, logger: _logger.IncludePrefix("DicomServer")))
            {
                var client = DicomClientFactory.Create("127.0.0.1", port, false, "SCU", "ANY-SCP");
                client.Logger = _logger.IncludePrefix(typeof(DicomClient).Name);

                DicomCFindResponse response             = null;
                DicomRequest.OnTimeoutEventArgs timeout = null;
                var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Study)
                {
                    OnResponseReceived = (req, res) => response = res,
                    OnTimeout          = (sender, args) => timeout = args
                };

                await client.AddRequestAsync(request).ConfigureAwait(false);

                await client.SendAsync().ConfigureAwait(false);

                Assert.NotNull(response);
                Assert.Equal(DicomStatus.Success, response.Status);
                Assert.Null(timeout);
            }
        }
Exemple #3
0
        public virtual IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
        {
            DicomStatus               status = DicomStatus.Success;
            IList <DicomDataset>      queries;
            List <DicomCFindResponse> responses = new List <DicomCFindResponse>();

            if (OnZSCFindRequest != null)
            {
                //此处通过代理来返回在服务端本机进行的操作结果,也就是DICOM协议中说的匹配查询结果
                queries = OnZSCFindRequest(request);
                if (queries != null)
                {
                    Logger.Info("查询到{0}个数据", queries.Count);

                    foreach (var item in queries)
                    {
                        //对于每一个查询匹配的结果,都需要有一个单独的C-FIND-RSP消息来返回到请求端
                        //【注】:每次发送的状态都必须是Pending,表明后续还会继续发送查询结果
                        DicomCFindResponse rsp = new DicomCFindResponse(request, DicomStatus.Pending);
                        rsp.Dataset = item;
                        responses.Add(rsp);
                    }
                }
                else
                {
                    status = DicomStatus.QueryRetrieveOutOfResources;
                }
            }
            //随后需要发送查询结束的状态,即Success到C-FIND SCU端
            responses.Add(new DicomCFindResponse(request, DicomStatus.Success));

            //这里貌似是一起将多个response发送出去的?需要后续在研究一下DicomService中的实现代码
            //搞清楚具体的发送机制
            return(responses);
        }
Exemple #4
0
 public static void DebugStudyResponse(DicomCFindResponse response)
 {
     if (response.Status == DicomStatus.Pending)
     {
         // print the results
         Console.WriteLine($"Patient {response.Dataset.Get(DicomTag.PatientName, string.Empty)}, {response.Dataset.Get(DicomTag.ModalitiesInStudy, string.Empty)}");
     }
     if (response.Status == DicomStatus.Success)
     {
         Console.WriteLine(response.Status.ToString());
     }
 }
Exemple #5
0
 public static void DebugStudyResponse(DicomCFindResponse response)
 {
     if (response.Status == DicomStatus.Pending)
     {
         // print the results
         Console.WriteLine($"Patient {response.Dataset.Get<String>(DicomTag.PatientName)}, {response.Dataset.Get<String>(DicomTag.ModalitiesInStudy, -1)}-Study from {response.Dataset.Get<DateTime>(DicomTag.StudyDate)} with UID {response.Dataset.Get<String>(DicomTag.StudyInstanceUID)} ");
     }
     if (response.Status == DicomStatus.Success)
     {
         Console.WriteLine(response.Status.ToString());
     }
 }
Exemple #6
0
 public static void DebugStudyResponse(DicomCFindResponse response)
 {
     if (response.Status == DicomStatus.Pending)
     {
         // print the results
         Console.WriteLine($"Patient {response.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty)}, {(response.Dataset.TryGetString(DicomTag.ModalitiesInStudy, out var dummy) ? dummy : string.Empty)}-Study from {response.Dataset.GetSingleValueOrDefault(DicomTag.StudyDate, new DateTime())} with UID {response.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty)} ");
     }
     if (response.Status == DicomStatus.Success)
     {
         Console.WriteLine(response.Status.ToString());
     }
 }
Exemple #7
0
        private void WriteValue(CsvWriter writer, DicomCFindResponse response, DicomTag tag)
        {
            var val = DicomTypeTranslaterReader.GetCSharpValue(response.Dataset, tag);

            if (val == null)
            {
                writer.WriteField("");
            }
            else
            {
                writer.WriteField(DicomTypeTranslater.Flatten(val));
            }
        }
Exemple #8
0
        public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
        {
            List <DicomCFindResponse> responses    = new List <DicomCFindResponse>();
            IList <DicomDataset>      queryResults = HandleCFindQuery(request);

            foreach (DicomDataset item in queryResults)
            {
                DicomCFindResponse response = new DicomCFindResponse(request, DicomStatus.Pending);
                response.Dataset = item;
                responses.Add(response);
            }
            responses.Add(new DicomCFindResponse(request, DicomStatus.Success));
            return(responses);
        }
Exemple #9
0
        private void WriteResult(CsvWriter writer, DicomCFindResponse response)
        {
            if (!response.HasDataset)
            {
                return;
            }

            foreach (var t in _tagsToWrite)
            {
                WriteValue(writer, response, t);
            }

            writer.NextRecord();
        }
            public SeriesQueryOut(DicomCFindResponse response)
            {
                PropertyInfo[] properties = typeof(SeriesQueryOut).GetProperties();
                foreach (var property in properties)
                {
                    // (0010,0010)
                    string tag = typeof(DicomTag).GetField(property.Name).GetValue(null).ToString();
                    // DicomTag.PatientName
                    DicomTag theTag = (DicomTag.Parse(tag));

                    string value = "";
                    response.Dataset.TryGetSingleValue(theTag, out value);
                    property.SetValue(this, value);
                }
            }
        public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
        {
            DicomStatus status  = DicomStatus.Success;
            var         queries = GetPatients();

            foreach (var item in queries)
            {
                DicomCFindResponse rs = new DicomCFindResponse(request, DicomStatus.Pending);
                rs.Dataset = item;
                yield return(rs);
            }
            DicomCFindResponse rs2 = new DicomCFindResponse(request, DicomStatus.Success);

            rs2.Dataset = queries.LastOrDefault();
            yield return(rs2);
        }
        private Patient GetPatientInformation(DicomCFindResponse rp)
        {
            Patient patient = new Patient
            {
                FirstName            = rp.Dataset.Get <string>(DicomTag.PatientName),
                Sex                  = rp.Dataset.Get <Sex>(DicomTag.PatientSex),
                BirthDate            = rp.Dataset.Get <DateTime>(DicomTag.PatientBirthDate),
                PatientAddress       = rp.Dataset.Get <string>(DicomTag.PatientAddress),
                PatientComments      = rp.Dataset.Get <string>(DicomTag.PatientComments),
                AccessionNumber      = rp.Dataset.Get <string>(DicomTag.AccessionNumber),
                PatientId            = rp.Dataset.Get <string>(DicomTag.PatientID),
                MedicalRecordLocator = rp.Dataset.Get <string>(DicomTag.MedicalRecordLocator),
                Telephone            = rp.Dataset.Get <string>(DicomTag.PatientTelephoneNumbers)
            };

            return(patient);
        }
Exemple #13
0
 public static void DebugSerieResponse(DicomCFindResponse response)
 {
     try
     {
         if (response.Status == DicomStatus.Pending)
         {
             // print the results
             Console.WriteLine($"Serie {response.Dataset.GetSingleValue<String>(DicomTag.SeriesDescription)}, {response.Dataset.GetSingleValue<String>(DicomTag.Modality)}, {response.Dataset.GetSingleValue<int>(DicomTag.NumberOfSeriesRelatedInstances)} instances");
         }
         if (response.Status == DicomStatus.Success)
         {
             Console.WriteLine(response.Status.ToString());
         }
     }
     catch (Exception)
     { }
 }
Exemple #14
0
        public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
        {
            Console.WriteLine(request.PresentationContext.AbstractSyntax.ToString());
            var responseList = new List <DicomCFindResponse>();
            var r            = new DicomCFindResponse(request, DicomStatus.Pending);

            r.Dataset = new DicomDataset();
            r.Dataset.Add(DicomTag.PatientID, request.PresentationContext.AbstractSyntax.ToString());
            responseList.Add(r);
            r         = new DicomCFindResponse(request, DicomStatus.Pending);
            r.Dataset = new DicomDataset();
            r.Dataset.Add(DicomTag.SOPClassesInStudy, request.PresentationContext.Result.ToString());
            responseList.Add(r);

            responseList.Add(new DicomCFindResponse(request, DicomStatus.Success));

            return(responseList);
        }
        public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
        {
            var patientId  = GetPatientId(request);
            var familyName = GetPatientName(request);

            List <DicomCFindResponse> responses = new List <DicomCFindResponse>();

            if (request.Level == DicomQueryRetrieveLevel.Patient)
            {
                foreach (DicomDataset result in GetWorklistResults(request))
                {
                    var response = new DicomCFindResponse(request, DicomStatus.Success);
                    response.Dataset = result;
                    responses.Add(response);
                }
            }
            responses.Add(new DicomCFindResponse(request, DicomStatus.Success));
            return(responses);
        }
Exemple #16
0
        //получает информацио о патиентах в Dicom Worklist
        private Patient GetPatientInformation(DicomCFindResponse rp)
        {
            string  patientName = rp.Dataset.Get <string>(DicomTag.PatientName);
            Patient patient     = new Patient
            {
                FirstName            = patientName.Substring(patientName.IndexOf('^') + 1, patientName.IndexOf('^') - 2),
                LastName             = patientName.Substring(0, patientName.IndexOf('^')),
                MiddleName           = patientName.Substring(patientName.LastIndexOf('^') + 1),
                Sex                  = rp.Dataset.Get <Sex>(DicomTag.PatientSex),
                BirthDate            = rp.Dataset.Get <DateTime>(DicomTag.PatientBirthDate),
                PatientAddress       = rp.Dataset.Get <string>(DicomTag.PatientAddress),
                PatientComments      = rp.Dataset.Get <string>(DicomTag.PatientComments),
                AccessionNumber      = rp.Dataset.Get <string>(DicomTag.AccessionNumber),
                PatientId            = rp.Dataset.Get <string>(DicomTag.PatientID),
                MedicalRecordLocator = rp.Dataset.Get <string>(DicomTag.MedicalRecordLocator),
                Telephone            = rp.Dataset.Get <string>(DicomTag.PatientTelephoneNumbers)
            };

            return(patient);
        }
        public async Task SendingFindRequestToServerThatSendsPendingResponsesWithinTimeoutShouldNotTimeout()
        {
            var port = Ports.GetNext();

            using (CreateServer <FastPendingResponsesDicomServer>(port))
            {
                var client = CreateClient(port);

                client.ServiceOptions.RequestTimeout = TimeSpan.FromSeconds(2);

                DicomCFindResponse lastResponse = null;
                var request = new DicomCFindRequest(DicomQueryRetrieveLevel.Patient)
                {
                    Dataset = new DicomDataset
                    {
                        { DicomTag.PatientID, "PAT123" }
                    },
                    OnResponseReceived = (req, res) => lastResponse = res
                };

                DicomRequest.OnTimeoutEventArgs onTimeoutEventArgs = null;
                request.OnTimeout += (sender, args) => onTimeoutEventArgs = args;

                await client.AddRequestAsync(request).ConfigureAwait(false);

                var sendTask = client.SendAsync();
                var sendTimeoutCancellationTokenSource = new CancellationTokenSource();
                var sendTimeout = Task.Delay(TimeSpan.FromSeconds(10), sendTimeoutCancellationTokenSource.Token);

                var winner = await Task.WhenAny(sendTask, sendTimeout).ConfigureAwait(false);

                sendTimeoutCancellationTokenSource.Cancel();
                sendTimeoutCancellationTokenSource.Dispose();

                Assert.Equal(winner, sendTask);
                Assert.NotNull(lastResponse);
                Assert.Equal(lastResponse.Status, DicomStatus.Success);
                Assert.Null(onTimeoutEventArgs);
            }
        }
Exemple #18
0
        public static void LogStudyResultsFoundToDebugConsole(DicomCFindResponse response)
        {
            // See http://dicom.nema.org/medical/dicom/current/output/chtml/part04/sect_CC.2.8.4.html for status codes for C-FIND responses
            // The remote AE will provide a status of pending if it has matches and continues to send it one by one
            if (response.Status == DicomStatus.Pending)
            {
                var patientName = response.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty);
                var studyDate   = response.Dataset.GetSingleValueOrDefault(DicomTag.StudyDate, new DateTime());
                var studyUID    = response.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty);

                LogToDebugConsole("Matched Result...");
                LogToDebugConsole($"Patient Found ->  {patientName} ");
                LogToDebugConsole($"Study Date ->  {studyDate} ");
                LogToDebugConsole($"Study UID ->  {studyUID} ");
                LogToDebugConsole("\n");
            }

            //if all match operations against the supplied query filter have been completed
            if (response.Status == DicomStatus.Success)
            {
                LogToDebugConsole(response.Status.ToString());
            }
        }
Exemple #19
0
        public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
        {
            IList <DicomCFindResponse> responses = new List <DicomCFindResponse>();

            //固定返回C-FIND-RSP给客户端
            for (int i = 0; i < 2; ++i)
            {
                DicomCFindResponse response = new DicomCFindResponse(request, DicomStatus.Pending)
                {
                    Dataset = request.Dataset
                };
                response.Completed = i + 100;
                responses.Add(response);
            }
            DicomCFindResponse rsp = new DicomCFindResponse(request, DicomStatus.Success)
            {
                Dataset = request.Dataset
            };

            rsp.Completed = 2234;
            responses.Add(rsp);
            return(responses);
        }
        public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
        {
            var log = new StringBuilder();
            IDicomDatasetWalker walkerTexasRanger = new DicomDatasetDumper(log);

            new DicomDatasetWalker(request.Dataset).Walk(walkerTexasRanger);

            //var description = string.Format("C-FIND -> {0}", request.Dataset.Get<DicomSequence>(DicomTag.ScheduledProcedureStepSequence).First().Get(DicomTag.ScheduledProcedureStepStartDate, "NONE"));

            List <DicomCFindResponse> responses = new List <DicomCFindResponse>();
            var results = m_WorklistRepository.WorklistItems;

            foreach (DicomDataset result in results)
            {
                //result.Add(DicomTag.RetrieveAETitle, "meeeeh");
                var response = new DicomCFindResponse(request, DicomStatus.Pending)
                {
                    Dataset = result
                };
                responses.Add(response);
            }
            responses.Add(new DicomCFindResponse(request, DicomStatus.Success));
            return(responses);
        }
            public StudyQueryOut(DicomCFindResponse response)
            {
                PropertyInfo[] properties = typeof(StudyQueryOut).GetProperties();
                foreach (var property in properties)
                {
                    // (0010,0010)
                    string tag = typeof(DicomTag).GetField(property.Name).GetValue(null).ToString();
                    // DicomTag.PatientName
                    DicomTag theTag = (DicomTag.Parse(tag));

                    if (property.Name != "ModalitiesInStudy")
                    {
                        string value = "";
                        response.Dataset.TryGetSingleValue(theTag, out value);
                        property.SetValue(this, value);
                    }
                    else
                    {
                        var value = new string[5];
                        response.Dataset.TryGetValues(theTag, out value);
                        string modalities = "";
                        if (value != null)
                        {
                            for (int i = 0; i < value.Length; i++)
                            {
                                modalities = modalities + value[i] + ", ";
                            }
                        }
                        if (modalities.Length > 2)
                        {
                            modalities = modalities.Substring(0, modalities.Length - 2);
                        }
                        property.SetValue(this, modalities);
                    }
                }
            }
Exemple #22
0
        public IEnumerable <DicomCFindResponse> OnCFindRequest(DicomCFindRequest request)
        {
            string prefix = "[WorklistSCP] [" + session + "] ";

            Program.Log.Write(prefix + "Begin processing c-find request.");

            List <DicomCFindResponse> responses = new List <DicomCFindResponse>();

            if (request.Level == DicomQueryRetrieveLevel.Worklist || request.Level == DicomQueryRetrieveLevel.Patient)
            {
                DataSet dsQC = DicomMappingHelper.CreateQCDataSet
                               <MWLQueryCriteriaItem>(WorkListSCPService.Service.QCList, request.Dataset);
                WorklistSCPHelper.ModifyQCDataSet(WorkListSCPService.Service.QCList, dsQC);
                if (dsQC == null)
                {
                    Program.Log.Write(prefix + "[WARNING] Process query criteria failed.");
                    responses.Add(new DicomCFindResponse(request, DicomStatus.QueryRetrieveUnableToProcess));
                    return(responses);
                }

                DataSet dsQR = WorkListSCPService.Service.RequestData(Program.ConfigMgt.Config.Rule, dsQC);

                if (dsQR == null)
                {
                    Program.Log.Write(prefix + "[WARNING] Query GC Gateway database failed.");
                    responses.Add(new DicomCFindResponse(request, DicomStatus.QueryRetrieveUnableToProcess));
                    return(responses);
                }
                WorklistSCPHelper.GenerateRequestedProcedureID(dsQR, session);

                if (WorklistSCPHelper.SplitDataRow(dsQR))
                {
                    Program.Log.Write(prefix + "[INFORMATION] Found multiple values in code value and performed splitting.");
                }

                //fname = path + "\\DataSet_QR_2_SPLIT_" + DateTime.Now.Ticks.ToString() + ".xml";
                //dsQR.WriteXml(fname);

                DElementListWrapper[] resultList = null;

                if (Program.ConfigMgt.Config.MergeElementList)
                {
                    resultList = WorklistSCPHelper.CreateQRElementList
                                 <MWLQueryResultItem>(WorkListSCPService.Service.QRList, dsQR);
                }
                else
                {
                    resultList = DicomMappingHelper.CreateQRElementList
                                 <MWLQueryResultItem>(WorkListSCPService.Service.QRList, dsQR);
                }

                if (resultList == null)
                {
                    Program.Log.Write(prefix + "[WARNING] Process query result failed.");
                    responses.Add(new DicomCFindResponse(request, DicomStatus.QueryRetrieveUnableToProcess));
                    return(responses);
                }

                int count = resultList.Length;
                if (count < 1)
                {
                    Program.Log.Write(prefix + "[WARNING] No query result.");
                }
                else
                {
                    int index = 1;
                    foreach (DElementListWrapper eleList in resultList)
                    {
                        Program.Log.Write(prefix + "Sending query result " + (index++).ToString() + "/" + count.ToString());

                        DicomDataset result = new DicomDataset();
                        if (Program.ConfigMgt.Config.SendCharacterSetTag)
                        {
                            //eleList.List.Add(DHelper.CharacterSet);
                            if (DHelper.iCharacterSet != null)
                            {
                                for (int i = 0; i < DHelper.iCharacterSet.Length; i++)
                                {
                                    eleList.List.Add <string>(DicomTag.SpecificCharacterSet, DHelper.iCharacterSet[i]);
                                }
                            }
                        }

                        eleList.List.Add <string>(new DicomTag(0x0000, 0x0002), "1.2.840.10008.5.1.4.31");

                        DicomCFindResponse response = new DicomCFindResponse(request, DicomStatus.Pending);
                        response.Dataset = eleList.List;
                        responses.Add(response);
                    }
                }
            }
            responses.Add(new DicomCFindResponse(request, DicomStatus.Success));
            return(responses);
        }