xmp_toolkit_ruby 0.0.2

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 (183) hide show
  1. checksums.yaml +7 -0
  2. data/.idea/.gitignore +8 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +88 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/AGENTS.md +72 -0
  8. data/CHANGELOG.md +45 -0
  9. data/LICENSE.txt +21 -0
  10. data/README.md +287 -0
  11. data/Rakefile +25 -0
  12. data/cliff.toml +138 -0
  13. data/docker/Dockerfile +87 -0
  14. data/docker/ProductConfig.cmake.patch +11 -0
  15. data/docker/ToolchainGCC.cmake.patch +11 -0
  16. data/exe/xmp_toolkit_ruby +8 -0
  17. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/LICENSE +31 -0
  18. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/build/XMP_BuildInfo.h +17 -0
  19. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/TXMPFiles.hpp +853 -0
  20. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/TXMPIterator.hpp +234 -0
  21. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/TXMPMeta.hpp +1753 -0
  22. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/TXMPUtils.hpp +967 -0
  23. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP.hpp +98 -0
  24. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP.incl_cpp +69 -0
  25. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/BaseInterfaces/IConfigurable.h +225 -0
  26. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/BaseInterfaces/ISharedObject.h +71 -0
  27. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/BaseInterfaces/IThreadSafe.h +76 -0
  28. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/BaseInterfaces/IVersionable.h +71 -0
  29. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IConfigurationManager.h +167 -0
  30. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IError.h +377 -0
  31. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IErrorNotifier.h +52 -0
  32. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IMemoryAllocator.h +65 -0
  33. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IObjectFactory.h +90 -0
  34. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Interfaces/IUTF8String.h +504 -0
  35. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Utilities/TWrapperFunctions.h +252 -0
  36. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/Utilities/TWrapperFunctions2.h +564 -0
  37. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/XMPCommonDefines.h +194 -0
  38. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/XMPCommonErrorCodes.h +114 -0
  39. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/XMPCommonFwdDeclarations.h +158 -0
  40. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/XMPCommonLatestInterfaceVersions.h +51 -0
  41. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/source/IConfigurable.cpp +204 -0
  42. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/source/IConfigurationManager.cpp +92 -0
  43. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/source/IError.cpp +207 -0
  44. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/source/IErrorNotifier.cpp +26 -0
  45. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCommon/source/IUTF8String.cpp +299 -0
  46. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IArrayNode.h +303 -0
  47. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IClientDOMParser.h +88 -0
  48. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IClientDOMSerializer.h +94 -0
  49. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/ICompositeNode.h +331 -0
  50. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/ICoreConfigurationManager.h +107 -0
  51. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/ICoreObjectFactory.h +279 -0
  52. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IDOMImplementationRegistry.h +150 -0
  53. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IDOMParser.h +181 -0
  54. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IDOMSerializer.h +120 -0
  55. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IMetadata.h +145 -0
  56. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IMetadataConverterUtils.h +116 -0
  57. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/INameSpacePrefixMap.h +236 -0
  58. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/INode.h +582 -0
  59. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/INodeIterator.h +193 -0
  60. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IPath.h +212 -0
  61. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IPathSegment.h +225 -0
  62. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/ISimpleNode.h +150 -0
  63. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/Interfaces/IStructureNode.h +306 -0
  64. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/XMPCoreDefines.h +94 -0
  65. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/XMPCoreErrorCodes.h +116 -0
  66. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/XMPCoreFwdDeclarations.h +325 -0
  67. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/XMPCoreLatestInterfaceVersions.h +97 -0
  68. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IArrayNode.cpp +163 -0
  69. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IClientDOMParser.cpp +76 -0
  70. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IClientDOMSerializer.cpp +73 -0
  71. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/ICompositeNode.cpp +121 -0
  72. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/ICoreConfigurationManager.cpp +88 -0
  73. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/ICoreObjectFactory.cpp +83 -0
  74. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IDOMImplementationRegistry.cpp +122 -0
  75. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IDOMParser.cpp +116 -0
  76. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IDOMSerializer.cpp +109 -0
  77. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IMetadata.cpp +113 -0
  78. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IMetadataConverterUtils.cpp +92 -0
  79. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/INameSpacePrefixMap.cpp +187 -0
  80. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/INode.cpp +377 -0
  81. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/INodeIterator.cpp +105 -0
  82. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IPath.cpp +157 -0
  83. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IPathSegment.cpp +146 -0
  84. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/ISimpleNode.cpp +111 -0
  85. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMPCore/source/IStructureNode.cpp +104 -0
  86. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP_Const.h +1590 -0
  87. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP_Environment.h +223 -0
  88. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP_IO.hpp +169 -0
  89. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/XMP_Version.h +52 -0
  90. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/TXMPFiles.incl_cpp +484 -0
  91. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/TXMPIterator.incl_cpp +223 -0
  92. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/TXMPMeta.incl_cpp +917 -0
  93. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/TXMPUtils.incl_cpp +445 -0
  94. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/WXMPFiles.hpp +281 -0
  95. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/WXMPIterator.hpp +74 -0
  96. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/WXMPMeta.hpp +635 -0
  97. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/WXMPUtils.hpp +314 -0
  98. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/include/client-glue/WXMP_Common.hpp +132 -0
  99. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/i80386linux_x64/debug/libXMPCore.so +0 -0
  100. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/i80386linux_x64/debug/libXMPCoreStatic.a +0 -0
  101. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/i80386linux_x64/debug/libXMPFiles.so +0 -0
  102. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/i80386linux_x64/debug/libXMPFilesStatic.a +0 -0
  103. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/macintosh/universal/Debug/libXMPCoreStatic.a +0 -0
  104. data/ext/xmp_toolkit_ruby/XMP-Toolkit-SDK/public/libraries/macintosh/universal/Debug/libXMPFilesStatic.a +0 -0
  105. data/ext/xmp_toolkit_ruby/extconf.rb +101 -0
  106. data/ext/xmp_toolkit_ruby/xmp_toolkit.cpp +321 -0
  107. data/ext/xmp_toolkit_ruby/xmp_toolkit.hpp +69 -0
  108. data/ext/xmp_toolkit_ruby/xmp_toolkit_ruby.cpp +44 -0
  109. data/lib/xmp_toolkit_ruby/cli.rb +95 -0
  110. data/lib/xmp_toolkit_ruby/namespaces.rb +77 -0
  111. data/lib/xmp_toolkit_ruby/plugins/LICENSE +31 -0
  112. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux/PDF_Handler.resources/MODULE_IDENTIFIER.txt +1 -0
  113. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux/PDF_Handler.resources/XMPPLUGINUIDS.txt +31 -0
  114. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux/PDF_Handler.xpi +0 -0
  115. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux/libMiniPDFL.so +0 -0
  116. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux_x64/PDF_Handler.resources/MODULE_IDENTIFIER.txt +1 -0
  117. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux_x64/PDF_Handler.resources/XMPPLUGINUIDS.txt +31 -0
  118. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux_x64/PDF_Handler.xpi +0 -0
  119. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/i80386linux/i80386linux_x64/libMiniPDFL.so +0 -0
  120. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/PDF_Handler +0 -0
  121. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/Info.plist +52 -0
  122. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MODULE_IDENTIFIER.txt +1 -0
  123. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/MiniPDFL +0 -0
  124. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Resources/English.lproj/InfoPlist.strings +0 -0
  125. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Resources/Info.plist +35 -0
  126. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/A/MiniPDFL +0 -0
  127. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings +0 -0
  128. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/A/Resources/Info.plist +35 -0
  129. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/A/_CodeSignature/CodeResources +146 -0
  130. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/Current/MiniPDFL +0 -0
  131. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings +0 -0
  132. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/Current/Resources/Info.plist +35 -0
  133. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/MiniPDFL.framework/Versions/Current/_CodeSignature/CodeResources +146 -0
  134. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Resources/XMPPLUGINUIDS.txt +31 -0
  135. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/PDF_Handler +0 -0
  136. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/Info.plist +52 -0
  137. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MODULE_IDENTIFIER.txt +1 -0
  138. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/MiniPDFL +0 -0
  139. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Resources/English.lproj/InfoPlist.strings +0 -0
  140. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Resources/Info.plist +35 -0
  141. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/A/MiniPDFL +0 -0
  142. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings +0 -0
  143. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/A/Resources/Info.plist +35 -0
  144. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/A/_CodeSignature/CodeResources +146 -0
  145. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/Current/MiniPDFL +0 -0
  146. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings +0 -0
  147. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/Current/Resources/Info.plist +35 -0
  148. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/MiniPDFL.framework/Versions/Current/_CodeSignature/CodeResources +146 -0
  149. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/Resources/XMPPLUGINUIDS.txt +31 -0
  150. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/A/_CodeSignature/CodeResources +216 -0
  151. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/PDF_Handler +0 -0
  152. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/Info.plist +52 -0
  153. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MODULE_IDENTIFIER.txt +1 -0
  154. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/MiniPDFL +0 -0
  155. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Resources/English.lproj/InfoPlist.strings +0 -0
  156. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Resources/Info.plist +35 -0
  157. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/A/MiniPDFL +0 -0
  158. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/A/Resources/English.lproj/InfoPlist.strings +0 -0
  159. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/A/Resources/Info.plist +35 -0
  160. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/A/_CodeSignature/CodeResources +146 -0
  161. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/Current/MiniPDFL +0 -0
  162. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/Current/Resources/English.lproj/InfoPlist.strings +0 -0
  163. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/Current/Resources/Info.plist +35 -0
  164. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/MiniPDFL.framework/Versions/Current/_CodeSignature/CodeResources +146 -0
  165. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/Resources/XMPPLUGINUIDS.txt +31 -0
  166. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/macintosh/universal/PDF_Handler.xpi/Versions/Current/_CodeSignature/CodeResources +216 -0
  167. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/linux/PDF_Handler.exp +11 -0
  168. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/mac/PDF_Handler.exp +2 -0
  169. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/mac/PDF_Handler.plist +28 -0
  170. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/mac/PDF_HandlerPList.h +12 -0
  171. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/win/CopyPDFL.bat +14 -0
  172. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/win/PDF_Handler-32.rc +8 -0
  173. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/win/PDF_Handler-64.rc +8 -0
  174. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/resource/win/PDF_Handler.def +9 -0
  175. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/windows/windows_x64/MiniPDFL.dll +0 -0
  176. data/lib/xmp_toolkit_ruby/plugins/PDF_Handler/windows/windows_x64/PDF_Handler.xpi +0 -0
  177. data/lib/xmp_toolkit_ruby/version.rb +5 -0
  178. data/lib/xmp_toolkit_ruby/xmp_file_format.rb +87 -0
  179. data/lib/xmp_toolkit_ruby/xmp_file_handler_flags.rb +49 -0
  180. data/lib/xmp_toolkit_ruby.rb +237 -0
  181. data/sig/xmp_toolkit_ruby.rbs +4 -0
  182. data/tasks/changelog.rake +29 -0
  183. metadata +357 -0
@@ -0,0 +1,321 @@
1
+ #include "xmp_toolkit.hpp"
2
+
3
+
4
+
5
+ bool xmp_meta_error_callback(
6
+ void * clientContext,
7
+ XMP_ErrorSeverity severity,
8
+ XMP_Int32 cause,
9
+ XMP_StringPtr message
10
+ ) {
11
+ const char * sevStr = (severity == kXMPErrSev_Recoverable) ? "RECOVERABLE"
12
+ : (severity == kXMPErrSev_OperationFatal) ? "FATAL OPERATION"
13
+ : (severity == kXMPErrSev_FileFatal) ? "FATAL FILE"
14
+ : (severity == kXMPErrSev_ProcessFatal) ? "FATAL PROCESS"
15
+ : "UNKNOWN";
16
+ std::cerr << "[TXMPMeta " << sevStr << "] "
17
+ << "Code=0x" << std::hex << cause << std::dec
18
+ << " Msg=\"" << (message ? message : "(no detail)") << "\"\n";
19
+
20
+ // If it's a recoverable error, return true so XMP can try to continue;
21
+ // otherwise return false to force an exception back to the caller.
22
+ return (severity == kXMPErrSev_Recoverable);
23
+ }
24
+
25
+ bool xmp_file_error_callback(
26
+ void * clientContext,
27
+ XMP_StringPtr filePath,
28
+ XMP_ErrorSeverity severity,
29
+ XMP_Int32 cause,
30
+ XMP_StringPtr message){
31
+
32
+ const char * sevStr = (severity == kXMPErrSev_Recoverable) ? "RECOVERABLE"
33
+ : (severity == kXMPErrSev_OperationFatal) ? "FATAL OPERATION"
34
+ : (severity == kXMPErrSev_FileFatal) ? "FATAL FILE"
35
+ : (severity == kXMPErrSev_ProcessFatal) ? "FATAL PROCESS"
36
+ : "UNKNOWN";
37
+
38
+ std::cerr << "[TXMPFiles " << sevStr << "] "
39
+ << "file=\"" << (filePath ? filePath : "(null)") << "\" "
40
+ << "cause=0x" << std::hex << cause << std::dec << "\n"
41
+ << " msg=\"" << (message ? message : "(no detail)") << "\"\n";
42
+
43
+ // Only attempt recovery if the error is marked recoverable
44
+ return (severity == kXMPErrSev_Recoverable);
45
+ }
46
+
47
+ VALUE write_xmp_to_file(int argc, VALUE* argv, VALUE self){
48
+ VALUE rb_filename, rb_xmp_data, rb_mode_sym;
49
+ XMP_OptionBits templateFlags = 0;
50
+
51
+ rb_scan_args(argc, argv, "3", &rb_filename, &rb_xmp_data, &rb_mode_sym);
52
+
53
+ Check_Type(rb_filename, T_STRING);
54
+ const char* xmpString = NULL;
55
+ if (!NIL_P(rb_xmp_data)) {
56
+ Check_Type(rb_xmp_data, T_STRING);
57
+ xmpString = StringValueCStr(rb_xmp_data);
58
+ }
59
+
60
+ const char* mode_cstr;
61
+ if (RB_TYPE_P(rb_mode_sym, T_SYMBOL)) {
62
+ // Convert symbol to string first
63
+ VALUE mode_str = rb_sym_to_s(rb_mode_sym);
64
+ mode_cstr = StringValueCStr(mode_str);
65
+ } else {
66
+ // Already a string
67
+ mode_cstr = StringValueCStr(rb_mode_sym);
68
+ }
69
+ bool override;
70
+
71
+ if (strcmp(mode_cstr, "upsert") == 0) {
72
+ templateFlags = kXMPTemplate_AddNewProperties
73
+ | kXMPTemplate_ReplaceExistingProperties
74
+ | kXMPTemplate_IncludeInternalProperties;
75
+ override = false;
76
+ } else if (strcmp(mode_cstr, "override") == 0) {
77
+ override = true;
78
+ } else {
79
+ rb_raise(rb_eArgError, "mode must be :upsert or :override (String or Symbol). Got '%s'", mode_cstr);
80
+ return Qnil; // unreachable, but for clarity
81
+ }
82
+
83
+
84
+ const char* fileName = StringValueCStr(rb_filename);
85
+
86
+ bool ok;
87
+ SXMPFiles xmpFile;
88
+ SXMPMeta newMeta;
89
+ SXMPMeta currentMeta;
90
+ XMP_PacketInfo xmpPacket;
91
+
92
+ if (xmpString != NULL) {
93
+ int i;
94
+ for (i = 0; i < (long)strlen(xmpString) - 10; i += 10){
95
+ newMeta.ParseFromBuffer(&xmpString[i], 10, kXMP_ParseMoreBuffers);
96
+ }
97
+
98
+ newMeta.ParseFromBuffer(&xmpString[i], (XMP_StringLen)strlen(xmpString) - i);
99
+ }
100
+
101
+ try {
102
+ XMP_OptionBits opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUseSmartHandler;
103
+ ok = xmpFile.OpenFile(fileName, kXMP_UnknownFile, opts);
104
+ if (!ok) {
105
+ xmpFile.CloseFile();
106
+
107
+ opts = kXMPFiles_OpenForUpdate | kXMPFiles_OpenUsePacketScanning;
108
+ ok = xmpFile.OpenFile( fileName, kXMP_UnknownFile, opts );
109
+ if ( ! ok ) {
110
+ // Neither smart handler nor packet scanning worked
111
+ xmpFile.CloseFile();
112
+ return Qnil;
113
+ }
114
+ }
115
+
116
+ fprintf(stderr, "Opened file %s for update\n", fileName);
117
+
118
+ ok = xmpFile.GetXMP(&currentMeta, 0, &xmpPacket);
119
+ if (!ok) {
120
+ xmpFile.CloseFile();
121
+ return Qnil;
122
+ }
123
+
124
+ XMP_DateTime dt;
125
+ SXMPUtils::CurrentDateTime(&dt);
126
+ std::string nowStr;
127
+ SXMPUtils::ConvertFromDate(dt, &nowStr);
128
+
129
+ if (xmpString != NULL){
130
+ newMeta.SetProperty(kXMP_NS_XMP, "MetadataDate", nowStr.c_str());
131
+ }
132
+
133
+ std::string newBuffer;
134
+ if (override) {
135
+
136
+ if (xmpFile.CanPutXMP(newMeta) ) {
137
+ xmpFile.PutXMP(newMeta);
138
+ } else {
139
+ xmpFile.CloseFile();
140
+
141
+ newMeta.SerializeToBuffer(&newBuffer);
142
+
143
+ rb_raise(rb_eArgError, "Can't update XMP new Data: '%s'", newBuffer.c_str());
144
+
145
+ return Qnil;
146
+ }
147
+ } else {
148
+ SXMPUtils::ApplyTemplate(
149
+ &currentMeta,
150
+ newMeta,
151
+ templateFlags
152
+ );
153
+
154
+ if (xmpFile.CanPutXMP(currentMeta) ) {
155
+ xmpFile.PutXMP(currentMeta);
156
+ } else {
157
+ xmpFile.CloseFile();
158
+
159
+ currentMeta.SerializeToBuffer(&newBuffer);
160
+
161
+ rb_raise(rb_eArgError, "Can't update XMP new Data: '%s'", newBuffer.c_str());
162
+
163
+ return Qnil;
164
+ }
165
+ }
166
+
167
+
168
+
169
+
170
+ xmpFile.CloseFile();
171
+ }
172
+ catch (XMP_Error& e) {
173
+ xmpFile.CloseFile();
174
+ rb_raise(rb_eRuntimeError, "XMP Error: %s", e.GetErrMsg());
175
+ return Qnil;
176
+ }
177
+ catch (...) {
178
+ xmpFile.CloseFile();
179
+ rb_raise(rb_eRuntimeError, "Unknown error processing XMP file");
180
+ return Qnil;
181
+ }
182
+
183
+ return Qnil;
184
+ }
185
+
186
+ VALUE get_xmp_from_file(VALUE self, VALUE rb_filename)
187
+ {
188
+ Check_Type(rb_filename, T_STRING);
189
+ const char* fileName = StringValueCStr(rb_filename);
190
+
191
+ bool ok;
192
+ SXMPMeta xmpMeta;
193
+ SXMPFiles xmpFile;
194
+ XMP_FileFormat format;
195
+ XMP_OptionBits openFlags, handlerFlags;
196
+ XMP_PacketInfo xmpPacket;
197
+
198
+ try {
199
+ XMP_OptionBits opts = kXMPFiles_OpenForRead | kXMPFiles_OpenUseSmartHandler;
200
+ ok = xmpFile.OpenFile(fileName, kXMP_UnknownFile, opts);
201
+ if (!ok) {
202
+ xmpFile.CloseFile();
203
+
204
+ opts = kXMPFiles_OpenForRead | kXMPFiles_OpenUsePacketScanning;
205
+ ok = xmpFile.OpenFile( fileName, kXMP_UnknownFile, opts );
206
+ if ( ! ok ) {
207
+ // Neither smart handler nor packet scanning worked
208
+ xmpFile.CloseFile();
209
+ return Qnil;
210
+ }
211
+ }
212
+
213
+ ok = xmpFile.GetFileInfo(0, &openFlags, &format, &handlerFlags);
214
+ if (!ok) {
215
+ xmpFile.CloseFile();
216
+ return Qnil;
217
+ }
218
+
219
+ ok = xmpFile.GetXMP(&xmpMeta, 0, &xmpPacket);
220
+ if (!ok) {
221
+ xmpFile.CloseFile();
222
+ return Qnil;
223
+ }
224
+
225
+ VALUE result = rb_hash_new();
226
+
227
+ rb_hash_aset(result,
228
+ rb_str_new_cstr("format"),
229
+ UINT2NUM(format));
230
+ rb_hash_aset(result,
231
+ rb_str_new_cstr("handler_flags"),
232
+ UINT2NUM(handlerFlags));
233
+ rb_hash_aset(result,
234
+ rb_str_new_cstr("offset"),
235
+ LONG2NUM(xmpPacket.offset));
236
+ rb_hash_aset(result,
237
+ rb_str_new_cstr("length"),
238
+ LONG2NUM(xmpPacket.length));
239
+
240
+ std::string xmpString;
241
+ xmpMeta.SerializeToBuffer(&xmpString);
242
+ rb_hash_aset(result,
243
+ rb_str_new_cstr("xmp_data"),
244
+ rb_str_new_cstr(xmpString.c_str()));
245
+
246
+ xmpFile.CloseFile();
247
+ return result;
248
+ }
249
+ catch (XMP_Error& e) {
250
+ xmpFile.CloseFile();
251
+ rb_raise(rb_eRuntimeError, "XMP Error: %s", e.GetErrMsg());
252
+ return Qnil;
253
+ }
254
+ catch (...) {
255
+ xmpFile.CloseFile();
256
+ rb_raise(rb_eRuntimeError, "Unknown error processing XMP file");
257
+ return Qnil;
258
+ }
259
+ }
260
+
261
+ // xmp_initialize(self, filename)
262
+ // Initialize the XMP Toolkit and SXMPFiles with an optional PLUGINS_PATH
263
+ VALUE xmp_initialize(VALUE self)
264
+ {
265
+ try {
266
+ if (!SXMPMeta::Initialize()) {
267
+ rb_raise(rb_eRuntimeError, "Failed to initialize XMP Toolkit metadata");
268
+ return Qnil;
269
+ }
270
+
271
+ // Look up XmpToolkitRuby::PLUGINS_PATH if defined
272
+ VALUE xmp_module = rb_const_get(rb_cObject, rb_intern("XmpToolkitRuby"));
273
+ if (rb_const_defined(xmp_module, rb_intern("PLUGINS_PATH"))) {
274
+ VALUE plugins_path = rb_const_get(xmp_module, rb_intern("PLUGINS_PATH"));
275
+
276
+ if (TYPE(plugins_path) == T_STRING) {
277
+ const char* path = StringValueCStr(plugins_path);
278
+ XMP_OptionBits options = 0;
279
+ options |= kXMPFiles_ServerMode;
280
+
281
+ if (!SXMPFiles::Initialize(options, path)) {
282
+ rb_raise(rb_eRuntimeError, "Failed to initialize XMP Files with plugin path");
283
+ return Qnil;
284
+ }
285
+ }
286
+ else {
287
+ if (!SXMPFiles::Initialize()) {
288
+ rb_raise(rb_eRuntimeError, "Failed to initialize XMP Files without plugin path");
289
+ return Qnil;
290
+ }
291
+ }
292
+ }
293
+ else {
294
+ if (!SXMPFiles::Initialize()) {
295
+ rb_raise(rb_eRuntimeError, "Failed to initialize XMP Files (PLUGINS_PATH not defined)");
296
+ return Qnil;
297
+ }
298
+ }
299
+
300
+ return Qnil;
301
+ }
302
+ catch (const XMP_Error& e) {
303
+ rb_raise(rb_eRuntimeError, "XMP Error during initialization: %s", e.GetErrMsg());
304
+ return Qnil;
305
+ }
306
+ catch (const std::exception& e) {
307
+ rb_raise(rb_eRuntimeError, "C++ exception during initialization: %s", e.what());
308
+ return Qnil;
309
+ }
310
+ catch (...) {
311
+ rb_raise(rb_eRuntimeError, "Unknown error during XMP initialization");
312
+ return Qnil;
313
+ }
314
+ }
315
+
316
+ VALUE xmp_terminate(VALUE self)
317
+ {
318
+ SXMPFiles::Terminate();
319
+ SXMPMeta::Terminate();
320
+ return Qnil;
321
+ }
@@ -0,0 +1,69 @@
1
+ #ifndef XMP_TOOLKIT_HPP
2
+ #define XMP_TOOLKIT_HPP
3
+
4
+ #include <cstdio>
5
+ #include <vector>
6
+ #include <string>
7
+ #include <cstring>
8
+
9
+ //#define ENABLE_XMP_CPP_INTERFACE 1
10
+
11
+ // Must be defined to instantiate template classes
12
+ #define TXMP_STRING_TYPE std::string
13
+
14
+ // Must be defined to give access to XMPFiles
15
+ #define XMP_INCLUDE_XMPFILES 1
16
+
17
+ // Ensure XMP templates are instantiated
18
+ #include "XMP.incl_cpp"
19
+
20
+ // Provide access to the API
21
+ #include "XMP.hpp"
22
+
23
+ #include <iostream>
24
+ #include <fstream>
25
+
26
+ #include <ruby.h>
27
+
28
+ using namespace std;
29
+
30
+ //#define ENABLE_XMP_CPP_INTERFACE 1;
31
+
32
+ // Must be defined to instantiate template classes
33
+ #define TXMP_STRING_TYPE std::string
34
+ // Must be defined to give access to XMPFiles
35
+ #define XMP_INCLUDE_XMPFILES 1
36
+
37
+ #include "XMP.incl_cpp"
38
+ #include "XMP.hpp"
39
+
40
+ // TXMPMeta‐style error callback
41
+ bool xmp_meta_error_callback(
42
+ void * clientContext,
43
+ XMP_ErrorSeverity severity,
44
+ XMP_Int32 cause,
45
+ XMP_StringPtr message
46
+ );
47
+
48
+ // TXMPFiles‐style error callback
49
+ bool xmp_file_error_callback(
50
+ void * clientContext,
51
+ XMP_StringPtr filePath,
52
+ XMP_ErrorSeverity severity,
53
+ XMP_Int32 cause,
54
+ XMP_StringPtr message
55
+ );
56
+
57
+ // Initialize SXMPMeta + SXMPFiles, installing callbacks.
58
+ // Returns Qtrue or raises a Ruby exception.
59
+ VALUE xmp_initialize(VALUE self);
60
+
61
+ // Terminate SXMPFiles + SXMPMeta.
62
+ VALUE xmp_terminate(VALUE self);
63
+
64
+ // process_file(filename) → Ruby Hash or nil
65
+ VALUE get_xmp_from_file(VALUE self, VALUE rb_filename);
66
+
67
+ VALUE write_xmp_to_file(int argc, VALUE* argv, VALUE self);
68
+
69
+ #endif
@@ -0,0 +1,44 @@
1
+ // xmp_init.cpp
2
+
3
+ #include "xmp_toolkit.hpp"
4
+ #include <ruby.h>
5
+
6
+ // The one and only Init function. Ruby will look for Init_xmp_toolkit_ruby
7
+ // because we will (in extconf.rb) build this extension as “xmp_toolkit_ruby.so”.
8
+ extern "C"
9
+ void Init_xmp_toolkit_ruby()
10
+ {
11
+
12
+ SXMPMeta::SetDefaultErrorCallback(
13
+ xmp_meta_error_callback,
14
+ nullptr,
15
+ 0
16
+ );
17
+
18
+ SXMPFiles::SetDefaultErrorCallback(
19
+ xmp_file_error_callback,
20
+ nullptr,
21
+ 0
22
+ );
23
+
24
+ VALUE mXmpToolkitRuby = rb_define_module("XmpToolkitRuby");
25
+ VALUE mXMPToolkit = rb_define_module_under(mXmpToolkitRuby, "XmpToolkit");
26
+
27
+ rb_define_singleton_method(mXMPToolkit,
28
+ "initialize_xmp",
29
+ RUBY_METHOD_FUNC(xmp_initialize),
30
+ 0);
31
+ rb_define_singleton_method(mXMPToolkit,
32
+ "terminate",
33
+ RUBY_METHOD_FUNC(xmp_terminate),
34
+ 0);
35
+ rb_define_singleton_method(mXMPToolkit,
36
+ "read_xmp",
37
+ RUBY_METHOD_FUNC(get_xmp_from_file),
38
+ 1);
39
+ rb_define_singleton_method(mXMPToolkit,
40
+ "write_xmp",
41
+ RUBY_METHOD_FUNC(write_xmp_to_file),
42
+ -1);
43
+
44
+ }
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "thor"
4
+
5
+ module XmpToolkitRuby
6
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
7
+ class CLI < Thor
8
+ # Ensures that the CLI exits with a non-zero status code on failure.
9
+ def self.exit_on_failure?
10
+ true
11
+ end
12
+
13
+ desc "print_xmp FILE_PATH [OUTPUT_FILE_PATH]", "Prints the XMP metadata from a given file. Optionally writes to OUTPUT_FILE_PATH."
14
+ method_option :raw, type: :boolean, default: false, desc: "Output the original, raw XMP data instead of the cleaned version."
15
+
16
+ def print_xmp(file_path, output_file_path = nil)
17
+ metadata = XmpToolkitRuby.xmp_from_file(file_path)
18
+ key_to_print = options[:raw] ? "xmp_data_orig" : "xmp_data"
19
+
20
+ if metadata && metadata[key_to_print]
21
+ xmp_content = metadata[key_to_print]
22
+ if output_file_path
23
+ begin
24
+ File.write(output_file_path, xmp_content)
25
+ puts "XMP Metadata from #{file_path}#{" (raw)" if options[:raw]} written to #{output_file_path}"
26
+ rescue SystemCallError => e # Catches errors like EACCES, ENOENT etc.
27
+ raise Thor::Error, "Error writing to output file #{output_file_path}: #{e.message}"
28
+ end
29
+ else
30
+ puts "XMP Metadata for: #{file_path}#{" (raw)" if options[:raw]}"
31
+ puts xmp_content
32
+ end
33
+ else
34
+ message = "No XMP metadata found (key: #{key_to_print}) or an error occurred for: #{file_path}"
35
+ raise Thor::Error, message if output_file_path
36
+
37
+ puts message
38
+
39
+ end
40
+ rescue XmpToolkitRuby::FileNotFoundError => e
41
+ raise Thor::Error, "Error: #{e.message}"
42
+ rescue StandardError => e
43
+ raise Thor::Error, "An unexpected error occurred: #{e.message}"
44
+ end
45
+
46
+ desc "override_xmp FILE_PATH XML_FILE_PATH", "Overrides or merges XMP metadata in FILE_PATH with content from XML_FILE_PATH."
47
+ long_desc <<-LONGDESC
48
+ This command will either replace or merge the XMP metadata in FILE_PATH
49
+ with the XMP metadata provided in XML_FILE_PATH.
50
+
51
+ When using --no-override (the default), new properties are added and existing ones updated.
52
+ When using --override, all existing XMP metadata is replaced with the new content.
53
+
54
+ The content of XML_FILE_PATH will be validated as XML before attempting to write.
55
+ LONGDESC
56
+ method_option :override, type: :boolean, default: false, desc: "Completely replace existing XMP instead of merging"
57
+
58
+ def override_xmp(file_path, xml_file_path)
59
+ raise Thor::Error, "XML file not found: #{xml_file_path}" unless File.exist?(xml_file_path)
60
+ raise Thor::Error, "XML file is not readable: #{xml_file_path}" unless File.readable?(xml_file_path)
61
+
62
+ xml_content = File.read(xml_file_path)
63
+
64
+ # Validate XML
65
+ doc = Nokogiri::XML(xml_content) do |config|
66
+ config.strict.nonet # More secure parsing options
67
+ end
68
+
69
+ unless doc.errors.empty?
70
+ error_messages = doc.errors.map(&:message).join("\n - ")
71
+ raise Thor::Error, "Invalid XML in #{xml_file_path}:\n - #{error_messages}"
72
+ end
73
+
74
+ # The XmpToolkitRuby.xmp_to_file method itself will call check_file! for file_path
75
+ XmpToolkitRuby.xmp_to_file(file_path, xml_content, override: options[:override])
76
+
77
+ mode = options[:override] ? "overrode" : "merged"
78
+ puts "Successfully #{mode} XMP metadata in #{file_path} with content from #{xml_file_path}."
79
+ rescue XmpToolkitRuby::FileNotFoundError => e
80
+ raise Thor::Error, "Error: #{e.message}"
81
+ rescue Thor::Error # Re-raise Thor errors directly
82
+ raise
83
+ rescue StandardError => e
84
+ raise Thor::Error, "An unexpected error occurred: #{e.message}\n#{e.backtrace.join("\n")}"
85
+ end
86
+
87
+ desc "version", "Show xmp_toolkit_ruby version"
88
+
89
+ def version
90
+ puts "xmp_toolkit_ruby version #{XmpToolkitRuby::VERSION}"
91
+ end
92
+ end
93
+
94
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
95
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module XmpToolkitRuby
4
+ module Namespaces
5
+ XMP_NS_XMP = "http://ns.adobe.com/xap/1.0/"
6
+
7
+ XMP_NS_XMP_RIGHTS = "http://ns.adobe.com/xap/1.0/rights/"
8
+ XMP_NS_XMP_MM = "http://ns.adobe.com/xap/1.0/mm/"
9
+ XMP_NS_XMP_BJ = "http://ns.adobe.com/xap/1.0/bj/"
10
+
11
+ XMP_NS_PDF = "http://ns.adobe.com/pdf/1.3/"
12
+ XMP_NS_PHOTOSHOP = "http://ns.adobe.com/photoshop/1.0/"
13
+ XMP_NS_PSALBUM = "http://ns.adobe.com/album/1.0/"
14
+ XMP_NS_EXIF = "http://ns.adobe.com/exif/1.0/"
15
+ XMP_NS_EXIF_AUX = "http://ns.adobe.com/exif/1.0/aux/"
16
+ XMP_NS_TIFF = "http://ns.adobe.com/tiff/1.0/"
17
+ XMP_NS_PNG = "http://ns.adobe.com/png/1.0/"
18
+ XMP_NS_SWF = "http://ns.adobe.com/swf/1.0/"
19
+ XMP_NS_JPEG = "http://ns.adobe.com/jpeg/1.0/"
20
+ XMP_NS_JP2K = "http://ns.adobe.com/jp2k/1.0/"
21
+ XMP_NS_CAMERA_RAW = "http://ns.adobe.com/camera-raw-settings/1.0/"
22
+ XMP_NS_DM = "http://ns.adobe.com/xmp/1.0/DynamicMedia/"
23
+ XMP_NS_SCRIPT = "http://ns.adobe.com/xmp/1.0/Script/"
24
+ XMP_NS_ASF = "http://ns.adobe.com/asf/1.0/"
25
+ XMP_NS_WAV = "http://ns.adobe.com/xmp/wav/1.0/"
26
+ XMP_NS_BWF = "http://ns.adobe.com/bwf/bext/1.0/"
27
+ XMP_NS_AESCART = "http://ns.adobe.com/aes/cart/"
28
+ XMP_NS_RIFFINFO = "http://ns.adobe.com/riff/info/"
29
+ XMP_NS_IXML = "http://ns.adobe.com/ixml/1.0/"
30
+ XMP_NS_XMP_NOTE = "http://ns.adobe.com/xmp/note/"
31
+
32
+ XMP_NS_ADOBE_STOCK_PHOTO = "http://ns.adobe.com/StockPhoto/1.0/"
33
+ XMP_NS_CREATOR_ATOM = "http://ns.adobe.com/creatorAtom/1.0/"
34
+
35
+ XMP_NS_EXIF_EX = "http://cipa.jp/exif/1.0/"
36
+
37
+ XMP_NS_XMP_IDENTIFIER_QUAL = "http://ns.adobe.com/xmp/Identifier/qual/1.0/"
38
+ XMP_NS_XMP_DIMENSIONS = "http://ns.adobe.com/xap/1.0/sType/Dimensions#"
39
+ XMP_NS_XMP_TEXT = "http://ns.adobe.com/xap/1.0/t/"
40
+ XMP_NS_XMP_PAGED_FILE = "http://ns.adobe.com/xap/1.0/t/pg/"
41
+ XMP_NS_XMP_GRAPHICS = "http://ns.adobe.com/xap/1.0/g/"
42
+ XMP_NS_XMP_IMAGE = "http://ns.adobe.com/xap/1.0/g/img/"
43
+ XMP_NS_XMP_FONT = "http://ns.adobe.com/xap/1.0/sType/Font#"
44
+ XMP_NS_XMP_RESOURCE_EVENT = "http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
45
+ XMP_NS_XMP_RESOURCE_REF = "http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
46
+ XMP_NS_XMP_ST_VERSION = "http://ns.adobe.com/xap/1.0/sType/Version#"
47
+ XMP_NS_XMP_ST_JOB = "http://ns.adobe.com/xap/1.0/sType/Job#"
48
+ XMP_NS_XMP_MANIFEST_ITEM = "http://ns.adobe.com/xap/1.0/sType/ManifestItem#"
49
+
50
+ # Deprecated XML namespace constants
51
+ XMP_NS_XMP_T = "http://ns.adobe.com/xap/1.0/t/"
52
+ XMP_NS_XMP_T_PG = "http://ns.adobe.com/xap/1.0/t/pg/"
53
+ XMP_NS_XMP_G_IMG = "http://ns.adobe.com/xap/1.0/g/img/"
54
+
55
+ XMP_NS_DC = "http://purl.org/dc/elements/1.1/"
56
+
57
+ XMP_NS_IPTC_CORE = "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
58
+ XMP_NS_IPTC_EXT = "http://iptc.org/std/Iptc4xmpExt/2008-02-29/"
59
+
60
+ XMP_NS_DICOM = "http://ns.adobe.com/DICOM/"
61
+
62
+ XMP_NS_PLUS = "http://ns.useplus.org/ldf/xmp/1.0/"
63
+
64
+ XMP_NS_PDFA_SCHEMA = "http://www.aiim.org/pdfa/ns/schema#"
65
+ XMP_NS_PDFA_PROPERTY = "http://www.aiim.org/pdfa/ns/property#"
66
+ XMP_NS_PDFA_TYPE = "http://www.aiim.org/pdfa/ns/type#"
67
+ XMP_NS_PDFA_FIELD = "http://www.aiim.org/pdfa/ns/field#"
68
+ XMP_NS_PDFA_ID = "http://www.aiim.org/pdfa/ns/id/"
69
+ XMP_NS_PDFA_EXTENSION = "http://www.aiim.org/pdfa/ns/extension/"
70
+
71
+ XMP_NS_PDFX = "http://ns.adobe.com/pdfx/1.3/"
72
+ XMP_NS_PDFX_ID = "http://www.npes.org/pdfx/ns/id/"
73
+
74
+ XMP_NS_RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
75
+ XMP_NS_XML = "http://www.w3.org/XML/1998/namespace"
76
+ end
77
+ end
@@ -0,0 +1,31 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2020, Adobe
4
+ All rights reserved.
5
+
6
+ See: https://github.com/adobe/XMP-Toolkit-SDK
7
+
8
+ Redistribution and use in source and binary forms, with or without
9
+ modification, are permitted provided that the following conditions are met:
10
+
11
+ 1. Redistributions of source code must retain the above copyright notice, this
12
+ list of conditions and the following disclaimer.
13
+
14
+ 2. Redistributions in binary form must reproduce the above copyright notice,
15
+ this list of conditions and the following disclaimer in the documentation
16
+ and/or other materials provided with the distribution.
17
+
18
+ 3. Neither the name of the copyright holder nor the names of its
19
+ contributors may be used to endorse or promote products derived from
20
+ this software without specific prior written permission.
21
+
22
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
23
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
26
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,31 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <PluginResource Architecture="x86">
3
+ <Handler
4
+ Name="adobe.coretech.xmp.minipdfl"
5
+ Version="1.00"
6
+ HandlerType="OwningHandler"
7
+ >
8
+ <CheckFormat
9
+ Offset="0"
10
+ Length="4"
11
+ ByteSeq="%PDF"
12
+ />
13
+ <Extensions>
14
+ <Extension Name="pdf" />
15
+ <Extension Name="pdfl" />
16
+ </Extensions>
17
+ <HandlerFlags>
18
+ <HandlerFlag Name="kXMPFiles_CanInjectXMP" />
19
+ <HandlerFlag Name="kXMPFiles_CanExpand" />
20
+ <HandlerFlag Name="kXMPFiles_CanRewrite" />
21
+ <HandlerFlag Name="kXMPFiles_AllowsOnlyXMP" />
22
+ <HandlerFlag Name="kXMPFiles_ReturnsRawPacket" />
23
+ <HandlerFlag Name="kXMPFiles_HandlerOwnsFile" />
24
+ <HandlerFlag Name="kXMPFiles_AllowsSafeUpdate" />
25
+ <HandlerFlag Name="kXMPFiles_NeedsPreloading" />
26
+ </HandlerFlags>
27
+ <SerializeOptions>
28
+ <SerializeOption Name="kXMP_OmitPacketWrapper" />
29
+ </SerializeOptions>
30
+ </Handler>
31
+ </PluginResource>