Mercurial > hg > orthanc
diff Plugins/Engine/OrthancPlugins.cpp @ 1861:a7bea843a7bc
"OrthancPluginLookupDictionary()" to get information about some DICOM tag
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 02 Dec 2015 13:00:18 +0100 |
parents | c7d70f659190 |
children | 5cf2bd0abfa2 |
line wrap: on
line diff
--- a/Plugins/Engine/OrthancPlugins.cpp Wed Dec 02 11:26:52 2015 +0100 +++ b/Plugins/Engine/OrthancPlugins.cpp Wed Dec 02 13:00:18 2015 +0100 @@ -44,6 +44,7 @@ #include "../../Core/OrthancException.h" #include "../../Core/Toolbox.h" #include "../../OrthancServer/FromDcmtkBridge.h" +#include "../../OrthancServer/ToDcmtkBridge.h" #include "../../OrthancServer/OrthancInitialization.h" #include "../../OrthancServer/ServerContext.h" #include "../../OrthancServer/ServerToolbox.h" @@ -60,6 +61,8 @@ #include "PluginsEnumerations.h" #include <boost/regex.hpp> +#include <dcmtk/dcmdata/dcdict.h> +#include <dcmtk/dcmdata/dcdicent.h> namespace Orthanc { @@ -1590,6 +1593,59 @@ } + + namespace + { + class DictionaryReadLocker + { + private: + const DcmDataDictionary& dictionary_; + + public: + DictionaryReadLocker() : dictionary_(dcmDataDict.rdlock()) + { + } + + ~DictionaryReadLocker() + { + dcmDataDict.unlock(); + } + + const DcmDataDictionary* operator->() + { + return &dictionary_; + } + }; + } + + + void OrthancPlugins::ApplyLookupDictionary(const void* parameters) + { + const _OrthancPluginLookupDictionary& p = + *reinterpret_cast<const _OrthancPluginLookupDictionary*>(parameters); + + DicomTag tag(FromDcmtkBridge::ParseTag(p.name)); + DcmTagKey tag2(tag.GetGroup(), tag.GetElement()); + + DictionaryReadLocker locker; + const DcmDictEntry* entry = locker->findEntry(tag2, NULL); + + if (entry == NULL) + { + throw OrthancException(ErrorCode_UnknownDicomTag); + } + else + { + p.target->group = entry->getKey().getGroup(); + p.target->element = entry->getKey().getElement(); + p.target->vr = Plugins::Convert(entry->getEVR()); + p.target->minMultiplicity = static_cast<uint32_t>(entry->getVMMin()); + p.target->maxMultiplicity = (entry->getVMMax() == DcmVariableVM ? 0 : static_cast<uint32_t>(entry->getVMMax())); + } + } + + + bool OrthancPlugins::InvokeService(SharedLibrary& plugin, _OrthancPluginService service, const void* parameters) @@ -2148,6 +2204,10 @@ ComputeHash(service, parameters); return true; + case _OrthancPluginService_LookupDictionary: + ApplyLookupDictionary(parameters); + return true; + default: { // This service is unknown to the Orthanc plugin engine