private DicomNCreateResponse CreateFilmSession(DicomNCreateRequest request) { if (_filmSession != null) { this.Logger.Error("Attemted to create new basic film session on association with {0}", CallingAE); SendAbort(DicomAbortSource.ServiceProvider, DicomAbortReason.NotSpecified); return(new DicomNCreateResponse(request, DicomStatus.NoSuchObjectInstance)); } var pc = request.PresentationContext; bool isColor = pc != null && pc.AbstractSyntax == DicomUID.BasicColorPrintManagementMetaSOPClass; _filmSession = new FilmSession(request.SOPClassUID, request.SOPInstanceUID, request.Dataset, isColor); this.Logger.Info("Create new film session {0}", _filmSession.SOPInstanceUID.UID); if (request.SOPInstanceUID == null || request.SOPInstanceUID.UID == string.Empty) { request.Command.AddOrUpdate(DicomTag.AffectedSOPInstanceUID, _filmSession.SOPInstanceUID); } var response = new DicomNCreateResponse(request, DicomStatus.Success); return(response); }
private DicomNCreateResponse CreateFilmBox(DicomNCreateRequest request) { if (_filmSession == null) { this.Logger.Error("A basic film session does not exist for this association {0}", CallingAE); SendAbort(DicomAbortSource.ServiceProvider, DicomAbortReason.NotSpecified); return(new DicomNCreateResponse(request, DicomStatus.NoSuchObjectInstance)); } var filmBox = _filmSession.CreateFilmBox(request.SOPInstanceUID, request.Dataset); if (!filmBox.Initialize()) { this.Logger.Error("Failed to initialize requested film box {0}", filmBox.SOPInstanceUID.UID); SendAbort(DicomAbortSource.ServiceProvider, DicomAbortReason.NotSpecified); return(new DicomNCreateResponse(request, DicomStatus.ProcessingFailure)); } this.Logger.Info("Created new film box {0}", filmBox.SOPInstanceUID.UID); var response = new DicomNCreateResponse(request, DicomStatus.Success); response.Command.Add(DicomTag.AffectedSOPInstanceUID, filmBox.SOPInstanceUID); response.Dataset = filmBox; return(response); }
public async Task AcceptStoreContexts() { int port = Ports.GetNext(); using (DicomServerFactory.Create <AcceptOnlyEchoStoreProvider>(port)) { var echoReq = new DicomCEchoRequest(); DicomStatus echoStatus = DicomStatus.Pending; echoReq.OnResponseReceived += (req, resp) => echoStatus = resp.Status; var storeReq = new DicomCStoreRequest(TestData.Resolve("CT1_J2KI")); DicomStatus storeStatus = DicomStatus.Pending; storeReq.OnResponseReceived += (req, resp) => storeStatus = resp.Status; var filmSession = new FilmSession(DicomUID.BasicFilmSession, DicomUID.Generate()); var printReq = new DicomNCreateRequest(filmSession.SOPClassUID, filmSession.SOPInstanceUID); DicomStatus printStatus = DicomStatus.Pending; printReq.OnResponseReceived += (req, resp) => printStatus = resp.Status; var client = DicomClientFactory.Create("127.0.0.1", port, false, "SCU", "ANY-SCP"); await client.AddRequestsAsync(new DicomRequest[] { echoReq, storeReq, printReq }); await client.SendAsync(); Assert.Equal(DicomStatus.Success, echoStatus); Assert.Equal(DicomStatus.Success, storeStatus); Assert.Equal(DicomStatus.SOPClassNotSupported, printStatus); } }
public async Task OnNCreateRequestAsync_ShouldRespond() { var port = Ports.GetNext(); using (DicomServerFactory.Create <AsyncDicomNServiceProvider>(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); DicomNCreateResponse response = null; DicomRequest.OnTimeoutEventArgs timeout = null; var request = new DicomNCreateRequest( DicomUID.BasicFilmSession, new DicomUID("1.2.3", null, DicomUidType.SOPInstance)) { 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); } }
public DicomNCreateResponse OnNCreateRequest(DicomNCreateRequest request) { UpdateMppsStatusInLocalCollections(request); var resp = new DicomNCreateResponse(request, DicomStatus.Success); return(resp); }
public void Print() { var dicomClient = new DicomClient(); dicomClient.NegotiateAsyncOps(); dicomClient.AddRequest( new DicomNCreateRequest(FilmSession.SOPClassUID, FilmSession.SOPInstanceUID) { Dataset = FilmSession }); foreach (var filmbox in FilmSession.BasicFilmBoxes) { var imageBoxRequests = new List <DicomNSetRequest>(); var filmBoxRequest = new DicomNCreateRequest(FilmBox.SOPClassUID, filmbox.SOPInstanceUID) { Dataset = filmbox }; filmBoxRequest.OnResponseReceived = (request, response) => { if (response.HasDataset) { var seq = response.Dataset.Get <DicomSequence>(DicomTag.ReferencedImageBoxSequence); for (int i = 0; i < seq.Items.Count; i++) { var req = imageBoxRequests[i]; var imageBox = req.Dataset; var sopInstanceUid = seq.Items[i].Get <string>(DicomTag.ReferencedSOPInstanceUID); imageBox.Add(DicomTag.SOPInstanceUID, sopInstanceUid); req.Command.Add(DicomTag.RequestedSOPInstanceUID, sopInstanceUid); } } }; dicomClient.AddRequest(filmBoxRequest); foreach (var image in filmbox.BasicImageBoxes) { var req = new DicomNSetRequest(image.SOPClassUID, image.SOPInstanceUID) { Dataset = image }; imageBoxRequests.Add(req); dicomClient.AddRequest(req); } } dicomClient.AddRequest(new DicomNActionRequest(FilmSession.SOPClassUID, FilmSession.SOPInstanceUID, 0x0001)); dicomClient.Send(RemoteAddress, RemotePort, false, CallingAE, CalledAE); }
public void SOPInstanceUIDGetter_SOPInstanceUIDNotDefinedInConstruction_IsNotDefinedInRequest() { var command = new DicomDataset { { DicomTag.CommandField, (ushort)DicomCommandField.NCreateRequest }, { DicomTag.MessageID, (ushort)1 }, { DicomTag.AffectedSOPClassUID, "1.2.3" } }; var request = new DicomNCreateRequest(command); var expected = request.SOPInstanceUID; Assert.Null(expected); }
private DicomNCreateResponse CreatePresentationLut(DicomNCreateRequest request) { if (_filmSession == null) { Logger.Error("Film Session on association with {0} does not exist", CallingAE); SendAbort(DicomAbortSource.ServiceProvider, DicomAbortReason.NotSpecified); return(new DicomNCreateResponse(request, DicomStatus.NoSuchObjectInstance)); } _filmSession.CreatePresentationLut(request.SOPInstanceUID, request.Dataset); var response = new DicomNCreateResponse(request, DicomStatus.Success); response.Command.Add(DicomTag.AffectedSOPInstanceUID, _filmSession.SOPInstanceUID); return(response); }
public void Constructor_FromRequestWithoutSopInstanceUid_ShouldNotThrow() { var request = new DicomNCreateRequest(new DicomDataset { { DicomTag.CommandField, (ushort)DicomCommandField.NCreateRequest }, { DicomTag.MessageID, (ushort)1 }, { DicomTag.AffectedSOPClassUID, "1.2.3" } }); DicomNCreateResponse response = null; var exception = Record.Exception(() => response = new DicomNCreateResponse(request, DicomStatus.Success)); Assert.Null(exception); Assert.Null(response.SOPInstanceUID); }
public DicomNCreateResponse OnNCreateRequest(DicomNCreateRequest request) { lock (_synchRoot) { if (request.SOPClassUID == DicomUID.BasicFilmSessionSOPClass) { return(CreateFilmSession(request)); } else if (request.SOPClassUID == DicomUID.BasicFilmBoxSOPClass) { return(CreateFilmBox(request)); } else { return(new DicomNCreateResponse(request, DicomStatus.SOPClassNotSupported)); } } }
public Task <DicomNCreateResponse> OnNCreateRequestAsync(DicomNCreateRequest request) { lock (_synchRoot) { if (request.SOPClassUID == DicomUID.BasicFilmSession) { return(Task.FromResult(CreateFilmSession(request))); } else if (request.SOPClassUID == DicomUID.BasicFilmBox) { return(Task.FromResult(CreateFilmBox(request))); } else { return(Task.FromResult(new DicomNCreateResponse(request, DicomStatus.SOPClassNotSupported))); } } }
public DicomNCreateResponse OnNCreateRequest(DicomNCreateRequest request) { if (request.SOPClassUID != DicomUID.ModalityPerformedProcedureStepSOPClass) { return(new DicomNCreateResponse(request, DicomStatus.SOPClassNotSupported)); } // on N-Create the UID is stored in AffectedSopInstanceUID, in N-Set the UID is stored in RequestedSopInstanceUID var affectedSopInstanceUID = request.Command.GetSingleValue <string>(DicomTag.AffectedSOPInstanceUID); Logger.Info($"recieving N-Create with SopUID {affectedSopInstanceUID}"); // get the procedureStepIds from request var procedureStepId = request.Dataset.GetSequence(DicomTag.ScheduledStepAttributesSequence) .First() .GetSingleValue <string>(DicomTag.ScheduledProcedureStepID); bool ok = MppsSource.SetInProgress(affectedSopInstanceUID, procedureStepId); return(new DicomNCreateResponse(request, ok ? DicomStatus.Success : DicomStatus.ProcessingFailure)); }
/// <summary> /// Initizalizes a new instance of the <see cref="DicomNCreateResponse"/> class. /// </summary> /// <param name="request">Associated N-CREATE request.</param> /// <param name="status">Response status.</param> public DicomNCreateResponse(DicomNCreateRequest request, DicomStatus status) : base(request, status) { SOPInstanceUID = request.SOPInstanceUID; }
private static (DicomUID affectedInstanceUid, string responseStatus, string responseMessage) SendMppsInProgress(string serverIP, int serverPort, string serverAET, string clientAET, DicomDataset worklistItem) { var client = new DicomClient(); var dataset = new DicomDataset(); DicomSequence procedureStepSq = worklistItem.GetSequence(DicomTag.ScheduledProcedureStepSequence); // A worklistitem may have a list of scheduledprocedureSteps. // For each of them you have to send separate MPPS InProgress- and Completed-messages. // there in this example we will only send for the first procedure step var procedureStep = procedureStepSq.First(); DicomDataset content = new DicomDataset(); // get study instance UID from MWL query resault string studyInstanceUID = worklistItem.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, DicomUID.Generate().ToString()); // set Attribute Sequence data content.Add(DicomTag.StudyInstanceUID, studyInstanceUID); content.Add(DicomTag.ReferencedStudySequence, new DicomDataset()); content.Add(DicomTag.AccessionNumber, worklistItem.GetSingleValueOrDefault(DicomTag.AccessionNumber, String.Empty)); content.Add(DicomTag.RequestedProcedureID, worklistItem.GetSingleValueOrDefault(DicomTag.RequestedProcedureID, String.Empty)); content.Add(DicomTag.RequestedProcedureDescription, worklistItem.GetSingleValueOrDefault(DicomTag.RequestedProcedureDescription, String.Empty)); content.Add(DicomTag.ScheduledProcedureStepID, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, String.Empty)); content.Add(DicomTag.ScheduledProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepDescription, String.Empty)); content.Add(DicomTag.ScheduledProtocolCodeSequence, new DicomDataset()); DicomSequence attr_Sequence = new DicomSequence(DicomTag.ScheduledStepAttributesSequence, content);//"Scheduled Step Attribute Sequence" dataset.Add(attr_Sequence); dataset.Add(DicomTag.PatientName, worklistItem.GetSingleValueOrDefault(DicomTag.PatientName, String.Empty)); dataset.Add(DicomTag.PatientID, worklistItem.GetSingleValueOrDefault(DicomTag.PatientID, String.Empty)); dataset.Add(DicomTag.PatientBirthDate, worklistItem.GetSingleValueOrDefault(DicomTag.PatientBirthDate, String.Empty)); dataset.Add(DicomTag.PatientSex, worklistItem.GetSingleValueOrDefault(DicomTag.PatientSex, String.Empty)); dataset.Add(DicomTag.ReferencedPatientSequence, new DicomDataset()); dataset.Add(DicomTag.PerformedProcedureStepID, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, String.Empty)); dataset.Add(DicomTag.PerformedStationAETitle, PerformedStationAETitle); dataset.Add(DicomTag.PerformedStationName, PerformedStationName); dataset.Add(DicomTag.PerformedLocation, string.Empty); dataset.Add(DicomTag.PerformedProcedureStepStartDate, DateTime.Now); dataset.Add(DicomTag.PerformedProcedureStepStartTime, DateTime.Now); // set status dataset.Add(DicomTag.PerformedProcedureStepStatus, "IN PROGRESS"); dataset.Add(DicomTag.PerformedProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, String.Empty)); dataset.Add(DicomTag.PerformedProcedureTypeDescription, string.Empty); dataset.Add(DicomTag.PerformedProcedureStepEndDate, string.Empty); dataset.Add(DicomTag.PerformedProcedureStepEndTime, string.Empty); // get modality from MWL query resault dataset.Add(DicomTag.Modality, procedureStep.GetSingleValueOrDefault(DicomTag.Modality, String.Empty)); dataset.Add(DicomTag.StudyID, worklistItem.GetSingleValueOrDefault(DicomTag.StudyID, string.Empty)); dataset.Add(DicomTag.PerformedProtocolCodeSequence, new DicomDataset()); // create an unique UID as the effectedinstamceUid, this id will be needed for the N-SET also DicomUID effectedinstamceUid = DicomUID.Generate("effectedinstamceUid"); var dicomStartRequest = new DicomNCreateRequest(DicomUID.ModalityPerformedProcedureStepSOPClass, effectedinstamceUid) { Dataset = dataset }; string responseStatus = string.Empty; string responseMessage = string.Empty; dicomStartRequest.OnResponseReceived += (req, response) => { if (response != null) { Console.WriteLine(response); responseStatus = response.Status.ToString(); responseMessage = response.ToString(); } }; client.AddRequest(dicomStartRequest); client.SendAsync(serverIP, serverPort, false, clientAET, serverAET).Wait(); return(effectedinstamceUid, responseStatus, responseMessage); }
public DicomNCreateResponse(DicomNCreateRequest request, DicomStatus status) : base(request, status) { }
public DicomNCreateResponse OnNCreateRequest(DicomNCreateRequest request) { throw new NotImplementedException(); }
public static string SendPrintTask(string callingAE, string calledAE, string calledIP, int calledPort, string taskPath) { PrintTaskInfo task = new PrintTaskInfo() { CallingAETitle = callingAE, TaskPath = taskPath }; string strErr = string.Empty; LogManager.Instance.Log("Start to send print task: " + taskPath); try { DirectoryInfo dirTask = new DirectoryInfo(taskPath); if (!dirTask.Exists) { throw new Exception("invalid task path"); } string filmSessionFile = Path.Combine(taskPath, "FilmSession.dcm"); if (!File.Exists(filmSessionFile)) { throw new Exception("can't find film session file"); } //load filmSession from dcmFile FilmSession filmSession = FilmSession.Load(filmSessionFile); //load filmBox from dcmFiles var subDirs = dirTask.EnumerateDirectories(); foreach (DirectoryInfo dirFilmBox in subDirs) { FilmBox filmBox = FilmBox.Load(filmSession, dirFilmBox.FullName); filmSession.BasicFilmBoxes.Add(filmBox); } var dicomClient = new DicomClient(); var filmSessionRequest = new DicomNCreateRequest(filmSession.SOPClassUID, filmSession.SOPInstanceUID); filmSessionRequest.Dataset = filmSession; dicomClient.AddRequest(filmSessionRequest); foreach (var filmbox in filmSession.BasicFilmBoxes) { var imageBoxRequests = new List <DicomNSetRequest>(); var filmBoxRequest = new DicomNCreateRequest(FilmBox.SOPClassUID, filmbox.SOPInstanceUID); filmBoxRequest.Dataset = filmbox; filmBoxRequest.OnResponseReceived = (request, response) => { if (response.HasDataset) { var seq = response.Dataset.Get <DicomSequence>(DicomTag.ReferencedImageBoxSequence); for (int i = 0; i < seq.Items.Count; i++) { var req = imageBoxRequests[i]; var imageBox = req.Dataset; var sopInstanceUid = seq.Items[i].Get <string>(DicomTag.ReferencedSOPInstanceUID); imageBox.AddOrUpdate(DicomTag.SOPInstanceUID, sopInstanceUid); req.Command.AddOrUpdate(DicomTag.RequestedSOPInstanceUID, sopInstanceUid); } } }; dicomClient.AddRequest(filmBoxRequest); foreach (var image in filmbox.BasicImageBoxes) { var req = new DicomNSetRequest(image.SOPClassUID, image.SOPInstanceUID) { Dataset = image }; imageBoxRequests.Add(req); dicomClient.AddRequest(req); } } dicomClient.AddRequest(new DicomNActionRequest(filmSession.SOPClassUID, filmSession.SOPInstanceUID, 0x0001)); dicomClient.Send(calledIP, calledPort, false, callingAE, calledAE); task.HasError = false; if (PrintTaskEvent != null) { PrintTaskEvent(task); } } catch (Exception e) { strErr = e.Message; LogManager.Instance.Log("Send task failed due to " + e.Message); task.HasError = true; task.ErrorMessage = e.Message; if (PrintTaskEvent != null) { PrintTaskEvent(task); } } return(strErr); }
public Task <DicomNCreateResponse> OnNCreateRequestAsync(DicomNCreateRequest request) => Task.FromResult(new DicomNCreateResponse(request, DicomStatus.Success) { Dataset = request.Dataset });
public async Task <(DicomUID affectedInstanceUid, string studyInstanceUid, bool result)> SendMppsInProgressAsync(string serverIp, int serverPort, string serverAET, string localAET, DicomDataset worklistItem) { DicomSequence procedureStepSeq = worklistItem.GetSequence(DicomTag.ScheduledProcedureStepSequence); // A worklistitem may have a list of scheduledprocedureSteps. // For each of them you have to send separate MPPS InProgress- and Completed-messages. // there in this example we will only send for the first procedure step DicomDataset procedureStep = procedureStepSeq.First(); // get study instance UID from MWL query resault string studyInstanceUID = worklistItem.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, DicomUIDGenerator.GenerateDerivedFromUUID().UID); DicomDataset dataset = new DicomDataset { { DicomTag.PatientName, worklistItem.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty) }, { DicomTag.PatientID, worklistItem.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty) }, { DicomTag.PatientBirthDate, worklistItem.GetSingleValueOrDefault(DicomTag.PatientBirthDate, string.Empty) }, { DicomTag.PatientSex, worklistItem.GetSingleValueOrDefault(DicomTag.PatientSex, string.Empty) }, { DicomTag.StudyID, worklistItem.GetSingleValueOrDefault(DicomTag.StudyID, string.Empty) }, { DicomTag.StudyInstanceUID, studyInstanceUID }, { DicomTag.PerformedProcedureStepID, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty) }, { DicomTag.PerformedProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty) }, // set status { DicomTag.PerformedProcedureStepStatus, IN_PROGRESS }, { DicomTag.PerformedProcedureTypeDescription, string.Empty }, { DicomTag.PerformedProcedureStepStartDate, DateTime.Now }, { DicomTag.PerformedProcedureStepStartTime, DateTime.Now }, { DicomTag.PerformedProcedureStepEndDate, string.Empty }, { DicomTag.PerformedProcedureStepEndTime, string.Empty }, { DicomTag.PerformedLocation, string.Empty }, { DicomTag.PerformedStationAETitle, localAET }, { DicomTag.PerformedStationName, localAET }, // get modality from MWL query result { DicomTag.Modality, procedureStep.GetSingleValueOrDefault(DicomTag.Modality, string.Empty) }, { DicomTag.PerformedProtocolCodeSequence, new DicomDataset() }, { DicomTag.ProcedureCodeSequence, new DicomDataset() }, { DicomTag.ReferencedPatientSequence, new DicomDataset() } }; // set Attribute Sequence data DicomDataset content = new DicomDataset { { DicomTag.AccessionNumber, worklistItem.GetSingleValueOrDefault(DicomTag.AccessionNumber, string.Empty) }, { DicomTag.StudyInstanceUID, studyInstanceUID }, { DicomTag.ReferencedStudySequence, new DicomDataset() }, { DicomTag.RequestedProcedureID, worklistItem.GetSingleValueOrDefault(DicomTag.RequestedProcedureID, string.Empty) }, { DicomTag.RequestedProcedureDescription, worklistItem.GetSingleValueOrDefault(DicomTag.RequestedProcedureDescription, string.Empty) }, { DicomTag.ScheduledProcedureStepID, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepID, string.Empty) }, { DicomTag.ScheduledProcedureStepDescription, procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepDescription, string.Empty) }, { DicomTag.ScheduledProtocolCodeSequence, new DicomDataset() } }; DicomSequence attr_Sequence = new DicomSequence(DicomTag.ScheduledStepAttributesSequence, content);//"Scheduled Step Attribute Sequence" dataset.Add(attr_Sequence); dataset.Add(DicomTag.PerformedSeriesSequence, new DicomDataset()); // create an unique UID as the effectedinstamceUid, this id will be needed for the N-SET also DicomUID effectedinstamceUid = DicomUID.Generate(); DicomNCreateRequest dicomStartRequest = new DicomNCreateRequest(DicomUID.ModalityPerformedProcedureStepSOPClass, effectedinstamceUid) { Dataset = dataset }; bool result = false; dicomStartRequest.OnResponseReceived += (req, res) => { if (res != null) { if (res.Status == DicomStatus.Success) { Logger.Debug("Set study [{0}] [In Progress] Success.", studyInstanceUID); result = true; } else { Logger.Warn("Set study [{0}] [In Progress] Failed. [{1}]", studyInstanceUID, res.Status); } } }; DicomClient client = new DicomClient(serverIp, serverPort, false, localAET, serverAET); await client.AddRequestAsync(dicomStartRequest); await client.SendAsync(); return(effectedinstamceUid, studyInstanceUID, result); }
public Task <DicomNCreateResponse> OnNCreateRequestAsync(DicomNCreateRequest request) => throw new NotImplementedException();