Mercurial > hg > orthanc
comparison OrthancServer/ServerContext.cpp @ 1005:84b6d7bca6db lua-scripting
refactoring of ServerContext::Store
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 08 Jul 2014 14:34:11 +0200 |
parents | a226e0959d8b |
children | 649d47854314 |
comparison
equal
deleted
inserted
replaced
1004:a226e0959d8b | 1005:84b6d7bca6db |
---|---|
138 | 138 |
139 printf("TODO\n"); | 139 printf("TODO\n"); |
140 std::cout << result; | 140 std::cout << result; |
141 } | 141 } |
142 | 142 |
143 #if 1 | 143 #if 0 |
144 { | 144 { |
145 // Autorouting test | 145 // Autorouting test |
146 RemoteModalityParameters p = Configuration::GetModalityUsingSymbolicName("sample"); | 146 RemoteModalityParameters p = Configuration::GetModalityUsingSymbolicName("sample"); |
147 | 147 |
148 ServerJob job; | 148 ServerJob job; |
257 } | 257 } |
258 } | 258 } |
259 | 259 |
260 | 260 |
261 | 261 |
262 StoreStatus ServerContext::Store(const char* dicomInstance, | |
263 size_t dicomSize, | |
264 const DicomMap& dicomSummary, | |
265 const Json::Value& dicomJson, | |
266 const std::string& remoteAet, | |
267 const ServerIndex::MetadataMap& metadata) | |
268 { | |
269 Json::Value simplified; | |
270 SimplifyTags(simplified, dicomJson); | |
271 | |
272 // Test if the instance must be filtered out | |
273 if (!ApplyReceivedInstanceFilter(simplified, remoteAet)) | |
274 { | |
275 LOG(INFO) << "An incoming instance has been discarded by the filter"; | |
276 return StoreStatus_FilteredOut; | |
277 } | |
278 | |
279 if (compressionEnabled_) | |
280 { | |
281 accessor_.SetCompressionForNextOperations(CompressionType_Zlib); | |
282 } | |
283 else | |
284 { | |
285 accessor_.SetCompressionForNextOperations(CompressionType_None); | |
286 } | |
287 | |
288 FileInfo dicomInfo = accessor_.Write(dicomInstance, dicomSize, FileContentType_Dicom); | |
289 FileInfo jsonInfo = accessor_.Write(dicomJson.toStyledString(), FileContentType_DicomAsJson); | |
290 | |
291 ServerIndex::Attachments attachments; | |
292 attachments.push_back(dicomInfo); | |
293 attachments.push_back(jsonInfo); | |
294 | |
295 // TODO REMOVE CONST_CAST !!!! | |
296 StoreStatus status = index_.Store(dicomSummary, attachments, remoteAet, const_cast<ServerIndex::MetadataMap&>(metadata)); | |
297 | |
298 if (status != StoreStatus_Success) | |
299 { | |
300 storage_.Remove(dicomInfo.GetUuid()); | |
301 storage_.Remove(jsonInfo.GetUuid()); | |
302 } | |
303 | |
304 switch (status) | |
305 { | |
306 case StoreStatus_Success: | |
307 LOG(INFO) << "New instance stored"; | |
308 break; | |
309 | |
310 case StoreStatus_AlreadyStored: | |
311 LOG(INFO) << "Already stored"; | |
312 break; | |
313 | |
314 case StoreStatus_Failure: | |
315 LOG(ERROR) << "Store failure"; | |
316 break; | |
317 | |
318 default: | |
319 // This should never happen | |
320 break; | |
321 } | |
322 | |
323 if (status == StoreStatus_Success || | |
324 status == StoreStatus_AlreadyStored) | |
325 { | |
326 try | |
327 { | |
328 DicomInstanceHasher hasher(dicomSummary); | |
329 std::string instanceId = hasher.HashInstance(); | |
330 | |
331 Json::Value metadata; | |
332 index_.GetMetadata(metadata, instanceId); | |
333 | |
334 ApplyOnStoredInstance(instanceId, simplified, metadata); | |
335 } | |
336 catch (OrthancException&) | |
337 { | |
338 LOG(ERROR) << "Error when dealing with OnStoredInstance"; | |
339 } | |
340 } | |
341 | |
342 return status; | |
343 } | |
344 | |
345 | |
346 void ServerContext::AnswerDicomFile(RestApiOutput& output, | 262 void ServerContext::AnswerDicomFile(RestApiOutput& output, |
347 const std::string& instancePublicId, | 263 const std::string& instancePublicId, |
348 FileContentType content) | 264 FileContentType content) |
349 { | 265 { |
350 FileInfo attachment; | 266 FileInfo attachment; |
430 that_.dicomCacheMutex_.unlock(); | 346 that_.dicomCacheMutex_.unlock(); |
431 #endif | 347 #endif |
432 } | 348 } |
433 | 349 |
434 | 350 |
435 static DcmFileFormat& GetDicom(ParsedDicomFile& file) | |
436 { | |
437 return *reinterpret_cast<DcmFileFormat*>(file.GetDcmtkObject()); | |
438 } | |
439 | |
440 | |
441 StoreStatus ServerContext::Store(std::string& resultPublicId, | |
442 ParsedDicomFile& dicomInstance, | |
443 const char* dicomBuffer, | |
444 size_t dicomSize, | |
445 const ServerIndex::MetadataMap& metadata) | |
446 { | |
447 DicomMap dicomSummary; | |
448 FromDcmtkBridge::Convert(dicomSummary, *GetDicom(dicomInstance).getDataset()); | |
449 | |
450 try | |
451 { | |
452 DicomInstanceHasher hasher(dicomSummary); | |
453 resultPublicId = hasher.HashInstance(); | |
454 | |
455 Json::Value dicomJson; | |
456 FromDcmtkBridge::ToJson(dicomJson, *GetDicom(dicomInstance).getDataset()); | |
457 | |
458 StoreStatus status = StoreStatus_Failure; | |
459 if (dicomSize > 0) | |
460 { | |
461 status = Store(dicomBuffer, dicomSize, dicomSummary, dicomJson, "", metadata); | |
462 } | |
463 | |
464 return status; | |
465 } | |
466 catch (OrthancException& e) | |
467 { | |
468 if (e.GetErrorCode() == ErrorCode_InexistentTag) | |
469 { | |
470 LogMissingRequiredTag(dicomSummary); | |
471 } | |
472 | |
473 throw; | |
474 } | |
475 } | |
476 | |
477 | |
478 StoreStatus ServerContext::Store(std::string& resultPublicId, | |
479 ParsedDicomFile& dicomInstance, | |
480 const ServerIndex::MetadataMap& metadata) | |
481 { | |
482 std::string buffer; | |
483 if (!FromDcmtkBridge::SaveToMemoryBuffer(buffer, *GetDicom(dicomInstance).getDataset())) | |
484 { | |
485 throw OrthancException(ErrorCode_InternalError); | |
486 } | |
487 | |
488 if (buffer.size() == 0) | |
489 return Store(resultPublicId, dicomInstance, NULL, 0, metadata); | |
490 else | |
491 return Store(resultPublicId, dicomInstance, &buffer[0], buffer.size(), metadata); | |
492 } | |
493 | |
494 | |
495 StoreStatus ServerContext::Store(std::string& resultPublicId, | |
496 const char* dicomBuffer, | |
497 size_t dicomSize, | |
498 const ServerIndex::MetadataMap& metadata) | |
499 { | |
500 ParsedDicomFile dicom(dicomBuffer, dicomSize); | |
501 return Store(resultPublicId, dicom, dicomBuffer, dicomSize, metadata); | |
502 } | |
503 | |
504 | |
505 StoreStatus ServerContext::Store(std::string& resultPublicId, | |
506 const std::string& dicomContent, | |
507 const ServerIndex::MetadataMap& metadata) | |
508 { | |
509 if (dicomContent.size() == 0) | |
510 { | |
511 return Store(resultPublicId, NULL, 0); | |
512 } | |
513 else | |
514 { | |
515 return Store(resultPublicId, &dicomContent[0], dicomContent.size(), metadata); | |
516 } | |
517 } | |
518 | |
519 | |
520 void ServerContext::SetStoreMD5ForAttachments(bool storeMD5) | 351 void ServerContext::SetStoreMD5ForAttachments(bool storeMD5) |
521 { | 352 { |
522 LOG(INFO) << "Storing MD5 for attachments: " << (storeMD5 ? "yes" : "no"); | 353 LOG(INFO) << "Storing MD5 for attachments: " << (storeMD5 ? "yes" : "no"); |
523 accessor_.SetStoreMD5(storeMD5); | 354 accessor_.SetStoreMD5(storeMD5); |
524 } | 355 } |