Ejemplo n.º 1
0
        void IDicomServerHandler.OnReceiveRequestMessage(DicomServer server, ServerAssociationParameters association, byte presentationID, DicomMessage message)
        {
            //_sessionDebug.SetAssociationDumpString(association);
            //_sessionDebug._request = message.Dump();

            #region Cancel request
            if (message.CommandField == DicomCommandField.CCancelRequest)
            {
                Platform.Log(LogLevel.Info,string.Format("Received CANCEL-RQ message from {0}.", association.CallingAE));
                _cancelReceived = true;
                return;
            }
            #endregion

            #region CEcho request
            if (message.CommandField == DicomCommandField.CEchoRequest)
            {
                server.SendCEchoResponse(presentationID, message.MessageId, DicomStatuses.Success);
                Platform.Log(LogLevel.Info,string.Format("Received ECHO-RQ message from {0}.", association.CallingAE));
                return;
            }
            #endregion

            #region MWL C-FIND request
            if (message.CommandField == DicomCommandField.CFindRequest)
            {                
                Platform.Log(LogLevel.Info,string.Format("Message Dumped :\n" + message.Dump("", DicomDumpOptions.KeepGroupLengthElements)));

                String level = message.DataSet[DicomTags.QueryRetrieveLevel].GetString(0, string.Empty);

                _cancelReceived = false;

                if (message.AffectedSopClassUid.Equals(SopClass.ModalityWorklistInformationModelFindUid))
                    OnReceiveMWLQuery(server, presentationID, message);                    
                else
                   // Not supported message type, send a failure status.
                    server.SendCFindResponse(presentationID, message.MessageId, new DicomMessage(),
                                                DicomStatuses.QueryRetrieveIdentifierDoesNotMatchSOPClass);
                return;

            }
            #endregion          

            //ignore all unsupported request

            server.SendAssociateAbort(DicomAbortSource.ServiceProvider, DicomAbortReason.UnexpectedPDU);
            Platform.Log(LogLevel.Info,string.Format("Unexpected Command. Send Associate Abort message from server to {0}.", association.CallingAE));
            return; 
           
        }
Ejemplo n.º 2
0
        void IDicomServerHandler.OnReceiveRequestMessage(DicomServer server, ServerAssociationParameters association, byte presentationID, DicomMessage message)
        {
            //_sessionDebug.SetAssociationDumpString(association);
            //_sessionDebug._request = message.Dump();

            #region CEcho request
            if (message.CommandField == DicomCommandField.CEchoRequest)
            {
                server.SendCEchoResponse(presentationID, message.MessageId, DicomStatuses.Success);
                Platform.Log(LogLevel.Info, "Received ECHO-RQ message from {0}.", association.CallingAE);
                return;
            }
            #endregion

            #region MPPS NCreate Request
            if (message.CommandField == DicomCommandField.NCreateRequest)
            {
                // june -1st-2009 :
                // Unlike the "ModalityWorklistIod"  class, the 'partially' implemented ModalityPerformedProcedureStepIod class could 
                // be usefull here.
                
                ModalityPerformedProcedureStepIod mppsIod = new ModalityPerformedProcedureStepIod(message.DataSet);

                Platform.Log(LogLevel.Info, "Message Dumped :\n" + message.Dump("", DicomDumpOptions.KeepGroupLengthElements));

                // checking message for error and anomalies

                bool conform = CheckNCreateDataSetConformance(server, association, presentationID, mppsIod, true);

                if (!conform)
                {
                    server.SendNCreateResponse(presentationID, message.MessageId, new DicomMessage(), DicomStatuses.InvalidAttributeValue);
                    Platform.Log(LogLevel.Error, "Sending Invalid Attributes Response.");
                    return;
                }

                // wrong status
                if (mppsIod.PerformedProcedureStepInformation.PerformedProcedureStepStatus != ClearCanvas.Dicom.Iod.Modules.PerformedProcedureStepStatus.InProgress)
                {
                    server.SendNCreateResponse(presentationID, message.MessageId, new DicomMessage(), DicomStatuses.InvalidAttributeValue);
                    Platform.Log(LogLevel.Error, "Recieved N-Create Request with bad status.");
                    return;
                }
                // pps already in cache (duplicated step) 
                string cacheKeyId = message.DataSet[DicomTags.AffectedSopInstanceUid].GetString(0, string.Empty);
                bool alreadyCached;
                MPPSScp.CacheMppsEntity(association, cacheKeyId, mppsIod, out alreadyCached);
                if (alreadyCached)
                {
                    server.SendNCreateResponse(presentationID, message.MessageId, new DicomMessage(), DicomStatuses.DuplicateSOPInstance);
                    Platform.Log(LogLevel.Error, "Recieved duplicated N-Create Request.");
                    return;
                }
                if (!ProcessNCreateRequest(server, presentationID, message))
                {
                    server.SendNCreateResponse(presentationID, message.MessageId, new DicomMessage(), DicomStatuses.ProcessingFailure);
                    Platform.Log(LogLevel.Error, "Sending Processing due to NCreate request Failure.");
                    return;
                }
                server.SendNCreateResponse(presentationID, message.MessageId, new DicomMessage(), DicomStatuses.Success);                
                return;

            }
            #endregion

            #region MPPS NSet Request
            if (message.CommandField == DicomCommandField.NSetRequest)
            {
                // june -1st-2009 :
                // Unlike the "ModalityWorklistIod"  class, the ModalityPerformedProcedureStepIod is fully implemented
                // we can use it here. 
                ModalityPerformedProcedureStepIod mppsIod = new ModalityPerformedProcedureStepIod(message.DataSet);

                Platform.Log(LogLevel.Info, "Message Dumped :\n" + message.Dump("", DicomDumpOptions.KeepGroupLengthElements));

                // check if pps already in cache (duplicated step) 
                string cacheKeyId = message.DataSet[DicomTags.AffectedSopInstanceUid].GetString(0, string.Empty);

                if (!IsMppsEntitycached(association, cacheKeyId))
                {
                    server.SendNCreateResponse(presentationID, message.MessageId, new DicomMessage(), DicomStatuses.NoSuchObjectInstance);
                    Platform.Log(LogLevel.Error, "Received Unknown NSset SOP.");
                    return;
                }

                // status diffrent from in progress
                if (mppsIod.PerformedProcedureStepInformation.PerformedProcedureStepStatus == ClearCanvas.Dicom.Iod.Modules.PerformedProcedureStepStatus.InProgress)
                {
                    server.SendNCreateResponse(presentationID, message.MessageId, new DicomMessage(), DicomStatuses.InvalidAttributeValue);
                    Platform.Log(LogLevel.Error, "Recieved N-Set Request with In Progress status.");
                    return;
                }

                // checking the received mppsiod against cached one
                ModalityPerformedProcedureStepIod cachedMppsIod = GetCachedMppsIod(association, cacheKeyId);
                //assuming cachedMppsIod not null.
                bool conform = CheckNSetDataSetConformance(server, association, presentationID, cachedMppsIod, mppsIod, true);

                if (!conform)
                {
                    server.SendNCreateResponse(presentationID, message.MessageId, new DicomMessage(), DicomStatuses.InvalidAttributeValue);
                    Platform.Log(LogLevel.Error, "Sending Failure Response.");
                    return;
                }

                string studyInstanceUID = mppsIod.
                                          PerformedProcedureStepRelationship.
                                          DicomAttributeProvider[DicomTags.StudyInstanceUid].
                                          GetString(0,"");

                XmlElement performedSeriesSQ = GenerateXmlForPerformedSeriesSQ(message,studyInstanceUID);

                bool success = true;

                if (mppsIod.PerformedProcedureStepInformation.PerformedProcedureStepStatus 
                            == ClearCanvas.Dicom.Iod.Modules.PerformedProcedureStepStatus.Completed)
                {
                    success = ProcessNSetRequestForCompleted(server, presentationID, message, performedSeriesSQ);
                }

                if (mppsIod.PerformedProcedureStepInformation.PerformedProcedureStepStatus 
                            == ClearCanvas.Dicom.Iod.Modules.PerformedProcedureStepStatus.Discontinued)
                {
                    success = ProcessNSetRequestForDiscontinued(server, presentationID, message, performedSeriesSQ);
                }

                if (success)
                   server.SendNSetResponse(presentationID, message.MessageId, new DicomMessage(), DicomStatuses.Success); 
                else
                   server.SendNSetResponse(presentationID, message.MessageId, new DicomMessage(), DicomStatuses.ProcessingFailure);
            
                MPPSScp.RemoveMppsEntityFromCache(association, cacheKeyId);
                
                return;
            }

            #endregion

            //ignore all unsupported request
            server.SendAssociateAbort(DicomAbortSource.ServiceProvider, DicomAbortReason.UnexpectedPDU);
            Platform.Log(LogLevel.Info, "Unexpected Command. Send Associate Abort message from server to {0}.", association.CallingAE);
            return;

        }