LAUREL BRIDGE

LaurelBridge.DCFExamples.StoreClient Namespace

DICOM Connectivity Framework V3.4
The StoreClient example demonstrates how to use the DCF to construct and use the high level store SCU class LaurelBridge.DCF.Dicom.Store.StoreClient.
Classes

  ClassDescription
Public classOptions
Command line options class for parsing user options for StoreClient.
Public classProgram
Basic store service class user example which should be run with StoreSCP.
Remarks

Supported OS Platforms:

  • Windows - .Net Framework 4.7.2 64-bit and 32-bit
  • Windows - .Net Core 2.1 64-bit and 32-bit
  • Linux - .Net Core 2.1 64-bit

Examples

StoreClient Sample Code
public class Program : IStoreClientListener
{
    private static readonly ILogger Logger = LogManager.GetCurrentClassLogger();
    private readonly Options _options;

    /// <summary>
    /// Main entry point for StoreClient.
    /// </summary>
    /// <param name="args">Program arguments.</param>
    [STAThread]
    public static void Main(string[] args)
    {
        try
        {
            Options options;
            if (!Options.TryParse(args, out options))
            {
                throw new ArgumentException("bad command line parameters");
            }
            new Program(options);
        }
        catch (Exception e)
        {
            Console.WriteLine("Error during execution: {0}", e);
            Environment.ExitCode = 1;
        }
        finally
        {
            if (System.Diagnostics.Debugger.IsAttached)
            {
                Console.Write("Press any key to continue . . . ");
                Console.ReadKey();
            }
        }
    }

    /// <summary>
    /// The class submits a store job.
    /// </summary>
    /// <param name="options">Parsed command line options class.</param>
    public Program(Options options)
    {
        _options = options;
        DCF.Dicom.Store.StoreClient client = new DCF.Dicom.Store.StoreClient();
        StoreJobStatus status = client.SubmitStoreJob(CreateStoreJobDescription(), this);
        Console.WriteLine("status for the job: " + Environment.NewLine + status);
    }

    /// <summary>
    /// Make a StoreJobDescriptions.  Multiple instances of datasets may be added to the job.
    /// </summary>
    /// <returns>The StoreJobDescription.</returns>
    private StoreJobDescription CreateStoreJobDescription()
    {
        StoreJobDescription sjd = new StoreJobDescription();
        sjd.CalledAETitle = _options.CalledAETitle;
        sjd.CallingAETitle = _options.CallingAETitle;
        sjd.CalledHost = _options.RemoteHost;
        sjd.CalledPort = _options.RemotePort.ToString();
        sjd.AddInstance(new DicomInstanceInfo(_options.InputPath));
        sjd.SessionSettings.SendDimseTimeoutSeconds = 60;
        sjd.SessionSettings.ReceiveDimseTimeoutSeconds = 60;

        return sjd;
    }

    /// <summary>
    /// Implementation of StoreClientListener interface.
    /// </summary>
    /// <param name="status">The status for an store job instance.</param>
    public virtual void StoreObjectComplete(StoreJobInstanceStatus status)
    {
        int base10DimseStatus = status.DimseStatusCode;
        string hexDimseStatus = base10DimseStatus.ToString("X");
        string stringDimseStatus = StoreDimseStatus.GetStatusAsString(status.DimseStatusCode);
        Logger.InfoFormat("Received storeObjectComplete event status({0}) (0x{1}), {2}", base10DimseStatus, hexDimseStatus, stringDimseStatus);
    }

    /// <summary>
    /// Implementation of StoreClientListener interface.
    /// </summary>
    /// <param name="status">The status for the store job.</param>
    public virtual void StoreJobComplete(StoreJobStatus status)
    {
        Logger.Info("Received storeJobComplete event "
                    + Environment.NewLine
                    + "status = "
                    + JobStatus.GetStatusAsString(status.Status)
                    + Environment.NewLine
                    + "statusInfo = "
                    + JobStatusInfo.GetStatusAsString(status.StatusInfo)
        );
    }
}