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 }