comparison Plugins/Engine/OrthancPlugins.cpp @ 3925:dd112d2b83f0 transcoding

new SDK: OrthancPluginGetInstanceAdvancedJson(), OrthancPluginGetInstanceDicomWebJson() and OrthancPluginGetInstanceDicomWebXml()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 13 May 2020 18:12:34 +0200
parents 395c59208f10
children 2910b0d30fe0
comparison
equal deleted inserted replaced
3924:395c59208f10 3925:dd112d2b83f0
366 throw OrthancException(ErrorCode_ParameterOutOfRange); 366 throw OrthancException(ErrorCode_ParameterOutOfRange);
367 } 367 }
368 } 368 }
369 369
370 public: 370 public:
371 DicomWebBinaryFormatter(const _OrthancPluginEncodeDicomWeb& parameters) : 371 DicomWebBinaryFormatter(OrthancPluginDicomWebBinaryCallback callback) :
372 oldCallback_(parameters.callback), 372 oldCallback_(callback),
373 newCallback_(NULL), 373 newCallback_(NULL),
374 newPayload_(NULL) 374 newPayload_(NULL)
375 { 375 {
376 } 376 }
377 377
378 DicomWebBinaryFormatter(const _OrthancPluginEncodeDicomWeb2& parameters) : 378 DicomWebBinaryFormatter(OrthancPluginDicomWebBinaryCallback2 callback,
379 void* payload) :
379 oldCallback_(NULL), 380 oldCallback_(NULL),
380 newCallback_(parameters.callback), 381 newCallback_(callback),
381 newPayload_(parameters.payload) 382 newPayload_(payload)
382 { 383 {
383 } 384 }
384 385
385 virtual DicomWebJsonVisitor::BinaryMode Format(std::string& bulkDataUri, 386 virtual DicomWebJsonVisitor::BinaryMode Format(std::string& bulkDataUri,
386 const std::vector<DicomTag>& parentTags, 387 const std::vector<DicomTag>& parentTags,
438 } 439 }
439 440
440 bulkDataUri = currentBulkDataUri_; 441 bulkDataUri = currentBulkDataUri_;
441 return currentMode_; 442 return currentMode_;
442 } 443 }
444 }
445
446 void Apply(char** target,
447 bool isJson,
448 ParsedDicomFile& dicom)
449 {
450 DicomWebJsonVisitor visitor;
451 visitor.SetFormatter(*this);
452
453 dicom.Apply(visitor);
454
455 std::string s;
456
457 if (isJson)
458 {
459 s = visitor.GetResult().toStyledString();
460 }
461 else
462 {
463 visitor.FormatXml(s);
464 }
465
466 *target = CopyString(s);
467 }
468
469
470 void Apply(char** target,
471 bool isJson,
472 const void* dicom,
473 size_t dicomSize)
474 {
475 ParsedDicomFile parsed(dicom, dicomSize);
476 Apply(target, isJson, parsed);
443 } 477 }
444 }; 478 };
445 } 479 }
446 480
447 481
2788 throw OrthancException(ErrorCode_NullPointer); 2822 throw OrthancException(ErrorCode_NullPointer);
2789 } 2823 }
2790 else if (hasDecoderPlugin) 2824 else if (hasDecoderPlugin)
2791 { 2825 {
2792 // TODO - This call could be speeded up the future, if a 2826 // TODO - This call could be speeded up the future, if a
2793 // "decoding context" gets introduced in the decoder plugins 2827 // "decoding context" gets introduced in the decoder plugins
2794
2795 decoded.reset(Decode(instance.GetBufferData(), instance.GetBufferSize(), p.frameIndex)); 2828 decoded.reset(Decode(instance.GetBufferData(), instance.GetBufferSize(), p.frameIndex));
2796 } 2829 }
2797 else 2830 else
2798 { 2831 {
2799 decoded.reset(DicomImageDecoder::Decode(instance.GetParsedDicomFile(), p.frameIndex)); 2832 decoded.reset(DicomImageDecoder::Decode(instance.GetParsedDicomFile(), p.frameIndex));
2816 std::string serialized; 2849 std::string serialized;
2817 instance.GetParsedDicomFile().SaveToMemoryBuffer(serialized); 2850 instance.GetParsedDicomFile().SaveToMemoryBuffer(serialized);
2818 CopyToMemoryBuffer(*p.targetBuffer, serialized); 2851 CopyToMemoryBuffer(*p.targetBuffer, serialized);
2819 return; 2852 return;
2820 } 2853 }
2854
2855 case _OrthancPluginService_GetInstanceAdvancedJson:
2856 {
2857 if (p.targetStringToFree == NULL)
2858 {
2859 throw OrthancException(ErrorCode_NullPointer);
2860 }
2821 2861
2862 Json::Value json;
2863 instance.GetParsedDicomFile().DatasetToJson(
2864 json, Plugins::Convert(p.format),
2865 static_cast<DicomToJsonFlags>(p.flags), p.maxStringLength);
2866
2867 Json::FastWriter writer;
2868 *p.targetStringToFree = CopyString(writer.write(json));
2869
2870 return;
2871 }
2872
2873 case _OrthancPluginService_GetInstanceDicomWebJson:
2874 case _OrthancPluginService_GetInstanceDicomWebXml:
2875 {
2876 if (p.targetStringToFree == NULL)
2877 {
2878 throw OrthancException(ErrorCode_NullPointer);
2879 }
2880
2881 DicomWebBinaryFormatter formatter(p.dicomWebCallback, p.dicomWebPayload);
2882 formatter.Apply(p.targetStringToFree,
2883 (service == _OrthancPluginService_GetInstanceDicomWebJson),
2884 instance.GetParsedDicomFile());
2885 return;
2886 }
2887
2822 default: 2888 default:
2823 throw OrthancException(ErrorCode_InternalError); 2889 throw OrthancException(ErrorCode_InternalError);
2824 } 2890 }
2825 } 2891 }
2826 2892
3541 p.target->maxMultiplicity = (entry->getVMMax() == DcmVariableVM ? 0 : static_cast<uint32_t>(entry->getVMMax())); 3607 p.target->maxMultiplicity = (entry->getVMMax() == DcmVariableVM ? 0 : static_cast<uint32_t>(entry->getVMMax()));
3542 } 3608 }
3543 } 3609 }
3544 3610
3545 3611
3546 static void FormatDicomWeb(char** target,
3547 bool isJson,
3548 DicomWebBinaryFormatter& formatter,
3549 const void* dicom,
3550 size_t dicomSize)
3551 {
3552 DicomWebJsonVisitor visitor;
3553 visitor.SetFormatter(formatter);
3554
3555 {
3556 ParsedDicomFile parsed(dicom, dicomSize);
3557 parsed.Apply(visitor);
3558 }
3559
3560 std::string s;
3561
3562 if (isJson)
3563 {
3564 s = visitor.GetResult().toStyledString();
3565 }
3566 else
3567 {
3568 visitor.FormatXml(s);
3569 }
3570
3571 *target = CopyString(s);
3572 }
3573
3574
3575 bool OrthancPlugins::InvokeSafeService(SharedLibrary& plugin, 3612 bool OrthancPlugins::InvokeSafeService(SharedLibrary& plugin,
3576 _OrthancPluginService service, 3613 _OrthancPluginService service,
3577 const void* parameters) 3614 const void* parameters)
3578 { 3615 {
3579 // Services that can be run without mutual exclusion 3616 // Services that can be run without mutual exclusion
3731 3768
3732 case _OrthancPluginService_GetInstanceFramesCount: 3769 case _OrthancPluginService_GetInstanceFramesCount:
3733 case _OrthancPluginService_GetInstanceRawFrame: 3770 case _OrthancPluginService_GetInstanceRawFrame:
3734 case _OrthancPluginService_GetInstanceDecodedFrame: 3771 case _OrthancPluginService_GetInstanceDecodedFrame:
3735 case _OrthancPluginService_SerializeDicomInstance: 3772 case _OrthancPluginService_SerializeDicomInstance:
3773 case _OrthancPluginService_GetInstanceAdvancedJson:
3774 case _OrthancPluginService_GetInstanceDicomWebJson:
3775 case _OrthancPluginService_GetInstanceDicomWebXml:
3736 AccessDicomInstance2(service, parameters); 3776 AccessDicomInstance2(service, parameters);
3737 return true; 3777 return true;
3738 3778
3739 case _OrthancPluginService_SetGlobalProperty: 3779 case _OrthancPluginService_SetGlobalProperty:
3740 { 3780 {
4251 case _OrthancPluginService_EncodeDicomWebXml: 4291 case _OrthancPluginService_EncodeDicomWebXml:
4252 { 4292 {
4253 const _OrthancPluginEncodeDicomWeb& p = 4293 const _OrthancPluginEncodeDicomWeb& p =
4254 *reinterpret_cast<const _OrthancPluginEncodeDicomWeb*>(parameters); 4294 *reinterpret_cast<const _OrthancPluginEncodeDicomWeb*>(parameters);
4255 4295
4256 DicomWebBinaryFormatter formatter(p); 4296 DicomWebBinaryFormatter formatter(p.callback);
4257 4297 formatter.Apply(p.target,
4258 FormatDicomWeb(p.target, 4298 (service == _OrthancPluginService_EncodeDicomWebJson),
4259 (service == _OrthancPluginService_EncodeDicomWebJson), 4299 p.dicom, p.dicomSize);
4260 formatter, p.dicom, p.dicomSize);
4261 return true; 4300 return true;
4262 } 4301 }
4263 4302
4264 case _OrthancPluginService_EncodeDicomWebJson2: 4303 case _OrthancPluginService_EncodeDicomWebJson2:
4265 case _OrthancPluginService_EncodeDicomWebXml2: 4304 case _OrthancPluginService_EncodeDicomWebXml2:
4266 { 4305 {
4267 const _OrthancPluginEncodeDicomWeb2& p = 4306 const _OrthancPluginEncodeDicomWeb2& p =
4268 *reinterpret_cast<const _OrthancPluginEncodeDicomWeb2*>(parameters); 4307 *reinterpret_cast<const _OrthancPluginEncodeDicomWeb2*>(parameters);
4269 4308
4270 DicomWebBinaryFormatter formatter(p); 4309 DicomWebBinaryFormatter formatter(p.callback, p.payload);
4271 4310 formatter.Apply(p.target,
4272 FormatDicomWeb(p.target, 4311 (service == _OrthancPluginService_EncodeDicomWebJson2),
4273 (service == _OrthancPluginService_EncodeDicomWebJson2), 4312 p.dicom, p.dicomSize);
4274 formatter, p.dicom, p.dicomSize);
4275 return true; 4313 return true;
4276 } 4314 }
4277 4315
4278 case _OrthancPluginService_GetTagName: 4316 case _OrthancPluginService_GetTagName:
4279 GetTagName(parameters); 4317 GetTagName(parameters);