/
CFindSCU.cs
125 lines (95 loc) · 4.51 KB
/
CFindSCU.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#region License
// Copyright (c) 2011, ClearCanvas Inc.
// All rights reserved.
// http://www.clearcanvas.ca
//
// This software is licensed under the Open Software License v3.0.
// For the complete license, see http://www.clearcanvas.ca/OSLv3.0
#endregion
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using ClearCanvas.Dicom;
using ClearCanvas.Dicom.Network;
namespace ClearCanvas.ImageServer.TestApp
{
class CFindSCU:IDicomClientHandler
{
private string _aeTitle;
private DicomClient _dicomClient;
private OnResultReceived _callback;
public string AETitle
{
get { return _aeTitle; }
set { _aeTitle = value; }
}
public delegate void OnResultReceived(DicomAttributeCollection ds);
public void Query(string remoteAE, string remoteHost, int remotePort, OnResultReceived callback)
{
_callback = callback;
IPAddress addr = Dns.GetHostAddresses(remoteHost)[0];
ClientAssociationParameters _assocParams = new ClientAssociationParameters(AETitle, remoteAE, new IPEndPoint(addr, remotePort));
byte pcid = _assocParams.AddPresentationContext(SopClass.StudyRootQueryRetrieveInformationModelFind);
_assocParams.AddTransferSyntax(pcid, TransferSyntax.ExplicitVrLittleEndian);
_assocParams.AddTransferSyntax(pcid, TransferSyntax.ImplicitVrLittleEndian);
_dicomClient = DicomClient.Connect(_assocParams, this);
}
private void SendCFind()
{
DicomMessage msg = new DicomMessage();
DicomAttributeCollection cFindDataset = msg.DataSet;
// set the Query Retrieve Level
cFindDataset[DicomTags.QueryRetrieveLevel].SetStringValue("STUDY");
// set the other tags we want to retrieve
cFindDataset[DicomTags.StudyInstanceUid].SetStringValue("");
cFindDataset[DicomTags.PatientsName].SetStringValue("");
cFindDataset[DicomTags.PatientId].SetStringValue("");
cFindDataset[DicomTags.ModalitiesInStudy].SetStringValue("");
cFindDataset[DicomTags.StudyDescription].SetStringValue("");
byte pcid = _dicomClient.AssociationParams.FindAbstractSyntax(SopClass.StudyRootQueryRetrieveInformationModelFind);
_dicomClient.SendCFindRequest(pcid, _dicomClient.NextMessageID(), msg);
}
#region IDicomClientHandler Members
public void OnReceiveAssociateAccept(DicomClient client, ClientAssociationParameters association)
{
SendCFind();
}
public void OnReceiveAssociateReject(DicomClient client, ClientAssociationParameters association, DicomRejectResult result, DicomRejectSource source, DicomRejectReason reason)
{
}
public void OnReceiveRequestMessage(DicomClient client, ClientAssociationParameters association, byte presentationID, DicomMessage message)
{
}
public void OnReceiveResponseMessage(DicomClient client, ClientAssociationParameters association, byte presentationID, DicomMessage message)
{
if (message.Status.Status == DicomState.Pending)
{
string studyinstanceuid = message.DataSet[DicomTags.StudyInstanceUid].GetString(0, "");
Console.WriteLine(studyinstanceuid);
if (_callback != null)
_callback(message.DataSet);
}
else
{
_dicomClient.SendReleaseRequest();
}
}
public void OnReceiveReleaseResponse(DicomClient client, ClientAssociationParameters association)
{
}
public void OnReceiveAbort(DicomClient client, ClientAssociationParameters association, DicomAbortSource source, DicomAbortReason reason)
{
throw new Exception("The method or operation is not implemented.");
}
public void OnNetworkError(DicomClient client, ClientAssociationParameters association, Exception e)
{
throw new Exception("The method or operation is not implemented.");
}
public void OnDimseTimeout(DicomClient server, ClientAssociationParameters association)
{
throw new Exception("The method or operation is not implemented.");
}
#endregion
}
}