Mercurial > hg > orthanc
comparison OrthancServer/OrthancRestApi.cpp @ 171:da7e915202c7 Orthanc-0.2.3-Paulus
quick and dirty access to raw tags
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 09 Nov 2012 13:45:36 +0100 |
parents | 93e1b0e3b83a |
children | 68dae290d5fa |
comparison
equal
deleted
inserted
replaced
169:cb8ce04d5708 | 171:da7e915202c7 |
---|---|
33 #include "OrthancRestApi.h" | 33 #include "OrthancRestApi.h" |
34 | 34 |
35 #include "OrthancInitialization.h" | 35 #include "OrthancInitialization.h" |
36 #include "FromDcmtkBridge.h" | 36 #include "FromDcmtkBridge.h" |
37 #include "../Core/Uuid.h" | 37 #include "../Core/Uuid.h" |
38 #include "../Core/DicomFormat/DicomArray.h" | |
38 | 39 |
39 #include <dcmtk/dcmdata/dcistrmb.h> | 40 #include <dcmtk/dcmdata/dcistrmb.h> |
40 #include <dcmtk/dcmdata/dcfilefo.h> | 41 #include <dcmtk/dcmdata/dcfilefo.h> |
41 #include <boost/lexical_cast.hpp> | 42 #include <boost/lexical_cast.hpp> |
43 #include <glog/logging.h> | |
42 | 44 |
43 namespace Orthanc | 45 namespace Orthanc |
44 { | 46 { |
45 static void SendJson(HttpOutput& output, | 47 static void SendJson(HttpOutput& output, |
46 const Json::Value& value) | 48 const Json::Value& value) |
110 { | 112 { |
111 throw OrthancException("Corrupted JSON file"); | 113 throw OrthancException("Corrupted JSON file"); |
112 } | 114 } |
113 | 115 |
114 SimplifyTagsRecursion(target, source); | 116 SimplifyTagsRecursion(target, source); |
117 } | |
118 | |
119 | |
120 static bool GetTagContent(HttpOutput& output, | |
121 const FileStorage& storage, | |
122 const std::string& fileUuid, | |
123 const UriComponents& uri) | |
124 { | |
125 // TODO: Implement a true caching mechanism! | |
126 static boost::mutex mutex_; | |
127 static std::string lastFileUuid_; | |
128 static DcmFileFormat dicomFile_; | |
129 | |
130 boost::mutex::scoped_lock lock(mutex_); | |
131 | |
132 if (fileUuid != lastFileUuid_) | |
133 { | |
134 LOG(INFO) << "Parsing file " << fileUuid; | |
135 std::string content; | |
136 storage.ReadFile(content, fileUuid); | |
137 | |
138 DcmInputBufferStream is; | |
139 if (content.size() > 0) | |
140 { | |
141 is.setBuffer(&content[0], content.size()); | |
142 } | |
143 is.setEos(); | |
144 | |
145 if (!dicomFile_.read(is).good()) | |
146 { | |
147 return false; | |
148 } | |
149 | |
150 lastFileUuid_ = fileUuid; | |
151 } | |
152 else | |
153 { | |
154 LOG(INFO) << "Already parsed file " << fileUuid; | |
155 } | |
156 | |
157 if (uri.size() == 3) | |
158 { | |
159 DicomMap dicomSummary; | |
160 FromDcmtkBridge::Convert(dicomSummary, *dicomFile_.getDataset()); | |
161 | |
162 DicomArray a(dicomSummary); | |
163 | |
164 Json::Value target = Json::arrayValue; | |
165 for (size_t i = 0; i < a.GetSize(); i++) | |
166 { | |
167 char b[16]; | |
168 sprintf(b, "%04x-%04x", a.GetElement(i).GetTagGroup(), | |
169 a.GetElement(i).GetTagElement()); | |
170 target.append(b); | |
171 } | |
172 | |
173 SendJson(output, target); | |
174 return true; | |
175 } | |
176 | |
177 if (uri.size() == 4) | |
178 { | |
179 if (uri[3].size() != 9 || | |
180 uri[3][4] != '-') | |
181 { | |
182 return false; | |
183 } | |
184 | |
185 unsigned int group, element; | |
186 if (sscanf(uri[3].c_str(), "%04x-%04x", &group, &element) != 2) | |
187 { | |
188 return false; | |
189 } | |
190 | |
191 DcmTagKey tag(group, element); | |
192 DcmElement* item = NULL; | |
193 | |
194 if (dicomFile_.getDataset()->findAndGetElement(tag, item).good() && | |
195 item != NULL) | |
196 { | |
197 std::string buffer; | |
198 buffer.resize(65536); | |
199 Uint32 length = item->getLength(); | |
200 Uint32 offset = 0; | |
201 | |
202 while (offset < length) | |
203 { | |
204 Uint32 nbytes; | |
205 if (length - offset < buffer.size()) | |
206 { | |
207 nbytes = length - offset; | |
208 } | |
209 else | |
210 { | |
211 nbytes = buffer.size(); | |
212 } | |
213 | |
214 output.SendOkHeader("application/octet-stream"); | |
215 if (item->getPartialValue(&buffer[0], offset, nbytes).good()) | |
216 { | |
217 output.Send(&buffer[0], nbytes); | |
218 offset += nbytes; | |
219 } | |
220 else | |
221 { | |
222 return true; | |
223 } | |
224 } | |
225 | |
226 return true; | |
227 } | |
228 else | |
229 { | |
230 return false; | |
231 } | |
232 } | |
233 | |
234 return false; | |
115 } | 235 } |
116 | 236 |
117 | 237 |
118 bool OrthancRestApi::Store(Json::Value& result, | 238 bool OrthancRestApi::Store(Json::Value& result, |
119 const std::string& postData) | 239 const std::string& postData) |
622 | 742 |
623 for (unsigned int i = 0; i < numberOfFrames; i++) | 743 for (unsigned int i = 0; i < numberOfFrames; i++) |
624 { | 744 { |
625 result.append(i); | 745 result.append(i); |
626 } | 746 } |
747 } | |
748 } | |
749 | |
750 | |
751 else if (uri.size() >= 3 && | |
752 uri[0] == "instances" && | |
753 uri[2] == "content") | |
754 { | |
755 Json::Value instance(Json::objectValue); | |
756 std::string fileUuid; | |
757 existingResource = index_.GetDicomFile(fileUuid, uri[1]); | |
758 | |
759 if (existingResource) | |
760 { | |
761 if (GetTagContent(output, storage_, fileUuid, uri)) | |
762 { | |
763 return; | |
764 } | |
765 else | |
766 { | |
767 existingResource = false; | |
768 } | |
627 } | 769 } |
628 } | 770 } |
629 | 771 |
630 | 772 |
631 else if (uri[0] == "instances" && | 773 else if (uri[0] == "instances" && |