The StorageCommitmentSCU example demonstrates how to use DCF to implement a storage commitment service class user.
Classes
Class | Description | |
---|---|---|
Program |
Storage commitment service class user example which should be run with the StorageCommitmentSCP example.
|
Examples
StorageCommitmentSCU Sample Code
public class Program { private static readonly ILogger Logger = LogManager.GetCurrentClassLogger(); /// <summary> /// Main entry point for StorageCommitmentSCU. /// </summary> [STAThread] public static void Main() { try { // Start an AssociationManager and listen for NEventReport requests as a result of this // SCU sending an NAction request to the StorageCommitment SCP. NEventReportServer nEventServer = new NEventReportServer(null); AssociationManager mgr = new AssociationManager(); mgr.ServerTcpPort = 105; mgr.AssociationConfigPolicyMgr = nEventServer; mgr.AddAssociationListener(nEventServer); Thread t = new Thread(mgr.Run); t.Start(); if (!mgr.WaitForRunning(2000)) { throw new TimeoutException("AssociationManager did not start in an acceptable amount of time"); } Dicom.Store.StorageCommitmentSCU scu = null; try { StorageCommitmentRequest request = CreateStorageCommitmentRq(); scu = CreateSCU(); scu.RequestAssociation(); Console.WriteLine("Outgoing NAction Request: {0}{1}", Environment.NewLine, request); DimseMessage response = scu.NAction(request, 30, 30); Console.WriteLine("Incoming NAction Response: {0}{1}", Environment.NewLine, response); } catch (Exception e) { Console.WriteLine("Exception caught sending nAction request: {0}{1}Please verify the Storage Commitment SCP is up and running", e, Environment.NewLine); } finally { if (scu != null && scu.Connected) scu.ReleaseAssociation(); } } catch (Exception e) { Console.WriteLine("Exception caught during execution: {0}", e); } } private static Dicom.Store.StorageCommitmentSCU CreateSCU() { AssociationInfo ainfo = new AssociationInfo(); ainfo.CallingTitle = "SCU"; ainfo.CalledTitle = "SCP"; ainfo.CalledPresentationAddress = "localhost:" + 104; // Add the requested presentation context RequestedPresentationContext ctx = new RequestedPresentationContext( 1, Uids.StorageCommitmentPushModelSOPClass, Uids.ELE, Uids.ILE); ainfo.AddRequestedPresentationContext(ctx); return new Dicom.Store.StorageCommitmentSCU(ainfo); } /// <summary> /// Build our storage commitment request containing the datasets to be stored. /// </summary> /// <returns>The StorageCommitmentRequest to be send to the StorageCommitment SCP.</returns> private static StorageCommitmentRequest CreateStorageCommitmentRq() { using (DicomFileInput dfi = new DicomFileInput("mr-knee.dcm", new DicomSessionSettings())) { DicomDataSet dds = dfi.ReadDataSetNoPixels(); StorageCommitmentRequest request = new StorageCommitmentRequest(); request.TransactionUid = DataDictionary.CreateUid(); List<ReferencedSopSequence> items = new List<ReferencedSopSequence>(); // item 1: MR-Knee ReferencedSopSequence refSopSequenceItem = new ReferencedSopSequence(); refSopSequenceItem.ReferencedSopClassUid = dds.GetElementStringValue(Tags.SOPClassUID); refSopSequenceItem.ReferencedSopInstanceUid = dds.GetElementStringValue(Tags.SOPInstanceUID); items.Add(refSopSequenceItem); // item 2: Bogus image used to demonstrate failures in the NEventReport sent from the StorageCommitment SCP refSopSequenceItem = new ReferencedSopSequence(); refSopSequenceItem.ReferencedSopClassUid = "1.2.3.4.5"; refSopSequenceItem.ReferencedSopInstanceUid = "1.2.3.4.5.6.7.8.9"; items.Add(refSopSequenceItem); request.ReferencedSopSequence(items.ToArray()); return request; } } /// <summary> /// Class to handle sending and receiving storage commitment requests/responses. /// </summary> class NEventReportServer : AssociationListenerAdapter, IAssociationConfigPolicyManager { readonly IList<AllowedPresentationContext> _presentationContexts; /// <summary> /// Create a StorageCommitmentSCU to send requests to the StorageCommitmentSCP on localhost /// using the given port number. /// </summary> public NEventReportServer(IList<AllowedPresentationContext> allowedPresentationContexts) { _presentationContexts = allowedPresentationContexts; } /// <summary> /// Returns a DicomSessionSettings object to be used for the association. /// </summary> /// <param name="assoc">The AssociationAcceptor for the given association</param> /// <returns>A default DicomSessionSettings object</returns> public DicomSessionSettings GetSessionSettings(AssociationAcceptor assoc) { return new DicomSessionSettings(); } /// <summary> /// Create a storage commitment SCU message handler to handle the interaction between the SCU and SCP /// regarding the status of the storage commitment. /// </summary> /// <param name="assoc">The AssociationAcceptor for the given association.</param> public override void BeginAssociation(AssociationAcceptor assoc) { assoc.RegisterServiceClassProvider(new StorageCommitmentNEventReportSCP(assoc, _presentationContexts, NEventReport)); } private NEventReportResponse NEventReport(AssociationAcceptor acceptor, NEventReportRequest request) { Logger.InfoFormat("Incoming NEventReport Request: {0}{1}", Environment.NewLine, request); NEventReportResponse response = new NEventReportResponse(request); Logger.InfoFormat("Outgoing NEventReport Response: {0}{1}", Environment.NewLine, response); return response; } } }