Mercurial > hg > orthanc
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); |