public CStoreRequestInfo(string fileName, object userModel) { try { _fileName = fileName; if (!File.Exists(fileName)) { throw new FileNotFoundException("Unable to load DICOM file!", fileName); } DicomTag stopTag = (userModel != null) ? DicomTags.PixelData : DcmFileMetaInfo.StopTag; DicomFileFormat ff = new DicomFileFormat(); ff.Load(fileName, stopTag, DicomReadOptions.Default); _transferSyntax = ff.FileMetaInfo.TransferSyntax; _originalTransferSyntax = _transferSyntax; _sopClass = ff.FileMetaInfo.MediaStorageSOPClassUID; _sopInst = ff.FileMetaInfo.MediaStorageSOPInstanceUID; if (userModel != null) { ff.Dataset.LoadDicomFields(userModel); _userState = userModel; } _status = DcmStatus.Pending; } catch (Exception e) { _status = DcmStatus.ProcessingFailure; _exception = e; throw; } }
protected override void OnReceiveNSetResponse(byte presentationID, ushort messageIdRespondedTo, DicomUID affectedClass, DicomUID affectedInstance, DcmDataset dataset, DcmStatus status) { if (_filmSession != null) { // ReSharper disable PossibleUnintendedReferenceComparison if (affectedClass == DicomUID.BasicColorImageBoxSOPClass || affectedClass == DicomUID.BasicGrayscaleImageBoxSOPClass) // ReSharper restore PossibleUnintendedReferenceComparison { if (status == DcmStatus.Success) { DcmImageBox imageBox = _filmSession.FindImageBox(affectedInstance); if (imageBox != null) { _pendingImageBoxResponses.Remove(imageBox); if (_pendingImageBoxResponses.Count == 0) { byte pcid = Associate.FindAbstractSyntax(DicomUID.PrinterSOPClass); SendNActionRequest(pcid, NextMessageID(), DicomUID.BasicFilmSessionSOPClass, _filmSession.SOPInstanceUID, 0x0001, null); } return; } } } } SendAbort(DcmAbortSource.ServiceUser, DcmAbortReason.NotSpecified); }
protected override void OnReceiveCEchoRequest(byte presentationID, ushort messageID, DcmPriority priority) { DcmStatus status = DcmStatus.Success; if (OnCEchoRequest != null) { status = OnCEchoRequest(this, presentationID, messageID, priority); } SendCEchoResponse(presentationID, messageID, status); }
protected override void OnReceiveCGetResponse(byte presentationID, ushort messageID, DcmDataset dataset, DcmStatus status, ushort remain, ushort complete, ushort warning, ushort failure) { if (OnCGetResponse != null) { OnCGetResponse(_current, dataset, status, remain, complete, warning, failure); } if (remain == 0 && status != DcmStatus.Pending) { PerformQueryOrRelease(); } }
protected override void OnReceiveCFindRequest(byte presentationID, ushort messageID, DcmPriority priority, DcmDataset dataset) { DcmStatus status = DcmStatus.QueryRetrieveUnableToProcess; DcmDataset resultDataset = null; if (OnCFindRequest != null) { status = OnCFindRequest(this, presentationID, messageID, priority, dataset); } SendCFindResponse(presentationID, messageID, resultDataset, status); }
protected override void OnReceiveCStoreRequest(byte presentationID, ushort messageID, DicomUID affectedInstance, DcmPriority priority, string moveAE, ushort moveMessageID, DcmDataset dataset, string fileName) { DcmStatus status = DcmStatus.Success; if (OnCStoreRequest != null) { status = OnCStoreRequest(this, presentationID, messageID, affectedInstance, priority, moveAE, moveMessageID, dataset, fileName); } SendCStoreResponse(presentationID, messageID, affectedInstance, status); }
protected override void OnReceiveCMoveRequest(byte presentationID, ushort messageID, string destinationAE, DcmPriority priority, DcmDataset dataset) { DcmStatus status = DcmStatus.QueryRetrieveUnableToProcess; ushort remain = 0; ushort complete = 0; ushort warning = 0; ushort failure = 0; if (OnCMoveRequest != null) { status = OnCMoveRequest(this, presentationID, messageID, destinationAE, priority, dataset, out remain, out complete, out warning, out failure); } SendCMoveResponse(presentationID, messageID, status, remain, complete, warning, failure); }
protected override void OnReceiveNGetResponse(byte presentationID, ushort messageIdRespondedTo, DicomUID affectedClass, DicomUID affectedInstance, DcmDataset dataset, DcmStatus status) { if (OnPrintGetPrinterStatusResponse != null) { var printerstatus = new DcmPrinterStatus(dataset); _acceptedPrinterStatus = OnPrintGetPrinterStatusResponse(printerstatus, status); } if (_acceptedPrinterStatus == false) { SendReleaseRequest(); return; } CreateFilmSession(); }
protected override void OnReceiveNDeleteResponse(byte presentationID, ushort messageIdRespondedTo, DicomUID affectedClass, DicomUID affectedInstance, DcmStatus status) { if (_filmSession != null) { if (affectedClass == DicomUID.BasicFilmBoxSOPClass) { if (status == DcmStatus.Success) { DcmFilmBox filmBox = _filmSession.FindFilmBox(affectedInstance); if (filmBox != null) { _pendingFilmBoxResponses.Remove(filmBox); if (_pendingFilmBoxResponses.Count == 0) { byte pcid = Associate.FindAbstractSyntax(DicomUID.PrinterSOPClass); SendNDeleteRequest(pcid, NextMessageID(), DicomUID.BasicFilmSessionSOPClass, _filmSession.SOPInstanceUID); } return; } } } if (affectedClass == DicomUID.BasicFilmSessionSOPClass) { if (status == DcmStatus.Success) { SendReleaseRequest(); return; } } } SendAbort(DcmAbortSource.ServiceUser, DcmAbortReason.NotSpecified); }
protected override void OnReceiveNEventReportResponse(byte presentationID, ushort messageIdRespondedTo, DicomUID affectedClass, DicomUID affectedInstance, ushort eventTypeID, DcmDataset dataset, DcmStatus status) { if (affectedClass == DicomUID.PrintJobSOPClass) { DcmPrintJob job = null; foreach (DcmPrintJob pj in _jobs) { if (pj.SOPInstanceUID == affectedInstance) { job = pj; break; } } if (job != null && (job.ExecutionStatus == "DONE" || job.ExecutionStatus == "FAILURE")) { _jobs.Remove(job); } return; } }
protected override void OnReceiveNActionResponse(byte presentationID, ushort messageIdRespondedTo, DicomUID affectedClass, DicomUID affectedInstance, ushort actionTypeID, DcmDataset dataset, DcmStatus status) { if (_filmSession != null) { // ReSharper disable PossibleUnintendedReferenceComparison if (affectedClass == DicomUID.BasicFilmSessionSOPClass) // ReSharper restore PossibleUnintendedReferenceComparison { if (status == DcmStatus.Success) { _pendingFilmBoxResponses.Clear(); byte pcid = Associate.FindAbstractSyntax(DicomUID.PrinterSOPClass); foreach (DcmFilmBox filmBox in _filmSession.BasicFilmBoxes) { _pendingFilmBoxResponses.Add(filmBox); SendNDeleteRequest(pcid, NextMessageID(), DicomUID.BasicFilmBoxSOPClass, filmBox.SOPInstanceUID); } return; } } } SendAbort(DcmAbortSource.ServiceUser, DcmAbortReason.NotSpecified); }
protected override void OnReceiveNCreateResponse(byte presentationID, ushort messageIdRespondedTo, DicomUID affectedClass, DicomUID affectedInstance, DcmDataset dataset, DcmStatus status) { if (_filmSession != null) { // ReSharper disable PossibleUnintendedReferenceComparison if (affectedClass == DicomUID.BasicFilmSessionSOPClass) // ReSharper restore PossibleUnintendedReferenceComparison { if (status == DcmStatus.Success) { int filmBoxesCount = CalculateRequiredImageBoxes(); if (filmBoxesCount == 0) { SendReleaseRequest(); return; } for (int i = 0; i < filmBoxesCount; i++) { var uid = DicomUID.Generate(); var filmBoxDataset = new DcmDataset(DicomTransferSyntax.ImplicitVRLittleEndian); var filmBox = _filmSession.CreateFilmBox(uid, filmBoxDataset.Clone()); filmBox.AnnotationDisplayFormatID = _annotationDisplayFormatID; filmBox.BorderDensity = _borderDensity; filmBox.ConfigurationInformation = _configurationInformation; filmBox.EmptyImageDensity = _emptyImageDensity; filmBox.FilmOrientation = _filmOrientation; filmBox.FilmSizeID = _filmSizeID; filmBox.Illumination = _illumination; filmBox.ImageDisplayFormat = _imageDisplayFormat; filmBox.MagnificationType = _magnificationType; filmBox.MaxDensity = _maxDensity; filmBox.MinDensity = _minDensity; filmBox.ReflectedAmbientLight = _reflectedAmbientLight; filmBox.RequestedResolutionID = _requestedResolutionID; filmBox.SmoothingType = _smoothingType; filmBox.Trim = _trim; byte pcid = Associate.FindAbstractSyntax(DicomUID.BasicGrayscalePrintManagementMetaSOPClass); SendNCreateRequest(pcid, NextMessageID(), DicomUID.BasicFilmBoxSOPClass, filmBox.SOPInstanceUID, filmBox.Dataset); } return; } } // ReSharper disable PossibleUnintendedReferenceComparison if (affectedClass == DicomUID.BasicFilmBoxSOPClass) // ReSharper restore PossibleUnintendedReferenceComparison { if (status == DcmStatus.Success) { var filmBox = _filmSession.FindFilmBox(affectedInstance); var filmBoxIndex = _filmSession.BasicFilmBoxes.IndexOf(filmBox); if (filmBox != null) { var referencedImageBoxSequenceList = dataset.GetSQ(DicomTags.ReferencedImageBoxSequence); if (referencedImageBoxSequenceList != null) { foreach (var item in referencedImageBoxSequenceList.SequenceItems) { var referencedSOPInstanceUID = item.Dataset.GetUID(DicomTags.ReferencedSOPInstanceUID); if (referencedSOPInstanceUID != null) { var imageBox = new DcmImageBox(filmBox, DcmImageBox.GraySOPClassUID, referencedSOPInstanceUID); filmBox.BasicImageBoxes.Add(imageBox); } } } _pendingImageBoxResponses.Clear(); if (filmBox.BasicImageBoxes.Count > 0) { var imageBoxIndex = 0; var imagesPerFilmbox = CalculateImagesPreFilmBox(); foreach (var imageBox in filmBox.BasicImageBoxes) { if (imagesPerFilmbox * filmBoxIndex + imageBoxIndex < _files.Count) { UpdateImageBox(imageBox, _files[imagesPerFilmbox * filmBoxIndex + imageBoxIndex], imageBoxIndex); } _pendingImageBoxResponses.Add(imageBox); imageBoxIndex++; byte pcid = Associate.FindAbstractSyntax(DicomUID.PrinterSOPClass); SendNSetRequest(pcid, NextMessageID(), imageBox.SOPClassUID, imageBox.SOPInstanceUID, imageBox.Dataset); } } return; } } } } SendAbort(DcmAbortSource.ServiceUser, DcmAbortReason.NotSpecified); }
/// <summary> /// Loads the DICOM file and changes the transfer syntax if needed. (Internal) /// </summary> /// <param name="client">C-Store Client</param> public void Load(CStoreClient client) { if (_loaded) { return; } try { DicomTransferSyntax tx = null; foreach (DcmPresContext pc in client.Associate.GetPresentationContexts()) { if (pc.Result == DcmPresContextResult.Accept && pc.AbstractSyntax == _sopClass) { tx = pc.AcceptedTransferSyntax; break; } } if (tx == null) { throw new DicomNetworkException("No accepted presentation contexts for abstract syntax: " + _sopClass.Description); } // Possible to stream from file? if (!client.DisableFileStreaming && tx == TransferSyntax) { using (FileStream fs = DicomFileFormat.GetDatasetStream(_fileName)) { _datasetSize = Convert.ToUInt32(fs.Length - fs.Position); fs.Close(); } return; } DcmCodecParameters codecParams = null; if (tx == client.PreferredTransferSyntax) { codecParams = client.PreferredTransferSyntaxParams; } DicomFileFormat ff = new DicomFileFormat(); ff.Load(FileName, DicomReadOptions.DefaultWithoutDeferredLoading); if (_originalTransferSyntax != tx) { if (_originalTransferSyntax.IsEncapsulated) { // Dataset is compressed... decompress try { ff.ChangeTransferSytnax(DicomTransferSyntax.ExplicitVRLittleEndian, null); } catch { client.Log.Error("{0} -> Unable to change transfer syntax:\n\tclass: {1}\n\told: {2}\n\tnew: {3}\n\treason: {4}\n\tcodecs: {5} - {6}", client.LogID, SOPClassUID.Description, _originalTransferSyntax, DicomTransferSyntax.ExplicitVRLittleEndian, #if DEBUG HasError ? "Unknown" : Error.ToString(), #else HasError ? "Unknown" : Error.Message, #endif DicomCodec.HasCodec(_originalTransferSyntax), DicomCodec.HasCodec(DicomTransferSyntax.ExplicitVRLittleEndian)); throw; } } if (tx.IsEncapsulated) { // Dataset needs to be compressed try { ff.ChangeTransferSytnax(tx, codecParams); } catch { client.Log.Error("{0} -> Unable to change transfer syntax:\n\tclass: {1}\n\told: {2}\n\tnew: {3}\n\treason: {4}\n\tcodecs: {5} - {6}", client.LogID, SOPClassUID.Description, ff.Dataset.InternalTransferSyntax, tx, #if DEBUG HasError ? "Unknown" : Error.ToString(), #else HasError ? "Unknown" : Error.Message, #endif DicomCodec.HasCodec(ff.Dataset.InternalTransferSyntax), DicomCodec.HasCodec(tx)); throw; } } } _dataset = ff.Dataset; _datasetSize = _dataset.CalculateWriteLength(tx, DicomWriteOptions.Default); _transferSyntax = tx; } catch (Exception e) { _dataset = null; _transferSyntax = _originalTransferSyntax; _status = DcmStatus.ProcessingFailure; _exception = e; } finally { _loaded = true; } }
protected override void OnReceiveCFindResponse(byte presentationID, ushort messageID, DcmDataset dataset, DcmStatus status) { if (status.State != DcmState.Pending) { if (OnCFindComplete != null) { OnCFindComplete(_current); } PerformQueryOrRelease(); } else if (dataset != null) { if (OnCFindResponse != null) { OnCFindResponse(_current, dataset); } } }
protected override void OnReceiveCFindResponse(byte presentationID, ushort messageID, DcmDataset dataset, DcmStatus status) { if (status.State != DcmState.Pending) { if (OnCFindComplete != null) { OnCFindComplete(_current); } PerformQueryOrRelease(); } else if (dataset != null) { if (OnCFindResponse != null) { Tr result = Activator.CreateInstance <Tr>(); result.FromDataset(dataset); OnCFindResponse(_current, result); } } }
public new void SendCFindResponse(byte presentationID, ushort messageIdRespondedTo, DcmDataset dataset, DcmStatus status) { base.SendCFindResponse(presentationID, messageIdRespondedTo, dataset, status); }
protected override void OnReceiveCEchoResponse(byte presentationID, ushort messageID, DcmStatus status) { if (OnCEchoResponse != null) { OnCEchoResponse(presentationID, messageID, status); } SendReleaseRequest(); }
/// <summary> /// Unloads the dataset and clears any errors. (Internal) /// </summary> public void Reset() { Unload(); _status = DcmStatus.Pending; _exception = null; }
protected override void OnReceiveCStoreResponse(byte presentationID, ushort messageIdRespondedTo, DicomUID affectedInstance, DcmStatus status) { _current.Status = status; if (OnCStoreResponseReceived != null) { try { OnCStoreResponseReceived(this, _current); } catch (Exception e) { Log.Error("Unhandled exception in user C-Store Response Callback: {0}", e.Message); } } _current.Unload(); _current = null; SendNextCStoreRequest(); }