# HG changeset patch # User Sebastien Jodogne # Date 1650903946 -7200 # Node ID 40fd2a485a8414783d89a0996e156a4f63fbcac4 # Parent d0c34145320c0ddc9bba86735fefcfd5039d8a8e fix build for older compilers diff -r d0c34145320c -r 40fd2a485a84 OrthancFramework/Sources/DicomFormat/DicomMap.cpp --- a/OrthancFramework/Sources/DicomFormat/DicomMap.cpp Mon Apr 25 17:32:58 2022 +0200 +++ b/OrthancFramework/Sources/DicomFormat/DicomMap.cpp Mon Apr 25 18:25:46 2022 +0200 @@ -168,9 +168,22 @@ // we keep many "copies" of the same data to guarantee quick access to organized data // and avoid rebuilding it all the time. - std::map > mainDicomTagsByTag_; - std::map > mainDicomTagsByName_; - std::map > mainDicomTagsByLevel_; + std::map patientsMainDicomTagsByTag_; + std::map patientsMainDicomTagsByName_; + std::set patientsMainDicomTagsByLevel_; + + std::map studiesMainDicomTagsByTag_; + std::map studiesMainDicomTagsByName_; + std::set studiesMainDicomTagsByLevel_; + + std::map seriesMainDicomTagsByTag_; + std::map seriesMainDicomTagsByName_; + std::set seriesMainDicomTagsByLevel_; + + std::map instancesMainDicomTagsByTag_; + std::map instancesMainDicomTagsByName_; + std::set instancesMainDicomTagsByLevel_; + std::set allMainDicomTags_; std::map signatures_; @@ -183,9 +196,22 @@ void ResetDefaultMainDicomTags() { - mainDicomTagsByTag_.clear(); - mainDicomTagsByName_.clear(); - mainDicomTagsByLevel_.clear(); + patientsMainDicomTagsByTag_.clear(); + patientsMainDicomTagsByName_.clear(); + patientsMainDicomTagsByLevel_.clear(); + + studiesMainDicomTagsByTag_.clear(); + studiesMainDicomTagsByName_.clear(); + studiesMainDicomTagsByLevel_.clear(); + + seriesMainDicomTagsByTag_.clear(); + seriesMainDicomTagsByName_.clear(); + seriesMainDicomTagsByLevel_.clear(); + + instancesMainDicomTagsByTag_.clear(); + instancesMainDicomTagsByName_.clear(); + instancesMainDicomTagsByLevel_.clear(); + allMainDicomTags_.clear(); // by default, initialize with the previous static list (up to 1.10.0) @@ -216,8 +242,6 @@ void LoadDefaultMainDicomTags(ResourceType level) { - assert(mainDicomTagsByTag_.find(level) == mainDicomTagsByTag_.end()); - const MainDicomTag* tags = NULL; size_t size; @@ -257,6 +281,69 @@ } + std::map& GetMainDicomTags(ResourceType level) + { + switch (level) + { + case ResourceType_Patient: + return patientsMainDicomTagsByTag_; + + case ResourceType_Study: + return studiesMainDicomTagsByTag_; + + case ResourceType_Series: + return seriesMainDicomTagsByTag_; + + case ResourceType_Instance: + return instancesMainDicomTagsByTag_; + + default: + throw OrthancException(ErrorCode_InternalError); + } + } + + std::map& GetMainDicomTagsByName(ResourceType level) + { + switch (level) + { + case ResourceType_Patient: + return patientsMainDicomTagsByName_; + + case ResourceType_Study: + return studiesMainDicomTagsByName_; + + case ResourceType_Series: + return seriesMainDicomTagsByName_; + + case ResourceType_Instance: + return instancesMainDicomTagsByName_; + + default: + throw OrthancException(ErrorCode_InternalError); + } + } + + std::set& GetMainDicomTagsByLevel(ResourceType level) + { + switch (level) + { + case ResourceType_Patient: + return patientsMainDicomTagsByLevel_; + + case ResourceType_Study: + return studiesMainDicomTagsByLevel_; + + case ResourceType_Series: + return seriesMainDicomTagsByLevel_; + + case ResourceType_Instance: + return instancesMainDicomTagsByLevel_; + + default: + throw OrthancException(ErrorCode_InternalError); + } + } + public: // Singleton pattern static MainDicomTagsConfiguration& GetInstance() @@ -267,44 +354,26 @@ void AddMainDicomTag(const DicomTag& tag, const std::string& name, ResourceType level) { - if (mainDicomTagsByTag_[level].find(tag) != mainDicomTagsByTag_[level].end()) + std::map& byTag = GetMainDicomTags(level); + std::map& byName = GetMainDicomTagsByName(level); + + if (byTag.find(tag) != byTag.end()) { throw OrthancException(ErrorCode_MainDicomTagsMultiplyDefined, tag.Format() + " is already defined"); } - if (mainDicomTagsByName_[level].find(name) != mainDicomTagsByName_[level].end()) + if (byName.find(name) != byName.end()) { throw OrthancException(ErrorCode_MainDicomTagsMultiplyDefined, name + " is already defined"); } - mainDicomTagsByTag_[level][tag] = name; - mainDicomTagsByName_[level][name] = DicomTag2(tag); - mainDicomTagsByLevel_[level].insert(tag); + byTag[tag] = name; + byName[name] = DicomTag2(tag); + GetMainDicomTagsByLevel(level).insert(tag); allMainDicomTags_.insert(tag); signatures_[level] = ComputeSignature(GetMainDicomTagsByLevel(level)); } - const std::map& GetMainDicomTags(ResourceType level) const - { - assert(mainDicomTagsByTag_.find(level) != mainDicomTagsByTag_.end()); - - return mainDicomTagsByTag_.at(level); - } - - const std::map& GetMainDicomTagsByName(ResourceType level) const - { - assert(mainDicomTagsByName_.find(level) != mainDicomTagsByName_.end()); - - return mainDicomTagsByName_.at(level); - } - - const std::set& GetMainDicomTagsByLevel(ResourceType level) const - { - assert(mainDicomTagsByLevel_.find(level) != mainDicomTagsByLevel_.end()); - - return mainDicomTagsByLevel_.at(level); - } - const std::set& GetAllMainDicomTags() const { return allMainDicomTags_; diff -r d0c34145320c -r 40fd2a485a84 OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp --- a/OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp Mon Apr 25 17:32:58 2022 +0200 +++ b/OrthancFramework/UnitTestsSources/FromDcmtkTests.cpp Mon Apr 25 18:25:46 2022 +0200 @@ -380,7 +380,7 @@ std::set result; FromDcmtkBridge::ParseListOfTags(result, source); - ASSERT_EQ(0, result.size()); + ASSERT_EQ(0u, result.size()); } {// invalid tag @@ -396,7 +396,7 @@ FromDcmtkBridge::ParseListOfTags(result, source); - ASSERT_EQ(1, result.size()); + ASSERT_EQ(1u, result.size()); } {// Json diff -r d0c34145320c -r 40fd2a485a84 OrthancFramework/UnitTestsSources/ToolboxTests.cpp --- a/OrthancFramework/UnitTestsSources/ToolboxTests.cpp Mon Apr 25 17:32:58 2022 +0200 +++ b/OrthancFramework/UnitTestsSources/ToolboxTests.cpp Mon Apr 25 18:25:46 2022 +0200 @@ -218,7 +218,7 @@ std::set missings; ASSERT_TRUE(Toolbox::IsSetInSet(needles, haystack)); - ASSERT_EQ(0, Toolbox::GetMissingsFromSet(missings, needles, haystack)); + ASSERT_EQ(0u, Toolbox::GetMissingsFromSet(missings, needles, haystack)); } { @@ -228,7 +228,7 @@ haystack.insert(5); ASSERT_TRUE(Toolbox::IsSetInSet(needles, haystack)); - ASSERT_EQ(0, Toolbox::GetMissingsFromSet(missings, needles, haystack)); + ASSERT_EQ(0u, Toolbox::GetMissingsFromSet(missings, needles, haystack)); } { @@ -239,7 +239,7 @@ needles.insert(5); haystack.insert(5); ASSERT_TRUE(Toolbox::IsSetInSet(needles, haystack)); - ASSERT_EQ(0, Toolbox::GetMissingsFromSet(missings, needles, haystack)); + ASSERT_EQ(0u, Toolbox::GetMissingsFromSet(missings, needles, haystack)); } { @@ -250,7 +250,7 @@ needles.insert(5); ASSERT_FALSE(Toolbox::IsSetInSet(needles, haystack)); - ASSERT_EQ(1, Toolbox::GetMissingsFromSet(missings, needles, haystack)); + ASSERT_EQ(1u, Toolbox::GetMissingsFromSet(missings, needles, haystack)); ASSERT_TRUE(missings.count(5) == 1); } @@ -262,7 +262,7 @@ needles.insert(6); haystack.insert(5); ASSERT_FALSE(Toolbox::IsSetInSet(needles, haystack)); - ASSERT_EQ(1, Toolbox::GetMissingsFromSet(missings, needles, haystack)); + ASSERT_EQ(1u, Toolbox::GetMissingsFromSet(missings, needles, haystack)); ASSERT_TRUE(missings.count(6) == 1); } @@ -276,7 +276,7 @@ haystack.insert(5); haystack.insert(6); ASSERT_TRUE(Toolbox::IsSetInSet(needles, haystack)); - ASSERT_EQ(0, Toolbox::GetMissingsFromSet(missings, needles, haystack)); + ASSERT_EQ(0u, Toolbox::GetMissingsFromSet(missings, needles, haystack)); } } @@ -321,4 +321,4 @@ Toolbox::JoinStrings(result, source, "\\"); ASSERT_EQ("1\\2", result); } -} \ No newline at end of file +} diff -r d0c34145320c -r 40fd2a485a84 OrthancServer/Plugins/Samples/Housekeeper/Plugin.cpp --- a/OrthancServer/Plugins/Samples/Housekeeper/Plugin.cpp Mon Apr 25 17:32:58 2022 +0200 +++ b/OrthancServer/Plugins/Samples/Housekeeper/Plugin.cpp Mon Apr 25 18:25:46 2022 +0200 @@ -36,7 +36,7 @@ static int globalPropertyId_ = 0; static bool force_ = false; -static uint throttleDelay_ = 0; +static unsigned int throttleDelay_ = 0; static std::unique_ptr workerThread_; static bool workerThreadShouldStop_ = false; static bool triggerOnStorageCompressionChange_ = true; @@ -156,7 +156,10 @@ struct DbConfiguration { std::string orthancVersion; - std::map mainDicomTagsSignature; + std::string patientsMainDicomTagsSignature; + std::string studiesMainDicomTagsSignature; + std::string seriesMainDicomTagsSignature; + std::string instancesMainDicomTagsSignature; bool storageCompressionEnabled; DbConfiguration() @@ -166,13 +169,16 @@ bool IsDefined() const { - return !orthancVersion.empty() && mainDicomTagsSignature.size() == 4; + return !orthancVersion.empty(); } void Clear() { orthancVersion.clear(); - mainDicomTagsSignature.clear(); + patientsMainDicomTagsSignature.clear(); + studiesMainDicomTagsSignature.clear(); + seriesMainDicomTagsSignature.clear(); + instancesMainDicomTagsSignature.clear(); } void ToJson(Json::Value& target) @@ -188,10 +194,10 @@ target = Json::objectValue; // default main dicom tags signature are the one from Orthanc 1.4.2 (last time the list was changed): - signatures["Patient"] = mainDicomTagsSignature[OrthancPluginResourceType_Patient]; - signatures["Study"] = mainDicomTagsSignature[OrthancPluginResourceType_Study]; - signatures["Series"] = mainDicomTagsSignature[OrthancPluginResourceType_Series]; - signatures["Instance"] = mainDicomTagsSignature[OrthancPluginResourceType_Instance]; + signatures["Patient"] = patientsMainDicomTagsSignature; + signatures["Study"] = studiesMainDicomTagsSignature; + signatures["Series"] = seriesMainDicomTagsSignature; + signatures["Instance"] = instancesMainDicomTagsSignature; target["MainDicomTagsSignature"] = signatures; target["OrthancVersion"] = orthancVersion; @@ -206,10 +212,10 @@ orthancVersion = source["OrthancVersion"].asString(); const Json::Value& signatures = source["MainDicomTagsSignature"]; - mainDicomTagsSignature[OrthancPluginResourceType_Patient] = signatures["Patient"].asString(); - mainDicomTagsSignature[OrthancPluginResourceType_Study] = signatures["Study"].asString(); - mainDicomTagsSignature[OrthancPluginResourceType_Series] = signatures["Series"].asString(); - mainDicomTagsSignature[OrthancPluginResourceType_Instance] = signatures["Instance"].asString(); + patientsMainDicomTagsSignature = signatures["Patient"].asString(); + studiesMainDicomTagsSignature = signatures["Study"].asString(); + seriesMainDicomTagsSignature = signatures["Series"].asString(); + instancesMainDicomTagsSignature = signatures["Instance"].asString(); storageCompressionEnabled = source["StorageCompressionEnabled"].asBool(); } @@ -283,10 +289,10 @@ pluginStatus.currentlyProcessingConfiguration.orthancVersion = "1.9.0"; // when we don't know, we assume some files were stored with Orthanc 1.9.0 (last version saving the dicom-as-json files) // default main dicom tags signature are the one from Orthanc 1.4.2 (last time the list was changed): - pluginStatus.currentlyProcessingConfiguration.mainDicomTagsSignature[OrthancPluginResourceType_Patient] = "0010,0010;0010,0020;0010,0030;0010,0040;0010,1000"; - pluginStatus.currentlyProcessingConfiguration.mainDicomTagsSignature[OrthancPluginResourceType_Study] = "0008,0020;0008,0030;0008,0050;0008,0080;0008,0090;0008,1030;0020,000d;0020,0010;0032,1032;0032,1060"; - pluginStatus.currentlyProcessingConfiguration.mainDicomTagsSignature[OrthancPluginResourceType_Series] = "0008,0021;0008,0031;0008,0060;0008,0070;0008,1010;0008,103e;0008,1070;0018,0010;0018,0015;0018,0024;0018,1030;0018,1090;0018,1400;0020,000e;0020,0011;0020,0037;0020,0105;0020,1002;0040,0254;0054,0081;0054,0101;0054,1000"; - pluginStatus.currentlyProcessingConfiguration.mainDicomTagsSignature[OrthancPluginResourceType_Instance] = "0008,0012;0008,0013;0008,0018;0020,0012;0020,0013;0020,0032;0020,0037;0020,0100;0020,4000;0028,0008;0054,1330"; + pluginStatus.currentlyProcessingConfiguration.patientsMainDicomTagsSignature = "0010,0010;0010,0020;0010,0030;0010,0040;0010,1000"; + pluginStatus.currentlyProcessingConfiguration.studiesMainDicomTagsSignature = "0008,0020;0008,0030;0008,0050;0008,0080;0008,0090;0008,1030;0020,000d;0020,0010;0032,1032;0032,1060"; + pluginStatus.currentlyProcessingConfiguration.seriesMainDicomTagsSignature = "0008,0021;0008,0031;0008,0060;0008,0070;0008,1010;0008,103e;0008,1070;0018,0010;0018,0015;0018,0024;0018,1030;0018,1090;0018,1400;0020,000e;0020,0011;0020,0037;0020,0105;0020,1002;0040,0254;0054,0081;0054,0101;0054,1000"; + pluginStatus.currentlyProcessingConfiguration.instancesMainDicomTagsSignature = "0008,0012;0008,0013;0008,0018;0020,0012;0020,0013;0020,0032;0020,0037;0020,0100;0020,4000;0028,0008;0054,1330"; } } @@ -310,10 +316,10 @@ Json::Value systemInfo; OrthancPlugins::RestApiGet(systemInfo, "/system", false); - configuration.mainDicomTagsSignature[OrthancPluginResourceType_Patient] = systemInfo["MainDicomTags"]["Patient"].asString(); - configuration.mainDicomTagsSignature[OrthancPluginResourceType_Study] = systemInfo["MainDicomTags"]["Study"].asString(); - configuration.mainDicomTagsSignature[OrthancPluginResourceType_Series] = systemInfo["MainDicomTags"]["Series"].asString(); - configuration.mainDicomTagsSignature[OrthancPluginResourceType_Instance] = systemInfo["MainDicomTags"]["Instance"].asString(); + configuration.patientsMainDicomTagsSignature = systemInfo["MainDicomTags"]["Patient"].asString(); + configuration.studiesMainDicomTagsSignature = systemInfo["MainDicomTags"]["Study"].asString(); + configuration.seriesMainDicomTagsSignature = systemInfo["MainDicomTags"]["Series"].asString(); + configuration.instancesMainDicomTagsSignature = systemInfo["MainDicomTags"]["Instance"].asString(); configuration.storageCompressionEnabled = systemInfo["StorageCompression"].asBool(); configuration.orthancVersion = OrthancPlugins::GetGlobalContext()->orthancVersion; @@ -327,8 +333,6 @@ } const char* lastVersion = last.orthancVersion.c_str(); - const std::map& lastTags = last.mainDicomTagsSignature; - const std::map& currentTags = current.mainDicomTagsSignature; bool needsProcessing = false; if (!OrthancPlugins::CheckMinimalVersion(lastVersion, 1, 9, 1)) @@ -344,7 +348,7 @@ } } - if (lastTags.at(OrthancPluginResourceType_Patient) != currentTags.at(OrthancPluginResourceType_Patient)) + if (last.patientsMainDicomTagsSignature != current.patientsMainDicomTagsSignature) { if (triggerOnMainDicomTagsChange_) { @@ -357,7 +361,7 @@ } } - if (lastTags.at(OrthancPluginResourceType_Study) != currentTags.at(OrthancPluginResourceType_Study)) + if (last.studiesMainDicomTagsSignature != current.studiesMainDicomTagsSignature) { if (triggerOnMainDicomTagsChange_) { @@ -370,7 +374,7 @@ } } - if (lastTags.at(OrthancPluginResourceType_Series) != currentTags.at(OrthancPluginResourceType_Series)) + if (last.seriesMainDicomTagsSignature != current.seriesMainDicomTagsSignature) { if (triggerOnMainDicomTagsChange_) { @@ -383,7 +387,7 @@ } } - if (lastTags.at(OrthancPluginResourceType_Instance) != currentTags.at(OrthancPluginResourceType_Instance)) + if (last.instancesMainDicomTagsSignature != current.instancesMainDicomTagsSignature) { if (triggerOnMainDicomTagsChange_) {