Mercurial > hg > orthanc
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, |