protected static IList<DicomAttributeCollection> Query(IApplicationEntity server, DicomAttributeCollection requestCollection) { //special case code for ModalitiesInStudy. An IStudyFinder must accept a multi-valued //string for ModalitiesInStudy (e.g. "MR\\CT") and process it appropriately for the //datasource that is being queried. In this case (Dicom) does not allow multiple //query keys, so we have to execute one query per modality specified in the //ModalitiesInStudy query item. List<string> modalityFilters = new List<string>(); if (requestCollection.Contains(DicomTags.ModalitiesInStudy)) { string modalityFilterString = requestCollection[DicomTags.ModalitiesInStudy].ToString(); if (!String.IsNullOrEmpty(modalityFilterString)) modalityFilters.AddRange(modalityFilterString.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries)); if (modalityFilters.Count == 0) modalityFilters.Add(""); //make sure there is at least one filter, the default. } SortedList<string, DicomAttributeCollection> resultsByStudy = new SortedList<string, DicomAttributeCollection>(); string combinedFilter = requestCollection[DicomTags.ModalitiesInStudy]; try { foreach (string modalityFilter in modalityFilters) { using (StudyRootFindScu scu = new StudyRootFindScu()) { requestCollection[DicomTags.ModalitiesInStudy].SetStringValue(modalityFilter); IList<DicomAttributeCollection> results = scu.Find( DicomServer.AETitle, server.AETitle, server.ScpParameters.HostName, server.ScpParameters.Port, requestCollection); scu.Join(new TimeSpan(0, 0, 0, 0, 1000)); if(scu.Status == ScuOperationStatus.Canceled) { String message = String.Format(SR.MessageFormatRemoteServerCancelledFind, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.ConnectFailed) { String message = String.Format(SR.MessageFormatConnectionFailed, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } else if (scu.Status == ScuOperationStatus.AssociationRejected) { String message = String.Format(SR.MessageFormatAssociationRejected, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.Failed) { String message = String.Format(SR.MessageFormatQueryOperationFailed, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.TimeoutExpired) { String message = String.Format(SR.MessageFormatConnectTimeoutExpired, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.NetworkError) { throw new DicomException(SR.MessageUnexpectedNetworkError); } if (scu.Status == ScuOperationStatus.UnexpectedMessage) { throw new DicomException(SR.MessageUnexpectedMessage); } //if this function returns true, it means that studies came back whose //modalities did not match the filter, meaning that filtering on //ModalitiesInStudy is not supported by that server. if (FilterResultsByModality(results, resultsByStudy, modalityFilter)) break; } } return new List<DicomAttributeCollection>(resultsByStudy.Values); } finally { //for consistencies sake, put the original filter back. requestCollection[DicomTags.ModalitiesInStudy].SetStringValue(combinedFilter); } }
private static int QueryDicomServer(Order order, string shredAETitle, string dicomServerAETitle, string dicomServerHost, int dicomServerPort, out bool studiesNotFound) { DicomAttributeCollection requestCollection = new DicomAttributeCollection(); requestCollection[DicomTags.QueryRetrieveLevel].SetStringValue("STUDY"); requestCollection[DicomTags.StudyInstanceUid].SetStringValue(""); requestCollection[DicomTags.AccessionNumber].SetStringValue(order.AccessionNumber); requestCollection[DicomTags.NumberOfStudyRelatedInstances].SetStringValue(""); int numberOfInstancesFromDicomServer = 0; using (StudyRootFindScu scu = new StudyRootFindScu()) { IList<DicomAttributeCollection> results = scu.Find( shredAETitle, dicomServerAETitle, dicomServerHost, dicomServerPort, requestCollection); // Wait for a response scu.Join(new TimeSpan(0, 0, 0, 0, 1000)); if (scu.Status == ScuOperationStatus.Canceled) { String message = String.Format(SR.MessageFormatDicomRemoteServerCancelledFind, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.ConnectFailed) { String message = String.Format(SR.MessageFormatDicomConnectionFailed, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.Failed) { String message = String.Format(SR.MessageFormatDicomQueryOperationFailed, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.TimeoutExpired) { String message = String.Format(SR.MessageFormatDicomConnectTimeoutExpired, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } foreach (DicomAttributeCollection result in results) { numberOfInstancesFromDicomServer += (int) result[DicomTags.NumberOfStudyRelatedInstances].GetUInt32(0, 0); } studiesNotFound = results.Count == 0; } return numberOfInstancesFromDicomServer; }
protected static IList <DicomAttributeCollection> Query(IApplicationEntity server, DicomAttributeCollection requestCollection) { //special case code for ModalitiesInStudy. An IStudyFinder must accept a multi-valued //string for ModalitiesInStudy (e.g. "MR\\CT") and process it appropriately for the //datasource that is being queried. In this case (Dicom) does not allow multiple //query keys, so we have to execute one query per modality specified in the //ModalitiesInStudy query item. List <string> modalityFilters = new List <string>(); if (requestCollection.Contains(DicomTags.ModalitiesInStudy)) { string modalityFilterString = requestCollection[DicomTags.ModalitiesInStudy].ToString(); if (!String.IsNullOrEmpty(modalityFilterString)) { modalityFilters.AddRange(modalityFilterString.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries)); } if (modalityFilters.Count == 0) { modalityFilters.Add(""); //make sure there is at least one filter, the default. } } SortedList <string, DicomAttributeCollection> resultsByStudy = new SortedList <string, DicomAttributeCollection>(); string combinedFilter = requestCollection[DicomTags.ModalitiesInStudy]; try { foreach (string modalityFilter in modalityFilters) { using (StudyRootFindScu scu = new StudyRootFindScu()) { requestCollection[DicomTags.ModalitiesInStudy].SetStringValue(modalityFilter); IList <DicomAttributeCollection> results = scu.Find( DicomServer.AETitle, server.AETitle, server.ScpParameters.HostName, server.ScpParameters.Port, requestCollection); scu.Join(new TimeSpan(0, 0, 0, 0, 1000)); if (scu.Status == ScuOperationStatus.Canceled) { String message = String.Format(SR.MessageFormatRemoteServerCancelledFind, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.ConnectFailed) { String message = String.Format(SR.MessageFormatConnectionFailed, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } else if (scu.Status == ScuOperationStatus.AssociationRejected) { String message = String.Format(SR.MessageFormatAssociationRejected, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.Failed) { String message = String.Format(SR.MessageFormatQueryOperationFailed, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.TimeoutExpired) { String message = String.Format(SR.MessageFormatConnectTimeoutExpired, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.NetworkError) { throw new DicomException(SR.MessageUnexpectedNetworkError); } if (scu.Status == ScuOperationStatus.UnexpectedMessage) { throw new DicomException(SR.MessageUnexpectedMessage); } //if this function returns true, it means that studies came back whose //modalities did not match the filter, meaning that filtering on //ModalitiesInStudy is not supported by that server. if (FilterResultsByModality(results, resultsByStudy, modalityFilter)) { break; } } } return(new List <DicomAttributeCollection>(resultsByStudy.Values)); } finally { //for consistencies sake, put the original filter back. requestCollection[DicomTags.ModalitiesInStudy].SetStringValue(combinedFilter); } }
private static int QueryDicomServer(Order order, string shredAETitle, string dicomServerAETitle, string dicomServerHost, int dicomServerPort, out bool studiesNotFound) { DicomAttributeCollection requestCollection = new DicomAttributeCollection(); requestCollection[DicomTags.QueryRetrieveLevel].SetStringValue("STUDY"); requestCollection[DicomTags.StudyInstanceUid].SetStringValue(""); requestCollection[DicomTags.AccessionNumber].SetStringValue(order.AccessionNumber); requestCollection[DicomTags.NumberOfStudyRelatedInstances].SetStringValue(""); int numberOfInstancesFromDicomServer = 0; using (StudyRootFindScu scu = new StudyRootFindScu()) { IList <DicomAttributeCollection> results = scu.Find( shredAETitle, dicomServerAETitle, dicomServerHost, dicomServerPort, requestCollection); // Wait for a response scu.Join(new TimeSpan(0, 0, 0, 0, 1000)); if (scu.Status == ScuOperationStatus.Canceled) { String message = String.Format(SR.MessageFormatDicomRemoteServerCancelledFind, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.ConnectFailed) { String message = String.Format(SR.MessageFormatDicomConnectionFailed, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.Failed) { String message = String.Format(SR.MessageFormatDicomQueryOperationFailed, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } if (scu.Status == ScuOperationStatus.TimeoutExpired) { String message = String.Format(SR.MessageFormatDicomConnectTimeoutExpired, scu.FailureDescription ?? "no failure description provided"); throw new DicomException(message); } foreach (DicomAttributeCollection result in results) { numberOfInstancesFromDicomServer += (int)result[DicomTags.NumberOfStudyRelatedInstances].GetUInt32(0, 0); } studiesNotFound = results.Count == 0; } return(numberOfInstancesFromDicomServer); }