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