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" &&