using Leadtools;
using Leadtools.Dicom;
using Leadtools.Dicom.Networking;
public enum WaitReturn
{
Complete,
Timeout,
}
class Utils
{
public static WaitReturn WaitForComplete(int ms, WaitHandle wh)
{
TimeSpan goal = new TimeSpan(DateTime.Now.AddMilliseconds(ms).Ticks);
do
{
if (wh.WaitOne(ms))
{
return WaitReturn.Complete;
}
if (goal.CompareTo(new TimeSpan(DateTime.Now.Ticks)) < 0)
{
return WaitReturn.Timeout;
}
} while (true);
}
}
class Client : IDicomEvents
{
public DicomNet net;
DicomExceptionCode _LastError = DicomExceptionCode.Success;
AutoResetEvent waitEvent = new AutoResetEvent(false);
public Client()
{
net = new DicomNet(string.Empty, this);
}
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);
}
public void OnConnect(DicomExceptionCode error, DicomNet net)
{
Debug.WriteLine("Client::OnConnect");
_LastError = error;
waitEvent.Set();
}
public void OnReceiveAssociateAccept(DicomAssociate association, DicomNet net)
{
Debug.WriteLine("Client::OnReceiveAssociateAccept");
waitEvent.Set();
}
public void OnReceiveReleaseResponse(DicomNet net)
{
Debug.WriteLine("Client::OnReceiveReleaseResponse");
waitEvent.Set();
}
public void OnReceiveCEchoResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, DicomNet net)
{
Debug.WriteLine("Client::OnReceiveCEchoResponse");
Debug.Assert(presentationId == 1, "Presentation id should be 1");
Debug.Assert(messageId == 1, "Message ID should be 1");
Debug.Assert(affectedClass == DicomUidType.VerificationClass, "Affected class should be " + DicomUidType.VerificationClass);
waitEvent.Set();
}
public void OnAccept(DicomExceptionCode error, DicomNet net, object hHandle)
{
// Not Used
}
public void OnClose(DicomExceptionCode error, DicomNet net)
{
// Not Used
}
public void OnReceive(DicomExceptionCode error, DicomPduType type, byte[] buffer, DicomNet net)
{
// Not Used
}
public void OnReceiveAbort(DicomAbortSourceType source, DicomAbortReasonType reason, DicomNet net)
{
// Not Used
}
public void OnReceiveAssociateReject(DicomAssociateRejectResultType result, DicomAssociateRejectSourceType source, DicomAssociateRejectReasonType reason, DicomNet net)
{
// Not Used
}
public void OnReceiveAssociateRequest(DicomAssociate association, DicomNet net)
{
// Not Used
}
public void OnReceiveCCancelRequest(byte presentationId, ushort messageId, DicomNet net)
{
// Not Used
}
public void OnReceiveCEchoRequest(byte presentationId, ushort messageId, string affectedClass, DicomNet net)
{
// Not Used
}
public void OnReceiveCFindRequest(byte presentationId, ushort messageId, string affectedClass, DicomCommandPriorityType priority, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCFindResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCGetRequest(byte presentationId, ushort messageId, string affectedClass, DicomCommandPriorityType priority, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCGetResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, ushort remaining, ushort completed, ushort failed, ushort warning, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCMoveRequest(byte presentationId, ushort messageId, string affectedClass, DicomCommandPriorityType priority, string MoveAE, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCMoveResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, ushort remaining, ushort completed, ushort failed, ushort warning, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCStoreRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandPriorityType priority, string MoveAE, ushort moveMessageId, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCStoreResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomNet net)
{
// Not Used
}
public void OnReceiveData(byte presentationId, DicomDataSet commandset, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNActionRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, ushort action, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNActionResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, ushort action, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNCreateRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNCreateResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNDeleteRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomNet net)
{
// Not Used
}
public void OnReceiveNDeleteResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomNet net)
{
// Not Used
}
public void OnReceiveNGetRequest(byte presentationID, ushort messageID, string affectedClass, string instance, uint[] attributes, DicomNet net)
{
// Not Used
}
public void OnReceiveNGetResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNReportRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, ushort dicomevent, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNReportResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, ushort dicomevent, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNSetRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNSetResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveReleaseRequest(DicomNet net)
{
// Not Used
}
public void OnReceiveUnknown(byte presentationId, DicomDataSet commandset, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnSend(DicomExceptionCode error, DicomPduType type, uint bytes, DicomNet net)
{
// Not Used
}
}
class ServerConnection : IDicomEvents
{
public DicomNet net;
public ServerConnection()
{
net = new DicomNet(string.Empty, this);
}
public void OnReceiveAssociateRequest(DicomAssociate association, DicomNet net)
{
Debug.WriteLine("ServerConnection::OnReceiveAssociateRequest");
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);
}
Debug.WriteLine("ServerConnection::SendAssociateAccept");
net.SendAssociateAccept(retAssociation);
}
public void OnReceiveReleaseRequest(DicomNet net)
{
Debug.WriteLine("ServerConnection::OnReceiveReleaseRequest");
Debug.WriteLine("ServerConnection::SendReleaseResponse");
net.SendReleaseResponse();
}
public void OnReceiveCEchoRequest(byte presentationId, ushort messageId, string affectedClass, DicomNet net)
{
Debug.WriteLine("ServerConnection::OnReceiveCEchoRequest");
Debug.Assert(presentationId == 1, "Presentation id should be 1");
Debug.Assert(messageId == 1, "Message ID should be 1");
Debug.Assert(affectedClass == DicomUidType.VerificationClass, "Affected class should be " + DicomUidType.VerificationClass);
Debug.WriteLine("ServerConnection::SendReleaseResponse");
net.SendCEchoResponse(presentationId, messageId, DicomUidType.VerificationClass, DicomCommandStatusType.Success);
}
public void OnAccept(DicomExceptionCode error, DicomNet net, object hHandle)
{
// Not Used
}
public void OnClose(DicomExceptionCode error, DicomNet net)
{
// Not Used
}
public void OnConnect(DicomExceptionCode error, DicomNet net)
{
// Not Used
}
public void OnReceive(DicomExceptionCode error, DicomPduType type, byte[] buffer, DicomNet net)
{
// Not Used
}
public void OnReceiveAbort(DicomAbortSourceType source, DicomAbortReasonType reason, DicomNet net)
{
// Not Used
}
public void OnReceiveAssociateAccept(DicomAssociate association, DicomNet net)
{
Debug.WriteLine("ServerConnection::OnReceiveAssociateAccept");
// Not Used
}
public void OnReceiveAssociateReject(DicomAssociateRejectResultType result, DicomAssociateRejectSourceType source, DicomAssociateRejectReasonType reason, DicomNet net)
{
// Not Used
}
public void OnReceiveCCancelRequest(byte presentationId, ushort messageId, DicomNet net)
{
// Not Used
}
public void OnReceiveCEchoResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, DicomNet net)
{
// Not Used
}
public void OnReceiveCFindRequest(byte presentationId, ushort messageId, string affectedClass, DicomCommandPriorityType priority, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCFindResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCGetRequest(byte presentationId, ushort messageId, string affectedClass, DicomCommandPriorityType priority, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCGetResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, ushort remaining, ushort completed, ushort failed, ushort warning, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCMoveRequest(byte presentationId, ushort messageId, string affectedClass, DicomCommandPriorityType priority, string MoveAE, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCMoveResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, ushort remaining, ushort completed, ushort failed, ushort warning, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCStoreRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandPriorityType priority, string MoveAE, ushort moveMessageId, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCStoreResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomNet net)
{
// Not Used
}
public void OnReceiveData(byte presentationId, DicomDataSet commandset, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNActionRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, ushort action, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNActionResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, ushort action, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNCreateRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNCreateResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNDeleteRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomNet net)
{
// Not Used
}
public void OnReceiveNDeleteResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomNet net)
{
// Not Used
}
public void OnReceiveNGetRequest(byte presentationID, ushort messageID, string affectedClass, string instance, uint[] attributes, DicomNet net)
{
// Not Used
}
public void OnReceiveNGetResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNReportRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, ushort dicomevent, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNReportResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, ushort dicomevent, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNSetRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNSetResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveReleaseResponse(DicomNet net)
{
// Not Used
}
public void OnReceiveUnknown(byte presentationId, DicomDataSet commandset, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnSend(DicomExceptionCode error, DicomPduType type, uint bytes, DicomNet net)
{
// Not Used
}
}
class Server : IDicomEvents
{
public DicomNet net;
ServerConnection client;
public Server()
{
net = new DicomNet(string.Empty, this);
}
public void OnAccept(DicomExceptionCode error, DicomNet net, object hHandle)
{
Debug.WriteLine("Server::OnAccept");
client = new ServerConnection();
Debug.WriteLine("Server Accepting Connection");
net.Accept(client.net, hHandle);
}
public void OnClose(DicomExceptionCode error, DicomNet net)
{
// Not Used
}
public void OnConnect(DicomExceptionCode error, DicomNet net)
{
// Not Used
}
public void OnReceive(DicomExceptionCode error, DicomPduType type, byte[] buffer, DicomNet net)
{
// Not Used
}
public void OnReceiveAbort(DicomAbortSourceType source, DicomAbortReasonType reason, DicomNet net)
{
// Not Used
}
public void OnReceiveAssociateAccept(DicomAssociate association, DicomNet net)
{
Debug.WriteLine("Server::OnReceiveAssociateAccept");
// Not Used
}
public void OnReceiveAssociateReject(DicomAssociateRejectResultType result, DicomAssociateRejectSourceType source, DicomAssociateRejectReasonType reason, DicomNet net)
{
// Not Used
}
public void OnReceiveAssociateRequest(DicomAssociate association, DicomNet net)
{
// Not Used
}
public void OnReceiveCCancelRequest(byte presentationId, ushort messageId, DicomNet net)
{
// Not Used
}
public void OnReceiveCEchoRequest(byte presentationId, ushort messageId, string affectedClass, DicomNet net)
{
// Not Used
}
public void OnReceiveCEchoResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, DicomNet net)
{
// Not Used
}
public void OnReceiveCFindRequest(byte presentationId, ushort messageId, string affectedClass, DicomCommandPriorityType priority, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCFindResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCGetRequest(byte presentationId, ushort messageId, string affectedClass, DicomCommandPriorityType priority, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCGetResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, ushort remaining, ushort completed, ushort failed, ushort warning, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCMoveRequest(byte presentationId, ushort messageId, string affectedClass, DicomCommandPriorityType priority, string MoveAE, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCMoveResponse(byte presentationId, ushort messageId, string affectedClass, DicomCommandStatusType status, ushort remaining, ushort completed, ushort failed, ushort warning, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCStoreRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandPriorityType priority, string MoveAE, ushort moveMessageId, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveCStoreResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomNet net)
{
// Not Used
}
public void OnReceiveData(byte presentationId, DicomDataSet commandset, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNActionRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, ushort action, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNActionResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, ushort action, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNCreateRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNCreateResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNDeleteRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomNet net)
{
// Not Used
}
public void OnReceiveNDeleteResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomNet net)
{
// Not Used
}
public void OnReceiveNGetRequest(byte presentationID, ushort messageID, string affectedClass, string instance, uint[] attributes, DicomNet net)
{
// Not Used
}
public void OnReceiveNGetResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNReportRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, ushort dicomevent, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNReportResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, ushort dicomevent, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNSetRequest(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveNSetResponse(byte presentationId, ushort messageId, string affectedClass, string Instance, DicomCommandStatusType status, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnReceiveReleaseRequest(DicomNet net)
{
// Not Used
}
public void OnReceiveReleaseResponse(DicomNet net)
{
// Not Used
}
public void OnReceiveUnknown(byte presentationId, DicomDataSet commandset, DicomDataSet dataset, DicomNet net)
{
// Not Used
}
public void OnSend(DicomExceptionCode error, DicomPduType type, uint bytes, DicomNet net)
{
// Not Used
}
}
public void SendCEchoRequestSample()
{
DicomEngine.Startup();
DicomNet.Startup();
Server server = new Server();
Client client = new Client();
//
// Connect to server
//
server.net.Listen("127.0.0.1", 104, 1); // start server
Debug.WriteLine("Client::Send Connect");
client.net.Connect(string.Empty, 1000, "127.0.0.1", 104); // connect to server
if (!client.Wait()) // wait for connection to finish
{
Debug.WriteLine("Connection timed out");
}
Debug.Assert(client.LastError == DicomExceptionCode.Success, "Connection failed");
Debug.Assert(client.net.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);
Debug.WriteLine("Client::SendAssociateRequest");
client.net.SendAssociateRequest(associate);
if (!client.Wait()) // wait for connection to finish
{
Debug.WriteLine("SendAssociateRequest timed out");
}
//
// Send Echo Request
//
byte pid = client.net.Association.FindAbstract(DicomUidType.VerificationClass);
Debug.WriteLine("Client::SendCEchoRequest");
client.net.SendCEchoRequest(pid, 1, DicomUidType.VerificationClass);
if (!client.Wait()) // wait for connection to finish
{
Debug.WriteLine("SendCEchoRequest timed out");
}
//
// SendReleaseRequest
//
Debug.WriteLine("Client::SendReleaseRequest");
client.net.SendReleaseRequest();
if (!client.Wait()) // wait for connection to finish
{
Debug.WriteLine("SendReleaseRequest timed out");
}
client.net.CloseForced(true);
server.net.CloseForced(true);
DicomEngine.Shutdown();
DicomNet.Shutdown();
}