diff --git a/UnitTest/UnitTest.vcxproj b/UnitTest/UnitTest.vcxproj index d98ea5b10..4040374a2 100644 --- a/UnitTest/UnitTest.vcxproj +++ b/UnitTest/UnitTest.vcxproj @@ -55,7 +55,7 @@ Use - Level3 + Level4 true $(SolutionDir);$(SolutionDir)six\modules\c++\scene\include;$(SolutionDir)six\modules\c++\six\include;$(SolutionDir)six\modules\c++\six.sidd\include;$(SolutionDir)six\modules\c++\six.sicd\include;$(SolutionDir)six\modules\c++\cphd\include;$(SolutionDir)six\modules\c++\cphd03\include;$(SolutionDir)externals\nitro\modules\c\nrt\include;$(SolutionDir)externals\nitro\modules\c\nitf\include;$(SolutionDir)externals\nitro\modules\c++\nitf\include;$(SolutionDir)externals\coda-oss\out\install\$(Platform)-$(Configuration)\include;$(SolutionDir)externals\coda-oss\out\install\$(Platform)-$(Configuration);$(SolutionDir)out\install\$(Platform)-$(Configuration)\include;$(SolutionDir)out\install\$(Platform)-$(Configuration);$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) _DEBUG;SIX_DEFAULT_SCHEMA_PATH=R"($(SolutionDir)install-$(Configuration)-$(Platform).$(PlatformToolset)\conf\schema\six)";%(PreprocessorDefinitions);_SILENCE_NONFLOATING_COMPLEX_DEPRECATION_WARNING diff --git a/externals/coda-oss/modules/c++/CMakeLists.txt b/externals/coda-oss/modules/c++/CMakeLists.txt index d30fb5766..694e037aa 100644 --- a/externals/coda-oss/modules/c++/CMakeLists.txt +++ b/externals/coda-oss/modules/c++/CMakeLists.txt @@ -3,8 +3,11 @@ set(TARGET_LANGUAGE c++) if (MSVC) # By default, there is a /W3 on the command-line from somewhere (?); adding # /Wn results in a compiler warning. - #add_compile_options(/W4) # /Wall - string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # /Wall + # + # https://github.com/microsoft/STL/wiki/Changelog#vs-2022-179-preview-1 + # > *Note*: `/Wall` is not intended for regular production use, as it contains a large number of + # > extremely noisy and low-value warnings. In general, the STL does not attempt to be `/Wall` clean. + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # add_compile_options(/W4) elseif (UNIX) # https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html diff --git a/externals/coda-oss/modules/c++/coda-oss.vcxproj b/externals/coda-oss/modules/c++/coda-oss.vcxproj index e2b2a306d..77af044c5 100644 --- a/externals/coda-oss/modules/c++/coda-oss.vcxproj +++ b/externals/coda-oss/modules/c++/coda-oss.vcxproj @@ -564,7 +564,7 @@ - EnableAllWarnings + Level4 true _DEBUG;_LIB;%(PreprocessorDefinitions);CODA_OSS_EXPORTS;CODA_OSS_DLL;MT_DEFAULT_PINNING=0;RE_ENABLE_STD_REGEX=1 pch.h @@ -593,7 +593,6 @@ - Level3 true true true @@ -609,6 +608,7 @@ true /Zc:__cplusplus %(AdditionalOptions) AdvancedVectorExtensions2 + Level3 diff --git a/externals/coda-oss/modules/c++/str/include/str/Convert.h b/externals/coda-oss/modules/c++/str/include/str/Convert.h index cbcbcf0e1..ca154a6a1 100644 --- a/externals/coda-oss/modules/c++/str/include/str/Convert.h +++ b/externals/coda-oss/modules/c++/str/include/str/Convert.h @@ -105,6 +105,7 @@ inline auto toString(long double value) { return toString_(value); } + inline std::string toString(uint8_t value) { return toString(gsl::narrow(value)); diff --git a/externals/coda-oss/modules/c++/str/source/Convert.cpp b/externals/coda-oss/modules/c++/str/source/Convert.cpp index f2ae3d9f9..b8a2bc741 100644 --- a/externals/coda-oss/modules/c++/str/source/Convert.cpp +++ b/externals/coda-oss/modules/c++/str/source/Convert.cpp @@ -42,32 +42,25 @@ template<> std::string str::toType(const std::string& s) template<> bool str::toType(const std::string& s) { - std::string ss = s; - str::lower(ss); - - if (ss == "true") + if (eq(s, "true")) // case-insensitive compare { return true; } - else if (ss == "false") + if (eq(s, "false")) // case-insensitive compare { return false; } - else if (str::isNumeric(ss)) + + // no need for lower(), digits don't have case + if (str::isNumeric(s)) { int value(0); - std::stringstream buf(ss); + std::stringstream buf(s); buf >> value; return (value != 0); } - else - { - throw except::BadCastException(except::Context(__FILE__, __LINE__, - std::string(""), std::string(""), - std::string("Invalid bool: '") + s + std::string("'"))); - } - return false; + throw except::BadCastException(except::Context(__FILE__, __LINE__, "", "", "Invalid bool: '" + s + "'")); } long long str::strtoll(const char *str, char **endptr, int base) diff --git a/externals/nitro/UnitTest/UnitTest.cpp b/externals/nitro/UnitTest/UnitTest.cpp index bd3176e4a..96add941b 100644 --- a/externals/nitro/UnitTest/UnitTest.cpp +++ b/externals/nitro/UnitTest/UnitTest.cpp @@ -1,11 +1,13 @@ #include "pch.h" #include "CppUnitTest.h" +#include #include // https://learn.microsoft.com/en-us/visualstudio/test/microsoft-visualstudio-testtools-cppunittestframework-api-reference?view=vs-2022 TEST_MODULE_INITIALIZE(methodName) { // module initialization code - nitf::Test::setNitfPluginPath(); + nitf_PluginRegistry_PreloadedTREHandlersEnable(NRT_TRUE); + nitf::Test::j2kSetNitfPluginPath(); } \ No newline at end of file diff --git a/externals/nitro/UnitTest/UnitTest.vcxproj b/externals/nitro/UnitTest/UnitTest.vcxproj index 582a6e41c..bae72b864 100644 --- a/externals/nitro/UnitTest/UnitTest.vcxproj +++ b/externals/nitro/UnitTest/UnitTest.vcxproj @@ -55,7 +55,7 @@ Use - Level3 + Level4 true $(ProjectDir);$(SolutionDir)modules\c\nrt\include;$(SolutionDir)modules\c\nitf\include;$(SolutionDir)modules\c++\nitf\include;$(SolutionDir)modules\c\j2k\include;$(SolutionDir)modules\c;$(SolutionDir)modules\c++;$(SolutionDir)externals\coda-oss\modules\c++;$(SolutionDir)externals\coda-oss\out\install\$(Platform)-$(Configuration)\include;$(SolutionDir)out\install\$(Platform)-$(Configuration)\include;$(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories) _DEBUG;%(PreprocessorDefinitions) @@ -258,9 +258,6 @@ {f06550ad-cfc7-40b8-8727-6c82c69a8982} - - {53f9f908-c678-4dee-9309-e71c1e03a45f} - {78849481-d356-4cc7-b182-31c21f857ed1} diff --git a/externals/nitro/UnitTest/nitf-c++.cpp b/externals/nitro/UnitTest/nitf-c++.cpp index 700258d51..92ba3fad2 100644 --- a/externals/nitro/UnitTest/nitf-c++.cpp +++ b/externals/nitro/UnitTest/nitf-c++.cpp @@ -8,7 +8,7 @@ #include #include -#include +#include #include #include #include diff --git a/externals/nitro/modules/c++/CMakeLists.txt b/externals/nitro/modules/c++/CMakeLists.txt index 6b60cd28f..320ab2705 100644 --- a/externals/nitro/modules/c++/CMakeLists.txt +++ b/externals/nitro/modules/c++/CMakeLists.txt @@ -3,9 +3,12 @@ set(TARGET_LANGUAGE c++) # turn on warnings as errors if (MSVC) # By default, there is a /W3 on the command-line from somewhere (?); adding - # /W4 results in a compiler warning. - #add_compile_options(/W4) # /Wall - string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # /Wall + # /Wn results in a compiler warning. + # + # https://github.com/microsoft/STL/wiki/Changelog#vs-2022-179-preview-1 + # > *Note*: `/Wall` is not intended for regular production use, as it contains a large number of + # > extremely noisy and low-value warnings. In general, the STL does not attempt to be `/Wall` clean. + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # add_compile_options(/W4) elseif (UNIX) #add_compile_options(-Wall -pedantic -Wextra) diff --git a/externals/nitro/modules/c++/nitf-c++.vcxproj b/externals/nitro/modules/c++/nitf-c++.vcxproj index 7d08f7107..6d12f0550 100644 --- a/externals/nitro/modules/c++/nitf-c++.vcxproj +++ b/externals/nitro/modules/c++/nitf-c++.vcxproj @@ -161,6 +161,7 @@ + @@ -213,7 +214,7 @@ - EnableAllWarnings + Level4 true _DEBUG;%(PreprocessorDefinitions) true @@ -232,6 +233,7 @@ AdvancedVectorExtensions2 MultiThreadedDebugDLL true + true diff --git a/externals/nitro/modules/c++/nitf-c++.vcxproj.filters b/externals/nitro/modules/c++/nitf-c++.vcxproj.filters index 7f786dc0b..e936e94cb 100644 --- a/externals/nitro/modules/c++/nitf-c++.vcxproj.filters +++ b/externals/nitro/modules/c++/nitf-c++.vcxproj.filters @@ -463,5 +463,8 @@ Header Files + + Header Files + \ No newline at end of file diff --git a/externals/nitro/modules/c++/nitf/apps/show_nitf++/show_nitf++.vcxproj b/externals/nitro/modules/c++/nitf/apps/show_nitf++/show_nitf++.vcxproj index 66dcf81ba..944eafbc5 100644 --- a/externals/nitro/modules/c++/nitf/apps/show_nitf++/show_nitf++.vcxproj +++ b/externals/nitro/modules/c++/nitf/apps/show_nitf++/show_nitf++.vcxproj @@ -47,7 +47,7 @@ - EnableAllWarnings + Level4 true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true @@ -65,6 +65,7 @@ true AdvancedVectorExtensions2 true + true Console diff --git a/externals/nitro/modules/c++/nitf/include/nitf/TRE.hpp b/externals/nitro/modules/c++/nitf/include/nitf/TRE.hpp index 09fdfab2a..e40c56283 100644 --- a/externals/nitro/modules/c++/nitf/include/nitf/TRE.hpp +++ b/externals/nitro/modules/c++/nitf/include/nitf/TRE.hpp @@ -366,9 +366,6 @@ DECLARE_CLASS(TRE) */ std::string getID() const; - private: - std::string truncate(const std::string& value, size_t maxDigits) const; - mutable nitf_Error error{}; }; } diff --git a/externals/nitro/modules/c++/nitf/include/nitf/TREsTyped.hpp b/externals/nitro/modules/c++/nitf/include/nitf/TREsTyped.hpp new file mode 100644 index 000000000..10b796a12 --- /dev/null +++ b/externals/nitro/modules/c++/nitf/include/nitf/TREsTyped.hpp @@ -0,0 +1,120 @@ +/* ========================================================================= + * This file is part of NITRO + * ========================================================================= + * + * (C) Copyright 2004 - 2014, MDA Information Systems LLC + * © Copyright 2023, Maxar Technologies, Inc. + * + * NITRO is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, If not, + * see . + * + */ + +#pragma once + +#include "TREField.hpp" + + // A sample (and simple) "strongly-typed" TRE; see ENGRDA in the +// unittests for something a bit more elaborate (not included because it's incomplete). +namespace nitf +{ +namespace TREs +{ + class TEST_DES final + { + nitf::TRE tre_; + static constexpr const char* tag = "TEST_DES"; + + public: + // from TRE::getID() + /** + * Get the TRE identifier. This is NOT the tag, however it may be the + * same value as the tag. The ID is used to identify a specific + * version/incarnation of the TRE, if multiple are possible. For most TREs, + * this value will be the same as the tag. + */ + TEST_DES(const std::string& id = "") noexcept(false) + : tre_(tag, id.empty() ? tag : id.c_str()), + TEST_DES_COUNT(tre_, "TEST_DES_COUNT"), + TEST_DES_START(tre_, "TEST_DES_START"), + TEST_DES_INCREMENT(tre_, "TEST_DES_INCREMENT") + { + } + ~TEST_DES() = default; + TEST_DES(const TEST_DES&) = delete; + TEST_DES& operator=(const TEST_DES&) = delete; + TEST_DES(TEST_DES&&) = default; + TEST_DES& operator=(TEST_DES&&) = delete; + + // From TEST_DES.c + /* + static nitf_TREDescription TEST_DES_description[] = { + {NITF_BCS_N, 2, "Number of data values", "TEST_DES_COUNT" }, + {NITF_BCS_N, 3, "Start value in ramp", "TEST_DES_START" }, + {NITF_BCS_N, 2, "Increment between values in ramp", "TEST_DES_INCREMENT" }, + {NITF_END, 0, NULL, NULL} + }; + */ + nitf::TREField_BCS_N<2> TEST_DES_COUNT; + nitf::TREField_BCS_N<3> TEST_DES_START; + nitf::TREField_BCS_N<2> TEST_DES_INCREMENT; + + void updateFields() + { + tre_.updateFields(); + } + }; + + class TEST_PRELOADED_DES final + { + nitf::TRE tre_; + static constexpr const char* tag = "TEST_PRELOADED_DES"; + + public: + // from TRE::getID() + /** + * Get the TRE identifier. This is NOT the tag, however it may be the + * same value as the tag. The ID is used to identify a specific + * version/incarnation of the TRE, if multiple are possible. For most TREs, + * this value will be the same as the tag. + */ + TEST_PRELOADED_DES(const std::string& id = "") noexcept(false) : tre_(tag, id.empty() ? tag : id.c_str()), + COUNT(tre_, "COUNT"), START(tre_, "START"), INCREMENT(tre_, "INCREMENT") { } + ~TEST_PRELOADED_DES() = default; + TEST_PRELOADED_DES(const TEST_PRELOADED_DES&) = delete; + TEST_PRELOADED_DES& operator=(const TEST_PRELOADED_DES&) = delete; + TEST_PRELOADED_DES(TEST_PRELOADED_DES&&) = default; + TEST_PRELOADED_DES& operator=(TEST_PRELOADED_DES&&) = delete; + + // From TREs.c + /* + static nitf_TREDescription TEST_PRELOADED_DES_description[] = { + {NITF_BCS_N, 2, "Number of data values", "COUNT" }, + {NITF_BCS_N, 3, "Start value in ramp", "START" }, + {NITF_BCS_N, 2, "Increment between values in ramp", "INCREMENT" }, + {NITF_END, 0, NULL, NULL} + }; + */ + nitf::TREField_BCS_N<2> COUNT; + nitf::TREField_BCS_N<3> START; + nitf::TREField_BCS_N<2> INCREMENT; + + void updateFields() + { + tre_.updateFields(); + } + }; + +} // namespace TREs +} // namespace nitf \ No newline at end of file diff --git a/externals/nitro/modules/c++/nitf/source/TRE.cpp b/externals/nitro/modules/c++/nitf/source/TRE.cpp index dd109d407..f0ae63b54 100644 --- a/externals/nitro/modules/c++/nitf/source/TRE.cpp +++ b/externals/nitro/modules/c++/nitf/source/TRE.cpp @@ -165,7 +165,7 @@ static bool endsWith(const std::string& s, const std::string& match) noexcept return sLen >= mLen; } -std::string TRE::truncate(const std::string& value, size_t maxDigits) const +static std::string truncate(const std::string& value, size_t maxDigits) { const size_t decimalIndex = value.find('.'); if (decimalIndex == std::string::npos) @@ -184,6 +184,40 @@ std::string TRE::truncate(const std::string& value, size_t maxDigits) const } return value; } +static std::string truncate(const nitf_Field& field, const std::string& value) +{ + auto retval = truncate(value, field.length); + + // From Field.h + if (field.type == NITF_BCS_A) + { + // is BCS-A data, it is space-filled, right-aligned. + while (retval.length() < field.length) + { + // copyAndFillSpaces() in Field.c "Spaces are added to the right" + retval += " "; + } + } + else if (field.type == NITF_BCS_N) + { + const auto decimalIndex = retval.find('.'); + + // If it is BCS-N, we expect zero-filled, left-aligned. + while (retval.length() < field.length) + { + if (decimalIndex == std::string::npos) + { + retval = "0" + retval; + } + else + { + retval += "0"; + } + } + } + + return retval; +} void TRE::setFieldValue(const std::string& key, const void* data, size_t dataLength, bool forceUpdate) { @@ -207,7 +241,7 @@ void TRE::setFieldValue(const nitf_Field& field, const std::string& key, const s else { // call truncate() first - const auto s = truncate(data, field.length); + const auto s = truncate(field, data); setFieldValue(key, s.c_str(), s.size(), forceUpdate); } } diff --git a/externals/nitro/modules/c++/nitf/source/UnitTests.cpp b/externals/nitro/modules/c++/nitf/source/UnitTests.cpp index 4b7be9066..31c651133 100644 --- a/externals/nitro/modules/c++/nitf/source/UnitTests.cpp +++ b/externals/nitro/modules/c++/nitf/source/UnitTests.cpp @@ -271,7 +271,7 @@ static std::string buildPluginName(const std::string& base) void nitf::Test::setNitfPluginPath() { // The name of the plugin we know exists and will always be built, see test_load_plugins - static const auto p = getNitfPluginPath(buildPluginName("ENGRDA")); + static const auto p = getNitfPluginPath(buildPluginName("TEST_DES")); sys::OS().setEnv("NITF_PLUGIN_PATH", p.string(), true /*overwrite*/); } diff --git a/externals/nitro/modules/c++/nitf/unittests/test_create_nitf++.cpp b/externals/nitro/modules/c++/nitf/unittests/test_create_nitf++.cpp index 10bf65413..e36b44f01 100644 --- a/externals/nitro/modules/c++/nitf/unittests/test_create_nitf++.cpp +++ b/externals/nitro/modules/c++/nitf/unittests/test_create_nitf++.cpp @@ -235,8 +235,6 @@ static bool test_create_nitf_with_byte_provider__testRead(const std::string& pat TEST_CASE(test_create_nitf_with_byte_provider_test) { - nitf::Test::setNitfPluginPath(); - // We can't actually compress. This is just for illustration. const bool shouldCompress = false; const std::string outname("test_create.nitf"); @@ -397,8 +395,6 @@ static bool test_create_nitf__testRead(const std::string& pathname, bool isMono TEST_CASE(test_create_nitf_test) { - nitf::Test::setNitfPluginPath(); - const std::string outname("test_create.nitf"); @@ -474,8 +470,6 @@ static void RecordThread_run() TEST_CASE(test_mt_record) { - nitf::Test::setNitfPluginPath(); - constexpr int NTHR = 2; std::array thrs; @@ -500,10 +494,9 @@ TEST_CASE(test_mt_record) TEST_ASSERT_TRUE(true); } - - - TEST_MAIN( + nitf::Test::setNitfPluginPath(); + TEST_CHECK(test_create_nitf_with_byte_provider_test); TEST_CHECK(test_create_nitf_test); TEST_CHECK(test_mt_record); diff --git a/externals/nitro/modules/c++/nitf/unittests/test_j2k_compress_tile.cpp b/externals/nitro/modules/c++/nitf/unittests/test_j2k_compress_tile.cpp index dedefd5ce..4548f1e25 100644 --- a/externals/nitro/modules/c++/nitf/unittests/test_j2k_compress_tile.cpp +++ b/externals/nitro/modules/c++/nitf/unittests/test_j2k_compress_tile.cpp @@ -181,8 +181,6 @@ static bool equals(const std::vector& lhs, const std::vector make_Tester(bool setBlocking, std::optional maxRo TEST_CASE(j2k_compressed_byte_provider_maxRowsPerSegment0) { - nitf::Test::setNitfPluginPath(); { auto tester = make_Tester(true /*setBlocking*/); tester.testMultipleWritesBlocked(); @@ -605,8 +604,6 @@ TEST_CASE(j2k_compressed_byte_provider_maxRowsPerSegment0) TEST_CASE(j2k_compressed_byte_provider) { - nitf::Test::setNitfPluginPath(); - // Run tests forcing various numbers of segments // Blocking is set at 40 rows / block so can't go less than this // Actual limit is a bit higher, since j2k needs a minimum size @@ -636,6 +633,8 @@ TEST_CASE(j2k_do_nothing) } TEST_MAIN( + nitf::Test::j2kSetNitfPluginPath(); + TEST_CHECK(j2k_do_nothing); //TEST_CHECK(j2k_compressed_byte_provider_maxRowsPerSegment0); // TODO: get working with CMake //TEST_CHECK(j2k_compressed_byte_provider); // TODO: get working with CMake diff --git a/externals/nitro/modules/c++/nitf/unittests/test_load_plugins.cpp b/externals/nitro/modules/c++/nitf/unittests/test_load_plugins.cpp index 4f84931dc..9e59a2405 100644 --- a/externals/nitro/modules/c++/nitf/unittests/test_load_plugins.cpp +++ b/externals/nitro/modules/c++/nitf/unittests/test_load_plugins.cpp @@ -78,16 +78,18 @@ TEST_CASE(test_retrieveTREHandler) TEST_CASE(test_load_PTPRAA) { + TEST_ASSERT_TRUE(nitf_PluginRegistry_PreloadedTREHandlerEnable("PTPRAA", NRT_TRUE)); retrieveTREHandler(testName, "PTPRAA"); } TEST_CASE(test_load_ENGRDA) { + TEST_ASSERT_TRUE(nitf_PluginRegistry_PreloadedTREHandlerEnable("ENGRDA", NRT_TRUE)); retrieveTREHandler(testName, "ENGRDA"); } TEST_CASE(test_load_all_TREs) { - const nitf::TRE tre("ACCPOB"); + const nitf::TRE ACCPOB("ACCPOB"); for (const auto& tre : all_TREs()) { diff --git a/externals/nitro/modules/c++/nitf/unittests/test_tre_create++.cpp b/externals/nitro/modules/c++/nitf/unittests/test_tre_create++.cpp index bc3f884fc..883c0fd8f 100644 --- a/externals/nitro/modules/c++/nitf/unittests/test_tre_create++.cpp +++ b/externals/nitro/modules/c++/nitf/unittests/test_tre_create++.cpp @@ -9,6 +9,7 @@ TEST_CASE(test_tre_create_329) { // https://github.com/mdaus/nitro/issues/329 + TEST_ASSERT_TRUE(nitf_PluginRegistry_PreloadedTREHandlerEnable("HISTOA", NRT_TRUE)); nitf::TRE tre("HISTOA", "HISTOA"); // allocates fields SYSTEM .. NEVENTS tre.setField("SYSTYPE", "M1"); TEST_ASSERT_TRUE(true); @@ -39,8 +40,6 @@ TEST_CASE(test_tre_clone_329) } TEST_MAIN( - nitf::Test::setNitfPluginPath(); - TEST_CHECK(test_tre_create_329); TEST_CHECK(test_tre_clone_329); ) diff --git a/externals/nitro/modules/c++/nitf/unittests/test_tre_mods++.cpp b/externals/nitro/modules/c++/nitf/unittests/test_tre_mods++.cpp index 1c2b4a870..bb9963e03 100644 --- a/externals/nitro/modules/c++/nitf/unittests/test_tre_mods++.cpp +++ b/externals/nitro/modules/c++/nitf/unittests/test_tre_mods++.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -58,7 +59,7 @@ #include "nitf/TRE.hpp" #include "nitf/exports.hpp" -#include "nitf/TREField.hpp" +#include "nitf/TREsTyped.hpp" // A sample "strongly-typed" TRE. There are too many TREs (and too much unwillingness to change) to // actually hook this up. But it's kind of neat code that I don't want to lose. @@ -159,7 +160,7 @@ struct /*namespace*/ TREs TEST_CASE(setFields) { - // create an ACFTA TRE + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("ACFTA", NRT_TRUE) ); nitf::TRE tre("ACFTA"); // set a field @@ -178,6 +179,7 @@ TEST_CASE(setFields) TEST_CASE(setBinaryFields) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("RPFHDR", NRT_TRUE) ); nitf::TRE tre("RPFHDR"); const int value = 123; tre.setField("LOCSEC", value); @@ -189,6 +191,7 @@ TEST_CASE(setBinaryFields) TEST_CASE(cloneTRE) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("JITCID", NRT_TRUE) ); nitf::TRE tre("JITCID"); tre.setField("FILCMT", "fyi"); @@ -202,6 +205,7 @@ TEST_CASE(cloneTRE) TEST_CASE(basicIteration) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("ACCPOB", NRT_TRUE) ); nitf::TRE tre("ACCPOB"); // The entire TRE is one loop, and we haven't told it @@ -227,8 +231,47 @@ TEST_CASE(basicIteration) TEST_ASSERT_EQ(numFields, static_cast(29)); } +static void test_des_(const std::string& testName, nitf::TRE& des, const std::string& prefix) +{ + des.setField(prefix + "COUNT", 12); + des.setField(prefix + "START", 345); + des.setField(prefix + "INCREMENT", 67); + + TEST_ASSERT_EQ(des.getFieldValue(prefix + "COUNT"), 12); + TEST_ASSERT_EQ(des.getFieldValue(prefix + "START"), 345); + TEST_ASSERT_EQ(des.getFieldValue(prefix + "INCREMENT"), 67); +} +TEST_CASE(use_TEST_DES) +{ + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("TEST_PRELOADED_DES", NRT_TRUE) ); + nitf::TRE preloaded("TEST_PRELOADED_DES", "TEST_PRELOADED_DES"); + test_des_(testName, preloaded, ""); + + nitf::TREs::TEST_PRELOADED_DES test_preloaded_des; + test_preloaded_des.COUNT = 12; + test_preloaded_des.START = 345; + test_preloaded_des.INCREMENT = 67; + TEST_ASSERT_EQ(test_preloaded_des.COUNT, 12); + TEST_ASSERT_EQ(test_preloaded_des.START, 345); + TEST_ASSERT_EQ(test_preloaded_des.INCREMENT, 67); + + /***********************************************************/ + + nitf::TRE des("TEST_DES", "TEST_DES"); + test_des_(testName, des, "TEST_DES_"); + + nitf::TREs::TEST_DES test_des; + test_des.TEST_DES_COUNT = 12; + test_des.TEST_DES_START = 345; + test_des.TEST_DES_INCREMENT = 67; + TEST_ASSERT_EQ(test_des.TEST_DES_COUNT, 12); + TEST_ASSERT_EQ(test_des.TEST_DES_START, 345); + TEST_ASSERT_EQ(test_des.TEST_DES_INCREMENT, 67); +} + TEST_CASE(use_ENGRDA) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("ENGRDA", NRT_TRUE) ); nitf::TRE engrda("ENGRDA", "ENGRDA"); engrda.setField("RESRC", "HSS"); @@ -253,6 +296,7 @@ TEST_CASE(use_ENGRDA) TEST_CASE(use_ENGRDA_typed_fields) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("ENGRDA", NRT_TRUE) ); nitf::TRE engrda("ENGRDA", "ENGRDA"); nitf::TREField_BCS_A<20> RESRC(engrda, "RESRC"); @@ -285,6 +329,7 @@ TEST_CASE(use_ENGRDA_typed_fields) TEST_CASE(use_typed_ENGRDA) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("ENGRDA", NRT_TRUE) ); TREs::ENGRDA engrda; // nitf::TRE engrda("ENGRDA", "ENGRDA"); engrda.RESRC = "HSS"; // engrda.setField("RESRC", "HSS"); @@ -333,6 +378,7 @@ TEST_CASE(use_typed_ENGRDA) TEST_CASE(use_CSEXRB_typed_fields) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("CSEXRB", NRT_TRUE) ); nitf::TRE tre("CSEXRB", "CSEXRB"); constexpr auto length = 12; @@ -346,6 +392,7 @@ TEST_CASE(use_CSEXRB_typed_fields) TEST_CASE(populateWhileIterating) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("ACCPOB", NRT_TRUE) ); nitf::TRE tre("ACCPOB"); size_t numFields = 0; for (auto it = tre.begin(); it != tre.end(); ++it) @@ -370,6 +417,7 @@ TEST_CASE(populateWhileIterating) TEST_CASE(overflowingNumericFields) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("CSCRNA", NRT_TRUE) ); nitf::TRE tre("CSCRNA"); // This field has a length of 9, so check that it's properly @@ -398,12 +446,14 @@ TEST_CASE(overflowingNumericFields) } TEST_MAIN( + // must be set before making any NITRO calls nitf::Test::setNitfPluginPath(); TEST_CHECK(setFields); TEST_CHECK(setBinaryFields); TEST_CHECK(cloneTRE); TEST_CHECK(basicIteration); + TEST_CHECK(use_TEST_DES); TEST_CHECK(use_ENGRDA); TEST_CHECK(use_ENGRDA_typed_fields); TEST_CHECK(use_typed_ENGRDA); diff --git a/externals/nitro/modules/c++/nitf/unittests/test_tre_mods.cpp b/externals/nitro/modules/c++/nitf/unittests/test_tre_mods.cpp index 5bee638c7..e7246b1e1 100644 --- a/externals/nitro/modules/c++/nitf/unittests/test_tre_mods.cpp +++ b/externals/nitro/modules/c++/nitf/unittests/test_tre_mods.cpp @@ -26,6 +26,8 @@ TEST_CASE(testNestedMod) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("ACCHZB", NRT_TRUE) ); + nitf_Error error; NITF_BOOL exists; nitf_TRE* tre = nitf_TRE_construct("ACCHZB", NULL, &error); @@ -59,6 +61,8 @@ TEST_CASE(testNestedMod) TEST_CASE(testIncompleteCondMod) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("ACCPOB", NRT_TRUE) ); + nitf_Error error; NITF_BOOL exists; nitf_TRE* tre = nitf_TRE_construct("ACCPOB", NULL, &error); @@ -90,6 +94,7 @@ TEST_CASE(testClone) nitf_Field* clonedField = NULL; nitf_Error error; + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("JITCID", NRT_TRUE) ); nitf_TRE* tre = nitf_TRE_construct("JITCID", NULL, &error); TEST_ASSERT(tre != NULL); @@ -110,13 +115,14 @@ TEST_CASE(testClone) TEST_CASE(testBasicMod) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("ACFTA", NRT_TRUE) ); + /* construct a tre */ NITF_BOOL exists; nitf_Error error; - nitf_Field* field; nitf_TRE *tre = nitf_TRE_construct("ACFTA", "ACFTA_132", &error); TEST_ASSERT(tre != NULL); - field = (nitf_TRE_getField(tre, "AC_MSN_ID")); + nitf_Field* field = (nitf_TRE_getField(tre, "AC_MSN_ID")); TEST_ASSERT_EQ_STR(field->raw, " "); exists = nitf_TRE_setField(tre, "AC_MSN_ID", "fly-by", 6, &error); @@ -139,6 +145,7 @@ TEST_CASE(testBasicMod) TEST_CASE(testSize) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("AIMIDB", NRT_TRUE) ); nitf_Error error; int treLength; nitf_TRE* tre = nitf_TRE_construct("AIMIDB", NULL, &error); @@ -174,18 +181,17 @@ TEST_CASE(iterateUnfilled) TEST_CASE(populateThenIterate) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("ACCPOB", NRT_TRUE) ); nitf_Error error; - nitf_TRECursor cursor; nitf_TRE* tre = nitf_TRE_construct("ACCPOB", NULL, &error); - uint32_t numFields = 0; - TEST_ASSERT(tre != NULL); + TEST_ASSERT_NOT_NULL(tre); + uint32_t numFields = 0; nitf_TRE_setField(tre, "NUMACPO", "2", 1, &error); nitf_TRE_setField(tre, "NUMPTS[0]", "3", 1, &error); nitf_TRE_setField(tre, "NUMPTS[1]", "2", 1, &error); - cursor = nitf_TRECursor_begin(tre); - + nitf_TRECursor cursor = nitf_TRECursor_begin(tre); while (!nitf_TRECursor_isDone(&cursor)) { TEST_ASSERT(nitf_TRECursor_iterate(&cursor, &error) != 0); @@ -200,13 +206,13 @@ TEST_CASE(populateThenIterate) TEST_CASE(populateWhileIterating) { + TEST_ASSERT_TRUE( nitf_PluginRegistry_PreloadedTREHandlerEnable("ACCPOB", NRT_TRUE) ); nitf_Error error; - nitf_TRECursor cursor; nitf_TRE* tre = nitf_TRE_construct("ACCPOB", NULL, &error); - uint32_t numFields = 0; - TEST_ASSERT(tre != NULL); + TEST_ASSERT_NOT_NULL(tre); - cursor = nitf_TRECursor_begin(tre); + uint32_t numFields = 0; + nitf_TRECursor cursor = nitf_TRECursor_begin(tre); while (!nitf_TRECursor_isDone(&cursor)) { TEST_ASSERT(nitf_TRECursor_iterate(&cursor, &error) != 0); @@ -231,8 +237,6 @@ TEST_CASE(populateWhileIterating) } TEST_MAIN( - nitf::Test::setNitfPluginPath(); - TEST_CHECK(testClone); TEST_CHECK(testSize); TEST_CHECK(testBasicMod); diff --git a/externals/nitro/modules/c/CMakeLists.txt b/externals/nitro/modules/c/CMakeLists.txt index 6e6b185dc..3d2a21634 100644 --- a/externals/nitro/modules/c/CMakeLists.txt +++ b/externals/nitro/modules/c/CMakeLists.txt @@ -4,9 +4,12 @@ set(TARGET_LANGUAGE c) # turn on warnings as errors if (MSVC) # By default, there is a /W3 on the command-line from somewhere (?); adding - # /W4 results in a compiler warning. - #add_compile_options(/W4) # /Wall - string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") # /Wall + # /Wn results in a compiler warning. + # + # https://github.com/microsoft/STL/wiki/Changelog#vs-2022-179-preview-1 + # > *Note*: `/Wall` is not intended for regular production use, as it contains a large number of + # > extremely noisy and low-value warnings. In general, the STL does not attempt to be `/Wall` clean. + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # add_compile_options(/W4) add_compile_options(/wd4996) # '...': This function or variable may be unsafe. elseif (UNIX) diff --git a/externals/nitro/modules/c/j2k/J2KCompress.vcxproj b/externals/nitro/modules/c/j2k/J2KCompress.vcxproj index 60e9ab7d1..021fcb706 100644 --- a/externals/nitro/modules/c/j2k/J2KCompress.vcxproj +++ b/externals/nitro/modules/c/j2k/J2KCompress.vcxproj @@ -62,7 +62,7 @@ - EnableAllWarnings + Level4 true _DEBUG;_LIB;%(PreprocessorDefinitions);NRT_MODULE_EXPORTS;NITRO_PCH;HAVE_J2K_H true diff --git a/externals/nitro/modules/c/j2k/J2KDecompress.vcxproj b/externals/nitro/modules/c/j2k/J2KDecompress.vcxproj index 6c31591a4..366e0b421 100644 --- a/externals/nitro/modules/c/j2k/J2KDecompress.vcxproj +++ b/externals/nitro/modules/c/j2k/J2KDecompress.vcxproj @@ -62,7 +62,7 @@ - EnableAllWarnings + Level4 true _DEBUG;_LIB;%(PreprocessorDefinitions);NRT_MODULE_EXPORTS;NITRO_PCH;HAVE_J2K_H true diff --git a/externals/nitro/modules/c/nitf-c.vcxproj b/externals/nitro/modules/c/nitf-c.vcxproj index 370fb800b..be058c828 100644 --- a/externals/nitro/modules/c/nitf-c.vcxproj +++ b/externals/nitro/modules/c/nitf-c.vcxproj @@ -48,7 +48,7 @@ - EnableAllWarnings + Level4 true _DEBUG;%(PreprocessorDefinitions);HAVE_OPENJPEG_H true @@ -68,6 +68,7 @@ false MultiThreadedDebugDLL true + true diff --git a/externals/nitro/modules/c/nitf/TEST_DES.vcxproj b/externals/nitro/modules/c/nitf/TEST_DES.vcxproj new file mode 100644 index 000000000..58478f202 --- /dev/null +++ b/externals/nitro/modules/c/nitf/TEST_DES.vcxproj @@ -0,0 +1,113 @@ + + + + + Debug + x64 + + + Release + x64 + + + + + + + + {f06550ad-cfc7-40b8-8727-6c82c69a8982} + + + + 16.0 + Win32Proj + {53F9F908-C678-4DEE-9309-E71C1D03A45F} + nitro + 10.0 + TEST_DES + + + + DynamicLibrary + true + v143 + + + DynamicLibrary + false + v143 + true + + + + + + + + + + + + + + + true + $(SolutionDir)$(Platform)\$(Configuration)\share\nitf\plugins\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + false + $(SolutionDir)$(Platform)\$(Configuration)\share\nitf\plugins\ + $(Platform)\$(Configuration)\$(ProjectName)\ + + + + Level4 + true + _DEBUG;_LIB;%(PreprocessorDefinitions);NRT_MODULE_EXPORTS;NITRO_PCH + true + $(ProjectDir)include;$(ProjectDir)..\nrt\include;%(AdditionalIncludeDirectories) + /FS %(AdditionalOptions) + true + CompileAsCpp + Guard + MultiThreadedDebugDLL + true + ProgramDatabase + AdvancedVectorExtensions2 + true + + + + + true + + + + + Level3 + true + true + true + NDEBUG;_LIB;%(PreprocessorDefinitions);NRT_MODULE_EXPORTS;NITRO_PCH + true + $(ProjectDir)include;$(ProjectDir)..\nrt\include;%(AdditionalIncludeDirectories) + /FS %(AdditionalOptions) + true + CompileAsCpp + Guard + true + AdvancedVectorExtensions2 + + + + + true + true + true + + + + + + \ No newline at end of file diff --git a/externals/nitro/modules/c/nitf/XML_DATA_CONTENT.vcxproj b/externals/nitro/modules/c/nitf/XML_DATA_CONTENT.vcxproj index 09c43df9f..2760bc1aa 100644 --- a/externals/nitro/modules/c/nitf/XML_DATA_CONTENT.vcxproj +++ b/externals/nitro/modules/c/nitf/XML_DATA_CONTENT.vcxproj @@ -62,7 +62,7 @@ - EnableAllWarnings + Level4 true _DEBUG;_LIB;%(PreprocessorDefinitions);NRT_MODULE_EXPORTS;NITRO_PCH true diff --git a/externals/nitro/modules/c/nitf/include/nitf/PluginIdentifier.h b/externals/nitro/modules/c/nitf/include/nitf/PluginIdentifier.h index da1203f2c..125ccd902 100644 --- a/externals/nitro/modules/c/nitf/include/nitf/PluginIdentifier.h +++ b/externals/nitro/modules/c/nitf/include/nitf/PluginIdentifier.h @@ -70,6 +70,7 @@ typedef struct _nitf_TREPreloaded const char* name; NITF_PLUGIN_INIT_FUNCTION init; NITF_PLUGIN_TRE_HANDLER_FUNCTION handler; + NITF_BOOL enabled; // most preloaded TREs are disabled by default } nitf_TREPreloaded; /* diff --git a/externals/nitro/modules/c/nitf/include/nitf/PluginRegistry.h b/externals/nitro/modules/c/nitf/include/nitf/PluginRegistry.h index 858d486fe..54feddb3f 100644 --- a/externals/nitro/modules/c/nitf/include/nitf/PluginRegistry.h +++ b/externals/nitro/modules/c/nitf/include/nitf/PluginRegistry.h @@ -165,8 +165,6 @@ NITFAPI(NITF_BOOL) nitf_PluginRegistry_loadDir(const char* dirName, nitf_Error * error); -NITFAPI(NITF_BOOL) - nitf_PluginRegistry_insertPlugin_(const char* msg, nitf_PluginRegistry* reg, const char** ident, nitf_DLL* dll, nitf_Error* error); NITFAPI(NITF_BOOL) nitf_PluginRegistry_loadPlugin(const char* fullPathName, nitf_Error* error); @@ -182,6 +180,19 @@ nitf_PluginRegistry_TREHandlerExists(const char* ident); NITFAPI(NITF_BOOL) nitf_PluginRegistry_TREHandlerExistsLog(const char* ident, FILE* log); +/*! + * Enable (or disable) a pre-loaded TRE. + * + * \param ident ID of the TRE + * + * \return true if a pre-loaded TRE handler exists, false otherwise + */ + +NITFAPI(NITF_BOOL) +nitf_PluginRegistry_PreloadedTREHandlerEnable(const char* ident, NITF_BOOL enable); +NITFAPI(void) +nitf_PluginRegistry_PreloadedTREHandlersEnable(NITF_BOOL enable); // "Handlers", not "Handler" + /*! * Checks if a compression handler exists for 'ident' * diff --git a/externals/nitro/modules/c/nitf/source/PluginRegistry.c b/externals/nitro/modules/c/nitf/source/PluginRegistry.c index e05bc2a84..e675d5360 100644 --- a/externals/nitro/modules/c/nitf/source/PluginRegistry.c +++ b/externals/nitro/modules/c/nitf/source/PluginRegistry.c @@ -20,6 +20,8 @@ * */ +#include + #include "nitf/PluginRegistry.h" NITFPRIV(nitf_PluginRegistry*) implicitConstruct(nitf_Error* error, FILE* log); @@ -967,15 +969,21 @@ insertCreator(nitf_DLL* dso, return nitf_HashTable_insert(hash, ident, (NITF_DATA*)dsoMain, error); } -/* - * Function is now greatly simplified. We only retrieve TREs from - * the hash table. If they are there, we are good, if not fail - * - * No more talking to the DSOs directly - */ -static const nitf_TREPreloaded* findPreloadedTRE(const char* keyName) +// Somebody might want to use a different set of preloadedTREs, or we might even want multiple +// sets of preloaded TREs. There's nothing to support either of those right now, but it's easy enough +// to put the infrastructure in place to make it easy to hook-up. +extern nitf_TREPreloaded defaultPreloadedTREs[]; +static nitf_TREPreloaded* findPreloadedTRE_(nitf_TREPreloaded preloadedTREs[], const char* keyName) { - extern const nitf_TREPreloaded preloadedTREs[]; + if (preloadedTREs == NULL) + { + return NULL; + } + if (keyName == NULL) + { + return NULL; + } + for (size_t i = 0;; i++) { const char* pKeyName = preloadedTREs[i].name; @@ -989,6 +997,56 @@ static const nitf_TREPreloaded* findPreloadedTRE(const char* keyName) } } } +static const nitf_TREPreloaded* findPreloadedTRE(nitf_TREPreloaded preloadedTREs[], const char* keyName) +{ + const nitf_TREPreloaded* retval = findPreloadedTRE_(preloadedTREs, keyName); + if ((retval != NULL) && (retval->enabled)) + { + return retval; + } + return NULL; +} + +static NITF_BOOL PreloadedTREHandlerEnable(nitf_TREPreloaded preloadedTREs[], + const char* keyName, NITF_BOOL enable) +{ + nitf_TREPreloaded* result = findPreloadedTRE_(preloadedTREs, keyName); + if (result != NULL) + { + result->enabled = enable; + return NRT_TRUE; + } + return NRT_FALSE; +} +NITFAPI(NITF_BOOL) +nitf_PluginRegistry_PreloadedTREHandlerEnable(const char* keyName, NITF_BOOL enable) +{ + return PreloadedTREHandlerEnable(defaultPreloadedTREs, keyName, enable); +} + +static void preloadedTREHandlersEnable(nitf_TREPreloaded preloadedTREs[], NITF_BOOL enable) +{ + if (preloadedTREs == NULL) + { + return; + } + + for (size_t i = 0;; i++) + { + const char* pKeyName = preloadedTREs[i].name; + if (pKeyName == NULL) // end of list + { + return; + } + + preloadedTREs[i].enabled = enable; + } +} +NITFAPI(void) +nitf_PluginRegistry_PreloadedTREHandlersEnable(NITF_BOOL enable) +{ + preloadedTREHandlersEnable(defaultPreloadedTREs, enable); +} /* * Initialize a DSO. The init hook is retrieved and called once @@ -1006,7 +1064,8 @@ static const char** preload_doInit(NITF_PLUGIN_INIT_FUNCTION init, const char* p return ident; } -static NRT_BOOL preloadTRE(const char* keyName, nitf_Error* error) +static NRT_BOOL preloadTRE(nitf_TREPreloaded preloadedTREs[], + const char* keyName, nitf_Error* error) { const char** ident; nitf_PluginRegistry* reg = nitf_PluginRegistry_getInstance(error); @@ -1020,7 +1079,7 @@ static NRT_BOOL preloadTRE(const char* keyName, nitf_Error* error) dll->lib = NULL; // not a real DLL dll->dsoMain = NULL; // filled in after successful findPreloadedTRE() - const nitf_TREPreloaded* plugin = findPreloadedTRE(keyName); + const nitf_TREPreloaded* plugin = findPreloadedTRE(preloadedTREs, keyName); if (plugin == NULL) { return NITF_FAILURE; @@ -1069,10 +1128,10 @@ nitf_PluginRegistry_retrieveTREHandler_(nitf_PluginRegistry* reg, return theHandler; } -static nitf_TREHandler* retrievePreloadedTREHandler(nitf_PluginRegistry* reg, const char* treIdent, - int* hadError, nitf_Error* error) +static nitf_TREHandler* retrievePreloadedTREHandler(nitf_TREPreloaded preloadedTREs[], + nitf_PluginRegistry* reg, const char* treIdent, int* hadError, nitf_Error* error) { - if (!preloadTRE(treIdent, error)) + if (!preloadTRE(preloadedTREs, treIdent, error)) { *hadError = 1; return NULL; @@ -1082,31 +1141,40 @@ static nitf_TREHandler* retrievePreloadedTREHandler(nitf_PluginRegistry* reg, co return nitf_PluginRegistry_retrieveTREHandler_(reg, treIdent, hadError, error); } -NITFPROT(nitf_TREHandler*) -nitf_PluginRegistry_retrieveTREHandler(nitf_PluginRegistry* reg, - const char* treIdent, - int* hadError, - nitf_Error* error) +static nitf_TREHandler* retrieveTREHandler(nitf_TREPreloaded preloadedTREs[], + nitf_PluginRegistry* reg, const char* treIdent, int* hadError, nitf_Error* error) { nitf_TREHandler* handler = nitf_PluginRegistry_retrieveTREHandler_(reg, treIdent, hadError, error); - if (*hadError) { + // Got an error; try a preloaded TRE. *hadError = 0; - return retrievePreloadedTREHandler(reg, treIdent, hadError, error); + return retrievePreloadedTREHandler(preloadedTREs, reg, treIdent, hadError, error); } - // Normally, a NULL handler is **not** an error. + // Normally, a NULL handler is **not** an error ... if (handler == NULL) { - int bad = 0; - nitf_TREHandler* preloadedHandler = retrievePreloadedTREHandler(reg, treIdent, &bad, error); + // ... but, if we can use a pre-loaded TRE, go with that. + int bad = 0; // retrievePreloadedTREHandler() might cause an error + nitf_TREHandler* preloadedHandler = retrievePreloadedTREHandler(preloadedTREs, reg, treIdent, &bad, error); if (!bad) - return preloadedHandler; + { + // no error, go with the pre-loaded handler + assert(preloadedHandler != NULL); // I supposed this *could* be NULL, but why? It makes no sense to preload a default handler. + return preloadedHandler; + } } - return handler; } +NITFPROT(nitf_TREHandler*) +nitf_PluginRegistry_retrieveTREHandler(nitf_PluginRegistry* reg, + const char* treIdent, + int* hadError, + nitf_Error* error) +{ + return retrieveTREHandler(defaultPreloadedTREs, reg, treIdent, hadError, error); +} NITFPROT(nitf_CompressionInterface*) nitf_PluginRegistry_retrieveCompInterface(const char* comp, nitf_Error* error) diff --git a/externals/nitro/modules/c/nitf/source/TREs.c b/externals/nitro/modules/c/nitf/source/TREs.c index 8cedb44e5..c8cbf1825 100644 --- a/externals/nitro/modules/c/nitf/source/TREs.c +++ b/externals/nitro/modules/c/nitf/source/TREs.c @@ -3,6 +3,7 @@ * ========================================================================= * * (C) Copyright 2004 - 2014, MDA Information Systems LLC + * © Copyright 2023, Maxar Technologies, Inc. * * NITRO is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by @@ -43,25 +44,86 @@ #include "../shared/RPFHDR.c" #include "../shared/TEST_DES.c" +#include "../shared/XML_DATA_CONTENT.c" -#define NITF_preload_TRE(Tre_) { #Tre_, Tre_##_init, Tre_##_handler } - -extern const nitf_TREPreloaded preloadedTREs[]; -const nitf_TREPreloaded preloadedTREs[] = { -/* - NITF_preload_TRE(ACCHZB), - NITF_preload_TRE(ACCPOB), - NITF_preload_TRE(ACFTA), - NITF_preload_TRE(AIMIDB), - NITF_preload_TRE(CSCRNA), - NITF_preload_TRE(CSEXRB), - //NITF_preload_TRE(ENGRDA), - NITF_preload_TRE(HISTOA), - NITF_preload_TRE(JITCID), - NITF_preload_TRE(PTPRAA), - NITF_preload_TRE(RPFHDR), - - NITF_preload_TRE(TEST_DES), -*/ - { NULL, NULL, NULL } + /******************************************************************************/ + /* + * Simple example DES for testing. + + This file defines a very simple Data Extension Segment. This example is + used for test of the UserSegment object and can be used aa an example + and starting point for the development of DES. + + This example defines a "standard" DE segment which means the user + header can be implemented via a TRE object and there are no out of + segment dependencies + + The DES ID will be TEST_PRELOADED_DES + + The user header will have three fields + + COUNT - Number of data values + START - Start value in ramp + INCREMENT - Increment between values in ramp + + The data is an 8-bit ramp defined by the three values. in testing, the + ramp will be setup to contain printable values. + */ + + /* TRE description for user header */ +static nitf_TREDescription TEST_PRELOADED_DES_description[] = { + {NITF_BCS_N, 2, "Number of data values", "COUNT" }, + {NITF_BCS_N, 3, "Start value in ramp", "START" }, + {NITF_BCS_N, 2, "Increment between values in ramp", "INCREMENT" }, + {NITF_END, 0, NULL, NULL} +}; +static nitf_TREDescriptionInfo TEST_PRELOADED_DES_descriptions[] = { + { "Preloaded DES (for testing)", TEST_PRELOADED_DES_description, NITF_TRE_DESC_NO_LENGTH }, + { "TEST_PRELOADED_DES", TEST_PRELOADED_DES_description, NITF_TRE_DESC_NO_LENGTH }, + { NULL, NULL, NITF_TRE_DESC_NO_LENGTH } +}; +static nitf_TREDescriptionSet TEST_PRELOADED_DES_descriptionSet = { 0, TEST_PRELOADED_DES_descriptions }; + +static const char* TEST_PRELOADED_DES_ident[] = +{ + NITF_PLUGIN_TRE_KEY, "TEST_PRELOADED_DES", "Preloaded DES (for testing)", NULL +}; + +static nitf_TREHandler TEST_PRELOADED_DESHandler; +static const char** TEST_PRELOADED_DES_init(nitf_Error* error) +{ + if (!nitf_TREUtils_createBasicHandler(&TEST_PRELOADED_DES_descriptionSet, + &TEST_PRELOADED_DESHandler, error)) + return NULL; + return TEST_PRELOADED_DES_ident; +} +static nitf_TREHandler* TEST_PRELOADED_DES_handler(nitf_Error* error) { + (void)error; + return &TEST_PRELOADED_DESHandler; +} + +/******************************************************************************/ + +#define NITF_preload_TRE_(Tre_, enabled_) { #Tre_, Tre_##_init, Tre_##_handler, enabled_ } +#define NITF_preload_TRE(Tre_) NITF_preload_TRE_(Tre_, NRT_FALSE /*enabled*/) + +nitf_TREPreloaded defaultPreloadedTREs[] = { + // Not preloading any TREs right now: with the existing system, + // a TRE can be removed by deleting the DLL/SO. If that same TRE + // were preloaded, there would be no way to get rid of it. + NITF_preload_TRE(ACCHZB), + NITF_preload_TRE(ACCPOB), + NITF_preload_TRE(ACFTA), + NITF_preload_TRE(AIMIDB), + NITF_preload_TRE(CSCRNA), + NITF_preload_TRE(CSEXRB), + NITF_preload_TRE(ENGRDA), + NITF_preload_TRE(HISTOA), + NITF_preload_TRE(JITCID), + NITF_preload_TRE(PTPRAA), + NITF_preload_TRE(RPFHDR), + + NITF_preload_TRE_(TEST_PRELOADED_DES, NRT_TRUE /*enabled*/), + + { NULL, NULL, NULL, NRT_FALSE } // end of list }; diff --git a/externals/nitro/modules/c/nrt/source/DLLUnix.c b/externals/nitro/modules/c/nrt/source/DLLUnix.c index fb68470cc..d1887e1af 100644 --- a/externals/nitro/modules/c/nrt/source/DLLUnix.c +++ b/externals/nitro/modules/c/nrt/source/DLLUnix.c @@ -127,7 +127,7 @@ NRTAPI(NRT_DLL_FUNCTION_PTR) nrt_DLL_retrieve(nrt_DLL * dll, // This might be a "preloaded" TRE if (dll->dsoMain) { - const char* underscore = strchr(function, '_'); + const char* underscore = strrchr(function, '_'); if ((underscore != NULL) && strcmp(underscore, "_handler") == 0) { return dll->dsoMain; diff --git a/externals/nitro/modules/c/nrt/source/DLLWin32.c b/externals/nitro/modules/c/nrt/source/DLLWin32.c index d5a59e621..6cf64fb97 100644 --- a/externals/nitro/modules/c/nrt/source/DLLWin32.c +++ b/externals/nitro/modules/c/nrt/source/DLLWin32.c @@ -137,7 +137,7 @@ NRTAPI(NRT_DLL_FUNCTION_PTR) nrt_DLL_retrieve(nrt_DLL * dll, // This might be a "preloaded" TRE if (dll->dsoMain) { - const char* underscore = strchr(function, '_'); + const char* underscore = strrchr(function, '_'); if ((underscore != NULL) && strcmp(underscore, "_handler") == 0) { return dll->dsoMain; diff --git a/externals/nitro/nitro.sln b/externals/nitro/nitro.sln index 56cfb2e04..0f6fc7c9d 100644 --- a/externals/nitro/nitro.sln +++ b/externals/nitro/nitro.sln @@ -20,26 +20,10 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "nitf-c++", "modules\c++\nit {A676EDF3-F231-47C8-A6E6-0FE50B50B71B} = {A676EDF3-F231-47C8-A6E6-0FE50B50B71B} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACCPOB", "modules\c\nitf\ACCPOB.vcxproj", "{730B1E6E-2469-4F9E-B093-D0C6262453C9}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACFTA", "modules\c\nitf\ACFTA.vcxproj", "{51D7B426-899E-428D-9F69-5DDAC9E403FB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AIMIDB", "modules\c\nitf\AIMIDB.vcxproj", "{12AA0752-4EE3-4E0A-85AF-0E5DEADBF343}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "JITCID", "modules\c\nitf\JITCID.vcxproj", "{D1D7FCD3-6130-4504-9DA0-9D80506BE55E}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "c-nitf-shared", "c-nitf-shared", "{27A2685A-E869-42A2-956D-92994F60C536}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CSCRNA", "modules\c\nitf\CSCRNA.vcxproj", "{023DE06D-3967-4406-B1B8-032118BB2552}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RPFHDR", "modules\c\nitf\RPFHDR.vcxproj", "{CF5B4F02-364D-4117-9FB9-6C9C7938E412}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "show_nitf++", "modules\c++\nitf\apps\show_nitf++\show_nitf++.vcxproj", "{839FF52C-57D1-45B6-81FD-5C7D72523EE5}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PTPRAA", "modules\c\nitf\PTPRAA.vcxproj", "{2BAAACA9-A5A4-412C-AE52-B16C2D107F55}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ENGRDA", "modules\c\nitf\ENGRDA.vcxproj", "{53F9F908-C678-4DEE-9309-E71C1E03A45F}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "J2KCompress", "modules\c\j2k\J2KCompress.vcxproj", "{A676EDF3-F231-47C8-A6E6-0FE50B50B71B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "J2KDecompress", "modules\c\j2k\J2KDecompress.vcxproj", "{C787537A-0CAC-4D6D-A6D6-A66765A06753}" @@ -51,20 +35,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github-workflows", ".githu .github\workflows\main.yml = .github\workflows\main.yml EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CSEXRB", "modules\c\nitf\CSEXRB.vcxproj", "{0A9BDA26-092F-4A2C-BBEF-00C64BF0C65E}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "externals", "externals", "{7D26D571-0014-4C50-BF86-612E743E64B6}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "coda-oss", "externals\coda-oss\modules\c++\coda-oss.vcxproj", "{9997E895-5161-4DDF-8F3F-099894CB2F21}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTest", "UnitTest\UnitTest.vcxproj", "{8ACE478C-8F6F-4D42-9B43-7D75882D4BE1}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ACCHZB", "modules\c\nitf\ACCHZB.vcxproj", "{53F9F908-C678-4DEE-9309-E71C1D03A45F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "HISTOA", "modules\c\nitf\HISTOA.vcxproj", "{D749AA73-4C9A-473D-96BB-070A6D9CAA54}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XML_DATA_CONTENT", "modules\c\nitf\XML_DATA_CONTENT.vcxproj", "{78849481-D356-4CC7-B182-31C21F857ED1}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TEST_DES", "modules\c\nitf\TEST_DES.vcxproj", "{53F9F908-C678-4DEE-9309-E71C1D03A45F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -79,42 +59,10 @@ Global {8F357A19-799E-4971-850E-3F28485C130B}.Debug|x64.Build.0 = Debug|x64 {8F357A19-799E-4971-850E-3F28485C130B}.Release|x64.ActiveCfg = Release|x64 {8F357A19-799E-4971-850E-3F28485C130B}.Release|x64.Build.0 = Release|x64 - {730B1E6E-2469-4F9E-B093-D0C6262453C9}.Debug|x64.ActiveCfg = Debug|x64 - {730B1E6E-2469-4F9E-B093-D0C6262453C9}.Debug|x64.Build.0 = Debug|x64 - {730B1E6E-2469-4F9E-B093-D0C6262453C9}.Release|x64.ActiveCfg = Release|x64 - {730B1E6E-2469-4F9E-B093-D0C6262453C9}.Release|x64.Build.0 = Release|x64 - {51D7B426-899E-428D-9F69-5DDAC9E403FB}.Debug|x64.ActiveCfg = Debug|x64 - {51D7B426-899E-428D-9F69-5DDAC9E403FB}.Debug|x64.Build.0 = Debug|x64 - {51D7B426-899E-428D-9F69-5DDAC9E403FB}.Release|x64.ActiveCfg = Release|x64 - {51D7B426-899E-428D-9F69-5DDAC9E403FB}.Release|x64.Build.0 = Release|x64 - {12AA0752-4EE3-4E0A-85AF-0E5DEADBF343}.Debug|x64.ActiveCfg = Debug|x64 - {12AA0752-4EE3-4E0A-85AF-0E5DEADBF343}.Debug|x64.Build.0 = Debug|x64 - {12AA0752-4EE3-4E0A-85AF-0E5DEADBF343}.Release|x64.ActiveCfg = Release|x64 - {12AA0752-4EE3-4E0A-85AF-0E5DEADBF343}.Release|x64.Build.0 = Release|x64 - {D1D7FCD3-6130-4504-9DA0-9D80506BE55E}.Debug|x64.ActiveCfg = Debug|x64 - {D1D7FCD3-6130-4504-9DA0-9D80506BE55E}.Debug|x64.Build.0 = Debug|x64 - {D1D7FCD3-6130-4504-9DA0-9D80506BE55E}.Release|x64.ActiveCfg = Release|x64 - {D1D7FCD3-6130-4504-9DA0-9D80506BE55E}.Release|x64.Build.0 = Release|x64 - {023DE06D-3967-4406-B1B8-032118BB2552}.Debug|x64.ActiveCfg = Debug|x64 - {023DE06D-3967-4406-B1B8-032118BB2552}.Debug|x64.Build.0 = Debug|x64 - {023DE06D-3967-4406-B1B8-032118BB2552}.Release|x64.ActiveCfg = Release|x64 - {023DE06D-3967-4406-B1B8-032118BB2552}.Release|x64.Build.0 = Release|x64 - {CF5B4F02-364D-4117-9FB9-6C9C7938E412}.Debug|x64.ActiveCfg = Debug|x64 - {CF5B4F02-364D-4117-9FB9-6C9C7938E412}.Debug|x64.Build.0 = Debug|x64 - {CF5B4F02-364D-4117-9FB9-6C9C7938E412}.Release|x64.ActiveCfg = Release|x64 - {CF5B4F02-364D-4117-9FB9-6C9C7938E412}.Release|x64.Build.0 = Release|x64 {839FF52C-57D1-45B6-81FD-5C7D72523EE5}.Debug|x64.ActiveCfg = Debug|x64 {839FF52C-57D1-45B6-81FD-5C7D72523EE5}.Debug|x64.Build.0 = Debug|x64 {839FF52C-57D1-45B6-81FD-5C7D72523EE5}.Release|x64.ActiveCfg = Release|x64 {839FF52C-57D1-45B6-81FD-5C7D72523EE5}.Release|x64.Build.0 = Release|x64 - {2BAAACA9-A5A4-412C-AE52-B16C2D107F55}.Debug|x64.ActiveCfg = Debug|x64 - {2BAAACA9-A5A4-412C-AE52-B16C2D107F55}.Debug|x64.Build.0 = Debug|x64 - {2BAAACA9-A5A4-412C-AE52-B16C2D107F55}.Release|x64.ActiveCfg = Release|x64 - {2BAAACA9-A5A4-412C-AE52-B16C2D107F55}.Release|x64.Build.0 = Release|x64 - {53F9F908-C678-4DEE-9309-E71C1E03A45F}.Debug|x64.ActiveCfg = Debug|x64 - {53F9F908-C678-4DEE-9309-E71C1E03A45F}.Debug|x64.Build.0 = Debug|x64 - {53F9F908-C678-4DEE-9309-E71C1E03A45F}.Release|x64.ActiveCfg = Release|x64 - {53F9F908-C678-4DEE-9309-E71C1E03A45F}.Release|x64.Build.0 = Release|x64 {A676EDF3-F231-47C8-A6E6-0FE50B50B71B}.Debug|x64.ActiveCfg = Debug|x64 {A676EDF3-F231-47C8-A6E6-0FE50B50B71B}.Debug|x64.Build.0 = Debug|x64 {A676EDF3-F231-47C8-A6E6-0FE50B50B71B}.Release|x64.ActiveCfg = Release|x64 @@ -123,10 +71,6 @@ Global {C787537A-0CAC-4D6D-A6D6-A66765A06753}.Debug|x64.Build.0 = Debug|x64 {C787537A-0CAC-4D6D-A6D6-A66765A06753}.Release|x64.ActiveCfg = Release|x64 {C787537A-0CAC-4D6D-A6D6-A66765A06753}.Release|x64.Build.0 = Release|x64 - {0A9BDA26-092F-4A2C-BBEF-00C64BF0C65E}.Debug|x64.ActiveCfg = Debug|x64 - {0A9BDA26-092F-4A2C-BBEF-00C64BF0C65E}.Debug|x64.Build.0 = Debug|x64 - {0A9BDA26-092F-4A2C-BBEF-00C64BF0C65E}.Release|x64.ActiveCfg = Release|x64 - {0A9BDA26-092F-4A2C-BBEF-00C64BF0C65E}.Release|x64.Build.0 = Release|x64 {9997E895-5161-4DDF-8F3F-099894CB2F21}.Debug|x64.ActiveCfg = Debug|x64 {9997E895-5161-4DDF-8F3F-099894CB2F21}.Debug|x64.Build.0 = Debug|x64 {9997E895-5161-4DDF-8F3F-099894CB2F21}.Release|x64.ActiveCfg = Release|x64 @@ -135,39 +79,25 @@ Global {8ACE478C-8F6F-4D42-9B43-7D75882D4BE1}.Debug|x64.Build.0 = Debug|x64 {8ACE478C-8F6F-4D42-9B43-7D75882D4BE1}.Release|x64.ActiveCfg = Release|x64 {8ACE478C-8F6F-4D42-9B43-7D75882D4BE1}.Release|x64.Build.0 = Release|x64 - {53F9F908-C678-4DEE-9309-E71C1D03A45F}.Debug|x64.ActiveCfg = Debug|x64 - {53F9F908-C678-4DEE-9309-E71C1D03A45F}.Debug|x64.Build.0 = Debug|x64 - {53F9F908-C678-4DEE-9309-E71C1D03A45F}.Release|x64.ActiveCfg = Release|x64 - {53F9F908-C678-4DEE-9309-E71C1D03A45F}.Release|x64.Build.0 = Release|x64 - {D749AA73-4C9A-473D-96BB-070A6D9CAA54}.Debug|x64.ActiveCfg = Debug|x64 - {D749AA73-4C9A-473D-96BB-070A6D9CAA54}.Debug|x64.Build.0 = Debug|x64 - {D749AA73-4C9A-473D-96BB-070A6D9CAA54}.Release|x64.ActiveCfg = Release|x64 - {D749AA73-4C9A-473D-96BB-070A6D9CAA54}.Release|x64.Build.0 = Release|x64 {78849481-D356-4CC7-B182-31C21F857ED1}.Debug|x64.ActiveCfg = Debug|x64 {78849481-D356-4CC7-B182-31C21F857ED1}.Debug|x64.Build.0 = Debug|x64 {78849481-D356-4CC7-B182-31C21F857ED1}.Release|x64.ActiveCfg = Release|x64 {78849481-D356-4CC7-B182-31C21F857ED1}.Release|x64.Build.0 = Release|x64 + {53F9F908-C678-4DEE-9309-E71C1D03A45F}.Debug|x64.ActiveCfg = Debug|x64 + {53F9F908-C678-4DEE-9309-E71C1D03A45F}.Debug|x64.Build.0 = Debug|x64 + {53F9F908-C678-4DEE-9309-E71C1D03A45F}.Release|x64.ActiveCfg = Release|x64 + {53F9F908-C678-4DEE-9309-E71C1D03A45F}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {730B1E6E-2469-4F9E-B093-D0C6262453C9} = {27A2685A-E869-42A2-956D-92994F60C536} - {51D7B426-899E-428D-9F69-5DDAC9E403FB} = {27A2685A-E869-42A2-956D-92994F60C536} - {12AA0752-4EE3-4E0A-85AF-0E5DEADBF343} = {27A2685A-E869-42A2-956D-92994F60C536} - {D1D7FCD3-6130-4504-9DA0-9D80506BE55E} = {27A2685A-E869-42A2-956D-92994F60C536} - {023DE06D-3967-4406-B1B8-032118BB2552} = {27A2685A-E869-42A2-956D-92994F60C536} - {CF5B4F02-364D-4117-9FB9-6C9C7938E412} = {27A2685A-E869-42A2-956D-92994F60C536} - {2BAAACA9-A5A4-412C-AE52-B16C2D107F55} = {27A2685A-E869-42A2-956D-92994F60C536} - {53F9F908-C678-4DEE-9309-E71C1E03A45F} = {27A2685A-E869-42A2-956D-92994F60C536} {A676EDF3-F231-47C8-A6E6-0FE50B50B71B} = {27A2685A-E869-42A2-956D-92994F60C536} {C787537A-0CAC-4D6D-A6D6-A66765A06753} = {27A2685A-E869-42A2-956D-92994F60C536} {A45CB073-25A7-411D-A7E7-589BCC8AF547} = {5C5727E7-0CFF-42B4-8F5A-D31B3BC81F21} - {0A9BDA26-092F-4A2C-BBEF-00C64BF0C65E} = {27A2685A-E869-42A2-956D-92994F60C536} {9997E895-5161-4DDF-8F3F-099894CB2F21} = {7D26D571-0014-4C50-BF86-612E743E64B6} - {53F9F908-C678-4DEE-9309-E71C1D03A45F} = {27A2685A-E869-42A2-956D-92994F60C536} - {D749AA73-4C9A-473D-96BB-070A6D9CAA54} = {27A2685A-E869-42A2-956D-92994F60C536} {78849481-D356-4CC7-B182-31C21F857ED1} = {27A2685A-E869-42A2-956D-92994F60C536} + {53F9F908-C678-4DEE-9309-E71C1D03A45F} = {27A2685A-E869-42A2-956D-92994F60C536} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {2D7AC542-BBB6-4BAC-8BF1-7E76C714BBA4} diff --git a/six/modules/c++/CMakeLists.txt b/six/modules/c++/CMakeLists.txt index 44914c170..6ec59c7bb 100644 --- a/six/modules/c++/CMakeLists.txt +++ b/six/modules/c++/CMakeLists.txt @@ -2,8 +2,11 @@ if (MSVC) # By default, there is a /W3 on the command-line from somewhere (?); adding # /Wn results in a compiler warning. - #add_compile_options(/W4) # /Wall - string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # /Wall + # + # https://github.com/microsoft/STL/wiki/Changelog#vs-2022-179-preview-1 + # > *Note*: `/Wall` is not intended for regular production use, as it contains a large number of + # > extremely noisy and low-value warnings. In general, the STL does not attempt to be `/Wall` clean. + string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # add_compile_options(/W4) add_compile_options(/wd4996) # '...': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. add_compile_options(/wd4127) # conditional expression is constant diff --git a/six/modules/c++/cphd/cphd.vcxproj b/six/modules/c++/cphd/cphd.vcxproj index 45aaa5e6a..1da9449ef 100644 --- a/six/modules/c++/cphd/cphd.vcxproj +++ b/six/modules/c++/cphd/cphd.vcxproj @@ -62,7 +62,7 @@ AdvancedVectorExtensions2 ProgramDatabase Guard - EnableAllWarnings + Level4 true MultiThreadedDebugDLL true diff --git a/six/modules/c++/cphd03/cphd03.vcxproj b/six/modules/c++/cphd03/cphd03.vcxproj index 129e15915..baffbf33a 100644 --- a/six/modules/c++/cphd03/cphd03.vcxproj +++ b/six/modules/c++/cphd03/cphd03.vcxproj @@ -62,7 +62,7 @@ AdvancedVectorExtensions2 ProgramDatabase Guard - EnableAllWarnings + Level4 true MultiThreadedDebugDLL true diff --git a/six/modules/c++/samples/check_valid_six.dir/check_valid_six.vcxproj b/six/modules/c++/samples/check_valid_six.dir/check_valid_six.vcxproj index eb0e48d06..dedfd0d89 100644 --- a/six/modules/c++/samples/check_valid_six.dir/check_valid_six.vcxproj +++ b/six/modules/c++/samples/check_valid_six.dir/check_valid_six.vcxproj @@ -61,7 +61,7 @@ AdvancedVectorExtensions2 ProgramDatabase Guard - EnableAllWarnings + Level4 true MultiThreadedDebugDLL true diff --git a/six/modules/c++/samples/crop_sicd.dir/crop_sicd.vcxproj b/six/modules/c++/samples/crop_sicd.dir/crop_sicd.vcxproj index 5b8ed9267..baae7870b 100644 --- a/six/modules/c++/samples/crop_sicd.dir/crop_sicd.vcxproj +++ b/six/modules/c++/samples/crop_sicd.dir/crop_sicd.vcxproj @@ -61,7 +61,7 @@ AdvancedVectorExtensions2 ProgramDatabase Guard - EnableAllWarnings + Level4 true MultiThreadedDebugDLL true diff --git a/six/modules/c++/scene/scene.vcxproj b/six/modules/c++/scene/scene.vcxproj index 62eb7adb3..cf3a27e0a 100644 --- a/six/modules/c++/scene/scene.vcxproj +++ b/six/modules/c++/scene/scene.vcxproj @@ -63,7 +63,7 @@ AdvancedVectorExtensions2 ProgramDatabase Guard - EnableAllWarnings + Level4 true true MultiThreadedDebugDLL diff --git a/six/modules/c++/six.convert/six.convert.vcxproj b/six/modules/c++/six.convert/six.convert.vcxproj index f67abbbe4..fa7aa68e4 100644 --- a/six/modules/c++/six.convert/six.convert.vcxproj +++ b/six/modules/c++/six.convert/six.convert.vcxproj @@ -62,7 +62,7 @@ AdvancedVectorExtensions2 ProgramDatabase Guard - EnableAllWarnings + Level4 true MultiThreadedDebugDLL true diff --git a/six/modules/c++/six.sicd/six.sicd.vcxproj b/six/modules/c++/six.sicd/six.sicd.vcxproj index d96c1fae4..d95b9eda8 100644 --- a/six/modules/c++/six.sicd/six.sicd.vcxproj +++ b/six/modules/c++/six.sicd/six.sicd.vcxproj @@ -63,9 +63,10 @@ AdvancedVectorExtensions2 ProgramDatabase Guard - EnableAllWarnings + Level4 MultiThreadedDebugDLL true + true diff --git a/six/modules/c++/six.sicd/source/ComplexToAMP8IPHS8I.cpp b/six/modules/c++/six.sicd/source/ComplexToAMP8IPHS8I.cpp index d799b3c5f..e34bb9117 100644 --- a/six/modules/c++/six.sicd/source/ComplexToAMP8IPHS8I.cpp +++ b/six/modules/c++/six.sicd/source/ComplexToAMP8IPHS8I.cpp @@ -143,7 +143,7 @@ six::sicd::details::ComplexToAMP8IPHS8I::ComplexToAMP8IPHS8I(const six::Amplitud const auto p1 = GetPhase(Utilities::toComplex(1, 1, pAmplitudeTable)); assert(p0 == 0.0); assert(p1 > p0); - phase_delta = p1 - p0; + phase_delta = gsl::narrow_cast(p1 - p0); size_t i = 0; for(const auto value : six::sicd::Utilities::iota_0_256()) { diff --git a/six/modules/c++/six.sicd/source/Utilities.cpp b/six/modules/c++/six.sicd/source/Utilities.cpp index 99377c227..42dccbee2 100644 --- a/six/modules/c++/six.sicd/source/Utilities.cpp +++ b/six/modules/c++/six.sicd/source/Utilities.cpp @@ -97,7 +97,7 @@ static auto toComplex_(double A, uint8_t phase) const auto angle = units::Radians{ 2 * std::numbers::pi * P }; double sin_angle, cos_angle; SinCos(angle, sin_angle, cos_angle); - six::zfloat S(A * cos_angle, A * sin_angle); + six::zfloat S(gsl::narrow_cast(A * cos_angle), gsl::narrow_cast(A * sin_angle)); return S; } six::zfloat six::sicd::Utilities::toComplex(uint8_t amplitude, uint8_t phase) diff --git a/six/modules/c++/six.sidd/six.sidd.vcxproj b/six/modules/c++/six.sidd/six.sidd.vcxproj index 4b4e5856b..8ad2eb70a 100644 --- a/six/modules/c++/six.sidd/six.sidd.vcxproj +++ b/six/modules/c++/six.sidd/six.sidd.vcxproj @@ -63,7 +63,7 @@ AdvancedVectorExtensions2 ProgramDatabase Guard - EnableAllWarnings + Level4 true MultiThreadedDebugDLL true diff --git a/six/modules/c++/six/six.vcxproj b/six/modules/c++/six/six.vcxproj index 5523252eb..6c40967ea 100644 --- a/six/modules/c++/six/six.vcxproj +++ b/six/modules/c++/six/six.vcxproj @@ -62,7 +62,7 @@ AdvancedVectorExtensions2 ProgramDatabase Guard - EnableAllWarnings + Level4 true true true