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.
Files changed (395) hide show
  1. package/NitroXlsx.podspec +26 -27
  2. package/Package.swift +31 -10
  3. package/README.md +1 -1
  4. package/android/CMakeLists.txt +20 -27
  5. package/package.json +2 -2
  6. package/scripts/run-cpp-tests.sh +1 -1
  7. package/thirdparty/OpenXLSX/.clang-format +118 -0
  8. package/thirdparty/OpenXLSX/.clang-tidy +28 -0
  9. package/thirdparty/OpenXLSX/.gitignore +130 -0
  10. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_before_XMLNode_wrappers +46 -0
  11. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_and_stripping +49 -0
  12. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_char_support +49 -0
  13. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespace_support +49 -0
  14. package/thirdparty/OpenXLSX/Benchmarks/2024-07-29-benchmarks_with_XMLNode_wrappers_and_namespaced_name_disabled +49 -0
  15. package/thirdparty/OpenXLSX/Benchmarks/2024-08-11-benchmarks_post-XLCellIterator-Rework +46 -0
  16. package/thirdparty/OpenXLSX/Benchmarks/2024-08-14-benchmarks_post-default-row-column-style-support +46 -0
  17. package/thirdparty/OpenXLSX/Benchmarks/2024-09-02-benchmarks +46 -0
  18. package/thirdparty/OpenXLSX/Benchmarks/2024-12-19-benchmarks +46 -0
  19. package/thirdparty/OpenXLSX/Benchmarks/2024-12-30-benchmarks-post-XLSharedStrings-by-ref +46 -0
  20. package/thirdparty/OpenXLSX/Benchmarks/2025-01-09-benchmarks-post-conditionalFormatsAndSheetProtection +46 -0
  21. package/thirdparty/OpenXLSX/Benchmarks/2025-01-10-benchmarks-post-XLCellValue-bugfix +46 -0
  22. package/thirdparty/OpenXLSX/Benchmarks/2025-01-31-benchmarks-post-XLComments-implementation +46 -0
  23. package/thirdparty/OpenXLSX/Benchmarks/2025-02-02-benchmarks-post-XLRowIterator-Rework +46 -0
  24. package/thirdparty/OpenXLSX/Benchmarks/2025-07-20-benchmarks-after-hiding-pugixml-internals +46 -0
  25. package/thirdparty/OpenXLSX/Benchmarks/2025-08-29-benchmarks-after-code-review-with-libzip +46 -0
  26. package/thirdparty/OpenXLSX/Benchmarks/Benchmark.cpp +249 -0
  27. package/thirdparty/OpenXLSX/Benchmarks/CMakeLists.txt +19 -0
  28. package/thirdparty/OpenXLSX/CMakeLists.txt +466 -0
  29. package/thirdparty/OpenXLSX/Documentation/CMakeLists.txt +31 -0
  30. package/thirdparty/OpenXLSX/Documentation/Doxyfile.in +2471 -0
  31. package/thirdparty/OpenXLSX/Documentation/DoxygenLayout.xml +194 -0
  32. package/thirdparty/OpenXLSX/Documentation/customdoxygen.css +1355 -0
  33. package/thirdparty/OpenXLSX/Examples/CMakeLists.txt +103 -0
  34. package/thirdparty/OpenXLSX/Examples/Demo1.cpp +279 -0
  35. package/thirdparty/OpenXLSX/Examples/Demo10.cpp +545 -0
  36. package/thirdparty/OpenXLSX/Examples/Demo1A.cpp +137 -0
  37. package/thirdparty/OpenXLSX/Examples/Demo2.cpp +65 -0
  38. package/thirdparty/OpenXLSX/Examples/Demo3.cpp +89 -0
  39. package/thirdparty/OpenXLSX/Examples/Demo4.cpp +86 -0
  40. package/thirdparty/OpenXLSX/Examples/Demo5.cpp +77 -0
  41. package/thirdparty/OpenXLSX/Examples/Demo6.cpp +103 -0
  42. package/thirdparty/OpenXLSX/Examples/Demo7.cpp +79 -0
  43. package/thirdparty/OpenXLSX/Examples/Demo8.cpp +117 -0
  44. package/thirdparty/OpenXLSX/Examples/Demo9.cpp +363 -0
  45. package/thirdparty/OpenXLSX/Examples/cmake/FindLIBZIP.cmake +61 -0
  46. package/thirdparty/OpenXLSX/Examples/external/CustomZip/CustomZip.hpp +256 -0
  47. package/thirdparty/OpenXLSX/LICENSE.md +29 -0
  48. package/thirdparty/OpenXLSX/Makefile.GNU +530 -0
  49. package/thirdparty/OpenXLSX/Notes/TBDs.txt +16 -0
  50. package/thirdparty/OpenXLSX/Notes/confirmed-TBCs.txt +8 -0
  51. package/thirdparty/OpenXLSX/Notes/styles-missing-support.xml +12 -0
  52. package/thirdparty/OpenXLSX/Notes/todo-list.txt +108 -0
  53. package/thirdparty/OpenXLSX/OpenXLSX/CMakeLists.txt +631 -0
  54. package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSX.hpp +63 -0
  55. package/thirdparty/OpenXLSX/OpenXLSX/OpenXLSXConfig.cmake +11 -0
  56. package/thirdparty/OpenXLSX/OpenXLSX/cmake/bundle_static_library.cmake +198 -0
  57. package/thirdparty/OpenXLSX/OpenXLSX/cmake/patch_pkg_config.cmake +69 -0
  58. package/thirdparty/OpenXLSX/OpenXLSX/headers/IZipArchive.hpp +361 -0
  59. package/thirdparty/OpenXLSX/OpenXLSX/headers/OpenXLSX-Exports.hpp +12 -0
  60. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCell.hpp +367 -0
  61. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellIterator.hpp +252 -0
  62. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellRange.hpp +223 -0
  63. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellReference.hpp +317 -0
  64. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCellValue.hpp +793 -0
  65. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColor.hpp +232 -0
  66. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLColumn.hpp +159 -0
  67. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLCommandQuery.hpp +228 -0
  68. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLComments.hpp +270 -0
  69. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLConstants.hpp +18 -0
  70. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLContentTypes.hpp +264 -0
  71. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDateTime.hpp +175 -0
  72. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDocument.hpp +505 -0
  73. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLDrawing.hpp +452 -0
  74. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLException.hpp +161 -0
  75. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLFormula.hpp +375 -0
  76. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLIterator.hpp +40 -0
  77. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLMergeCells.hpp +216 -0
  78. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLProperties.hpp +348 -0
  79. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRelationships.hpp +348 -0
  80. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRow.hpp +721 -0
  81. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLRowData.hpp +488 -0
  82. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSharedStrings.hpp +204 -0
  83. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLSheet.hpp +1640 -0
  84. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLStyles.hpp +2390 -0
  85. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLTables.hpp +132 -0
  86. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLWorkbook.hpp +404 -0
  87. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlData.hpp +283 -0
  88. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlFile.hpp +194 -0
  89. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParser.hpp +282 -0
  90. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLXmlParserForwardDeclarations.hpp +85 -0
  91. package/thirdparty/OpenXLSX/OpenXLSX/headers/XLZipArchive.hpp +232 -0
  92. package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/LibZip.hpp +447 -0
  93. package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/OpenXLSXFileSystemTools.hpp +207 -0
  94. package/thirdparty/OpenXLSX/OpenXLSX/headers/detail/Zippy.hpp +1375 -0
  95. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCell.cpp +340 -0
  96. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellIterator.cpp +427 -0
  97. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellRange.cpp +221 -0
  98. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellReference.cpp +408 -0
  99. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLCellValue.cpp +519 -0
  100. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColor.cpp +202 -0
  101. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLColumn.cpp +141 -0
  102. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLComments.cpp +637 -0
  103. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLContentTypes.cpp +329 -0
  104. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDateTime.cpp +269 -0
  105. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDocument.cpp +1678 -0
  106. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLDrawing.cpp +784 -0
  107. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLFormula.cpp +201 -0
  108. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLMergeCells.cpp +357 -0
  109. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLProperties.cpp +810 -0
  110. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRelationships.cpp +529 -0
  111. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRow.cpp +918 -0
  112. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLRowData.cpp +508 -0
  113. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSharedStrings.cpp +220 -0
  114. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLSheet.cpp +1970 -0
  115. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLStyles.cpp +3014 -0
  116. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLTables.cpp +125 -0
  117. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLWorkbook.cpp +784 -0
  118. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlData.cpp +247 -0
  119. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlFile.cpp +160 -0
  120. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLXmlParser.cpp +261 -0
  121. package/thirdparty/OpenXLSX/OpenXLSX/sources/XLZipArchive.cpp +266 -0
  122. package/thirdparty/OpenXLSX/OpenXLSX/sources/utilities/XLUtilities.hpp +478 -0
  123. package/thirdparty/OpenXLSX/README.md +1279 -0
  124. package/thirdparty/OpenXLSX/Scripts/cmake-cleanup.sh +102 -0
  125. package/thirdparty/OpenXLSX/Scripts/compile.sh +23 -0
  126. package/thirdparty/OpenXLSX/Scripts/demos-cleanup.sh +25 -0
  127. package/thirdparty/OpenXLSX/Scripts/demos-run-all.sh +60 -0
  128. package/thirdparty/OpenXLSX/Scripts/guarded-xml-format.sh +47 -0
  129. package/thirdparty/OpenXLSX/Scripts/make-gnu.sh +11 -0
  130. package/thirdparty/OpenXLSX/Scripts/uninstall-manifest.sh +48 -0
  131. package/thirdparty/OpenXLSX/Scripts/xml-format-all.sh +19 -0
  132. package/thirdparty/OpenXLSX/Scripts/xml-format.sh +38 -0
  133. package/thirdparty/OpenXLSX/Tests/CMakeLists.txt +37 -0
  134. package/thirdparty/OpenXLSX/Tests/catch/catch.hpp +17799 -0
  135. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_automake.hpp +68 -0
  136. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_sonarqube.hpp +182 -0
  137. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_tap.hpp +278 -0
  138. package/thirdparty/OpenXLSX/Tests/catch/catch_reporter_teamcity.hpp +212 -0
  139. package/thirdparty/OpenXLSX/Tests/main.cpp +55 -0
  140. package/thirdparty/OpenXLSX/Tests/testXLCell.cpp +176 -0
  141. package/thirdparty/OpenXLSX/Tests/testXLCellRange.cpp +180 -0
  142. package/thirdparty/OpenXLSX/Tests/testXLCellReference.cpp +160 -0
  143. package/thirdparty/OpenXLSX/Tests/testXLCellValue.cpp +366 -0
  144. package/thirdparty/OpenXLSX/Tests/testXLCellValueProxy.cpp +255 -0
  145. package/thirdparty/OpenXLSX/Tests/testXLColor.cpp +75 -0
  146. package/thirdparty/OpenXLSX/Tests/testXLDateTime.cpp +229 -0
  147. package/thirdparty/OpenXLSX/Tests/testXLDocument.cpp +197 -0
  148. package/thirdparty/OpenXLSX/Tests/testXLFormula.cpp +131 -0
  149. package/thirdparty/OpenXLSX/Tests/testXLRow.cpp +597 -0
  150. package/thirdparty/OpenXLSX/Tests/testXLSheet.cpp +77 -0
  151. package/thirdparty/OpenXLSX/Tests/ziptest-with-libs.cpp +88 -0
  152. package/thirdparty/OpenXLSX/Tests/ziptest.cpp +735 -0
  153. package/thirdparty/OpenXLSX/cmake/get-git-HEAD-ID.cmake +45 -0
  154. package/thirdparty/OpenXLSX/cmake/libopenxlsxCPackOptions.cmake.in +20 -0
  155. package/thirdparty/OpenXLSX/cmake/manage_dependency.cmake +813 -0
  156. package/thirdparty/OpenXLSX/cmake/recursive_library_type_test.cmake +52 -0
  157. package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-shared.hpp +42 -0
  158. package/thirdparty/OpenXLSX/gnu-make-crutch/OpenXLSX-Exports-static.hpp +42 -0
  159. package/thirdparty/OpenXLSX/vcpkg.json +24 -0
  160. package/thirdparty/README.md +42 -0
  161. package/thirdparty/miniz/.clang-format +47 -0
  162. package/thirdparty/miniz/.travis.yml +2 -0
  163. package/thirdparty/miniz/CMakeLists.txt +333 -0
  164. package/thirdparty/miniz/CMakePresets.json +31 -0
  165. package/thirdparty/miniz/ChangeLog.md +272 -0
  166. package/thirdparty/miniz/Config.cmake.in +1 -0
  167. package/thirdparty/miniz/LICENSE +22 -0
  168. package/thirdparty/miniz/amalgamate.sh +57 -0
  169. package/thirdparty/miniz/examples/example1.c +105 -0
  170. package/thirdparty/miniz/examples/example2.c +164 -0
  171. package/thirdparty/miniz/examples/example3.c +269 -0
  172. package/thirdparty/miniz/examples/example4.c +102 -0
  173. package/thirdparty/miniz/examples/example5.c +327 -0
  174. package/thirdparty/miniz/examples/example6.c +189 -0
  175. package/thirdparty/miniz/meson.build +21 -0
  176. package/thirdparty/miniz/miniz.c +646 -0
  177. package/thirdparty/miniz/miniz.h +615 -0
  178. package/thirdparty/miniz/miniz.pc.in +13 -0
  179. package/thirdparty/miniz/miniz_common.h +89 -0
  180. package/thirdparty/miniz/miniz_export.h +20 -0
  181. package/thirdparty/miniz/miniz_tdef.c +1602 -0
  182. package/thirdparty/miniz/miniz_tdef.h +199 -0
  183. package/thirdparty/miniz/miniz_tinfl.c +778 -0
  184. package/thirdparty/miniz/miniz_tinfl.h +150 -0
  185. package/thirdparty/miniz/miniz_zip.c +4895 -0
  186. package/thirdparty/miniz/miniz_zip.h +454 -0
  187. package/thirdparty/miniz/readme.md +46 -0
  188. package/thirdparty/miniz/test.sh +36 -0
  189. package/thirdparty/miniz/tests/add_in_place_fuzzer.c +87 -0
  190. package/thirdparty/miniz/tests/catch_amalgamated.cpp +10795 -0
  191. package/thirdparty/miniz/tests/catch_amalgamated.hpp +13143 -0
  192. package/thirdparty/miniz/tests/checksum_fuzzer.c +26 -0
  193. package/thirdparty/miniz/tests/compress_fuzzer.c +91 -0
  194. package/thirdparty/miniz/tests/flush_fuzzer.c +88 -0
  195. package/thirdparty/miniz/tests/fuzz_main.c +55 -0
  196. package/thirdparty/miniz/tests/large_fuzzer.c +133 -0
  197. package/thirdparty/miniz/tests/main.cpp +185 -0
  198. package/thirdparty/miniz/tests/miniz_tdefl_fuzzer.cc +115 -0
  199. package/thirdparty/miniz/tests/miniz_tester.cpp +1881 -0
  200. package/thirdparty/miniz/tests/miniz_zip_validate_fuzzer.cc +71 -0
  201. package/thirdparty/miniz/tests/miniz_zip_writer_fuzzer.cc +96 -0
  202. package/thirdparty/miniz/tests/ossfuzz.sh +48 -0
  203. package/thirdparty/miniz/tests/small_fuzzer.c +126 -0
  204. package/thirdparty/miniz/tests/timer.cpp +152 -0
  205. package/thirdparty/miniz/tests/timer.h +40 -0
  206. package/thirdparty/miniz/tests/uncompress2_fuzzer.c +21 -0
  207. package/thirdparty/miniz/tests/uncompress_fuzzer.c +30 -0
  208. package/thirdparty/miniz/tests/zip.dict +9 -0
  209. package/thirdparty/miniz/tests/zip_fuzzer.c +63 -0
  210. package/thirdparty/pugixml/.codecov.yml +7 -0
  211. package/thirdparty/pugixml/.gitattributes +1 -0
  212. package/thirdparty/pugixml/CMakeLists.txt +330 -0
  213. package/thirdparty/pugixml/LICENSE.md +24 -0
  214. package/thirdparty/pugixml/Makefile +98 -0
  215. package/thirdparty/pugixml/README.md +81 -0
  216. package/thirdparty/pugixml/SECURITY.md +9 -0
  217. package/thirdparty/pugixml/appveyor.yml +50 -0
  218. package/thirdparty/pugixml/docs/config.adoc +7 -0
  219. package/thirdparty/pugixml/docs/images/dom_tree.png +0 -0
  220. package/thirdparty/pugixml/docs/images/vs2005_link1.png +0 -0
  221. package/thirdparty/pugixml/docs/images/vs2005_link2.png +0 -0
  222. package/thirdparty/pugixml/docs/images/vs2005_pch1.png +0 -0
  223. package/thirdparty/pugixml/docs/images/vs2005_pch2.png +0 -0
  224. package/thirdparty/pugixml/docs/images/vs2005_pch3.png +0 -0
  225. package/thirdparty/pugixml/docs/images/vs2005_pch4.png +0 -0
  226. package/thirdparty/pugixml/docs/images/vs2010_link1.png +0 -0
  227. package/thirdparty/pugixml/docs/images/vs2010_link2.png +0 -0
  228. package/thirdparty/pugixml/docs/manual.adoc +3326 -0
  229. package/thirdparty/pugixml/docs/manual.html +6395 -0
  230. package/thirdparty/pugixml/docs/quickstart.adoc +287 -0
  231. package/thirdparty/pugixml/docs/quickstart.html +1107 -0
  232. package/thirdparty/pugixml/docs/samples/character.xml +8 -0
  233. package/thirdparty/pugixml/docs/samples/custom_memory_management.cpp +27 -0
  234. package/thirdparty/pugixml/docs/samples/include.cpp +64 -0
  235. package/thirdparty/pugixml/docs/samples/load_error_handling.cpp +33 -0
  236. package/thirdparty/pugixml/docs/samples/load_file.cpp +16 -0
  237. package/thirdparty/pugixml/docs/samples/load_memory.cpp +66 -0
  238. package/thirdparty/pugixml/docs/samples/load_options.cpp +30 -0
  239. package/thirdparty/pugixml/docs/samples/load_stream.cpp +97 -0
  240. package/thirdparty/pugixml/docs/samples/modify_add.cpp +29 -0
  241. package/thirdparty/pugixml/docs/samples/modify_base.cpp +43 -0
  242. package/thirdparty/pugixml/docs/samples/modify_remove.cpp +27 -0
  243. package/thirdparty/pugixml/docs/samples/save_custom_writer.cpp +116 -0
  244. package/thirdparty/pugixml/docs/samples/save_declaration.cpp +27 -0
  245. package/thirdparty/pugixml/docs/samples/save_file.cpp +17 -0
  246. package/thirdparty/pugixml/docs/samples/save_options.cpp +48 -0
  247. package/thirdparty/pugixml/docs/samples/save_stream.cpp +18 -0
  248. package/thirdparty/pugixml/docs/samples/save_subtree.cpp +26 -0
  249. package/thirdparty/pugixml/docs/samples/text.cpp +35 -0
  250. package/thirdparty/pugixml/docs/samples/transitions.xml +7 -0
  251. package/thirdparty/pugixml/docs/samples/traverse_base.cpp +51 -0
  252. package/thirdparty/pugixml/docs/samples/traverse_iter.cpp +27 -0
  253. package/thirdparty/pugixml/docs/samples/traverse_predicate.cpp +48 -0
  254. package/thirdparty/pugixml/docs/samples/traverse_rangefor.cpp +32 -0
  255. package/thirdparty/pugixml/docs/samples/traverse_walker.cpp +35 -0
  256. package/thirdparty/pugixml/docs/samples/tree.xml +12 -0
  257. package/thirdparty/pugixml/docs/samples/weekly-shift_jis.xml +78 -0
  258. package/thirdparty/pugixml/docs/samples/weekly-utf-16.xml +0 -0
  259. package/thirdparty/pugixml/docs/samples/weekly-utf-8.xml +78 -0
  260. package/thirdparty/pugixml/docs/samples/xgconsole.xml +12 -0
  261. package/thirdparty/pugixml/docs/samples/xpath_error.cpp +43 -0
  262. package/thirdparty/pugixml/docs/samples/xpath_query.cpp +36 -0
  263. package/thirdparty/pugixml/docs/samples/xpath_select.cpp +28 -0
  264. package/thirdparty/pugixml/docs/samples/xpath_variables.cpp +38 -0
  265. package/thirdparty/pugixml/readme.txt +50 -0
  266. package/thirdparty/pugixml/scripts/archive.py +54 -0
  267. package/thirdparty/pugixml/scripts/cocoapods_push.sh +4 -0
  268. package/thirdparty/pugixml/scripts/natvis/pugixml.natvis +77 -0
  269. package/thirdparty/pugixml/scripts/natvis/pugixml_compact.natvis +506 -0
  270. package/thirdparty/pugixml/scripts/nuget/build/native/pugixml-propertiesui.xml +17 -0
  271. package/thirdparty/pugixml/scripts/nuget/build/native/pugixml.targets +28 -0
  272. package/thirdparty/pugixml/scripts/nuget/pugixml.nuspec +20 -0
  273. package/thirdparty/pugixml/scripts/nuget_build.ps1 +60 -0
  274. package/thirdparty/pugixml/scripts/premake4.lua +92 -0
  275. package/thirdparty/pugixml/scripts/pugixml-config.cmake.in +12 -0
  276. package/thirdparty/pugixml/scripts/pugixml.pc.in +11 -0
  277. package/thirdparty/pugixml/scripts/pugixml.podspec +14 -0
  278. package/thirdparty/pugixml/scripts/pugixml.xcodeproj/project.pbxproj +212 -0
  279. package/thirdparty/pugixml/scripts/pugixml_airplay.mkf +13 -0
  280. package/thirdparty/pugixml/scripts/pugixml_codeblocks.cbp +44 -0
  281. package/thirdparty/pugixml/scripts/pugixml_codelite.project +56 -0
  282. package/thirdparty/pugixml/scripts/pugixml_dll.rc +45 -0
  283. package/thirdparty/pugixml/scripts/pugixml_vs2005.vcproj +343 -0
  284. package/thirdparty/pugixml/scripts/pugixml_vs2005_static.vcproj +343 -0
  285. package/thirdparty/pugixml/scripts/pugixml_vs2008.vcproj +339 -0
  286. package/thirdparty/pugixml/scripts/pugixml_vs2008_static.vcproj +339 -0
  287. package/thirdparty/pugixml/scripts/pugixml_vs2010.vcxproj +191 -0
  288. package/thirdparty/pugixml/scripts/pugixml_vs2010_static.vcxproj +191 -0
  289. package/thirdparty/pugixml/scripts/pugixml_vs2013.vcxproj +199 -0
  290. package/thirdparty/pugixml/scripts/pugixml_vs2013_static.vcxproj +199 -0
  291. package/thirdparty/pugixml/scripts/pugixml_vs2015.vcxproj +172 -0
  292. package/thirdparty/pugixml/scripts/pugixml_vs2015_static.vcxproj +176 -0
  293. package/thirdparty/pugixml/scripts/pugixml_vs2017.vcxproj +172 -0
  294. package/thirdparty/pugixml/scripts/pugixml_vs2017_static.vcxproj +176 -0
  295. package/thirdparty/pugixml/scripts/pugixml_vs2019.vcxproj +176 -0
  296. package/thirdparty/pugixml/scripts/pugixml_vs2019_static.vcxproj +180 -0
  297. package/thirdparty/pugixml/scripts/pugixml_vs2022.vcxproj +176 -0
  298. package/thirdparty/pugixml/scripts/pugixml_vs2022_static.vcxproj +180 -0
  299. package/thirdparty/pugixml/scripts/pugixml_vs2026.vcxproj +176 -0
  300. package/thirdparty/pugixml/scripts/pugixml_vs2026_static.vcxproj +180 -0
  301. package/thirdparty/pugixml/scripts/sbom.cdx.json +47 -0
  302. package/thirdparty/pugixml/src/pugiconfig.hpp +81 -0
  303. package/thirdparty/pugixml/src/pugixml.cpp +13776 -0
  304. package/thirdparty/pugixml/src/pugixml.hpp +1604 -0
  305. package/thirdparty/pugixml/tests/allocator.cpp +175 -0
  306. package/thirdparty/pugixml/tests/allocator.hpp +10 -0
  307. package/thirdparty/pugixml/tests/autotest-appveyor.ps1 +93 -0
  308. package/thirdparty/pugixml/tests/cmake-appveyor.ps1 +57 -0
  309. package/thirdparty/pugixml/tests/data/empty.xml +0 -0
  310. package/thirdparty/pugixml/tests/data/large.xml +1 -0
  311. package/thirdparty/pugixml/tests/data/latintest_latin1.xml +1 -0
  312. package/thirdparty/pugixml/tests/data/latintest_utf8.xml +1 -0
  313. package/thirdparty/pugixml/tests/data/multiline.xml +3 -0
  314. package/thirdparty/pugixml/tests/data/small.xml +1 -0
  315. package/thirdparty/pugixml/tests/data/truncation.xml +19 -0
  316. package/thirdparty/pugixml/tests/data/utftest_utf16_be.xml +0 -0
  317. package/thirdparty/pugixml/tests/data/utftest_utf16_be_bom.xml +0 -0
  318. package/thirdparty/pugixml/tests/data/utftest_utf16_be_clean.xml +0 -0
  319. package/thirdparty/pugixml/tests/data/utftest_utf16_be_nodecl.xml +0 -0
  320. package/thirdparty/pugixml/tests/data/utftest_utf16_le.xml +0 -0
  321. package/thirdparty/pugixml/tests/data/utftest_utf16_le_bom.xml +0 -0
  322. package/thirdparty/pugixml/tests/data/utftest_utf16_le_clean.xml +0 -0
  323. package/thirdparty/pugixml/tests/data/utftest_utf16_le_nodecl.xml +0 -0
  324. package/thirdparty/pugixml/tests/data/utftest_utf32_be.xml +0 -0
  325. package/thirdparty/pugixml/tests/data/utftest_utf32_be_bom.xml +0 -0
  326. package/thirdparty/pugixml/tests/data/utftest_utf32_be_clean.xml +0 -0
  327. package/thirdparty/pugixml/tests/data/utftest_utf32_be_nodecl.xml +0 -0
  328. package/thirdparty/pugixml/tests/data/utftest_utf32_le.xml +0 -0
  329. package/thirdparty/pugixml/tests/data/utftest_utf32_le_bom.xml +0 -0
  330. package/thirdparty/pugixml/tests/data/utftest_utf32_le_clean.xml +0 -0
  331. package/thirdparty/pugixml/tests/data/utftest_utf32_le_nodecl.xml +0 -0
  332. package/thirdparty/pugixml/tests/data/utftest_utf8.xml +87 -0
  333. package/thirdparty/pugixml/tests/data/utftest_utf8_bom.xml +87 -0
  334. package/thirdparty/pugixml/tests/data/utftest_utf8_clean.xml +84 -0
  335. package/thirdparty/pugixml/tests/data/utftest_utf8_nodecl.xml +86 -0
  336. package/thirdparty/pugixml/tests/data//321/202/320/265/321/201/321/202.xml +1 -0
  337. package/thirdparty/pugixml/tests/data_fuzz_parse/basic.xml +1 -0
  338. package/thirdparty/pugixml/tests/data_fuzz_parse/doctype.xml +1 -0
  339. package/thirdparty/pugixml/tests/data_fuzz_parse/refs.xml +1 -0
  340. package/thirdparty/pugixml/tests/data_fuzz_parse/types.xml +1 -0
  341. package/thirdparty/pugixml/tests/data_fuzz_parse/utf16.xml +0 -0
  342. package/thirdparty/pugixml/tests/data_fuzz_parse/utf32.xml +0 -0
  343. package/thirdparty/pugixml/tests/data_fuzz_xpath/basic.xpath +1 -0
  344. package/thirdparty/pugixml/tests/data_fuzz_xpath/functions.xpath +1 -0
  345. package/thirdparty/pugixml/tests/data_fuzz_xpath/math.xpath +1 -0
  346. package/thirdparty/pugixml/tests/data_fuzz_xpath/path.xpath +1 -0
  347. package/thirdparty/pugixml/tests/data_fuzz_xpath/predicate.xpath +1 -0
  348. package/thirdparty/pugixml/tests/fuzz_parse.cpp +14 -0
  349. package/thirdparty/pugixml/tests/fuzz_parse.dict +72 -0
  350. package/thirdparty/pugixml/tests/fuzz_setup.sh +11 -0
  351. package/thirdparty/pugixml/tests/fuzz_xpath.cpp +46 -0
  352. package/thirdparty/pugixml/tests/fuzz_xpath.dict +72 -0
  353. package/thirdparty/pugixml/tests/helpers.hpp +114 -0
  354. package/thirdparty/pugixml/tests/main.cpp +218 -0
  355. package/thirdparty/pugixml/tests/test.cpp +220 -0
  356. package/thirdparty/pugixml/tests/test.hpp +175 -0
  357. package/thirdparty/pugixml/tests/test_compact.cpp +150 -0
  358. package/thirdparty/pugixml/tests/test_deprecated.cpp +25 -0
  359. package/thirdparty/pugixml/tests/test_document.cpp +1910 -0
  360. package/thirdparty/pugixml/tests/test_dom_modify.cpp +2122 -0
  361. package/thirdparty/pugixml/tests/test_dom_text.cpp +601 -0
  362. package/thirdparty/pugixml/tests/test_dom_traverse.cpp +1481 -0
  363. package/thirdparty/pugixml/tests/test_header_guard.cpp +3 -0
  364. package/thirdparty/pugixml/tests/test_header_iosfwd_1.cpp +3 -0
  365. package/thirdparty/pugixml/tests/test_header_iosfwd_2.cpp +3 -0
  366. package/thirdparty/pugixml/tests/test_header_iostream_1.cpp +3 -0
  367. package/thirdparty/pugixml/tests/test_header_iostream_2.cpp +3 -0
  368. package/thirdparty/pugixml/tests/test_header_only_1.cpp +21 -0
  369. package/thirdparty/pugixml/tests/test_header_only_2.cpp +21 -0
  370. package/thirdparty/pugixml/tests/test_header_string_1.cpp +3 -0
  371. package/thirdparty/pugixml/tests/test_header_string_2.cpp +3 -0
  372. package/thirdparty/pugixml/tests/test_header_string_iostream.cpp +5 -0
  373. package/thirdparty/pugixml/tests/test_memory.cpp +303 -0
  374. package/thirdparty/pugixml/tests/test_parse.cpp +1463 -0
  375. package/thirdparty/pugixml/tests/test_parse_doctype.cpp +366 -0
  376. package/thirdparty/pugixml/tests/test_unicode.cpp +152 -0
  377. package/thirdparty/pugixml/tests/test_version.cpp +5 -0
  378. package/thirdparty/pugixml/tests/test_write.cpp +757 -0
  379. package/thirdparty/pugixml/tests/test_xpath.cpp +833 -0
  380. package/thirdparty/pugixml/tests/test_xpath_api.cpp +646 -0
  381. package/thirdparty/pugixml/tests/test_xpath_functions.cpp +844 -0
  382. package/thirdparty/pugixml/tests/test_xpath_operators.cpp +566 -0
  383. package/thirdparty/pugixml/tests/test_xpath_parse.cpp +428 -0
  384. package/thirdparty/pugixml/tests/test_xpath_paths.cpp +787 -0
  385. package/thirdparty/pugixml/tests/test_xpath_paths_abbrev_w3c.cpp +219 -0
  386. package/thirdparty/pugixml/tests/test_xpath_paths_w3c.cpp +312 -0
  387. package/thirdparty/pugixml/tests/test_xpath_variables.cpp +683 -0
  388. package/thirdparty/pugixml/tests/test_xpath_xalan_1.cpp +411 -0
  389. package/thirdparty/pugixml/tests/test_xpath_xalan_2.cpp +417 -0
  390. package/thirdparty/pugixml/tests/test_xpath_xalan_3.cpp +321 -0
  391. package/thirdparty/pugixml/tests/test_xpath_xalan_4.cpp +300 -0
  392. package/thirdparty/pugixml/tests/test_xpath_xalan_5.cpp +295 -0
  393. package/thirdparty/pugixml/tests/writer_string.cpp +79 -0
  394. package/thirdparty/pugixml/tests/writer_string.hpp +27 -0
  395. 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