←Select platform

OnClose Method (DicomNet)

Summary

Notifies a member of a connection that the connection was closed.

Syntax

C#
VB
C++
protected virtual void OnClose(  
   Leadtools.Dicom.DicomExceptionCode error, 
   Leadtools.Dicom.DicomNet net 
) 
Protected Overridable Sub OnClose( _ 
   ByVal error As Leadtools.Dicom.DicomExceptionCode, _ 
   ByVal net As Leadtools.Dicom.DicomNet _ 
)  
protected: 
virtual void OnClose(  
   Leadtools.Dicom.DicomExceptionCode error, 
   Leadtools.Dicom.DicomNet^ net 
)  

Parameters

error
An error code.

net
The DicomNet object of the peer member of the connection.

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.

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).

C#
VB
using Leadtools; 
using Leadtools.Dicom; 
 
[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(); 
} 
Imports Leadtools 
Imports Leadtools.Dicom 
 
<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 

Requirements

Target Platforms

Products | Support | Contact Us | Copyright Notices
© 1991-2017 LEAD Technologies, Inc. All Rights Reserved.
Leadtools.Dicom Assembly
Click or drag to resize