diff OrthancServer/Sources/OrthancInitialization.cpp @ 4696:dd6274412ff4

new configuration option "ExternalDictionaries" to load external DICOM dictionaries
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 17 Jun 2021 15:47:21 +0200
parents 3badc205cb4c
children f0038043fb97 7053502fbf97
line wrap: on
line diff
--- a/OrthancServer/Sources/OrthancInitialization.cpp	Thu Jun 17 14:00:34 2021 +0200
+++ b/OrthancServer/Sources/OrthancInitialization.cpp	Thu Jun 17 15:47:21 2021 +0200
@@ -53,6 +53,7 @@
 #include "../../OrthancFramework/Sources/HttpClient.h"
 #include "../../OrthancFramework/Sources/Logging.h"
 #include "../../OrthancFramework/Sources/OrthancException.h"
+#include "../../OrthancFramework/Sources/SerializationToolbox.h"
 
 #include "Database/SQLiteDatabaseWrapper.h"
 #include "OrthancConfiguration.h"
@@ -62,14 +63,19 @@
 #include <dcmtk/dcmnet/diutil.h>  // For DCM_dcmnetLogger
 
 
+static const char* const STORAGE_DIRECTORY = "StorageDirectory";
+static const char* const ORTHANC_STORAGE = "OrthancStorage";
+
 
 namespace Orthanc
 {
   static void RegisterUserMetadata(const Json::Value& config)
   {
-    if (config.isMember("UserMetadata"))
+    static const char* const USER_METADATA = "UserMetadata";
+    
+    if (config.isMember(USER_METADATA))
     {
-      const Json::Value& parameter = config["UserMetadata"];
+      const Json::Value& parameter = config[USER_METADATA];
 
       Json::Value::Members members = parameter.getMemberNames();
       for (size_t i = 0; i < members.size(); i++)
@@ -103,9 +109,11 @@
 
   static void RegisterUserContentType(const Json::Value& config)
   {
-    if (config.isMember("UserContentType"))
+    static const char* const USER_CONTENT_TYPE = "UserContentType";
+    
+    if (config.isMember(USER_CONTENT_TYPE))
     {
-      const Json::Value& parameter = config["UserContentType"];
+      const Json::Value& parameter = config[USER_CONTENT_TYPE];
 
       Json::Value::Members members = parameter.getMemberNames();
       for (size_t i = 0; i < members.size(); i++)
@@ -150,20 +158,36 @@
   }
 
 
+  static void LoadExternalDictionaries(const Json::Value& configuration)
+  {
+    static const char* const EXTERNAL_DICTIONARIES = "ExternalDictionaries";
+    
+    if (configuration.type() == Json::objectValue &&
+        configuration.isMember(EXTERNAL_DICTIONARIES))
+    {
+      std::vector<std::string> dictionaries;
+      SerializationToolbox::ReadArrayOfStrings(dictionaries, configuration, EXTERNAL_DICTIONARIES);
+      FromDcmtkBridge::LoadExternalDictionaries(dictionaries);
+    }
+  }
+
+
   static void LoadCustomDictionary(const Json::Value& configuration)
   {
+    static const char* const DICTIONARY = "Dictionary";
+    
     if (configuration.type() != Json::objectValue ||
-        !configuration.isMember("Dictionary") ||
-        configuration["Dictionary"].type() != Json::objectValue)
+        !configuration.isMember(DICTIONARY) ||
+        configuration[DICTIONARY].type() != Json::objectValue)
     {
       return;
     }
 
-    Json::Value::Members tags(configuration["Dictionary"].getMemberNames());
+    Json::Value::Members tags(configuration[DICTIONARY].getMemberNames());
 
     for (Json::Value::ArrayIndex i = 0; i < tags.size(); i++)
     {
-      const Json::Value& content = configuration["Dictionary"][tags[i]];
+      const Json::Value& content = configuration[DICTIONARY][tags[i]];
       if (content.type() != Json::arrayValue ||
           content.size() < 2 ||
           content.size() > 5 ||
@@ -190,9 +214,13 @@
 
   static void ConfigurePkcs11(const Json::Value& config)
   {
+    static const char* const MODULE = "Module";
+    static const char* const VERBOSE = "Verbose";
+    static const char* const PIN = "Pin";
+    
     if (config.type() != Json::objectValue ||
-        !config.isMember("Module") ||
-        config["Module"].type() != Json::stringValue)
+        !config.isMember(MODULE) ||
+        config[MODULE].type() != Json::stringValue)
     {
       throw OrthancException(ErrorCode_BadFileFormat,
                              "No path to the PKCS#11 module (DLL or .so) is provided "
@@ -200,11 +228,11 @@
     }
 
     std::string pin;
-    if (config.isMember("Pin"))
+    if (config.isMember(PIN))
     {
-      if (config["Pin"].type() == Json::stringValue)
+      if (config[PIN].type() == Json::stringValue)
       {
-        pin = config["Pin"].asString();
+        pin = config[PIN].asString();
       }
       else
       {
@@ -214,11 +242,11 @@
     }
 
     bool verbose = false;
-    if (config.isMember("Verbose"))
+    if (config.isMember(VERBOSE))
     {
-      if (config["Verbose"].type() == Json::booleanValue)
+      if (config[VERBOSE].type() == Json::booleanValue)
       {
-        verbose = config["Verbose"].asBool();
+        verbose = config[VERBOSE].asBool();
       }
       else
       {
@@ -227,17 +255,18 @@
       }
     }
 
-    HttpClient::InitializePkcs11(config["Module"].asString(), pin, verbose);
+    HttpClient::InitializePkcs11(config[MODULE].asString(), pin, verbose);
   }
 
 
 
   void OrthancInitialize(const char* configurationFile)
   {
-    static const char* LOCALE = "Locale";
-    static const char* PKCS11 = "Pkcs11";
-    static const char* DEFAULT_ENCODING = "DefaultEncoding";
-    static const char* MALLOC_ARENA_MAX = "MallocArenaMax";
+    static const char* const LOCALE = "Locale";
+    static const char* const PKCS11 = "Pkcs11";
+    static const char* const DEFAULT_ENCODING = "DefaultEncoding";
+    static const char* const MALLOC_ARENA_MAX = "MallocArenaMax";
+    static const char* const LOAD_PRIVATE_DICTIONARY = "LoadPrivateDictionary";
     
     OrthancConfiguration::WriterLock lock;
 
@@ -254,7 +283,7 @@
         locale = lock.GetConfiguration().GetStringParameter(LOCALE, "");
       }
       
-      bool loadPrivate = lock.GetConfiguration().GetBooleanParameter("LoadPrivateDictionary", true);
+      bool loadPrivate = lock.GetConfiguration().GetBooleanParameter(LOAD_PRIVATE_DICTIONARY, true);
       Orthanc::InitializeFramework(locale, loadPrivate);
     }
 
@@ -278,6 +307,7 @@
     RegisterUserMetadata(lock.GetJson());
     RegisterUserContentType(lock.GetJson());
 
+    LoadExternalDictionaries(lock.GetJson());  // New in Orthanc 1.9.4
     LoadCustomDictionary(lock.GetJson());
 
     lock.GetConfiguration().RegisterFont(ServerResources::FONT_UBUNTU_MONO_BOLD_16);
@@ -319,7 +349,7 @@
     OrthancConfiguration::ReaderLock lock;
 
     std::string storageDirectoryStr = 
-      lock.GetConfiguration().GetStringParameter("StorageDirectory", "OrthancStorage");
+      lock.GetConfiguration().GetStringParameter(STORAGE_DIRECTORY, ORTHANC_STORAGE);
 
     // Open the database
     boost::filesystem::path indexDirectory = lock.GetConfiguration().InterpretStringParameterAsPath(
@@ -413,10 +443,13 @@
 
   static IStorageArea* CreateFilesystemStorage()
   {
+    static const char* const SYNC_STORAGE_AREA = "SyncStorageArea";
+    static const char* const STORE_DICOM = "StoreDicom";
+    
     OrthancConfiguration::ReaderLock lock;
 
     std::string storageDirectoryStr = 
-      lock.GetConfiguration().GetStringParameter("StorageDirectory", "OrthancStorage");
+      lock.GetConfiguration().GetStringParameter(STORAGE_DIRECTORY, ORTHANC_STORAGE);
 
     boost::filesystem::path storageDirectory = 
       lock.GetConfiguration().InterpretStringParameterAsPath(storageDirectoryStr);
@@ -424,9 +457,9 @@
     LOG(WARNING) << "Storage directory: " << storageDirectory;
 
     // New in Orthanc 1.7.4
-    bool fsyncOnWrite = lock.GetConfiguration().GetBooleanParameter("SyncStorageArea", true);
+    bool fsyncOnWrite = lock.GetConfiguration().GetBooleanParameter(SYNC_STORAGE_AREA, true);
 
-    if (lock.GetConfiguration().GetBooleanParameter("StoreDicom", true))
+    if (lock.GetConfiguration().GetBooleanParameter(STORE_DICOM, true))
     {
       return new FilesystemStorage(storageDirectory.string(), fsyncOnWrite);
     }