Leadtools.Dicom Requires Medical product license | Send comments on this topic. | Back to Introduction - All Topics | Help Version 15.10.31
OnClose Method
See Also  Example
Leadtools.Dicom Namespace > DicomNet Class : OnClose Method




error
An error code.
net
The DicomNet object of the peer member of the connection.
Notifies a member of a connection that the connection was closed.

Syntax

Visual Basic (Declaration) 
Protected Overridable Sub OnClose( _
   ByVal error As DicomExceptionCode, _
   ByVal net As DicomNet _
) 
Visual Basic (Usage)Copy Code
Dim instance As DicomNet
Dim error As DicomExceptionCode
Dim net As DicomNet
 
instance.OnClose(error, net)
C# 
protected virtual void OnClose( 
   DicomExceptionCode error,
   DicomNet net
)
Managed Extensions for C++ 
protected: virtual void OnClose( 
   DicomExceptionCode error,
   DicomNet* net
) 
C++/CLI 
protected:
virtual void OnClose( 
   DicomExceptionCode error,
   DicomNet^ net
) 

Parameters

error
An error code.
net
The DicomNet object of the peer member of the connection.

Example

This is a comprehensive sample that shows how to use the abort operation. The sample includes both the SCP (server) and the SCU (client).

Visual BasicCopy Code
<StructLayout(LayoutKind.Sequential)> _
Public Structure MSG
    Public hwnd As IntPtr
    Public message As UInteger
    Public wParam As IntPtr
    Public lParam As IntPtr
    Public time As UInteger
    Public p As System.Drawing.Point
End Structure
Public Enum WaitReturn
    Complete
    Timeout
End Enum

Private Class Utils
    <DllImport("user32.dll")> _
    Shared Function PeekMessage(<System.Runtime.InteropServices.Out()> ByRef lpMsg As MSG, ByVal hWnd As IntPtr, ByVal wMsgFilterMin As UInteger, ByVal wMsgFilterMax As UInteger, ByVal wRemoveMsg As UInteger) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

    <DllImport("user32.dll")> _
    Shared Function TranslateMessage(ByRef lpMsg As MSG) As Boolean
    End Function
    <DllImport("user32.dll")> _
    Shared Function DispatchMessage(ByRef lpmsg As MSG) As IntPtr
    End Function

    Private Const PM_REMOVE As UInteger = 1

    Public Shared Function WaitForComplete(ByVal mill As Double, ByVal wh As WaitHandle) As WaitReturn
        Dim goal As TimeSpan = New TimeSpan(DateTime.Now.AddMilliseconds(mill).Ticks)

        Do
            Dim msg As MSG = New MSG()

            If PeekMessage(msg, IntPtr.Zero, 0, 0, PM_REMOVE) Then
                TranslateMessage(msg)
                DispatchMessage(msg)
            End If

            If wh.WaitOne(New TimeSpan(0, 0, 0), False) Then
                Return WaitReturn.Complete
            End If

            If goal.CompareTo(New TimeSpan(DateTime.Now.Ticks)) < 0 Then
                Return WaitReturn.Timeout
            End If

        Loop While True
    End Function
End Class

Private Class Client : Inherits DicomNet
    Private _LastError As DicomExceptionCode = DicomExceptionCode.Success
    Private waitEvent As AutoResetEvent = New AutoResetEvent(False)

    Public Sub New()
        MyBase.New(Nothing, DicomNetSecurityeMode.None)
    End Sub

    Public ReadOnly Property LastError() As DicomExceptionCode
        Get
            Return _LastError
        End Get
    End Property

    Public Function Wait() As Boolean
        Dim ret As WaitReturn

        _LastError = DicomExceptionCode.Success
        ret = Utils.WaitForComplete((5 * 60) * 1000, waitEvent)

        Return (ret = WaitReturn.Complete)
    End Function

    Protected Overrides Sub OnConnect(ByVal [error] As DicomExceptionCode)
        _LastError = [error]
        waitEvent.Set()
    End Sub

    Protected Overrides Sub OnReceiveAssociateAccept(ByVal association As DicomAssociate)
        waitEvent.Set()
    End Sub

    Protected Overrides Sub OnClose(ByVal [error] As DicomExceptionCode, ByVal net As DicomNet)
        waitEvent.Set()
    End Sub
End Class

Private Class ServerConnection : Inherits DicomNet
    Public Sub New()
        MyBase.New(Nothing, DicomNetSecurityeMode.None)
    End Sub

    Protected Overrides Sub OnReceiveAssociateRequest(ByVal association As DicomAssociate)
        Dim retAssociation As DicomAssociate = New DicomAssociate(False)

        Debug.Assert(association.Called = "ServerTest", "Called AETitle should be ServerTest")
        Debug.Assert(association.Calling = "ClientTest", "Calling AETitle should be ClientTest")
        Debug.Assert(association.ImplementClass = "1.2.840.114257.1", "Implementation class should be 1.2.840.114257.1")
        Debug.Assert(association.ImplementationVersionName = "1", "Implementation version should be 1")
        Debug.Assert(association.MaxLength = &H100000, "Max length should be 0x100000")
        Debug.Assert(association.GetAbstract(1) = DicomUidType.VerificationClass, "Presentation index 1 should be " & DicomUidType.VerificationClass)
        Debug.Assert(association.GetTransfer(1, 0) = DicomUidType.ImplicitVRLittleEndian, "Abstract Syntax (1,0) should be " & DicomUidType.ImplicitVRLittleEndian)

        '
        ' Build our Association Accept
        '
        retAssociation.Called = association.Called
        retAssociation.Calling = association.Calling
        retAssociation.ImplementClass = association.ImplementClass
        retAssociation.ImplementationVersionName = association.ImplementationVersionName
        Dim x As Integer = 0
        Do While x < association.PresentationContextCount
            Dim id As Byte = association.GetPresentationContextID(x)
            Dim abSyntax As String = association.GetAbstract(id)
            Dim trSyntax As String = DicomUidType.ImplicitVRLittleEndian

            retAssociation.AddPresentationContext(id, 0, abSyntax)
            If association.GetTransferCount(id) > 0 Then
                trSyntax = association.GetTransfer(id, 0)
            End If

            retAssociation.AddTransfer(id, trSyntax)
            x += 1
        Loop
        SendAssociateAccept(retAssociation)
    End Sub

    Protected Overrides Sub OnReceiveAbort(ByVal source As DicomAbortSourceType, ByVal reason As DicomAbortReasonType)
        Debug.Assert(source = DicomAbortSourceType.User, "Source should be user")
        Debug.Assert(reason = DicomAbortReasonType.InvalidParameterValue, "Reason should be invalid param")
        Close()
    End Sub
End Class

Private Class Server : Inherits DicomNet
    Private client As ServerConnection

    Public Sub New()
        MyBase.New(Nothing, DicomNetSecurityeMode.None)
    End Sub

    Protected Overrides Sub OnAccept(ByVal [error] As DicomExceptionCode)
        client = New ServerConnection()

        Accept(client)
    End Sub
End Class


Public Sub SendAbortSample()
    DicomEngine.Startup()
    DicomNet.Startup()

    Using server As Server = New Server()
        Using client As Client = New Client()
            '
            ' Connect to server
            '
            server.Listen("127.0.0.1", 104, 1) ' start server
            client.Connect(Nothing, 1000, "127.0.0.1", 104) ' connect to server
            If (Not client.Wait()) Then ' wait for connection to finish
                Debug.Fail("Connection timed out")
            End If
            Debug.Assert(client.LastError = DicomExceptionCode.Success, "Connection failed")
            Debug.Assert(client.IsConnected(), "Client not connected")

            '
            ' Send associate request
            '
            Dim associate As DicomAssociate = New DicomAssociate(True)

            associate.Called = "ServerTest"
            associate.Calling = "ClientTest"
            associate.ImplementClass = "1.2.840.114257.1"
            associate.ImplementationVersionName = "1"
            associate.MaxLength = &H100000
            associate.AddPresentationContext(1, 0, DicomUidType.VerificationClass)
            associate.AddTransfer(1, DicomUidType.ImplicitVRLittleEndian)
            client.SendAssociateRequest(associate)
            If (Not client.Wait()) Then ' wait for connection to finish
                Debug.Fail("SendAssociateRequest timed out")
            End If

            Dim p As IntPtr = New IntPtr(5)
            client.SendAbort(DicomAbortSourceType.User, DicomAbortReasonType.InvalidParameterValue)
            If (Not client.Wait()) Then ' wait for abort to finish
                Debug.Fail("SendAbort timed out")
            End If

            If client.IsConnected() Then
                client.CloseForced(True)
            End If
        End Using
        server.CloseForced(True)
    End Using

    DicomEngine.Shutdown()
    DicomNet.Shutdown()
End Sub
C#Copy Code
[StructLayout(LayoutKind.Sequential)] 
public struct MSG 

    public IntPtr hwnd; 
    public uint message; 
    public IntPtr wParam; 
    public IntPtr lParam; 
    public uint time; 
    public System.Drawing.Point p; 

public enum WaitReturn 

    Complete, 
    Timeout, 

 
class Utils 

    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool PeekMessage(out MSG lpMsg, IntPtr hWnd, 
                                   uint wMsgFilterMin, uint wMsgFilterMax, 
                                   uint wRemoveMsg); 
 
    [DllImport("user32.dll")] 
    static extern bool TranslateMessage([In] ref MSG lpMsg); 
    [DllImport("user32.dll")] 
    static extern IntPtr DispatchMessage([In] ref MSG lpmsg); 
 
    const uint PM_REMOVE = 1; 
 
    public static WaitReturn WaitForComplete(double mill, WaitHandle wh) 
    { 
        TimeSpan goal = new TimeSpan(DateTime.Now.AddMilliseconds(mill).Ticks); 
 
        do 
        { 
            MSG msg = new MSG(); 
 
            if (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE)) 
            { 
                TranslateMessage(ref msg); 
                DispatchMessage(ref msg); 
            } 
 
            if (wh.WaitOne(new TimeSpan(0, 0, 0), false)) 
            { 
                return WaitReturn.Complete; 
            } 
 
            if (goal.CompareTo(new TimeSpan(DateTime.Now.Ticks)) < 0) 
            { 
                return WaitReturn.Timeout; 
            } 
 
        } while (true); 
    } 

 
class Client : DicomNet 

    DicomExceptionCode _LastError = DicomExceptionCode.Success; 
    AutoResetEvent waitEvent = new AutoResetEvent(false); 
 
    public Client() 
        : base(null, DicomNetSecurityeMode.None) 
    { 
    } 
 
    public DicomExceptionCode LastError 
    { 
        get 
        { 
            return _LastError; 
        } 
    } 
 
    public bool Wait() 
    { 
        WaitReturn ret; 
 
        _LastError = DicomExceptionCode.Success; 
        ret = Utils.WaitForComplete((5 * 60) * 1000, waitEvent); 
 
        return (ret == WaitReturn.Complete); 
    } 
 
    protected override void OnConnect(DicomExceptionCode error) 
    { 
        _LastError = error; 
        waitEvent.Set(); 
    } 
 
    protected override void OnReceiveAssociateAccept(DicomAssociate association) 
    { 
        waitEvent.Set(); 
    } 
 
    protected override void OnClose(DicomExceptionCode error, DicomNet net) 
    {                
        waitEvent.Set(); 
    } 

 
class ServerConnection : DicomNet 

    public ServerConnection() 
        : base(null, DicomNetSecurityeMode.None) 
    { 
    } 
 
    protected override void OnReceiveAssociateRequest(DicomAssociate association) 
    { 
        DicomAssociate retAssociation = new DicomAssociate(false); 
 
        Debug.Assert(association.Called == "ServerTest", "Called AETitle should be ServerTest"); 
        Debug.Assert(association.Calling == "ClientTest", "Calling AETitle should be ClientTest"); 
        Debug.Assert(association.ImplementClass == "1.2.840.114257.1", "Implementation class should be 1.2.840.114257.1"); 
        Debug.Assert(association.ImplementationVersionName == "1", "Implementation version should be 1"); 
        Debug.Assert(association.MaxLength == 0x100000, "Max length should be 0x100000"); 
        Debug.Assert(association.GetAbstract(1) == DicomUidType.VerificationClass, "Presentation index 1 should be " + DicomUidType.VerificationClass); 
        Debug.Assert(association.GetTransfer(1, 0) == DicomUidType.ImplicitVRLittleEndian, "Abstract Syntax (1,0) should be " + DicomUidType.ImplicitVRLittleEndian); 
 
        // 
        // Build our Association Accept 
        // 
        retAssociation.Called = association.Called; 
        retAssociation.Calling = association.Calling; 
        retAssociation.ImplementClass = association.ImplementClass; 
        retAssociation.ImplementationVersionName = association.ImplementationVersionName; 
        for (int x = 0; x < association.PresentationContextCount; x++) 
        { 
            byte id = association.GetPresentationContextID(x); 
            string abSyntax = association.GetAbstract(id); 
            string trSyntax = DicomUidType.ImplicitVRLittleEndian; 
 
            retAssociation.AddPresentationContext(id, 0, abSyntax); 
            if (association.GetTransferCount(id) > 0) 
            { 
                trSyntax = association.GetTransfer(id, 0); 
            } 
 
            retAssociation.AddTransfer(id, trSyntax); 
        } 
        SendAssociateAccept(retAssociation); 
    } 
 
    protected override void OnReceiveAbort(DicomAbortSourceType source, DicomAbortReasonType reason) 
    {                
        Debug.Assert(source == DicomAbortSourceType.User, "Source should be user"); 
        Debug.Assert(reason == DicomAbortReasonType.InvalidParameterValue, "Reason should be invalid param"); 
        Close(); 
    } 

 
class Server : DicomNet 

    ServerConnection client; 
 
    public Server() 
        : base(null, DicomNetSecurityeMode.None) 
    { 
    } 
 
    protected override void OnAccept(DicomExceptionCode error) 
    { 
        client = new ServerConnection(); 
 
        Accept(client); 
    } 

 
 
public void SendAbortSample() 

    DicomEngine.Startup(); 
    DicomNet.Startup(); 
 
    using (Server server = new Server()) 
    { 
        using (Client client = new Client()) 
        { 
            // 
            // Connect to server 
            // 
            server.Listen("127.0.0.1", 104, 1); // start server 
            client.Connect(null, 1000, "127.0.0.1", 104); // connect to server 
            if (!client.Wait()) // wait for connection to finish 
            { 
                Debug.Fail("Connection timed out"); 
            } 
            Debug.Assert(client.LastError == DicomExceptionCode.Success, "Connection failed"); 
            Debug.Assert(client.IsConnected(), "Client not connected"); 
 
            // 
            // Send associate request 
            // 
            DicomAssociate associate = new DicomAssociate(true); 
 
            associate.Called = "ServerTest"; 
            associate.Calling = "ClientTest"; 
            associate.ImplementClass = "1.2.840.114257.1"; 
            associate.ImplementationVersionName = "1"; 
            associate.MaxLength = 0x100000; 
            associate.AddPresentationContext(1, 0, DicomUidType.VerificationClass); 
            associate.AddTransfer(1, DicomUidType.ImplicitVRLittleEndian); 
            client.SendAssociateRequest(associate); 
            if (!client.Wait()) // wait for connection to finish 
            { 
                Debug.Fail("SendAssociateRequest timed out"); 
            } 
 
            IntPtr p = new IntPtr(5); 
            client.SendAbort(DicomAbortSourceType.User, DicomAbortReasonType.InvalidParameterValue); 
            if (!client.Wait()) // wait for abort to finish 
            { 
                Debug.Fail("SendAbort timed out"); 
            } 
 
            if (client.IsConnected()) 
                client.CloseForced(true); 
        } 
        server.CloseForced(true); 
    } 
 
    DicomEngine.Shutdown(); 
    DicomNet.Shutdown(); 
}

Remarks

A call to this method is generated by a call to Close. The OnClose method is useful to both SCUs and SCPs.

To customize this method, you must derive a class from DicomNet and override this method.

Requirements

Target Platforms: Microsoft .NET Framework 2.0, Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family

See Also

Leadtools.Dicom requires a Medical toolkit license and unlock key. For more information, refer to: Raster Pro/Document/Medical Features