Beispiel #1
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);
        }