comparison OrthancServer/main.cpp @ 619:70d0f27e5bd3 find-move-scp

refactoring
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 25 Oct 2013 11:57:30 +0200
parents 5ab377df6d8b
children 4aa6f0d79947
comparison
equal deleted inserted replaced
618:5ab377df6d8b 619:70d0f27e5bd3
43 #include "DicomProtocol/DicomServer.h" 43 #include "DicomProtocol/DicomServer.h"
44 #include "DicomProtocol/DicomUserConnection.h" 44 #include "DicomProtocol/DicomUserConnection.h"
45 #include "OrthancInitialization.h" 45 #include "OrthancInitialization.h"
46 #include "ServerContext.h" 46 #include "ServerContext.h"
47 #include "OrthancFindRequestHandler.h" 47 #include "OrthancFindRequestHandler.h"
48 #include "OrthancMoveRequestHandler.h"
48 49
49 using namespace Orthanc; 50 using namespace Orthanc;
50 51
51 52
52 53
71 server_.Store(&dicomFile[0], dicomFile.size(), dicomSummary, dicomJson, remoteAet); 72 server_.Store(&dicomFile[0], dicomFile.size(), dicomSummary, dicomJson, remoteAet);
72 } 73 }
73 } 74 }
74 }; 75 };
75 76
76
77
78 class OrthancMoveRequestIterator : public IMoveRequestIterator
79 {
80 private:
81 ServerContext& context_;
82 std::vector<std::string> instances_;
83 DicomUserConnection connection_;
84 size_t position_;
85
86 public:
87 OrthancMoveRequestIterator(ServerContext& context,
88 const std::string& target,
89 const std::string& publicId) :
90 context_(context),
91 position_(0)
92 {
93 LOG(INFO) << "Sending resource " << publicId << " to modality \"" << target << "\"";
94
95 std::list<std::string> tmp;
96 context_.GetIndex().GetChildInstances(tmp, publicId);
97
98 instances_.reserve(tmp.size());
99 for (std::list<std::string>::iterator it = tmp.begin(); it != tmp.end(); it++)
100 {
101 instances_.push_back(*it);
102 }
103
104 ConnectToModalityUsingAETitle(connection_, target);
105 }
106
107 virtual unsigned int GetSubOperationCount() const
108 {
109 return instances_.size();
110 }
111
112 virtual Status DoNext()
113 {
114 if (position_ >= instances_.size())
115 {
116 return Status_Failure;
117 }
118
119 const std::string& id = instances_[position_++];
120
121 std::string dicom;
122 context_.ReadFile(dicom, id, FileContentType_Dicom);
123 connection_.Store(dicom);
124
125 return Status_Success;
126 }
127 };
128
129
130
131 class OrthancMoveRequestHandler : public IMoveRequestHandler
132 {
133 private:
134 ServerContext& context_;
135
136 bool LookupResource(std::string& publicId,
137 DicomTag tag,
138 const DicomMap& input)
139 {
140 if (!input.HasTag(tag))
141 {
142 return false;
143 }
144
145 std::string value = input.GetValue(tag).AsString();
146
147 std::list<std::string> ids;
148 context_.GetIndex().LookupTagValue(ids, tag, value);
149
150 if (ids.size() != 1)
151 {
152 return false;
153 }
154 else
155 {
156 publicId = ids.front();
157 return true;
158 }
159 }
160
161 public:
162 OrthancMoveRequestHandler(ServerContext& context) :
163 context_(context)
164 {
165 }
166
167 public:
168 virtual IMoveRequestIterator* Handle(const std::string& target,
169 const DicomMap& input)
170 {
171 LOG(WARNING) << "Move-SCU request received for AET \"" << target << "\"";
172
173
174 /**
175 * Retrieve the query level.
176 **/
177
178 const DicomValue* levelTmp = input.TestAndGetValue(DICOM_TAG_QUERY_RETRIEVE_LEVEL);
179 if (levelTmp == NULL)
180 {
181 throw OrthancException(ErrorCode_BadRequest);
182 }
183
184 ResourceType level = StringToResourceType(levelTmp->AsString().c_str());
185
186
187 /**
188 * Lookup for the resource to be sent.
189 **/
190
191 bool ok;
192 std::string publicId;
193
194 switch (level)
195 {
196 case ResourceType_Patient:
197 ok = LookupResource(publicId, DICOM_TAG_PATIENT_ID, input);
198 break;
199
200 case ResourceType_Study:
201 ok = LookupResource(publicId, DICOM_TAG_STUDY_INSTANCE_UID, input);
202 break;
203
204 case ResourceType_Series:
205 ok = LookupResource(publicId, DICOM_TAG_SERIES_INSTANCE_UID, input);
206 break;
207
208 case ResourceType_Instance:
209 ok = LookupResource(publicId, DICOM_TAG_SOP_INSTANCE_UID, input);
210 break;
211
212 default:
213 ok = false;
214 }
215
216 if (!ok)
217 {
218 throw OrthancException(ErrorCode_BadRequest);
219 }
220
221 return new OrthancMoveRequestIterator(context_, target, publicId);
222 }
223 };
224 77
225 78
226 class MyDicomServerFactory : 79 class MyDicomServerFactory :
227 public IStoreRequestHandlerFactory, 80 public IStoreRequestHandlerFactory,
228 public IFindRequestHandlerFactory, 81 public IFindRequestHandlerFactory,