Mercurial > hg > orthanc
diff Core/DicomParsing/MemoryBufferTranscoder.cpp @ 3929:7dc5e7e0045d transcoding
simplifying MemoryBufferTranscoder::Transcode() interface
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 14 May 2020 14:40:13 +0200 |
parents | 1f71c2f20e16 |
children | b99acc213937 |
line wrap: on
line diff
--- a/Core/DicomParsing/MemoryBufferTranscoder.cpp Thu May 14 13:31:05 2020 +0200 +++ b/Core/DicomParsing/MemoryBufferTranscoder.cpp Thu May 14 14:40:13 2020 +0200 @@ -37,6 +37,10 @@ #include "../OrthancException.h" #include "FromDcmtkBridge.h" +#if !defined(NDEBUG) // For debugging +# include "ParsedDicomFile.h" +#endif + namespace Orthanc { MemoryBufferTranscoder::MemoryBufferTranscoder() @@ -63,9 +67,31 @@ } + static void CheckTargetSyntax(const std::string& transcoded, + const std::set<DicomTransferSyntax>& allowedSyntaxes) + { +#if !defined(NDEBUG) + // Debug mode + ParsedDicomFile parsed(transcoded); + + std::string s; + DicomTransferSyntax a, b; + if (!parsed.LookupTransferSyntax(s) || + !FromDcmtkBridge::LookupOrthancTransferSyntax(a, parsed.GetDcmtkObject()) || + !LookupTransferSyntax(b, s) || + a != b || + allowedSyntaxes.find(a) == allowedSyntaxes.end()) + { + throw OrthancException( + ErrorCode_Plugin, + "DEBUG - The transcoding plugin has not written to one of the allowed transfer syntaxes"); + } +#endif + } + + bool MemoryBufferTranscoder::TranscodeParsedToBuffer( std::string& target /* out */, - DicomTransferSyntax& sourceSyntax /* out */, bool& hasSopInstanceUidChanged /* out */, DcmFileFormat& dicom /* in, possibly modified */, DicomTransferSyntax targetSyntax, @@ -81,30 +107,23 @@ const void* data = source.empty() ? NULL : source.c_str(); - std::set<DicomTransferSyntax> tmp; - tmp.insert(targetSyntax); - - DicomTransferSyntax targetSyntax2; - bool success = Transcode(target, sourceSyntax, targetSyntax2, hasSopInstanceUidChanged, - data, source.size(), tmp, allowNewSopInstanceUid); + std::set<DicomTransferSyntax> allowedSyntaxes; + allowedSyntaxes.insert(targetSyntax); - if (success && - targetSyntax != targetSyntax2) - { - throw OrthancException(ErrorCode_InternalError); - } - + bool success = Transcode(target, hasSopInstanceUidChanged, + data, source.size(), allowedSyntaxes, allowNewSopInstanceUid); + #if ORTHANC_ENABLE_DCMTK_TRANSCODING == 1 if (!success && useDcmtk_ && dcmtk_.TranscodeParsedToBuffer( - target, sourceSyntax, hasSopInstanceUidChanged, - dicom, targetSyntax, allowNewSopInstanceUid)) + target, hasSopInstanceUidChanged, dicom, targetSyntax, allowNewSopInstanceUid)) { success = true; } #endif + CheckTargetSyntax(target, allowedSyntaxes); return success; } @@ -116,13 +135,14 @@ const std::set<DicomTransferSyntax>& allowedSyntaxes, bool allowNewSopInstanceUid) { - DicomTransferSyntax sourceSyntax, targetSyntax; bool hasSopInstanceUidChanged; std::string target; - if (Transcode(target, sourceSyntax, targetSyntax, hasSopInstanceUidChanged, + if (Transcode(target, hasSopInstanceUidChanged, buffer, size, allowedSyntaxes, allowNewSopInstanceUid)) { + CheckTargetSyntax(target, allowedSyntaxes); + const void* data = target.empty() ? NULL : target.c_str(); return IDicomTranscoder::TranscodedDicom::CreateFromInternal( FromDcmtkBridge::LoadFromMemoryBuffer(data, target.size()), hasSopInstanceUidChanged);