react-native-nitro-xlsx 0.2.5 → 0.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NitroXlsx.podspec +26 -27
- package/Package.swift +31 -10
- package/README.md +1 -1
- package/android/CMakeLists.txt +20 -27
- package/package.json +2 -2
- package/scripts/run-cpp-tests.sh +1 -1
- package/thirdparty/OpenXLSX/.clang-format +118 -0
- package/thirdparty/OpenXLSX/.clang-tidy +28 -0
- package/thirdparty/OpenXLSX/.gitignore +130 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_before_XMLNode_wrappers +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_and_stripping +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_char_support +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_support +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespaced_name_disabled +49 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-08-11-benchmarks_post-XLCellIterator-Rework +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-08-14-benchmarks_post-default-row-column-style-support +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-09-02-benchmarks +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-12-19-benchmarks +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2024-12-30-benchmarks-post-XLSharedStrings-by-ref +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-01-09-benchmarks-post-conditionalFormatsAndSheetProtection +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-01-10-benchmarks-post-XLCellValue-bugfix +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-01-31-benchmarks-post-XLComments-implementation +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-02-02-benchmarks-post-XLRowIterator-Rework +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-07-20-benchmarks-after-hiding-pugixml-internals +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/2025-08-29-benchmarks-after-code-review-with-libzip +46 -0
- package/thirdparty/OpenXLSX/Benchmarks/Benchmark.cpp +249 -0
- package/thirdparty/OpenXLSX/Benchmarks/CMakeLists.txt +19 -0
- package/thirdparty/OpenXLSX/CMakeLists.txt +466 -0
- package/thirdparty/OpenXLSX/Documentation/CMakeLists.txt +31 -0
- package/thirdparty/OpenXLSX/Documentation/Doxyfile.in +2471 -0
- package/thirdparty/OpenXLSX/Documentation/DoxygenLayout.xml +194 -0
- package/thirdparty/OpenXLSX/Documentation/customdoxygen.css +1355 -0
- package/thirdparty/OpenXLSX/Examples/CMakeLists.txt +103 -0
- package/thirdparty/OpenXLSX/Examples/Demo1.cpp +279 -0
- package/thirdparty/OpenXLSX/Examples/Demo10.cpp +545 -0
- package/thirdparty/OpenXLSX/Examples/Demo1A.cpp +137 -0
- package/thirdparty/OpenXLSX/Examples/Demo2.cpp +65 -0
- package/thirdparty/OpenXLSX/Examples/Demo3.cpp +89 -0
- package/thirdparty/OpenXLSX/Examples/Demo4.cpp +86 -0
- package/thirdparty/OpenXLSX/Examples/Demo5.cpp +77 -0
- package/thirdparty/OpenXLSX/Examples/Demo6.cpp +103 -0
- package/thirdparty/OpenXLSX/Examples/Demo7.cpp +79 -0
- package/thirdparty/OpenXLSX/Examples/Demo8.cpp +117 -0
- package/thirdparty/OpenXLSX/Examples/Demo9.cpp +363 -0
- package/thirdparty/OpenXLSX/Examples/cmake/FindLIBZIP.cmake +61 -0
- package/thirdparty/OpenXLSX/Examples/external/CustomZip/CustomZip.hpp +256 -0
- package/thirdparty/OpenXLSX/LICENSE.md +29 -0
- package/thirdparty/OpenXLSX/Makefile.GNU +530 -0
- package/thirdparty/OpenXLSX/Notes/TBDs.txt +16 -0
- package/thirdparty/OpenXLSX/Notes/confirmed-TBCs.txt +8 -0
- package/thirdparty/OpenXLSX/Notes/styles-missing-support.xml +12 -0
- package/thirdparty/OpenXLSX/Notes/todo-list.txt +108 -0
- package/thirdparty/OpenXLSX/OpenXLSX/CMakeLists.txt +631 -0
- package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSX.hpp +63 -0
- package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSXConfig.cmake +11 -0
- package/thirdparty/OpenXLSX/OpenXLSX/cmake/bundle_static_library.cmake +198 -0
- package/thirdparty/OpenXLSX/OpenXLSX/cmake/patch_pkg_config.cmake +69 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/IZipArchive.hpp +361 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX-Exports.hpp +12 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCell.hpp +367 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellIterator.hpp +252 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellRange.hpp +223 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellReference.hpp +317 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellValue.hpp +793 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColor.hpp +232 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColumn.hpp +159 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCommandQuery.hpp +228 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLComments.hpp +270 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLConstants.hpp +18 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLContentTypes.hpp +264 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDateTime.hpp +175 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDocument.hpp +505 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDrawing.hpp +452 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLException.hpp +161 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLFormula.hpp +375 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLIterator.hpp +40 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLMergeCells.hpp +216 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLProperties.hpp +348 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRelationships.hpp +348 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRow.hpp +721 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRowData.hpp +488 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSharedStrings.hpp +204 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSheet.hpp +1640 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLStyles.hpp +2390 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLTables.hpp +132 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLWorkbook.hpp +404 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlData.hpp +283 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlFile.hpp +194 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParser.hpp +282 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParserForwardDeclarations.hpp +85 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/XLZipArchive.hpp +232 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/LibZip.hpp +447 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/OpenXLSXFileSystemTools.hpp +207 -0
- package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/Zippy.hpp +1375 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCell.cpp +340 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellIterator.cpp +427 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellRange.cpp +221 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellReference.cpp +408 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellValue.cpp +519 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColor.cpp +202 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColumn.cpp +141 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLComments.cpp +637 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLContentTypes.cpp +329 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDateTime.cpp +269 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDocument.cpp +1678 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDrawing.cpp +784 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLFormula.cpp +201 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLMergeCells.cpp +357 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLProperties.cpp +810 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRelationships.cpp +529 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRow.cpp +918 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRowData.cpp +508 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSharedStrings.cpp +220 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSheet.cpp +1970 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLStyles.cpp +3014 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLTables.cpp +125 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLWorkbook.cpp +784 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlData.cpp +247 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlFile.cpp +160 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlParser.cpp +261 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/XLZipArchive.cpp +266 -0
- package/thirdparty/OpenXLSX/OpenXLSX/sources/utilities/XLUtilities.hpp +478 -0
- package/thirdparty/OpenXLSX/README.md +1279 -0
- package/thirdparty/OpenXLSX/Scripts/cmake-cleanup.sh +102 -0
- package/thirdparty/OpenXLSX/Scripts/compile.sh +23 -0
- package/thirdparty/OpenXLSX/Scripts/demos-cleanup.sh +25 -0
- package/thirdparty/OpenXLSX/Scripts/demos-run-all.sh +60 -0
- package/thirdparty/OpenXLSX/Scripts/guarded-xml-format.sh +47 -0
- package/thirdparty/OpenXLSX/Scripts/make-gnu.sh +11 -0
- package/thirdparty/OpenXLSX/Scripts/uninstall-manifest.sh +48 -0
- package/thirdparty/OpenXLSX/Scripts/xml-format-all.sh +19 -0
- package/thirdparty/OpenXLSX/Scripts/xml-format.sh +38 -0
- package/thirdparty/OpenXLSX/Tests/CMakeLists.txt +37 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch.hpp +17799 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_automake.hpp +68 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_sonarqube.hpp +182 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_tap.hpp +278 -0
- package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_teamcity.hpp +212 -0
- package/thirdparty/OpenXLSX/Tests/main.cpp +55 -0
- package/thirdparty/OpenXLSX/Tests/testXLCell.cpp +176 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellRange.cpp +180 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellReference.cpp +160 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellValue.cpp +366 -0
- package/thirdparty/OpenXLSX/Tests/testXLCellValueProxy.cpp +255 -0
- package/thirdparty/OpenXLSX/Tests/testXLColor.cpp +75 -0
- package/thirdparty/OpenXLSX/Tests/testXLDateTime.cpp +229 -0
- package/thirdparty/OpenXLSX/Tests/testXLDocument.cpp +197 -0
- package/thirdparty/OpenXLSX/Tests/testXLFormula.cpp +131 -0
- package/thirdparty/OpenXLSX/Tests/testXLRow.cpp +597 -0
- package/thirdparty/OpenXLSX/Tests/testXLSheet.cpp +77 -0
- package/thirdparty/OpenXLSX/Tests/ziptest-with-libs.cpp +88 -0
- package/thirdparty/OpenXLSX/Tests/ziptest.cpp +735 -0
- package/thirdparty/OpenXLSX/cmake/get-git-HEAD-ID.cmake +45 -0
- package/thirdparty/OpenXLSX/cmake/libopenxlsxCPackOptions.cmake.in +20 -0
- package/thirdparty/OpenXLSX/cmake/manage_dependency.cmake +813 -0
- package/thirdparty/OpenXLSX/cmake/recursive_library_type_test.cmake +52 -0
- package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-shared.hpp +42 -0
- package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-static.hpp +42 -0
- package/thirdparty/OpenXLSX/vcpkg.json +24 -0
- package/thirdparty/README.md +42 -0
- package/thirdparty/miniz/.clang-format +47 -0
- package/thirdparty/miniz/.travis.yml +2 -0
- package/thirdparty/miniz/CMakeLists.txt +333 -0
- package/thirdparty/miniz/CMakePresets.json +31 -0
- package/thirdparty/miniz/ChangeLog.md +272 -0
- package/thirdparty/miniz/Config.cmake.in +1 -0
- package/thirdparty/miniz/LICENSE +22 -0
- package/thirdparty/miniz/amalgamate.sh +57 -0
- package/thirdparty/miniz/examples/example1.c +105 -0
- package/thirdparty/miniz/examples/example2.c +164 -0
- package/thirdparty/miniz/examples/example3.c +269 -0
- package/thirdparty/miniz/examples/example4.c +102 -0
- package/thirdparty/miniz/examples/example5.c +327 -0
- package/thirdparty/miniz/examples/example6.c +189 -0
- package/thirdparty/miniz/meson.build +21 -0
- package/thirdparty/miniz/miniz.c +646 -0
- package/thirdparty/miniz/miniz.h +615 -0
- package/thirdparty/miniz/miniz.pc.in +13 -0
- package/thirdparty/miniz/miniz_common.h +89 -0
- package/thirdparty/miniz/miniz_export.h +20 -0
- package/thirdparty/miniz/miniz_tdef.c +1602 -0
- package/thirdparty/miniz/miniz_tdef.h +199 -0
- package/thirdparty/miniz/miniz_tinfl.c +778 -0
- package/thirdparty/miniz/miniz_tinfl.h +150 -0
- package/thirdparty/miniz/miniz_zip.c +4895 -0
- package/thirdparty/miniz/miniz_zip.h +454 -0
- package/thirdparty/miniz/readme.md +46 -0
- package/thirdparty/miniz/test.sh +36 -0
- package/thirdparty/miniz/tests/add_in_place_fuzzer.c +87 -0
- package/thirdparty/miniz/tests/catch_amalgamated.cpp +10795 -0
- package/thirdparty/miniz/tests/catch_amalgamated.hpp +13143 -0
- package/thirdparty/miniz/tests/checksum_fuzzer.c +26 -0
- package/thirdparty/miniz/tests/compress_fuzzer.c +91 -0
- package/thirdparty/miniz/tests/flush_fuzzer.c +88 -0
- package/thirdparty/miniz/tests/fuzz_main.c +55 -0
- package/thirdparty/miniz/tests/large_fuzzer.c +133 -0
- package/thirdparty/miniz/tests/main.cpp +185 -0
- package/thirdparty/miniz/tests/miniz_tdefl_fuzzer.cc +115 -0
- package/thirdparty/miniz/tests/miniz_tester.cpp +1881 -0
- package/thirdparty/miniz/tests/miniz_zip_validate_fuzzer.cc +71 -0
- package/thirdparty/miniz/tests/miniz_zip_writer_fuzzer.cc +96 -0
- package/thirdparty/miniz/tests/ossfuzz.sh +48 -0
- package/thirdparty/miniz/tests/small_fuzzer.c +126 -0
- package/thirdparty/miniz/tests/timer.cpp +152 -0
- package/thirdparty/miniz/tests/timer.h +40 -0
- package/thirdparty/miniz/tests/uncompress2_fuzzer.c +21 -0
- package/thirdparty/miniz/tests/uncompress_fuzzer.c +30 -0
- package/thirdparty/miniz/tests/zip.dict +9 -0
- package/thirdparty/miniz/tests/zip_fuzzer.c +63 -0
- package/thirdparty/pugixml/.codecov.yml +7 -0
- package/thirdparty/pugixml/.gitattributes +1 -0
- package/thirdparty/pugixml/CMakeLists.txt +330 -0
- package/thirdparty/pugixml/LICENSE.md +24 -0
- package/thirdparty/pugixml/Makefile +98 -0
- package/thirdparty/pugixml/README.md +81 -0
- package/thirdparty/pugixml/SECURITY.md +9 -0
- package/thirdparty/pugixml/appveyor.yml +50 -0
- package/thirdparty/pugixml/docs/config.adoc +7 -0
- package/thirdparty/pugixml/docs/images/dom_tree.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_link1.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_link2.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch1.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch2.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch3.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2005_pch4.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2010_link1.png +0 -0
- package/thirdparty/pugixml/docs/images/vs2010_link2.png +0 -0
- package/thirdparty/pugixml/docs/manual.adoc +3326 -0
- package/thirdparty/pugixml/docs/manual.html +6395 -0
- package/thirdparty/pugixml/docs/quickstart.adoc +287 -0
- package/thirdparty/pugixml/docs/quickstart.html +1107 -0
- package/thirdparty/pugixml/docs/samples/character.xml +8 -0
- package/thirdparty/pugixml/docs/samples/custom_memory_management.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/include.cpp +64 -0
- package/thirdparty/pugixml/docs/samples/load_error_handling.cpp +33 -0
- package/thirdparty/pugixml/docs/samples/load_file.cpp +16 -0
- package/thirdparty/pugixml/docs/samples/load_memory.cpp +66 -0
- package/thirdparty/pugixml/docs/samples/load_options.cpp +30 -0
- package/thirdparty/pugixml/docs/samples/load_stream.cpp +97 -0
- package/thirdparty/pugixml/docs/samples/modify_add.cpp +29 -0
- package/thirdparty/pugixml/docs/samples/modify_base.cpp +43 -0
- package/thirdparty/pugixml/docs/samples/modify_remove.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/save_custom_writer.cpp +116 -0
- package/thirdparty/pugixml/docs/samples/save_declaration.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/save_file.cpp +17 -0
- package/thirdparty/pugixml/docs/samples/save_options.cpp +48 -0
- package/thirdparty/pugixml/docs/samples/save_stream.cpp +18 -0
- package/thirdparty/pugixml/docs/samples/save_subtree.cpp +26 -0
- package/thirdparty/pugixml/docs/samples/text.cpp +35 -0
- package/thirdparty/pugixml/docs/samples/transitions.xml +7 -0
- package/thirdparty/pugixml/docs/samples/traverse_base.cpp +51 -0
- package/thirdparty/pugixml/docs/samples/traverse_iter.cpp +27 -0
- package/thirdparty/pugixml/docs/samples/traverse_predicate.cpp +48 -0
- package/thirdparty/pugixml/docs/samples/traverse_rangefor.cpp +32 -0
- package/thirdparty/pugixml/docs/samples/traverse_walker.cpp +35 -0
- package/thirdparty/pugixml/docs/samples/tree.xml +12 -0
- package/thirdparty/pugixml/docs/samples/weekly-shift_jis.xml +78 -0
- package/thirdparty/pugixml/docs/samples/weekly-utf-16.xml +0 -0
- package/thirdparty/pugixml/docs/samples/weekly-utf-8.xml +78 -0
- package/thirdparty/pugixml/docs/samples/xgconsole.xml +12 -0
- package/thirdparty/pugixml/docs/samples/xpath_error.cpp +43 -0
- package/thirdparty/pugixml/docs/samples/xpath_query.cpp +36 -0
- package/thirdparty/pugixml/docs/samples/xpath_select.cpp +28 -0
- package/thirdparty/pugixml/docs/samples/xpath_variables.cpp +38 -0
- package/thirdparty/pugixml/readme.txt +50 -0
- package/thirdparty/pugixml/scripts/archive.py +54 -0
- package/thirdparty/pugixml/scripts/cocoapods_push.sh +4 -0
- package/thirdparty/pugixml/scripts/natvis/pugixml.natvis +77 -0
- package/thirdparty/pugixml/scripts/natvis/pugixml_compact.natvis +506 -0
- package/thirdparty/pugixml/scripts/nuget/build/native/pugixml-propertiesui.xml +17 -0
- package/thirdparty/pugixml/scripts/nuget/build/native/pugixml.targets +28 -0
- package/thirdparty/pugixml/scripts/nuget/pugixml.nuspec +20 -0
- package/thirdparty/pugixml/scripts/nuget_build.ps1 +60 -0
- package/thirdparty/pugixml/scripts/premake4.lua +92 -0
- package/thirdparty/pugixml/scripts/pugixml-config.cmake.in +12 -0
- package/thirdparty/pugixml/scripts/pugixml.pc.in +11 -0
- package/thirdparty/pugixml/scripts/pugixml.podspec +14 -0
- package/thirdparty/pugixml/scripts/pugixml.xcodeproj/project.pbxproj +212 -0
- package/thirdparty/pugixml/scripts/pugixml_airplay.mkf +13 -0
- package/thirdparty/pugixml/scripts/pugixml_codeblocks.cbp +44 -0
- package/thirdparty/pugixml/scripts/pugixml_codelite.project +56 -0
- package/thirdparty/pugixml/scripts/pugixml_dll.rc +45 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2005.vcproj +343 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2005_static.vcproj +343 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2008.vcproj +339 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2008_static.vcproj +339 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2010.vcxproj +191 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2010_static.vcxproj +191 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2013.vcxproj +199 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2013_static.vcxproj +199 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2015.vcxproj +172 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2015_static.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2017.vcxproj +172 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2017_static.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2019.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2019_static.vcxproj +180 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2022.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2022_static.vcxproj +180 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2026.vcxproj +176 -0
- package/thirdparty/pugixml/scripts/pugixml_vs2026_static.vcxproj +180 -0
- package/thirdparty/pugixml/scripts/sbom.cdx.json +47 -0
- package/thirdparty/pugixml/src/pugiconfig.hpp +81 -0
- package/thirdparty/pugixml/src/pugixml.cpp +13776 -0
- package/thirdparty/pugixml/src/pugixml.hpp +1604 -0
- package/thirdparty/pugixml/tests/allocator.cpp +175 -0
- package/thirdparty/pugixml/tests/allocator.hpp +10 -0
- package/thirdparty/pugixml/tests/autotest-appveyor.ps1 +93 -0
- package/thirdparty/pugixml/tests/cmake-appveyor.ps1 +57 -0
- package/thirdparty/pugixml/tests/data/empty.xml +0 -0
- package/thirdparty/pugixml/tests/data/large.xml +1 -0
- package/thirdparty/pugixml/tests/data/latintest_latin1.xml +1 -0
- package/thirdparty/pugixml/tests/data/latintest_utf8.xml +1 -0
- package/thirdparty/pugixml/tests/data/multiline.xml +3 -0
- package/thirdparty/pugixml/tests/data/small.xml +1 -0
- package/thirdparty/pugixml/tests/data/truncation.xml +19 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_be_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf16_le_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_be_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le_bom.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le_clean.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf32_le_nodecl.xml +0 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8.xml +87 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8_bom.xml +87 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8_clean.xml +84 -0
- package/thirdparty/pugixml/tests/data/utftest_utf8_nodecl.xml +86 -0
- package/thirdparty/pugixml/tests/data//321/202/320/265/321/201/321/202.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/basic.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/doctype.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/refs.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/types.xml +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/utf16.xml +0 -0
- package/thirdparty/pugixml/tests/data_fuzz_parse/utf32.xml +0 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/basic.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/functions.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/math.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/path.xpath +1 -0
- package/thirdparty/pugixml/tests/data_fuzz_xpath/predicate.xpath +1 -0
- package/thirdparty/pugixml/tests/fuzz_parse.cpp +14 -0
- package/thirdparty/pugixml/tests/fuzz_parse.dict +72 -0
- package/thirdparty/pugixml/tests/fuzz_setup.sh +11 -0
- package/thirdparty/pugixml/tests/fuzz_xpath.cpp +46 -0
- package/thirdparty/pugixml/tests/fuzz_xpath.dict +72 -0
- package/thirdparty/pugixml/tests/helpers.hpp +114 -0
- package/thirdparty/pugixml/tests/main.cpp +218 -0
- package/thirdparty/pugixml/tests/test.cpp +220 -0
- package/thirdparty/pugixml/tests/test.hpp +175 -0
- package/thirdparty/pugixml/tests/test_compact.cpp +150 -0
- package/thirdparty/pugixml/tests/test_deprecated.cpp +25 -0
- package/thirdparty/pugixml/tests/test_document.cpp +1910 -0
- package/thirdparty/pugixml/tests/test_dom_modify.cpp +2122 -0
- package/thirdparty/pugixml/tests/test_dom_text.cpp +601 -0
- package/thirdparty/pugixml/tests/test_dom_traverse.cpp +1481 -0
- package/thirdparty/pugixml/tests/test_header_guard.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iosfwd_1.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iosfwd_2.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iostream_1.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_iostream_2.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_only_1.cpp +21 -0
- package/thirdparty/pugixml/tests/test_header_only_2.cpp +21 -0
- package/thirdparty/pugixml/tests/test_header_string_1.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_string_2.cpp +3 -0
- package/thirdparty/pugixml/tests/test_header_string_iostream.cpp +5 -0
- package/thirdparty/pugixml/tests/test_memory.cpp +303 -0
- package/thirdparty/pugixml/tests/test_parse.cpp +1463 -0
- package/thirdparty/pugixml/tests/test_parse_doctype.cpp +366 -0
- package/thirdparty/pugixml/tests/test_unicode.cpp +152 -0
- package/thirdparty/pugixml/tests/test_version.cpp +5 -0
- package/thirdparty/pugixml/tests/test_write.cpp +757 -0
- package/thirdparty/pugixml/tests/test_xpath.cpp +833 -0
- package/thirdparty/pugixml/tests/test_xpath_api.cpp +646 -0
- package/thirdparty/pugixml/tests/test_xpath_functions.cpp +844 -0
- package/thirdparty/pugixml/tests/test_xpath_operators.cpp +566 -0
- package/thirdparty/pugixml/tests/test_xpath_parse.cpp +428 -0
- package/thirdparty/pugixml/tests/test_xpath_paths.cpp +787 -0
- package/thirdparty/pugixml/tests/test_xpath_paths_abbrev_w3c.cpp +219 -0
- package/thirdparty/pugixml/tests/test_xpath_paths_w3c.cpp +312 -0
- package/thirdparty/pugixml/tests/test_xpath_variables.cpp +683 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_1.cpp +411 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_2.cpp +417 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_3.cpp +321 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_4.cpp +300 -0
- package/thirdparty/pugixml/tests/test_xpath_xalan_5.cpp +295 -0
- package/thirdparty/pugixml/tests/writer_string.cpp +79 -0
- package/thirdparty/pugixml/tests/writer_string.hpp +27 -0
- package/scripts/prepare-openxlsx.js +0 -126
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
#ifndef LIBZIP_WRAPPER_H
|
|
2
|
+
#define LIBZIP_WRAPPER_H
|
|
3
|
+
|
|
4
|
+
// ===== External Includes ===== //
|
|
5
|
+
#include <cstddef> // size_t
|
|
6
|
+
#include <cstdio> // fprintf
|
|
7
|
+
#include <random> // std::random_device, std::mt19937, std::uniform_int_distribution
|
|
8
|
+
#include <stdexcept> // std::runtime_error
|
|
9
|
+
#include <string> // std::string
|
|
10
|
+
#include <string.h> // strerror
|
|
11
|
+
#include <type_traits> // std::make_signed_t
|
|
12
|
+
|
|
13
|
+
#include <zip.h> // libzip
|
|
14
|
+
|
|
15
|
+
// ===== OpenXLSX Includes ===== //
|
|
16
|
+
#include "detail/OpenXLSXFileSystemTools.hpp" // OpenXLSX::GenerateRandomNameInSamePath, OpenXLSX::fopen, OpenXLSX::remove, OpenXLSX::rename
|
|
17
|
+
|
|
18
|
+
// ===== portable ssize_t definition ===== //
|
|
19
|
+
using ssize_t = std::make_signed_t< std::size_t >;
|
|
20
|
+
|
|
21
|
+
namespace LibZip {
|
|
22
|
+
/**
|
|
23
|
+
* @brief provide a (const) library name to the caller
|
|
24
|
+
* @details
|
|
25
|
+
*/
|
|
26
|
+
constexpr const char *ZipLibraryName() { return "LibZip"; };
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @brief get the library version from libzip
|
|
30
|
+
* @details provide a pass-through function to zip_libzip_version
|
|
31
|
+
*/
|
|
32
|
+
const char *ZipLibraryVersion() { return zip_libzip_version(); }
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @brief The LibZipException class is a custom exception class derived from the std::runtime_error class.
|
|
36
|
+
* @details In case of an error in the LibZip library, an LibZipException object will be thrown, with a message
|
|
37
|
+
* describing the details of the error.
|
|
38
|
+
*/
|
|
39
|
+
class LibZipException : public std::runtime_error
|
|
40
|
+
{
|
|
41
|
+
public:
|
|
42
|
+
explicit LibZipException(const std::string& err) : runtime_error(err) {};
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @brief
|
|
47
|
+
*/
|
|
48
|
+
class LibZipInputError : public LibZipException
|
|
49
|
+
{
|
|
50
|
+
public:
|
|
51
|
+
explicit LibZipInputError(const std::string& err) : LibZipException(err) {};
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @brief
|
|
56
|
+
*/
|
|
57
|
+
class LibZipInternalError : public LibZipException
|
|
58
|
+
{
|
|
59
|
+
public:
|
|
60
|
+
explicit LibZipInternalError(const std::string& err) : LibZipException(err) {};
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class ZipArchive {
|
|
65
|
+
private:
|
|
66
|
+
void *m_zipData; // the raw data of the unmodified source archive, (re-)set on ZipArchive::Open
|
|
67
|
+
size_t m_zipSize; // the size in bytes of the unmodified source archive stored at m_zipData
|
|
68
|
+
zip_error_t m_zipError; // TBD how useful: save zip_error_t states across different methods
|
|
69
|
+
zip_source_t *m_zipSrc; // the zip source, as opposed to the archive - TBD what the logic of this is
|
|
70
|
+
zip_t *m_za; // the zip archive - changes must be committed before they can be read via GetEntryDataAsString
|
|
71
|
+
std::string m_name; // name of the archive file for which ZipArchive::Open was called
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @brief close archive, commit changes and - if the underlying reference count reaches zero - free resources (m_zipData, m_zipSrc)
|
|
75
|
+
* @return N/A
|
|
76
|
+
* @throw LibZipInternalError
|
|
77
|
+
*/
|
|
78
|
+
void closeZip() {
|
|
79
|
+
//
|
|
80
|
+
if (zip_close(m_za) < 0) {
|
|
81
|
+
using namespace std::literals::string_literals;
|
|
82
|
+
throw LibZipInternalError("ZipArchive::closeZip: can't close zip archive '"s + m_name + "': "s + zip_strerror(m_za));
|
|
83
|
+
}
|
|
84
|
+
m_za = nullptr;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @brief (re)open zip archive from source, allowing further read & write access
|
|
89
|
+
* @return N/A
|
|
90
|
+
* @throw LibZipInternalError
|
|
91
|
+
*/
|
|
92
|
+
void reopenFromZipSource() {
|
|
93
|
+
if ((m_za = zip_open_from_source(m_zipSrc, 0, &m_zipError)) == nullptr) {
|
|
94
|
+
zip_source_free(m_zipSrc);
|
|
95
|
+
m_zipSrc = nullptr; // prevent double-free
|
|
96
|
+
zip_error_fini(&m_zipError);
|
|
97
|
+
using namespace std::literals::string_literals;
|
|
98
|
+
throw LibZipInternalError("ZipArchive::reopenFromZipSource: can't open zip from source: "s + zip_error_strerror(&m_zipError));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* @brief load data from filename into this->m_zipData
|
|
104
|
+
* @param filename load a file from here
|
|
105
|
+
* @return 0 on success, -1 on failure
|
|
106
|
+
*/
|
|
107
|
+
int loadArchiveData(std::string filename)
|
|
108
|
+
{
|
|
109
|
+
m_zipSize = 0; // init in case of failure
|
|
110
|
+
|
|
111
|
+
off_t archiveSizeCompressed = OpenXLSX::fileSize( filename );
|
|
112
|
+
if (archiveSizeCompressed < 0) {
|
|
113
|
+
fprintf(stderr, "ZipArchive::loadArchiveData: can't obtain info about %s (errno %d: %s)\n", filename.c_str(), errno, strerror(errno));
|
|
114
|
+
m_zipData = nullptr;
|
|
115
|
+
return -1;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if ((m_zipData = malloc(static_cast<size_t>(archiveSizeCompressed))) == nullptr) {
|
|
119
|
+
fprintf(stderr, "ZipArchive::loadArchiveData: can't allocate buffer\n");
|
|
120
|
+
return -1;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
FILE *fp = OpenXLSX::fopen(filename.c_str(), "rb");
|
|
124
|
+
if (fp == nullptr) {
|
|
125
|
+
free(m_zipData);
|
|
126
|
+
m_zipData = nullptr;
|
|
127
|
+
fprintf(stderr, "ZipArchive::loadArchiveData: can't open %s: %s\n", filename.c_str(), strerror(errno));
|
|
128
|
+
return -1;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (fread(m_zipData, 1, static_cast<size_t>(archiveSizeCompressed), fp) < static_cast<size_t>(archiveSizeCompressed)) {
|
|
132
|
+
free(m_zipData);
|
|
133
|
+
m_zipData = nullptr;
|
|
134
|
+
fprintf(stderr, "ZipArchive::loadArchiveData: can't read %s: %s\n", filename.c_str(), strerror(errno));
|
|
135
|
+
fclose(fp);
|
|
136
|
+
return -1;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
fclose(fp);
|
|
140
|
+
|
|
141
|
+
m_zipSize = static_cast<size_t>(archiveSizeCompressed);
|
|
142
|
+
return 0;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* @brief Save size bytes from data to a temporary file, then move that to filename
|
|
147
|
+
* @param data save data from here
|
|
148
|
+
* @param size amount of bytes to save
|
|
149
|
+
* @param filename (final) save destination
|
|
150
|
+
* @return 0 on success, -1 on failure
|
|
151
|
+
*/
|
|
152
|
+
int saveArchiveFile(void *data, size_t size, std::string filename)
|
|
153
|
+
{
|
|
154
|
+
// ===== Generate a random file name with the same path as the current file
|
|
155
|
+
std::string tempPath = OpenXLSX::GenerateRandomNameInSamePath(filename, 20);
|
|
156
|
+
|
|
157
|
+
FILE *fp = OpenXLSX::fopen(tempPath.c_str(), "wb");
|
|
158
|
+
if (fp == nullptr) {
|
|
159
|
+
fprintf(stderr, "ZipArchive::saveArchiveFile: can't open %s: %s\n", tempPath.c_str(), strerror(errno));
|
|
160
|
+
return -1;
|
|
161
|
+
}
|
|
162
|
+
if (fwrite(data, 1, size, fp) < size) {
|
|
163
|
+
fprintf(stderr, "ZipArchive::saveArchiveFile: can't write %s: %s\n", tempPath.c_str(), strerror(errno));
|
|
164
|
+
fclose(fp);
|
|
165
|
+
return -1;
|
|
166
|
+
}
|
|
167
|
+
if (fclose(fp) < 0) {
|
|
168
|
+
fprintf(stderr, "ZipArchive::saveArchiveFile: can't close %s: %s\n", tempPath.c_str(), strerror(errno));
|
|
169
|
+
return -1;
|
|
170
|
+
}
|
|
171
|
+
OpenXLSX::remove(filename.c_str());
|
|
172
|
+
OpenXLSX::rename(tempPath.c_str(), filename.c_str()); // forward to function supporting unicode on Windows
|
|
173
|
+
|
|
174
|
+
return 0;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
public:
|
|
179
|
+
/**
|
|
180
|
+
* @brief construct an empty ZipArchive
|
|
181
|
+
*/
|
|
182
|
+
ZipArchive()
|
|
183
|
+
: m_zipData(nullptr), m_zipSize(0), m_zipSrc(nullptr), m_za(nullptr), m_name("") {}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* @brief destructor: close zip archive if open
|
|
187
|
+
* @note data will not be saved automatically on destruction - user must call ZipArchive::Save
|
|
188
|
+
*/
|
|
189
|
+
~ZipArchive() {
|
|
190
|
+
if (IsOpen()) Close();
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* @brief test whether zip archive is open / ready for reads & writes
|
|
195
|
+
* @return true if a zip file has been opened, false if archive is not open
|
|
196
|
+
*/
|
|
197
|
+
bool IsOpen() const { return m_za != nullptr; }
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* @brief close an open archive and free resources
|
|
201
|
+
* @return N/A
|
|
202
|
+
* @throw LibZipInputError if archive is not open
|
|
203
|
+
*/
|
|
204
|
+
void Close() {
|
|
205
|
+
if (!IsOpen()) throw LibZipInputError("ZipArchive::Close: archive is not open!");
|
|
206
|
+
|
|
207
|
+
// struct zip_file_attributes {
|
|
208
|
+
// zip_uint64_t valid; /* which fields have valid values */
|
|
209
|
+
// zip_uint8_t version; /* version of this struct, currently 1 */
|
|
210
|
+
// zip_uint8_t host_system; /* host system on which file was created */
|
|
211
|
+
// zip_uint8_t ascii; /* flag whether file is ASCII text */
|
|
212
|
+
// zip_uint8_t version_needed; /* minimum version needed to extract file */
|
|
213
|
+
// zip_uint32_t external_file_attributes; /* external file attributes (host-system specific) */
|
|
214
|
+
// zip_uint16_t general_purpose_bit_flags; /* general purpose big flags, only some bits are honored */
|
|
215
|
+
// zip_uint16_t general_purpose_bit_mask; /* which bits in general_purpose_bit_flags are valid */
|
|
216
|
+
// };
|
|
217
|
+
// zip_file_attributes_t zipAttrs;
|
|
218
|
+
// zipAttrs.general_purpose_bit_flags = 0;
|
|
219
|
+
// zip_source_get_file_attributes(m_zipSrc, &zipAttrs);
|
|
220
|
+
// printf( "zip_file_attributes::general_purpose_bit_flags is 0x%08x\n", static_cast< uint16_t >( zipAttrs.general_purpose_bit_flags ) );
|
|
221
|
+
|
|
222
|
+
closeZip(); // invalidates m_zipData and m_zipSrc because reference count for the underlying zip source should reach zero
|
|
223
|
+
m_zipData = nullptr;
|
|
224
|
+
m_zipSize = 0;
|
|
225
|
+
m_zipSrc = nullptr;
|
|
226
|
+
m_name = "";
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* @brief Open an existing archive file
|
|
231
|
+
* @param archiveName the file to load from
|
|
232
|
+
* @return N/A
|
|
233
|
+
* @throw LibZipInputError if archive is already open
|
|
234
|
+
* @throw LibZipInternalError if archiveName can't be opened / loaded
|
|
235
|
+
*/
|
|
236
|
+
void Open(std::string archiveName) {
|
|
237
|
+
using namespace std::literals::string_literals;
|
|
238
|
+
if (IsOpen())
|
|
239
|
+
throw LibZipInputError("ZipArchive::Open: archive is already open for source file "s + m_name); // user must close the archive before re-opening
|
|
240
|
+
|
|
241
|
+
/* get buffer with zip archive inside */
|
|
242
|
+
if (loadArchiveData(archiveName) < 0)
|
|
243
|
+
throw LibZipInternalError("ZipArchive::Open: failed to load archive data from file "s + archiveName);
|
|
244
|
+
|
|
245
|
+
zip_error_init(&m_zipError);
|
|
246
|
+
/* create source from buffer */
|
|
247
|
+
if ((m_zipSrc = zip_source_buffer_create(m_zipData, m_zipSize, 1, &m_zipError)) == nullptr) {
|
|
248
|
+
free(m_zipData);
|
|
249
|
+
m_zipData = nullptr; // prevent double-free
|
|
250
|
+
zip_error_fini(&m_zipError);
|
|
251
|
+
throw LibZipInternalError("ZipArchive::Open: can't create source: "s + zip_error_strerror(&m_zipError));
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
reopenFromZipSource();
|
|
255
|
+
|
|
256
|
+
zip_error_fini(&m_zipError);
|
|
257
|
+
m_name = archiveName;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* @brief make modified archive data available for reading via GetEntryDataAsString
|
|
262
|
+
* @return N/A
|
|
263
|
+
* @throw LibZipInternalError thrown from closeZip or reopenFromZipSource upon failure
|
|
264
|
+
*/
|
|
265
|
+
void CommitChanges() { // make changes readable
|
|
266
|
+
zip_source_keep(m_zipSrc); // ensure that m_zipSrc survives zip_close
|
|
267
|
+
closeZip(); // close zip and thereby commit changes
|
|
268
|
+
reopenFromZipSource(); // ensure that archive is valid again for further reading & modifications
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* @brief Save the (modified) archive to savePath
|
|
273
|
+
* @param savePath save here, or save to original filename if empty string is provided
|
|
274
|
+
* @return N/A
|
|
275
|
+
* @throw LibZipInternalError upon any failure
|
|
276
|
+
*/
|
|
277
|
+
void Save(std::string savePath)
|
|
278
|
+
{
|
|
279
|
+
if (!IsOpen()) throw LibZipInputError("ZipArchive::Save: archive is not open!");
|
|
280
|
+
|
|
281
|
+
if (savePath.empty()) // saving in original file location!
|
|
282
|
+
savePath = m_name;
|
|
283
|
+
|
|
284
|
+
zip_source_keep(m_zipSrc); // ensure that m_zipSrc survives zip_close
|
|
285
|
+
closeZip(); // close the zip archive to commit changes
|
|
286
|
+
|
|
287
|
+
if (zip_source_is_deleted(m_zipSrc)) {
|
|
288
|
+
/* new archive is empty, thus no data */
|
|
289
|
+
throw LibZipInternalError("ZipArchive::Save: zip_source_is_deleted returned true, this should not happen");
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
using namespace std::literals::string_literals;
|
|
293
|
+
|
|
294
|
+
void *saveData = nullptr;
|
|
295
|
+
zip_stat_t zst;
|
|
296
|
+
if (zip_source_stat(m_zipSrc, &zst) < 0)
|
|
297
|
+
throw LibZipInternalError("ZipArchive::Save: can't stat source: "s + zip_error_strerror(zip_source_error(m_zipSrc)));
|
|
298
|
+
|
|
299
|
+
size_t saveSize = zst.size;
|
|
300
|
+
if (zip_source_open(m_zipSrc) < 0) // prepare m_zipSrc for reading archive data from it
|
|
301
|
+
throw LibZipInternalError("ZipArchive::Save: can't open source: "s + zip_error_strerror(zip_source_error(m_zipSrc)));
|
|
302
|
+
|
|
303
|
+
if ((saveData = malloc(saveSize)) == nullptr) { // allocate memory to store the modified archive for saving to a file
|
|
304
|
+
zip_source_close(m_zipSrc);
|
|
305
|
+
throw LibZipInternalError("ZipArchive::Save: malloc failed: "s + strerror(errno));
|
|
306
|
+
}
|
|
307
|
+
// ==== Read the archive raw data from m_zipSrc
|
|
308
|
+
if (static_cast<size_t>(zip_source_read(m_zipSrc, saveData, saveSize)) < saveSize) {
|
|
309
|
+
zip_source_close(m_zipSrc);
|
|
310
|
+
free(saveData);
|
|
311
|
+
throw LibZipInternalError("ZipArchive::Save: can't read saveData from source: "s + zip_error_strerror(zip_source_error(m_zipSrc)));
|
|
312
|
+
}
|
|
313
|
+
zip_source_close(m_zipSrc); // close the zip source
|
|
314
|
+
if (saveArchiveFile(saveData, saveSize, savePath.c_str()) < 0) // and save the archive
|
|
315
|
+
throw LibZipInternalError("ZipArchive::Save: failed to save archive data to "s + savePath);
|
|
316
|
+
|
|
317
|
+
free(saveData); // free temporary buffer used for saving the archive
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
reopenFromZipSource(); // ensure that archive is valid again for further modifications
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* @brief Add a file to the archive and write data to it - overwrite existing files
|
|
325
|
+
* @param entryName file path in the archive - if existing, destination will be replaced
|
|
326
|
+
* @param data contents for a text file to be placed in the archive for entryName
|
|
327
|
+
* @return N/A
|
|
328
|
+
* @throw LibZipInputError when called on a non-valid archive
|
|
329
|
+
* @throw LibZipInternalError upon any other failure
|
|
330
|
+
*/
|
|
331
|
+
void AddEntry(const std::string& entryName, const std::string& data)
|
|
332
|
+
{
|
|
333
|
+
if (!IsOpen())
|
|
334
|
+
throw LibZipInputError("ZipArchive::AddEntry: archive is not open!");
|
|
335
|
+
|
|
336
|
+
void *buf = malloc(data.size()); // allocate memory for a persistent copy of data.data()
|
|
337
|
+
memcpy(buf, data.data(), data.size()); // copy data.data() to the allocated memory
|
|
338
|
+
|
|
339
|
+
// create the zip source for a single entry from data
|
|
340
|
+
struct zip_source *zipSrc = zip_source_buffer(m_za, buf, data.size(), 1); // create zip source from buffer, flagging that buf shall be freed by libzip
|
|
341
|
+
|
|
342
|
+
if (!zipSrc)
|
|
343
|
+
throw LibZipInternalError("ZipArchive::AddEntry: failed to create a zip source from entry data");
|
|
344
|
+
|
|
345
|
+
if (-1 == zip_file_add(m_za, entryName.c_str(), zipSrc, ZIP_FL_OVERWRITE | ZIP_FL_ENC_UTF_8)) {
|
|
346
|
+
using namespace std::literals::string_literals;
|
|
347
|
+
throw LibZipInternalError("ZipArchive::AddEntry: failed to add file to archive: "s + zip_error_strerror(zip_get_error(m_za)));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* @brief Delete a file from the archive
|
|
353
|
+
* @param entryName archive file to delete
|
|
354
|
+
* @return N/A
|
|
355
|
+
* @throw LibZipInputError when called on a non-valid archive
|
|
356
|
+
* @throw LibZipInternalError upon any other failure
|
|
357
|
+
*/
|
|
358
|
+
void DeleteEntry(const std::string& entryName)
|
|
359
|
+
{
|
|
360
|
+
using namespace std::literals::string_literals;
|
|
361
|
+
|
|
362
|
+
if (!IsOpen())
|
|
363
|
+
throw LibZipInputError("ZipArchive::DeleteEntry: archive is not open!");
|
|
364
|
+
|
|
365
|
+
int index = zip_name_locate(m_za, entryName.c_str(), 0);
|
|
366
|
+
if (index == -1)
|
|
367
|
+
// throw LibZipInputError("ZipArchive::DeleteEntry: archive does not contain file: "s + entryName);
|
|
368
|
+
return; // nothing to do
|
|
369
|
+
|
|
370
|
+
if (0 != zip_delete(m_za, index))
|
|
371
|
+
throw LibZipInternalError("ZipArchive::DeleteEntry: failed to delete file "s + entryName + " from archive: "s + zip_error_strerror(zip_get_error(m_za)));
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* @brief Return the contents of an archive file as a string
|
|
376
|
+
* @note function is intended for text files only
|
|
377
|
+
* @param entryName archive file to fetch
|
|
378
|
+
* @return std::string with the contents of the archive file
|
|
379
|
+
* @throw LibZipInputError when called on a non-valid archive or if entryName does not exist in the archive
|
|
380
|
+
* @throw LibZipInternalError upon any other failure
|
|
381
|
+
*/
|
|
382
|
+
std::string GetEntryDataAsString(const std::string& entryName) const
|
|
383
|
+
{
|
|
384
|
+
using namespace std::literals::string_literals;
|
|
385
|
+
|
|
386
|
+
if (!IsOpen())
|
|
387
|
+
throw LibZipInputError("ZipArchive::GetEntryDataAsString: archive is not open!");
|
|
388
|
+
|
|
389
|
+
int index = zip_name_locate(m_za, entryName.c_str(), 0); // ensure that entryName exists in the archive
|
|
390
|
+
if (index == -1)
|
|
391
|
+
throw LibZipInputError("ZipArchive::GetEntryDataAsString: archive does not contain file: "s + entryName);
|
|
392
|
+
|
|
393
|
+
// determine how many bytes entry data encompasses
|
|
394
|
+
struct zip_stat entryInfo;
|
|
395
|
+
if (0 != zip_stat_index(m_za, index, 0, &entryInfo))
|
|
396
|
+
throw LibZipInternalError("ZipArchive::GetEntryDataAsString: failed to obtain archive entry info for "s + entryName + ": "s + zip_error_strerror(zip_get_error(m_za)));
|
|
397
|
+
|
|
398
|
+
zip_file_t *fd = zip_fopen_index(m_za, index, 0); // get a file descriptor for desired entry
|
|
399
|
+
if (fd == nullptr)
|
|
400
|
+
throw LibZipInternalError("ZipArchive::GetEntryDataAsString: an error occurred trying to open archive file "s + entryName + ": "s + zip_error_strerror(zip_get_error(m_za)));
|
|
401
|
+
|
|
402
|
+
char *entryDataChr = reinterpret_cast<char *>(malloc(entryInfo.size + 1)); // temporary buffer to construct return string from
|
|
403
|
+
zip_fread(fd, entryDataChr, entryInfo.size); // read entry data into temporary buffer
|
|
404
|
+
entryDataChr[entryInfo.size] = 0; // ensure zero-termination of buffer data
|
|
405
|
+
std::string entryDataAsString(entryDataChr); // construct string return value from buffer data
|
|
406
|
+
free(entryDataChr); // free temporary buffer
|
|
407
|
+
zip_fclose(fd); // close file descriptor
|
|
408
|
+
|
|
409
|
+
return entryDataAsString;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* @brief test whether a file exists in the archive
|
|
414
|
+
* @param entryName archive file to locate
|
|
415
|
+
* @return true if archive has file, false otherwise
|
|
416
|
+
*/
|
|
417
|
+
bool HasEntry(const std::string& entryName) const
|
|
418
|
+
{
|
|
419
|
+
return (-1 != zip_name_locate(m_za, entryName.c_str(), 0)); // zip_name_locate also returns -1 if m_za is nullptr, thus no extra check for IsOpen()
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* @brief get valid entry index range [0;EntryCount()-1]
|
|
424
|
+
* @return amount of entries in the zip archive
|
|
425
|
+
* @return -1 on error (m_za is not open / nullptr)
|
|
426
|
+
*/
|
|
427
|
+
ssize_t EntryCount() const { return zip_get_num_entries(m_za, 0); } // TBC that zip_flags_t flags = 0 effects the same behavior as obsolete zip_get_num_files
|
|
428
|
+
// { return zip_get_num_files(m_za); }
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* @brief get entry name by index
|
|
432
|
+
* @param index which entry name to get, must be within [0;EntryCount()-1]
|
|
433
|
+
* @return std::string with the name of the entry at index
|
|
434
|
+
* @return empty string if entry does not have a name / index is invalid
|
|
435
|
+
* @throw LibZipInputError if archive is closed (nullptr)
|
|
436
|
+
*/
|
|
437
|
+
std::string EntryName( int index ) const // get name of the archive entry at index
|
|
438
|
+
{
|
|
439
|
+
if (!IsOpen())
|
|
440
|
+
throw LibZipInputError("ZipArchive::EntryName: archive is not open");
|
|
441
|
+
const char *name = zip_get_name(m_za, index, 0);
|
|
442
|
+
return std::string(name == nullptr ? "" : name);
|
|
443
|
+
}
|
|
444
|
+
};
|
|
445
|
+
} // namespace LibZip
|
|
446
|
+
|
|
447
|
+
#endif // LIBZIP_WRAPPER_H
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
#ifndef OPENXLSX_TOOLS_H
|
|
2
|
+
#define OPENXLSX_TOOLS_H
|
|
3
|
+
|
|
4
|
+
#ifdef _WIN32
|
|
5
|
+
#include <algorithm> // std::replace
|
|
6
|
+
#endif
|
|
7
|
+
#ifdef ENABLE_NOWIDE
|
|
8
|
+
#include <nowide/cstdio.hpp> // nowide::fopen, nowide::remove, nowide::rename
|
|
9
|
+
#include <nowide/stat.hpp>
|
|
10
|
+
namespace boost {} // ensure that namespace exists, even if boost doesn't define it
|
|
11
|
+
using namespace boost; // depending on library version, nowide namespace is hidden in boost::nowide
|
|
12
|
+
#else
|
|
13
|
+
#include <cstdio> // std::fopen
|
|
14
|
+
#include <filesystem> // std::filesystem::remove, std::filesystem::rename
|
|
15
|
+
#include <sys/stat.h> // for stat, to test if a file exists and whether a file is a directory
|
|
16
|
+
#endif
|
|
17
|
+
#include <random> // std::random_device, std::mt19937, std::uniform_int_distribution
|
|
18
|
+
#include <string> // std::string
|
|
19
|
+
#include <sys/types.h> // off_t
|
|
20
|
+
|
|
21
|
+
// stat shenanigans configured *below* includes to make it absolutely clear that this is module-local
|
|
22
|
+
#ifdef ENABLE_NOWIDE
|
|
23
|
+
#define STAT nowide::stat // use nowide version of stat, same name for win and non-win
|
|
24
|
+
#define STATSTRUCT nowide::posix_stat_t // platform-specific struct stat and struct _stat get mapped to nowide::posix_stat_t (without the struct keyword)
|
|
25
|
+
#else
|
|
26
|
+
// don't use "stat" directly because windows has compatibility-breaking defines
|
|
27
|
+
#if defined(_WIN32)
|
|
28
|
+
// NOTE: this branch should never be triggered, because on _WIN32, ENABLE_NOWIDE should be always true
|
|
29
|
+
#define STAT _stat // _stat should be available in standard environment on Windows
|
|
30
|
+
#define STATSTRUCT struct _stat // struct _stat also exists - split the two names in case the struct _stat must not be used on windows
|
|
31
|
+
#else
|
|
32
|
+
#define STAT stat
|
|
33
|
+
#define STATSTRUCT struct stat
|
|
34
|
+
#endif
|
|
35
|
+
#endif
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
namespace OpenXLSX
|
|
39
|
+
{
|
|
40
|
+
/* 2025-05-04: moved a set of file system related utility functions to this new header file so that Unicode support on windows (nowide)
|
|
41
|
+
* can be implemented in a central location */
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @brief Test if path exists as either a file or a directory
|
|
45
|
+
* @param path Check for existence of this
|
|
46
|
+
* @return true if path exists as a file or directory
|
|
47
|
+
*/
|
|
48
|
+
inline bool pathExists(const std::string& path)
|
|
49
|
+
{
|
|
50
|
+
STATSTRUCT info;
|
|
51
|
+
if (STAT(path.c_str(), &info ) == 0) // test if path exists
|
|
52
|
+
return true;
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
#ifdef __GNUC__ // conditionally enable GCC specific pragmas to suppress unused function warning
|
|
57
|
+
# pragma GCC diagnostic push
|
|
58
|
+
# pragma GCC diagnostic ignored "-Wunused-function"
|
|
59
|
+
#endif // __GNUC__
|
|
60
|
+
/**
|
|
61
|
+
* @brief Test if fileName exists and is not a directory
|
|
62
|
+
* @param fileName The path to check for existence (as a file)
|
|
63
|
+
* @return true if fileName exists and is a file, otherwise false
|
|
64
|
+
*/
|
|
65
|
+
inline bool fileExists(const std::string& fileName)
|
|
66
|
+
{
|
|
67
|
+
STATSTRUCT info;
|
|
68
|
+
if (STAT(fileName.c_str(), &info ) == 0) // test if path exists
|
|
69
|
+
if ((info.st_mode & S_IFDIR) == 0) // test if it is NOT a directory
|
|
70
|
+
return true;
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @brief Test if fileName exists and is a directory
|
|
76
|
+
* @param dirName The path to check for existence (as a directory)
|
|
77
|
+
* @return true if fileName exists and is a directory, otherwise false
|
|
78
|
+
*/
|
|
79
|
+
inline bool isDirectory(const std::string& dirName)
|
|
80
|
+
{
|
|
81
|
+
STATSTRUCT info;
|
|
82
|
+
if (STAT(dirName.c_str(), &info ) == 0) // test if path exists
|
|
83
|
+
if ((info.st_mode & S_IFDIR) != 0) // test if it is a directory
|
|
84
|
+
return true;
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
#ifdef __GNUC__ // conditionally enable GCC specific pragmas to suppress unused function warning
|
|
88
|
+
# pragma GCC diagnostic pop
|
|
89
|
+
#endif // __GNUC__
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @brief determine the size of a file if it exists
|
|
93
|
+
* @param fileName file to obtain info about
|
|
94
|
+
* @return size of the file in Bytes (as returned by struct stat field st_size, or -1 if file info could not be obtained
|
|
95
|
+
*/
|
|
96
|
+
inline off_t fileSize(const std::string& fileName)
|
|
97
|
+
{
|
|
98
|
+
STATSTRUCT info;
|
|
99
|
+
if (STAT(fileName.c_str(), &info ) == 0) // if file info could be obtained
|
|
100
|
+
return info.st_size; // then return the file size
|
|
101
|
+
return -1; // default: return -1 to indicate failure
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @brief opens a file with support for unicode filenames on Windows
|
|
106
|
+
* @param filename (unicode) name of file to open
|
|
107
|
+
* @param mode how to open the file - passed through to fopen
|
|
108
|
+
* @return FILE * to the open file on success
|
|
109
|
+
* @return nullptr on failure
|
|
110
|
+
*/
|
|
111
|
+
inline FILE* fopen( std::string filename, std::string mode )
|
|
112
|
+
{
|
|
113
|
+
# ifdef ENABLE_NOWIDE
|
|
114
|
+
return nowide::fopen(filename.c_str(), mode.c_str());
|
|
115
|
+
# else
|
|
116
|
+
return std::fopen(filename.c_str(), mode.c_str());
|
|
117
|
+
# endif
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @brief Generates a random filename, which is used to generate a temporary archive when modifying and saving
|
|
122
|
+
* archive files.
|
|
123
|
+
* @param length The length of the filename to create.
|
|
124
|
+
* @return Returns the generated filename, appended with '.tmp'.
|
|
125
|
+
*/
|
|
126
|
+
inline std::string GenerateRandomName(int length)
|
|
127
|
+
{
|
|
128
|
+
std::string letters = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
129
|
+
|
|
130
|
+
std::random_device rand_dev;
|
|
131
|
+
std::mt19937 generator(rand_dev());
|
|
132
|
+
std::uniform_int_distribution<int> distr(0, letters.size() - 1);
|
|
133
|
+
|
|
134
|
+
std::string result;
|
|
135
|
+
for (int i = 0; i < length; ++i) {
|
|
136
|
+
result += letters[distr(generator)];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return result + ".tmp";
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* @brief Generates a random filename with a call to GenerateRandomName, prepending the same path in which filename is located
|
|
144
|
+
* @param filename determine "same path" from this file
|
|
145
|
+
* @param length The length of the filename to create.
|
|
146
|
+
* @return Returns the generated random filename in the same path as filename, appended with '.tmp'.
|
|
147
|
+
* @note this function accounts for amigaos and windows specific drive / directory separators
|
|
148
|
+
*/
|
|
149
|
+
inline std::string GenerateRandomNameInSamePath(std::string filename, int length)
|
|
150
|
+
{
|
|
151
|
+
if (filename.empty()) filename = "./"; // local folder
|
|
152
|
+
|
|
153
|
+
# ifdef _WIN32
|
|
154
|
+
std::replace( filename.begin(), filename.end(), '\\', '/' ); // pull request #210, alternate fix: fopen etc work fine with forward slashes
|
|
155
|
+
# endif
|
|
156
|
+
|
|
157
|
+
// ===== Determine path of the current file
|
|
158
|
+
size_t pathPos = filename.rfind('/');
|
|
159
|
+
|
|
160
|
+
// pull request #191, support AmigaOS style paths
|
|
161
|
+
# ifdef __amigaos__
|
|
162
|
+
constexpr const char * localFolder = ""; // local folder on AmigaOS can not be explicitly expressed in a path
|
|
163
|
+
if (pathPos == std::string::npos) pathPos = filename.rfind(':'); // if no '/' found, attempt to find amiga drive root path
|
|
164
|
+
# else
|
|
165
|
+
constexpr const char * localFolder = "./"; // local folder on _WIN32 && __linux__ is .
|
|
166
|
+
# endif
|
|
167
|
+
std::string tempPath{};
|
|
168
|
+
if (pathPos != std::string::npos) tempPath = filename.substr(0, pathPos + 1);
|
|
169
|
+
else tempPath = localFolder; // prepend explicit identification of local folder in case path did not contain a folder
|
|
170
|
+
|
|
171
|
+
// ===== Generate a random file name with the same path as the current file
|
|
172
|
+
return tempPath + GenerateRandomName(length);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* @warning DRAFT VERSION, TO BE TESTED!
|
|
177
|
+
* @brief Portable remove function to delete a file with unicode characters in the filename even on Windows
|
|
178
|
+
* @param p (unicode) std::string name of file to delete
|
|
179
|
+
* @return true upon success, false upon failure
|
|
180
|
+
*/
|
|
181
|
+
inline bool remove(std::string const &p )
|
|
182
|
+
{
|
|
183
|
+
# ifdef ENABLE_NOWIDE
|
|
184
|
+
return ( nowide::remove(p.c_str()) == 0 ); // nowide::remove / std::remove return an int, and 0 means success
|
|
185
|
+
# else
|
|
186
|
+
return std::filesystem::remove(p.c_str());
|
|
187
|
+
# endif
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* @warning DRAFT VERSION, TO BE TESTED!
|
|
192
|
+
* @brief Portable rename function to save a filename with unicode characters even on Windows
|
|
193
|
+
* @param old_p (unicode) std::string source filename
|
|
194
|
+
* @param new_p (unicode) std::string destination filename
|
|
195
|
+
* @return N/A
|
|
196
|
+
*/
|
|
197
|
+
inline void rename(std::string const &old_p, std::string const &new_p )
|
|
198
|
+
{
|
|
199
|
+
# ifdef ENABLE_NOWIDE
|
|
200
|
+
nowide::rename(old_p.c_str(), new_p.c_str());
|
|
201
|
+
# else
|
|
202
|
+
std::filesystem::rename(old_p.c_str(), new_p.c_str());
|
|
203
|
+
# endif
|
|
204
|
+
}
|
|
205
|
+
} // namespace OpenXLSX
|
|
206
|
+
|
|
207
|
+
#endif // OPENXLSX_TOOLS_H
|