summaryrefslogtreecommitdiff
path: root/gpr/source/lib/xmp_core/public
diff options
context:
space:
mode:
authorluxagraf <sng@luxagraf.net>2023-06-15 15:58:59 -0500
committerluxagraf <sng@luxagraf.net>2023-06-15 15:58:59 -0500
commitab987e10f154f5536bb8fd936ae0966e909fa969 (patch)
tree9de5076f38b71ececb1bc94f8d9d19170898d603 /gpr/source/lib/xmp_core/public
added all my scriptssynced/master
Diffstat (limited to 'gpr/source/lib/xmp_core/public')
-rw-r--r--gpr/source/lib/xmp_core/public/include/TXMPFiles.hpp855
-rw-r--r--gpr/source/lib/xmp_core/public/include/TXMPIterator.hpp235
-rw-r--r--gpr/source/lib/xmp_core/public/include/TXMPMeta.hpp1751
-rw-r--r--gpr/source/lib/xmp_core/public/include/TXMPUtils.hpp967
-rw-r--r--gpr/source/lib/xmp_core/public/include/XMP.hpp98
-rw-r--r--gpr/source/lib/xmp_core/public/include/XMP.incl_cpp69
-rw-r--r--gpr/source/lib/xmp_core/public/include/XMP_Const.h1560
-rw-r--r--gpr/source/lib/xmp_core/public/include/XMP_Environment.h165
-rw-r--r--gpr/source/lib/xmp_core/public/include/XMP_IO.hpp171
-rw-r--r--gpr/source/lib/xmp_core/public/include/XMP_Version.h52
-rw-r--r--gpr/source/lib/xmp_core/public/include/client-glue/TXMPFiles.incl_cpp484
-rw-r--r--gpr/source/lib/xmp_core/public/include/client-glue/TXMPIterator.incl_cpp223
-rw-r--r--gpr/source/lib/xmp_core/public/include/client-glue/TXMPMeta.incl_cpp914
-rw-r--r--gpr/source/lib/xmp_core/public/include/client-glue/TXMPUtils.incl_cpp445
-rw-r--r--gpr/source/lib/xmp_core/public/include/client-glue/WXMPFiles.hpp281
-rw-r--r--gpr/source/lib/xmp_core/public/include/client-glue/WXMPIterator.hpp74
-rw-r--r--gpr/source/lib/xmp_core/public/include/client-glue/WXMPMeta.hpp621
-rw-r--r--gpr/source/lib/xmp_core/public/include/client-glue/WXMPUtils.hpp315
-rw-r--r--gpr/source/lib/xmp_core/public/include/client-glue/WXMP_Common.hpp128
19 files changed, 9408 insertions, 0 deletions
diff --git a/gpr/source/lib/xmp_core/public/include/TXMPFiles.hpp b/gpr/source/lib/xmp_core/public/include/TXMPFiles.hpp
new file mode 100644
index 0000000..27ee413
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/TXMPFiles.hpp
@@ -0,0 +1,855 @@
+#ifndef __TXMPFiles_hpp__
+#define __TXMPFiles_hpp__ 1
+
+#if ( ! __XMP_hpp__ )
+ #error "Do not directly include, use XMP.hpp"
+#endif
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// =================================================================================================
+/// \file TXMPFiles.hpp
+/// \brief API for access to the main (document-level) metadata in a file_.
+///
+/// The Adobe XMP Toolkit's file handling component, XMPFiles, is a front end to a set of
+/// format-specific file handlers that support file I/O for XMP. The file handlers implement smart,
+/// efficient support for those file formats for which the means to embed XMP is defined in the XMP
+/// Specification. Where possible, this support allows:
+/// \li Injection of XMP where none currently exists
+/// \li Expansion of XMP without regard to existing padding
+/// \li Reconciliation of the XMP and other legacy forms of metadata.
+///
+/// \c TXMPFiles is designed for use by clients interested in the metadata and not in the primary
+/// file content; the Adobe Bridge application is a typical example. \c TXMPFiles is not intended to
+/// be appropriate for files authored by an application; that is, those files for which the
+/// application has explicit knowledge of the file format.
+// =================================================================================================
+
+
+// =================================================================================================
+/// \class TXMPFiles TXMPFiles.hpp
+/// \brief API for access to the main (document-level) metadata in a file.
+///
+/// \c TXMPFiles is a template class that provides the API for the Adobe XMP Toolkit's XMPFiles
+/// component. This provides convenient access to the main, or document level, XMP for a file. Use
+/// it to obtain metadata from a file, which you can then manipulate with the XMP Core component
+/// (the classes \c TXMPMeta, \c TXMPUtils, and \c TXMPIterator); and to write new or changed
+/// metadata back out to a file.
+///
+/// The functions allow you to open a file, read and write the metadata, then close the file.
+/// While open, portions of the file might be maintained in RAM data structures. Memory
+/// usage can vary considerably depending onfile format and access options.
+///
+/// A file can be opened for read-only or read-write access, with typical exclusion for both
+/// modes. Errors result in the throw of an \c XMPError exception.
+///
+/// \c TXMPFiles is the template class. It must be instantiated with a string class such as
+/// \c std::string. Read the Toolkit Overview for information about the overall architecture of the XMP
+/// API, and the documentation for \c XMP.hpp for specific instantiation instructions.
+///
+/// Access these functions through the concrete class, \c SXMPFiles.
+// =================================================================================================
+
+
+#if XMP_StaticBuild // ! Client XMP_IO objects can only be used in static builds.
+ #include "XMP_IO.hpp"
+#endif
+
+
+template <class tStringObj>
+class TXMPFiles {
+
+public:
+
+ // =============================================================================================
+ /// \name Initialization and termination
+ /// @{
+ ///
+ /// A \c TXMPFiles object must be initialized before use and can be terminated when done.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetVersionInfo() retrieves version information for the XMPFiles component.
+ ///
+ /// Can be called before \c #Initialize(). This function is static; make the call directly from
+ /// the concrete class (\c SXMPFiles).
+ ///
+ /// @param versionInfo [out] A buffer in which to return the version information.
+
+ static void GetVersionInfo ( XMP_VersionInfo * versionInfo );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Initializes the XMPFiles library; must be called before creating an \c SXMPFiles object.
+ ///
+ /// The main action is to activate the available smart file handlers. Must be called before
+ /// using any methods except \c GetVersionInfo().
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPFiles).
+ ///
+ /// @return True on success.
+
+ static bool Initialize();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Initializes the XMPFiles library; must be called before creating an \c SXMPFiles object.
+ ///
+ /// This overload of TXMPFiles::Initialize() accepts option bits to customize the initialization
+ /// actions. At this time no option is defined.
+ ///
+ /// The main action is to activate the available smart file handlers. Must be called before
+ /// using any methods except \c GetVersionInfo().
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPFiles).
+ ///
+ /// @param options Option flags to control the initialization actions.
+ ///
+ /// @return True on success.
+
+ static bool Initialize ( XMP_OptionBits options );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Initializes the XMPFiles library; must be called before creating an \c SXMPFiles object.
+ ///
+ /// This overload of TXMPFiles::Initialize() accepts plugin directory and name of the plug-ins
+ /// as a comma separated list to load the file handler plug-ins. If plugins == NULL, then all
+ /// plug-ins present in the plug-in directory will be loaded.
+ ///
+ /// The main action is to activate the available smart file handlers. Must be called before
+ /// using any methods except \c GetVersionInfo().
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPFiles).
+ ///
+ /// @param pluginFolder Pugin directorty to load the file handler plug-ins.
+ /// @param plugins Comma sepearted list of plug-ins which should be loaded from the plug-in directory.
+ /// If plugin == NULL, then all plug-ins availbale in the plug-in directory will be loaded.
+ ///
+ /// @return True on success.
+
+ static bool Initialize ( const char* pluginFolder, const char* plugins = NULL );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Initializes the XMPFiles library; must be called before creating an \c SXMPFiles object.
+ ///
+ /// This overload of TXMPFiles::Initialize( XMP_OptionBits options ) accepts plugin directory and
+ /// name of the plug-ins as a comma separated list to load the file handler plug-ins.
+ /// If plugins == NULL, then all plug-ins present in the plug-in directory will be loaded.
+ ///
+ /// The main action is to activate the available smart file handlers. Must be called before
+ /// using any methods except \c GetVersionInfo().
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPFiles).
+ ///
+ /// @param options Option flags to control the initialization actions.
+ /// @param pluginFolder Pugin directorty to load the file handler plug-ins.
+ /// @param plugins Comma sepearted list of plug-ins which should be loaded from the plug-in directory.
+ /// If plugin == NULL, then all plug-ins availbale in the plug-in directory will be loaded.
+ ///
+ /// @return True on success.
+
+ static bool Initialize ( XMP_OptionBits options, const char* pluginFolder, const char* plugins = NULL );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Terminates use of the XMPFiles library.
+ ///
+ /// Optional. Deallocates global data structures created by intialization. Its main action is to
+ /// deallocate heap-allocated global storage, for the benefit of client leak checkers.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPFiles).
+
+ static void Terminate();
+
+ /// @}
+
+ // =============================================================================================
+ /// \name Constructors and destructor
+ /// @{
+ ///
+ /// The default constructor initializes an object that is associated with no file. The alternate
+ /// constructors call \c OpenFile().
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Default constructor initializes an object that is associated with no file.
+
+ TXMPFiles();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Destructor; typical virtual destructor.
+ ///
+ /// The destructor does not call \c CloseFile(); pending updates are lost when the destructor is run.
+ ///
+ /// @see \c OpenFile(), \c CloseFile()
+
+ virtual ~TXMPFiles() throw();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Alternate constructor associates the new \c XMPFiles object with a specific file.
+ ///
+ /// Calls \c OpenFile() to open the specified file after performing a default construct.
+ ///
+ /// @param filePath The path for the file, specified as a nul-terminated UTF-8 string.
+ ///
+ /// @param format A format hint for the file, if known.
+ ///
+ /// @param openFlags Options for how the file is to be opened (for read or read/write, for
+ /// example). Use a logical OR of these bit-flag constants:
+ ///
+ /// \li \c #kXMPFiles_OpenForRead
+ /// \li \c #kXMPFiles_OpenForUpdate
+ /// \li \c #kXMPFiles_OpenOnlyXMP
+ /// \li \c #kXMPFiles_OpenStrictly
+ /// \li \c #kXMPFiles_OpenUseSmartHandler
+ /// \li \c #kXMPFiles_OpenUsePacketScanning
+ /// \li \c #kXMPFiles_OpenLimitedScanning
+ ///
+ /// @return The new \c TXMPFiles object.
+
+ TXMPFiles ( XMP_StringPtr filePath,
+ XMP_FileFormat format = kXMP_UnknownFile,
+ XMP_OptionBits openFlags = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Alternate constructor associates the new \c XMPFiles object with a specific file,
+ /// using a string object.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object
+ /// for the file path. It is otherwise identical; see details in the canonical form.
+
+ TXMPFiles ( const tStringObj & filePath,
+ XMP_FileFormat format = kXMP_UnknownFile,
+ XMP_OptionBits openFlags = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Copy constructor
+ ///
+ /// Increments an internal reference count but does not perform a deep copy.
+ ///
+ /// @param original The existing \c TXMPFiles object to copy.
+ ///
+ /// @return The new \c TXMPFiles object.
+
+ TXMPFiles ( const TXMPFiles<tStringObj> & original );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Assignment operator
+ ///
+ /// Increments an internal reference count but does not perform a deep copy.
+ ///
+ /// @param rhs The existing \c TXMPFiles object.
+
+ void operator= ( const TXMPFiles<tStringObj> & rhs );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Reconstructs a \c TXMPFiles object from an internal reference.
+ ///
+ /// This constructor creates a new \c TXMPFiles object that refers to the underlying reference
+ /// object of an existing \c TXMPFiles object. Use to safely pass \c SXMPFiles references across
+ /// DLL boundaries.
+ ///
+ /// @param xmpFilesObj The underlying reference object, obtained from some other XMP object
+ /// with \c TXMPFiles::GetInternalRef().
+ ///
+ /// @return The new object.
+
+ TXMPFiles ( XMPFilesRef xmpFilesObj );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief GetInternalRef() retrieves an internal reference that can be safely passed across DLL
+ /// boundaries and reconstructed.
+ ///
+ /// Use with the reconstruction constructor to safely pass \c SXMPFiles references across DLL
+ /// boundaries where the clients might have used different string types when instantiating
+ /// \c TXMPFiles.
+ ///
+ /// @return The internal reference.
+ ///
+ /// @see \c TXMPMeta::GetInternalRef() for usage.
+
+ XMPFilesRef GetInternalRef();
+
+ /// @}
+
+ // =============================================================================================
+ /// \name File handler information
+ /// @{
+ ///
+ /// Call this static function from the concrete class, \c SXMPFiles, to obtain information about
+ /// the file handlers for the XMPFiles component.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief GetFormatInfo() reports what features are supported for a specific file format.
+ ///
+ /// The file handlers for different file formats vary considerably in what features they
+ /// support. Support depends on both the general capabilities of the format and the
+ /// implementation of the handler for that format.
+ ///
+ ///This function is static; make the call directly from the concrete class (\c SXMPFiles).
+ ///
+ /// @param format The file format whose support flags are desired.
+ ///
+ /// @param handlerFlags [out] A buffer in which to return a logical OR of option bit flags.
+ /// The following constants are defined:
+ ///
+ /// \li \c #kXMPFiles_CanInjectXMP - Can inject first-time XMP into an existing file.
+ /// \li \c #kXMPFiles_CanExpand - Can expand XMP or other metadata in an existing file.
+ /// \li \c #kXMPFiles_CanRewrite - Can copy one file to another, writing new metadata (as in SaveAs)
+ /// \li \c #kXMPFiles_CanReconcile - Supports reconciliation between XMP and other forms.
+ /// \li \c #kXMPFiles_AllowsOnlyXMP - Allows access to just the XMP, ignoring other forms.
+ /// This is only meaningful if \c #kXMPFiles_CanReconcile is set.
+ /// \li \c #kXMPFiles_ReturnsRawPacket - File handler returns raw XMP packet information and string.
+ ///
+ /// Even if \c #kXMPFiles_ReturnsRawPacket is set, the returned packet information might have an
+ /// offset of -1 to indicate an unknown offset. While all file handlers should be able to return
+ /// the raw packet, some might not know the offset of the packet within the file. This is
+ /// typical in cases where external libraries are used. These cases might not even allow return
+ /// of the raw packet.
+ ///
+ /// @return True if the format has explicit "smart" support, false if the format is handled by
+ /// the default packet scanning plus heuristics. */
+
+
+ static bool GetFormatInfo ( XMP_FileFormat format,
+ XMP_OptionBits * handlerFlags = 0 );
+
+ /// @}
+
+ // =============================================================================================
+ /// \name File operations
+ /// @{
+ ///
+ /// These functions allow you to open, close, and query files.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CheckFileFormat() tries to determine the format of a file.
+ ///
+ /// Tries to determine the format of a file, returning an \c #XMP_FileFormat value. Uses the
+ /// same logic as \c OpenFile() to select a smart handler.
+ ///
+ /// @param filePath The path for the file, appropriate for the local operating system. Passed as
+ /// a nul-terminated UTF-8 string. The path is the same as would be passed to \c OpenFile.
+ ///
+ /// @return The file's format if a smart handler would be selected by \c OpenFile(), otherwise
+ /// \c #kXMP_UnknownFile.
+
+ static XMP_FileFormat CheckFileFormat ( XMP_StringPtr filePath );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CheckPackageFormat() tries to determine the format of a "package" folder.
+ ///
+ /// Tries to determine the format of a package, given the name of the top-level folder. Returns
+ /// an \c #XMP_FileFormat value. Examples of recognized packages include the video formats P2,
+ /// XDCAM, or Sony HDV. These packages contain collections of "clips", stored as multiple files
+ /// in specific subfolders.
+ ///
+ /// @param folderPath The path for the top-level folder, appropriate for the local operating
+ /// system. Passed as a nul-terminated UTF-8 string. This is not the same path you would pass to
+ /// \c OpenFile(). For example, the top-level path for a package might be ".../MyMovie", while
+ /// the path to a file you wish to open would be ".../MyMovie/SomeClip".
+ ///
+ /// @return The package's format if it can be determined, otherwise \c #kXMP_UnknownFile.
+
+ static XMP_FileFormat CheckPackageFormat ( XMP_StringPtr folderPath );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetFileModDate() returns the last modification date of all files that are returned
+ /// by \c GetAssociatedResources()
+ ///
+ /// Returns the most recent O/S file modification date of all associated files. In the typical case
+ /// of a single file containing embedded XMP, returned date value is the modification date of the
+ /// same file. For sidecar and folder based video packages, returned date value is the modification
+ /// date of that associated file which was updated last.
+ ///
+ /// @param filePath A path exactly as would be passed to \c OpenFile.
+ ///
+ /// @param modDate A required pointer to return the last modification date.
+ ///
+ /// @param format A format hint as would be passed to \c OpenFile.
+ ///
+ /// @param options An optional set of option flags. The only defined one is \c kXMPFiles_ForceGivenHandler,
+ /// used to shortcut the handler selection logic if the caller is certain of the format.
+ ///
+ /// @return Returns true if the file path is valid to select a smart handler, false for an
+ /// invalid path or if fallback packet scanning would be selected.
+
+ static bool GetFileModDate ( XMP_StringPtr filePath,
+ XMP_DateTime * modDate,
+ XMP_FileFormat * format = 0,
+ XMP_OptionBits options = 0 );
+
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetAssociatedResources() returns a list of files and folders associated to filePath.
+ ///
+ /// \c GetAssociatedResources is provided to locate all files that are associated to the given
+ /// filePath such as sidecar-based XMP or folder-based video packages.If a smart
+ /// handler can be selected (not fallback packet scanning) then a list of file/folder paths is
+ /// returned for the related files that can be safely copied/imported to a different location,
+ /// keeping intact metadata(XMP and non-XMP),content and the necessary folder structure of the
+ /// format. The necessary folder structure here is the structure that is needed to uniquely
+ /// identify a folder-based format.The filePath and format parameters are exactly as would be
+ /// used for OpenFile. In the simple embedded XMP case just one path is returned. In the simple
+ /// sidecar case one or two paths will be returned, one if there is no sidecar XMP and two if
+ /// sidecar XMP exists. For folder-based handlers paths to all associated files is returned,
+ /// including the files and folders necessary to identify the format.In general, all the returned
+ /// paths are existent.In case of folder based video formats the first associated resource in the
+ /// resourceList is the root folder.
+ ///
+ /// @param filePath A path exactly as would be passed to \c OpenFile.
+ ///
+ /// @param resourceList Address of a vector of strings to receive all associated resource paths.
+ ///
+ /// @param format A format hint as would be passed to \c OpenFile.
+ ///
+ /// @param options An optional set of option flags. The only defined one is \c kXMPFiles_ForceGivenHandler,
+ /// used to shortcut the handler selection logic if the caller is certain of the format.
+ ///
+ /// @return Returns true if the file path is valid to select a smart handler, false for an
+ /// invalid path or if fallback packet scanning would be selected. Can also return false for
+ /// unexpected errors that prevent knowledge of the file usage.
+
+ static bool GetAssociatedResources ( XMP_StringPtr filePath,
+ std::vector<tStringObj>* resourceList,
+ XMP_FileFormat format = kXMP_UnknownFile,
+ XMP_OptionBits options = 0);
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c IsMetadataWritable() returns true if metadata can be updated for the given media path.
+ ///
+ /// \c IsMetadataWritable is provided to check if metadata can be updated or written to the format.In
+ /// the case of folder-based video formats only if all the metadata files can be written to, true is
+ /// returned.In other words, false is returned for a partial-write state of metadata files in
+ /// folder-based media formats.
+ ///
+ /// @param filePath A path exactly as would be passed to \c OpenFile.
+ ///
+ /// @param writable A pointer to the result flag. Is true if the metadata can be updated in the format,
+ /// otherwise false.
+ ///
+ /// @param format A format hint as would be passed to \c OpenFile.
+ ///
+ /// @param options An optional set of option flags. The only defined one is \c kXMPFiles_ForceGivenHandler,
+ /// used to shortcut the handler selection logic if the caller is certain of the format.
+ ///
+ /// @return Returns true if the file path is valid to select a smart handler, false for an
+ /// invalid path or if fallback packet scanning would be selected.
+
+ static bool IsMetadataWritable (XMP_StringPtr filePath,
+ bool * writable,
+ XMP_FileFormat format = kXMP_UnknownFile,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c OpenFile() opens a file for metadata access.
+ ///
+ /// Opens a file for the requested forms of metadata access. Opening the file at a minimum
+ /// causes the raw XMP packet to be read from the file. If the file handler supports legacy
+ /// metadata reconciliation then legacy metadata is also read, unless \c #kXMPFiles_OpenOnlyXMP
+ /// is passed.
+ ///
+ /// If the file is opened for read-only access (passing \c #kXMPFiles_OpenForRead), the disk
+ /// file is closed immediately after reading the data from it; the \c XMPFiles object, however,
+ /// remains in the open state. You must call \c CloseFile() when finished using it. Other
+ /// methods, such as \c GetXMP(), can only be used between the \c OpenFile() and \c CloseFile()
+ /// calls. The \c XMPFiles destructor does not call \c CloseFile(); if you call it without
+ /// closing, any pending updates are lost.
+ ///
+ /// If the file is opened for update (passing \c #kXMPFiles_OpenForUpdate), the disk file
+ /// remains open until \c CloseFile() is called. The disk file is only updated once, when
+ /// \c CloseFile() is called, regardless of how many calls are made to \c PutXMP().
+ ///
+ /// Typically, the XMP is not parsed and legacy reconciliation is not performed until \c GetXMP()
+ /// is called, but this is not guaranteed. Specific file handlers might do earlier parsing of
+ /// the XMP. Delayed parsing and early disk file close for read-only access are optimizations
+ /// to help clients implementing file browsers, so that they can access the file briefly
+ /// and possibly display a thumbnail, then postpone more expensive XMP processing until later.
+ ///
+ /// @param filePath The path for the file, appropriate for the local operating system. Passed as
+ /// a nul-terminated UTF-8 string.
+ ///
+ /// @param format The format of the file. If the format is unknown (\c #kXMP_UnknownFile) the
+ /// format is determined from the file content. The first handler to check is guessed from the
+ /// file's extension. Passing a specific format value is generally just a hint about what file
+ /// handler to try first (instead of the one based on the extension). If
+ /// \c #kXMPFiles_OpenStrictly is set, then any format other than \c #kXMP_UnknownFile requires
+ /// that the file actually be that format; otherwise an exception is thrown.
+ ///
+ /// @param openFlags A set of option flags that describe the desired access. By default (zero)
+ /// the file is opened for read-only access and the format handler decides on the level of
+ /// reconciliation that will be performed. A logical OR of these bit-flag constants:
+ ///
+ /// \li \c #kXMPFiles_OpenForRead - Open for read-only access.
+ /// \li \c #kXMPFiles_OpenForUpdate - Open for reading and writing.
+ /// \li \c #kXMPFiles_OpenOnlyXMP - Only the XMP is wanted, no reconciliation.
+ /// \li \c #kXMPFiles_OpenStrictly - Be strict about locating XMP and reconciling with other
+ /// forms. By default, a best effort is made to locate the correct XMP and to reconcile XMP
+ /// with other forms (if reconciliation is done). This option forces stricter rules, resulting
+ /// in exceptions for errors. The definition of strictness is specific to each handler, there
+ /// might be no difference.
+ /// \li \c #kXMPFiles_OpenUseSmartHandler - Require the use of a smart handler.
+ /// \li \c #kXMPFiles_OpenUsePacketScanning - Force packet scanning, do not use a smart handler.
+ /// \li \c #kXMPFiles_OptimizeFileLayout - When updating a file, spend the effort necessary
+ /// to optimize file layout.
+ ///
+ /// @return True if the file is succesfully opened and attached to a file handler. False for
+ /// anticipated problems, such as passing \c #kXMPFiles_OpenUseSmartHandler but not having an
+ /// appropriate smart handler. Throws an exception for serious problems.
+
+ bool OpenFile ( XMP_StringPtr filePath,
+ XMP_FileFormat format = kXMP_UnknownFile,
+ XMP_OptionBits openFlags = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c OpenFile() opens a file for metadata access, using a string object
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object for the file
+ /// path. It is otherwise identical; see details in the canonical form.
+
+ bool OpenFile ( const tStringObj & filePath,
+ XMP_FileFormat format = kXMP_UnknownFile,
+ XMP_OptionBits openFlags = 0 );
+
+ #if XMP_StaticBuild // ! Client XMP_IO objects can only be used in static builds.
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c OpenFile() opens a client-provided XMP_IO object for metadata access.
+ ///
+ /// Alternative to the basic form of the function, allowing you to pass an XMP_IO object for
+ /// client-managed I/O.
+ ///
+
+ bool OpenFile ( XMP_IO * clientIO,
+ XMP_FileFormat format = kXMP_UnknownFile,
+ XMP_OptionBits openFlags = 0 );
+ #endif
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief CloseFile() explicitly closes an opened file.
+ ///
+ /// Performs any necessary output to the file and closes it. Files that are opened for update
+ /// are written to only when closing.
+ ///
+ /// If the file is opened for read-only access (passing \c #kXMPFiles_OpenForRead), the disk
+ /// file is closed immediately after reading the data from it; the \c XMPFiles object, however,
+ /// remains in the open state. You must call \c CloseFile() when finished using it. Other
+ /// methods, such as \c GetXMP(), can only be used between the \c OpenFile() and \c CloseFile()
+ /// calls. The \c XMPFiles destructor does not call \c CloseFile(); if you call it without closing,
+ /// any pending updates are lost.
+ ///
+ /// If the file is opened for update (passing \c #kXMPFiles_OpenForUpdate), the disk file remains
+ /// open until \c CloseFile() is called. The disk file is only updated once, when \c CloseFile()
+ /// is called, regardless of how many calls are made to \c PutXMP().
+ ///
+ /// @param closeFlags Option flags for optional closing actions. This bit-flag constant is
+ /// defined:
+ ///
+ /// \li \c #kXMPFiles_UpdateSafely - Write into a temporary file then swap for crash safety.
+
+ void CloseFile ( XMP_OptionBits closeFlags = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetFileInfo() retrieves basic information about an opened file.
+ ///
+ /// @param filePath [out] A buffer in which to return the path passed to \c OpenFile(). Can be
+ /// null if value is not wanted.
+ ///
+ /// @param openFlags [out] A buffer in which to return the option flags passed to
+ /// \c OpenFile(). Can be null if value is not wanted.
+ ///
+ /// @param format [out] A buffer in which to return the file format. Can be null if value is not
+ /// wanted.
+ /// @param handlerFlags [out] A buffer in which to return the handler's capability flags. Can
+ /// be null if value is not wanted.
+ ///
+ /// @return True if the file object is in the open state; that is, \c OpenFile() has been called
+ /// but \c CloseFile() has not. False otherwise. Even if the file object is open, the actual
+ /// disk file might be closed in the host file-system sense; see \c OpenFile().
+
+ bool GetFileInfo ( tStringObj * filePath = 0,
+ XMP_OptionBits * openFlags = 0,
+ XMP_FileFormat * format = 0,
+ XMP_OptionBits * handlerFlags = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetAbortProc() registers a callback function used to check for a user-signaled abort.
+ ///
+ /// The specified procedure is called periodically to allow a user to cancel time-consuming
+ /// operations. The callback function should return true to signal an abort, which results in an
+ /// exception being thrown.
+ ///
+ /// @param abortProc The callback function.
+ ///
+ /// @param abortArg A pointer to caller-defined data to pass to the callback function.
+
+ void SetAbortProc ( XMP_AbortProc abortProc,
+ void * abortArg );
+
+ /// @}
+
+ // =============================================================================================
+ /// \name Accessing metadata
+ /// @{
+ ///
+ /// These functions allow you to retrieve XMP metadata from open files, so that you can use the
+ /// \c TXMPMeta API to manipulate it. The \c PutXMP() functions update the XMP packet in memory.
+ /// Changed XMP is not actually written out to the file until the file is closed.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetXMP() retrieves the XMP metadata from an open file.
+ ///
+ /// The function reports whether XMP is present in the file; you can choose to retrieve any or
+ /// all of the parsed XMP, the raw XMP packet,or information about the raw XMP packet. The
+ /// options provided when the file was opened determine if reconciliation is done with other
+ /// forms of metadata.
+ ///
+ /// @param xmpObj [out] An XMP object in which to return the parsed XMP metadata. Can be null.
+ ///
+ /// @param xmpPacket [out] An string object in which to return the raw XMP packet as stored in
+ /// the file. Can be null. The encoding of the packet is given in the \c packetInfo. Returns an
+ /// empty string if the low level file handler does not provide the raw packet.
+ ///
+ /// @param packetInfo [out] An string object in which to return the location and form of the raw
+ /// XMP in the file. \c #XMP_PacketInfo::charForm and \c #XMP_PacketInfo::writeable reflect the
+ /// raw XMP in the file. The parsed XMP property values are always UTF-8. The writeable flag is
+ /// taken from the packet trailer; it applies only to "format ignorant" writing. The
+ /// \c #XMP_PacketInfo structure always reflects the state of the XMP in the file. The offset,
+ /// length, and character form do not change as a result of calling \c PutXMP() unless the file
+ /// is also written. Some file handlers might not return location or contents of the raw packet
+ /// string. To determine whether one does, check the \c #kXMPFiles_ReturnsRawPacket bit returned
+ /// by \c GetFormatInfo(). If the low-level file handler does not provide the raw packet
+ /// location, \c #XMP_PacketInfo::offset and \c #XMP_PacketInfo::length are both 0,
+ /// \c #XMP_PacketInfo::charForm is UTF-8, and \c #XMP_PacketInfo::writeable is false.
+ ///
+ /// @return True if the file has XMP, false otherwise.
+
+ bool GetXMP ( SXMPMeta * xmpObj = 0,
+ tStringObj * xmpPacket = 0,
+ XMP_PacketInfo * packetInfo = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c PutXMP() updates the XMP metadata in this object without writing out the file.
+ ///
+ /// This function supplies new XMP for the file. However, the disk file is not written until the
+ /// object is closed with \c CloseFile(). The options provided when the file was opened
+ /// determine if reconciliation is done with other forms of metadata.
+ ///
+ /// @param xmpObj The new metadata as an XMP object.
+
+ void PutXMP ( const SXMPMeta & xmpObj );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c PutXMP() updates the XMP metadata in this object without writing out the file,
+ /// using a string object for input.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass the metadata as a string object
+ /// instead of an XMP object. It is otherwise identical; see details in the canonical form.
+ ///
+ /// @param xmpPacket The new metadata as a string object containing a complete XMP packet.
+
+ void PutXMP ( const tStringObj & xmpPacket );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c PutXMP() updates the XMP metadata in this object without writing out the file,
+ /// using a string object and optional length.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass the metadata as a string object
+ /// instead of an XMP object. It is otherwise identical; see details in the canonical form.
+ ///
+ /// @param xmpPacket The new metadata as a <tt>const char *</tt> string containing an XMP packet.
+ ///
+ /// @param xmpLength Optional. The number of bytes in the string. If not supplied, the string is
+ /// assumed to be nul-terminated.
+
+ void PutXMP ( XMP_StringPtr xmpPacket,
+ XMP_StringLen xmpLength = kXMP_UseNullTermination );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CanPutXMP() reports whether this file can be updated with a specific XMP packet.
+ ///
+ /// Use to determine if the file can probably be updated with a given set of XMP metadata. This
+ /// depends on the size of the packet, the options with which the file was opened, and the
+ /// capabilities of the handler for the file format. The function obtains the length of the
+ /// serialized packet for the provided XMP, but does not keep it or modify it, and does not
+ /// cause the file to be written when closed. This is implemented roughly as follows:
+ ///
+ /// <pre>
+ /// bool CanPutXMP ( XMP_StringPtr xmpPacket )
+ /// {
+ /// XMP_FileFormat format;
+ /// this->GetFileInfo ( 0, &format, 0 );
+ ///
+ /// XMP_OptionBits formatFlags;
+ /// GetFormatInfo ( format, &formatFlags );
+ ///
+ /// if ( (formatFlags & kXMPFiles_CanInjectXMP) && (formatFlags & kXMPFiles_CanExpand) ) return true;
+ ///
+ /// XMP_PacketInfo packetInfo;
+ /// bool hasXMP = this->GetXMP ( 0, 0, &packetInfo );
+ ///
+ /// if ( ! hasXMP ) {
+ /// if ( formatFlags & kXMPFiles_CanInjectXMP ) return true;
+ /// } else {
+ /// if ( (formatFlags & kXMPFiles_CanExpand) ||
+ /// (packetInfo.length >= strlen(xmpPacket)) ) return true;
+ /// }
+ /// return false;
+ /// }
+ /// </pre>
+ ///
+ /// @param xmpObj The proposed new metadata as an XMP object.
+
+ bool CanPutXMP ( const SXMPMeta & xmpObj );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CanPutXMP() reports whether this file can be updated with a specific XMP packet,
+ /// passed in a string object.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass the metadata as a string object
+ /// instead of an XMP object. It is otherwise identical; see details in the canonical form.
+ ///
+ /// @param xmpPacket The proposed new metadata as a string object containing an XMP packet.
+
+ bool CanPutXMP ( const tStringObj & xmpPacket );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CanPutXMP() reports whether this file can be updated with a specific XMP packet,
+ /// passed in a string object.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass the metadata as a string object
+ /// instead of an XMP object. It is otherwise identical; see details in the canonical form.
+ ///
+ /// @param xmpPacket The proposed new metadata as a <tt>const char *</tt> string containing an XMP packet.
+ ///
+ /// @param xmpLength Optional. The number of bytes in the string. If not supplied, the string
+ /// is assumed to be nul-terminated.
+
+ bool CanPutXMP ( XMP_StringPtr xmpPacket,
+ XMP_StringLen xmpLength = kXMP_UseNullTermination );
+
+ /// @}
+
+ // =============================================================================================
+ /// \name Progress notifications
+ /// @{
+ ///
+ /// These functions allow track the progress of file operations. Initially only file updates are
+ /// tracked, these all occur within calls to SXMPFiles::CloseFile. There are no plans to track
+ /// other operations at this time. Tracking support must be added to specific file handlers,
+ /// there are no guarantees about which handlers will have support. To simplify the logic only
+ /// file writes will be estimated and measured.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetDefaultProgressCallback() sets a global default for progress tracking. This is
+ /// used as a default for XMPFiles (library) objects created after the default is set. This does
+ /// not affect the callback for new SXMPFiles (client) objects with an existing XMPFiles object.
+ ///
+ /// @param proc The client's callback function. Can be zero to disable notifications.
+ ///
+ /// @param context A pointer used to carry client-private context.
+ ///
+ /// @param interval The desired number of seconds between notifications. Ideally the first
+ /// notification is sent after this interval, then at each following multiple of this interval.
+ ///
+ /// @param sendStartStop A Boolean value indicating if initial and final notifications are
+ /// wanted in addition to those at the reporting intervals.
+
+ static void SetDefaultProgressCallback ( XMP_ProgressReportProc proc, void * context = 0,
+ float interval = 1.0, bool sendStartStop = false );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProgressCallback() sets the progress notification callback for the associated
+ /// XMPFiles (library) object.
+ ///
+ /// @param proc The client's callback function. Can be zero to disable notifications.
+ ///
+ /// @param context A pointer used to carry client-private context.
+ ///
+ /// @param interval The desired number of seconds between notifications. Ideally the first
+ /// notification is sent after this interval, then at each following multiple of this interval.
+ ///
+ /// @param sendStartStop A Boolean value indicating if initial and final notifications are
+ /// wanted in addition to those at the reporting intervals.
+
+ void SetProgressCallback ( XMP_ProgressReportProc proc, void * context = 0,
+ float interval = 1.0, bool sendStartStop = false );
+
+ /// @}
+
+ // =============================================================================================
+ // Error notifications
+ // ===================
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Error notifications
+ /// @{
+ ///
+ /// From the beginning through version 5.5, XMP Toolkit errors result in throwing an \c XMP_Error
+ /// exception. For the most part exceptions were thrown early and thus API calls aborted as soon
+ /// as an error was detected. Starting in version 5.5, support has been added for notifications
+ /// of errors arising in calls to \c TXMPFiles functions.
+ ///
+ /// A client can register an error notification callback function for a \c TXMPFile object. This
+ /// can be done as a global default or individually to each object. The global default applies
+ /// to all objects created after it is registered. Within the object there is no difference
+ /// between the global default or explicitly registered callback. The callback function returns
+ /// a \c bool value indicating if recovery should be attempted (true) or an exception thrown
+ /// (false). If no callback is registered, a best effort at recovery and continuation will be
+ /// made with an exception thrown if recovery is not possible.
+ ///
+ /// The number of notifications delivered for a given TXMPFiles object can be limited. This is
+ /// intended to reduce chatter from multiple or cascading errors. The limit is set when the
+ /// callback function is registered. This limits the number of notifications of the highest
+ /// severity delivered or less. If a higher severity error occurs, the counting starts again.
+ /// The limit and counting can be reset at any time, see \c ResetErrorCallbackLimit.
+
+ // --------------------------------------------------------------------------------------------
+ /// @brief SetDefaultErrorCallback() registers a global default error notification callback.
+ ///
+ /// @param proc The client's callback function.
+ ///
+ /// @param context Client-provided context for the callback.
+ ///
+ /// @param limit A limit on the number of notifications to be delivered.
+
+ static void SetDefaultErrorCallback ( XMPFiles_ErrorCallbackProc proc, void* context = 0, XMP_Uns32 limit = 1 );
+
+ // --------------------------------------------------------------------------------------------
+ /// @brief SetErrorCallback() registers an error notification callback.
+ ///
+ /// @param proc The client's callback function.
+ ///
+ /// @param context Client-provided context for the callback.
+ ///
+ /// @param limit A limit on the number of notifications to be delivered.
+
+ void SetErrorCallback ( XMPFiles_ErrorCallbackProc proc, void* context = 0, XMP_Uns32 limit = 1 );
+
+ // --------------------------------------------------------------------------------------------
+ /// @brief ResetErrorCallbackLimit() resets the error notification limit and counting. It has no
+ /// effect if an error notification callback function is not registered.
+ ///
+ /// @param limit A limit on the number of notifications to be delivered.
+
+ void ResetErrorCallbackLimit ( XMP_Uns32 limit = 1 );
+
+ /// @}
+
+ // =============================================================================================
+
+private:
+
+ XMPFilesRef xmpFilesRef;
+
+ // These are used as callbacks from the library code to the client when returning values that
+ // involve heap allocations. This ensures the allocations occur within the client.
+ static void SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen );
+ static void SetClientStringVector ( void * clientPtr, XMP_StringPtr* arrayPtr, XMP_Uns32 stringCount );
+
+}; // class TXMPFiles
+
+// =================================================================================================
+
+#endif // __TXMPFiles_hpp__
diff --git a/gpr/source/lib/xmp_core/public/include/TXMPIterator.hpp b/gpr/source/lib/xmp_core/public/include/TXMPIterator.hpp
new file mode 100644
index 0000000..603db68
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/TXMPIterator.hpp
@@ -0,0 +1,235 @@
+#ifndef __TXMPIterator_hpp__
+#define __TXMPIterator_hpp__ 1
+
+#if ( ! __XMP_hpp__ )
+ #error "Do not directly include, use XMP.hpp"
+#endif
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// =================================================================================================
+/// \file TXMPIterator.hpp
+/// \brief API for access to the XMP Toolkit iteration services.
+///
+/// \c TXMPIterator is the template class providing iteration services for the XMP Toolkit. It must
+/// be instantiated with a string class such as \c std::string. See the instructions in XMP.hpp, and
+/// the Overview for a discussion of the overall architecture of the XMP API.
+// =================================================================================================
+
+// =================================================================================================
+/// \class TXMPIterator TXMPIterator.hpp
+/// @brief API for access to the XMP Toolkit iteration services.
+///
+/// \c TXMPIterator provides a uniform means to iterate over the schema and properties within an XMP
+/// object. \c TXMPIterator is a template class which must be instantiated with a string class such
+/// as \c std::string. See the instructions in XMP.hpp, and the Overview for a discussion of the
+/// overall architecture of the XMP API. Access these functions through the concrete class,
+/// \c SXMPIterator.
+///
+/// @note Only XMP object iteration is currently available. Future development may include iteration
+/// over global tables, such as registered namespaces.
+///
+/// To understand how iteration works, you should have a thorough understanding of the XMP data
+/// tree, as described in the XMP Specification Part 1. You might also find it helpful to create
+/// some complex XMP and examine the output of \c TXMPMeta::DumpObject().
+///
+/// \li The top of the XMP data tree is a single root node. This does not explicitly appear in the
+/// dump and is never visited by an iterator; that is, it is never returned from
+/// \c TXMPIterator::Next().
+///
+/// \li Beneath the root are schema nodes; these collect the top-level properties in the same
+/// namespace. They are created and destroyed implicitly.
+///
+/// \li Beneath the schema nodes are the property nodes. The nodes below a property node depend on
+/// its type (simple, struct, or array) and whether it has qualifiers.
+///
+/// A \c TXMPIterator constructor defines a starting point for the iteration, and options that
+/// control how it proceeds. By default, iteration starts at the root and visits all nodes beneath
+/// it in a depth-first manner. The root node iteself is not visited; the first visited node is a
+/// schema node. You can provide a schema name or property path to select a different starting node.
+/// By default, this visits the named root node first then all nodes beneath it in a depth-first
+/// manner.
+///
+/// The function \c TXMPIterator::Next() delivers the schema URI, path, and option flags for the
+/// node being visited. If the node is simple, it also delivers the value. Qualifiers for this node
+/// are visited next. The fields of a struct or items of an array are visited after the qualifiers
+/// of the parent.
+///
+/// You can specify options when contructing the iteration object to control how the iteration is
+/// performed.
+///
+/// \li \c #kXMP_IterJustChildren - Visit just the immediate children of the root. Skip the root
+/// itself and all nodes below the immediate children. This omits the qualifiers of the immediate
+/// children, the qualifier nodes being below what they qualify.
+/// \li \c #kXMP_IterJustLeafNodes - Visit just the leaf property nodes and their qualifiers.
+/// \li \c #kXMP_IterJustLeafName - Return just the leaf component of the node names. The default
+/// is to return the full path name.
+/// \li \c #kXMP_IterOmitQualifiers - Do not visit the qualifiers of a node.
+// =================================================================================================
+
+#include "client-glue/WXMPIterator.hpp"
+
+template <class tStringObj> class TXMPIterator {
+
+public:
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Assignment operator, assigns the internal ref and increments the ref count.
+ ///
+ /// Assigns the internal reference from an existing object and increments the reference count on
+ /// the underlying internal XMP iterator.
+ ///
+ /// @param rhs An existing iteration object.
+
+ void operator= ( const TXMPIterator<tStringObj> & rhs );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Copy constructor, creates a client object refering to the same internal object.
+ ///
+ /// Creates a new client iterator that refers to the same underlying iterator as an existing object.
+ ///
+ /// @param original An existing iteration object to copy.
+
+ TXMPIterator ( const TXMPIterator<tStringObj> & original );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Constructs an iterator for properties within a schema in an XMP object.
+ ///
+ /// See the class description for the general operation of an XMP object iterator.
+ /// Overloaded forms are provided to iterate the entire data tree,
+ /// a subtree rooted at a specific node, or properties within a specific schema.
+ ///
+ /// @param xmpObj The XMP object over which to iterate.
+ ///
+ /// @param schemaNS Optional schema namespace URI to restrict the iteration. To visit all of the
+ /// schema, pass 0 or the empty string "".
+ ///
+ /// @param propName Optional property name to restrict the iteration. May be an arbitrary path
+ /// expression. If provided, a schema URI must also be provided. To visit all properties, pass 0
+ /// or the empty string "".
+ ///
+ /// @param options Option flags to control the iteration. A logical OR of these bit flag constants:
+ /// \li \c #kXMP_IterJustChildren - Visit only the immediate children of the root; default visits subtrees.
+ /// \li \c #kXMP_IterJustLeafNodes - Visit only the leaf nodes; default visits all nodes.
+ /// \li \c #kXMP_IterJustLeafName - Return just the leaf part of the path; default returns the full path.
+ /// \li \c #kXMP_IterOmitQualifiers - Omit all qualifiers.
+ ///
+ /// @return The new TXMPIterator object.
+
+ TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Constructs an iterator for a subtree of properties within an XMP object.
+ ///
+ /// See the class description for the general operation of an XMP object iterator. Overloaded
+ /// forms are provided to iterate the entire data tree, a subtree rooted at a specific node, or
+ /// properties within a specific schema.
+ ///
+ /// @param xmpObj The XMP object over which to iterate.
+ ///
+ /// @param schemaNS Optional schema namespace URI to restrict the iteration. To visit all of the
+ /// schema, pass 0 or the empty string "".
+ ///
+ /// @param options Option flags to control the iteration. A logical OR of these bit flag constants:
+ /// \li \c #kXMP_IterJustChildren - Visit only the immediate children of the root; default visits subtrees.
+ /// \li \c #kXMP_IterJustLeafNodes - Visit only the leaf nodes; default visits all nodes.
+ /// \li \c #kXMP_IterJustLeafName - Return just the leaf part of the path; default returns the full path.
+ /// \li \c #kXMP_IterOmitQualifiers - Omit all qualifiers.
+ ///
+ /// @return The new TXMPIterator object.
+
+ TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Constructs an iterator for the entire data tree within an XMP object.
+ ///
+ /// See the class description for the general operation of an XMP object iterator. Overloaded
+ /// forms are provided to iterate the entire data tree, a subtree rooted at a specific node, or
+ /// properties within a specific schema.
+ ///
+ /// @param xmpObj The XMP object over which to iterate.
+ ///
+ /// @param options Option flags to control the iteration. A logical OR of these bit flag constants:
+ /// \li \c #kXMP_IterJustChildren - Visit only the immediate children of the root; default visits subtrees.
+ /// \li \c #kXMP_IterJustLeafNodes - Visit only the leaf nodes; default visits all nodes.
+ /// \li \c #kXMP_IterJustLeafName - Return just the leaf part of the path; default returns the full path.
+ /// \li \c #kXMP_IterOmitQualifiers - Omit all qualifiers.
+ ///
+ /// @return The new \c TXMPIterator object.
+
+ TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Constructs an iterator for the global tables of the XMP toolkit. Not implemented.
+
+ TXMPIterator ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_OptionBits options );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Destructor, typical virtual destructor.
+
+ virtual ~TXMPIterator() throw();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Next() visits the next node in the iteration.
+ ///
+ /// Proceeds to the next node according to the options specified on creation of this object, and
+ /// delivers the schema URI, path, and option flags for the node being visited. If the node is
+ /// simple, it also delivers the value.
+ ///
+ /// @param schemaNS [out] A string object in which to return the assigned the schema namespace
+ /// URI of the current property. Can be null if the value is not wanted.
+ ///
+ /// @param propPath [out] A string object in which to return the XPath name of the current
+ /// property. Can be null if the value is not wanted.
+ ///
+ /// @param propValue [out] A string object in which to return the value of the current
+ /// property. Can be null if the value is not wanted.
+ ///
+ /// @param options [out] A buffer in which to return the flags describing the current property,
+ /// which are a logical OR of \c #XMP_OptionBits bit-flag constants.
+ ///
+ /// @return True if there was another node to visit, false if the iteration is complete.
+
+ bool Next ( tStringObj * schemaNS = 0,
+ tStringObj * propPath = 0,
+ tStringObj * propValue = 0,
+ XMP_OptionBits * options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Skip() skips some portion of the remaining iterations.
+ ///
+ /// @param options Option flags to control the iteration, a logical OR of these bit-flag
+ /// constants:
+ /// \li \c #kXMP_IterSkipSubtree - Skip the subtree below the current node.
+ /// \li \c #kXMP_IterSkipSiblings - Skip the subtree below and remaining siblings of the current node.
+
+ void Skip ( XMP_OptionBits options );
+
+private:
+
+ XMPIteratorRef iterRef;
+
+ TXMPIterator(); // ! Hidden, must choose property or table iteration.
+
+ static void SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen );
+
+}; // class TXMPIterator
+
+// =================================================================================================
+
+#endif // __TXMPIterator_hpp__
diff --git a/gpr/source/lib/xmp_core/public/include/TXMPMeta.hpp b/gpr/source/lib/xmp_core/public/include/TXMPMeta.hpp
new file mode 100644
index 0000000..57aa62a
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/TXMPMeta.hpp
@@ -0,0 +1,1751 @@
+#ifndef __TXMPMeta_hpp__
+#define __TXMPMeta_hpp__ 1
+
+#if ( ! __XMP_hpp__ )
+ #error "Do not directly include, use XMP.hpp"
+#endif
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// =================================================================================================
+/// \file TXMPMeta.hpp
+/// \brief API for access to the XMP Toolkit core services.
+///
+/// \c TXMPMeta is the template class providing the core services of the XMP Toolkit. It must be
+/// instantiated with a string class such as \c std::string. Read the Toolkit Overview for
+/// information about the overall architecture of the XMP API, and the documentation for \c XMP.hpp
+/// for specific instantiation instructions. Please that you MUST NOT derive a class from this class,
+/// consider this class FINAL, use it directly. [1279031]
+///
+/// Access these functions through the concrete class, \c SXMPMeta.
+// =================================================================================================
+
+// =================================================================================================
+/// \class TXMPMeta TXMPMeta.hpp
+/// \brief API for access to the XMP Toolkit core services.
+///
+/// \c TXMPMeta is the template class providing the core services of the XMP Toolkit. It should be
+/// instantiated with a string class such as \c std::string. Read the Toolkit Overview for
+/// information about the overall architecture of the XMP API, and the documentation for \c XMP.hpp
+/// for specific instantiation instructions.
+///
+/// Access these functions through the concrete class, \c SXMPMeta.
+///
+/// You can create \c TXMPMeta objects (also called XMP objects) from metadata that you construct,
+/// or that you obtain from files using the XMP Toolkit's XMPFiles component; see \c TXMPFiles.hpp.
+// =================================================================================================
+
+template <class tStringObj> class TXMPIterator;
+template <class tStringObj> class TXMPUtils;
+
+// -------------------------------------------------------------------------------------------------
+
+template <class tStringObj> class TXMPMeta {
+
+public:
+
+ // =============================================================================================
+ // Initialization and termination
+ // ==============================
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Initialization and termination
+ ///
+ /// @{
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetVersionInfo() retrieves runtime version information.
+ ///
+ /// The header \c XMPVersion.hpp defines a static version number for the XMP Toolkit, which
+ /// describes the version of the API used at client compile time. It is not necessarily the same
+ /// as the runtime version. Do not base runtime decisions on the static version alone; you can,
+ /// however, compare the runtime and static versions.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta). The
+ /// function can be called before calling \c TXMPMeta::Initialize().
+ ///
+ /// @param info [out] A buffer in which to return the version information.
+
+ static void GetVersionInfo ( XMP_VersionInfo * info );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Initialize() explicitly initializes the XMP Toolkit before use. */
+
+ /// Initializes the XMP Toolkit.
+ ///
+ /// Call this function before making any other calls to the \c TXMPMeta functions, except
+ /// \c TXMPMeta::GetVersionInfo().
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+ ///
+ /// @return True on success. */
+ static bool Initialize();
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Terminate() explicitly terminates usage of the XMP Toolkit.
+ ///
+ /// Frees structures created on initialization.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+
+ static void Terminate();
+
+ /// @}
+
+ // =============================================================================================
+ // Constuctors and destructor
+ // ==========================
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Constructors and destructor
+ /// @{
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Default constructor, creates an empty object.
+ ///
+ /// The default constructor creates a new empty \c TXMPMeta object.
+ ///
+ /// @return The new object. */
+ TXMPMeta();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Copy constructor, creates a client object refering to the same internal object.
+ ///
+ /// The copy constructor creates a new \c TXMPMeta object that refers to the same internal XMP
+ /// object. as an existing \c TXMPMeta object.
+ ///
+ /// @param original The object to copy.
+ ///
+ /// @return The new object. */
+
+ TXMPMeta ( const TXMPMeta<tStringObj> & original );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Assignment operator, assigns the internal reference and increments the reference count.
+ ///
+ /// The assignment operator assigns the internal ref from the rhs object and increments the
+ /// reference count on the underlying internal XMP object.
+
+ void operator= ( const TXMPMeta<tStringObj> & rhs );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Reconstructs an XMP object from an internal reference.
+ ///
+ /// This constructor creates a new \c TXMPMeta object that refers to the underlying reference object
+ /// of an existing \c TXMPMeta object. Use to safely pass XMP objects across DLL boundaries.
+ ///
+ /// @param xmpRef The underlying reference object, obtained from some other XMP object with
+ /// \c TXMPMeta::GetInternalRef().
+ ///
+ /// @return The new object.
+
+ TXMPMeta ( XMPMetaRef xmpRef );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Constructs an object and parse one buffer of RDF into it.
+ ///
+ /// This constructor creates a new \c TXMPMeta object and populates it with metadata from a
+ /// buffer containing serialized RDF. This buffer must be a complete RDF parse stream.
+ ///
+ /// The result of passing serialized data to this function is identical to creating an empty
+ /// object then calling \c TXMPMeta::ParseFromBuffer(). To use the constructor, however, the RDF
+ /// must be complete. If you need to parse data from multiple buffers, create an empty object
+ /// and use \c TXMPMeta::ParseFromBuffer().
+ ///
+ /// @param buffer A pointer to the buffer of RDF to be parsed. Can be null if the length is 0;
+ /// in this case, the function creates an empty object.
+ ///
+ /// @param xmpSize The length in bytes of the buffer.
+ ///
+ /// @return The new object.
+
+ TXMPMeta ( XMP_StringPtr buffer,
+ XMP_StringLen xmpSize );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Destructor, typical virtual destructor. */
+ virtual ~TXMPMeta() throw();
+
+ /// @}
+
+ // =============================================================================================
+ // Global state functions
+ // ======================
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Global option flags
+ /// @{
+ /// Global option flags affect the overall behavior of the XMP Toolkit. The available options
+ /// will be declared in \c XMP_Const.h. There are none in this version of the Toolkit.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetGlobalOptions() retrieves the set of global option flags. There are none in
+ /// this version of the Toolkit.
+ ///
+ /// This function is static; you can make the call from the class without instantiating it.
+ ///
+ /// @return A logical OR of global option bit-flag constants.
+
+ static XMP_OptionBits GetGlobalOptions();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetGlobalOptions() updates the set of global option flags. There are none in this
+ /// version of the Toolkit.
+ ///
+ /// The entire set is replaced with the new values. If only one flag is to be modified, use
+ /// \c TXMPMeta::GetGlobalOptions() to obtain the current set, modify the desired flag, then use
+ /// this function to reset the value.
+ ///
+ /// This function is static; you can make the call from the class without instantiating it.
+ ///
+ /// @param options A logical OR of global option bit-flag constants.
+
+ static void SetGlobalOptions ( XMP_OptionBits options );
+
+ /// @}
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Internal data structure dump utilities
+ /// @{
+ ///
+ /// These are debugging utilities that dump internal data structures, to be handled by
+ /// client-defined callback described in \c XMP_Const.h.
+ ///
+ /// @see Member function \c TXMPMeta::DumpObject()
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DumpNamespaces() sends the list of registered namespace URIs and prefixes to a handler.
+ ///
+ /// For debugging. Invokes a client-defined callback for each line of output.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+ ///
+ /// @param outProc The client-defined procedure to handle each line of output.
+ ///
+ /// @param clientData A pointer to client-defined data to pass to the handler.
+ ///
+ /// @return A success-fail status value, returned from the handler. Zero is success, failure
+ /// values are client-defined.
+
+ static XMP_Status DumpNamespaces ( XMP_TextOutputProc outProc,
+ void * clientData );
+
+ /// @}
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Namespace Functions
+ /// @{
+ ///
+ /// Namespaces must be registered before use in namespace URI parameters or path expressions.
+ /// Within the XMP Toolkit the registered namespace URIs and prefixes must be unique. Additional
+ /// namespaces encountered when parsing RDF are automatically registered.
+ ///
+ /// The namespace URI should always end in an XML name separator such as '/' or '#'. This is
+ /// because some forms of RDF shorthand catenate a namespace URI with an element name to form a
+ /// new URI.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c RegisterNamespace() registers a namespace URI with a suggested prefix.
+ ///
+ /// If the URI is not registered but the suggested prefix is in use, a unique prefix is created
+ /// from the suggested one. The actual registered prefix is returned. The function result tells
+ /// if the registered prefix is the suggested one. It is not an error if the URI is already
+ /// registered, regardless of the prefix.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+ ///
+ /// @param namespaceURI The URI for the namespace. Must be a valid XML URI.
+ ///
+ /// @param suggestedPrefix The suggested prefix to be used if the URI is not yet registered.
+ /// Must be a valid XML name.
+ ///
+ /// @param registeredPrefix [out] A string object in which to return the prefix actually
+ /// registered for this URI.
+ ///
+ /// @return True if the registered prefix matches the suggested prefix.
+ ///
+ /// @note No checking is done on either the URI or the prefix. */
+
+ static bool RegisterNamespace ( XMP_StringPtr namespaceURI,
+ XMP_StringPtr suggestedPrefix,
+ tStringObj * registeredPrefix );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetNamespacePrefix() obtains the prefix for a registered namespace URI, and
+ /// reports whether the URI is registered.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+ ///
+ /// @param namespaceURI The URI for the namespace. Must not be null or the empty string. It is
+ /// not an error if the namespace URI is not registered.
+ ///
+ /// @param namespacePrefix [out] A string object in which to return the prefix registered for
+ /// this URI, with a terminating colon character, ':'. If the namespace is not registered, this
+ /// string is not modified.
+ ///
+ /// @return True if the namespace URI is registered.
+
+ static bool GetNamespacePrefix ( XMP_StringPtr namespaceURI,
+ tStringObj * namespacePrefix );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetNamespaceURI() obtains the URI for a registered namespace prefix, and reports
+ /// whether the prefix is registered.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+ ///
+ /// @param namespacePrefix The prefix for the namespace. Must not be null or the empty string.
+ /// It is not an error if the namespace prefix is not registered.
+ ///
+ /// @param namespaceURI [out] A string object in which to return the URI registered for this
+ /// prefix. If the prefix is not registered, this string is not modified.
+ ///
+ /// @return True if the namespace prefix is registered.
+
+ static bool GetNamespaceURI ( XMP_StringPtr namespacePrefix,
+ tStringObj * namespaceURI );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Not implemented.
+ ///
+ /// Deletes a namespace from the registry. Does nothing if the URI is not registered, or if the
+ /// parameter is null or the empty string.
+ ///
+ /// This function is static; make the call directly from the concrete class (\c SXMPMeta).
+ ///
+ /// @param namespaceURI The URI for the namespace.
+
+ static void DeleteNamespace ( XMP_StringPtr namespaceURI );
+
+ /// @}
+
+ // =============================================================================================
+ // Basic property manipulation functions
+ // =====================================
+
+ // *** Should add discussion of schemaNS and propName prefix usage.
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Accessing property values
+ /// @{
+ ///
+ /// The property value accessors all take a property specification; the top level namespace URI
+ /// (the "schema" namespace) and the basic name of the property being referenced. See the
+ /// introductory discussion of path expression usage for more information.
+ ///
+ /// The accessor functions return true if the specified property exists. If it does, output
+ /// parameters return the value (if any) and option flags describing the property. The option
+ /// bit-flag constants that describe properties are \c kXMP_PropXx and
+ /// \c kXMP_ArrayIsXx. See \c #kXMP_PropValueIsURI and following, and macros \c #XMP_PropIsSimple
+ /// and following in \c XMP_Const.h. If the property exists and has a value, it is returned as a
+ /// Unicode string in UTF-8 encoding. Arrays and the non-leaf levels of structs do not have
+ /// values.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty() reports whether a property exists, and retrieves its value.
+ ///
+ /// This is the simplest property accessor. Use this to retrieve the values of top-level simple
+ /// properties, or after using the path composition functions in \c TXMPUtils.
+ ///
+ /// When specifying a namespace and path (in this and all other accessors):
+ /// \li If a namespace URI is specified, it must be for a registered namespace.
+ /// \li If the namespace is specified only by a prefix in the property name path,
+ /// it must be a registered prefix.
+ /// \li If both a URI and path prefix are present, they must be corresponding
+ /// parts of a registered namespace.
+ ///
+ /// @param schemaNS The namespace URI for the property. The URI must be for a registered
+ /// namespace. Must not be null or the empty string.
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string. The first component can be a namespace prefix; if present without a
+ /// \c schemaNS value, the prefix specifies the namespace. The prefix must be for a registered
+ /// namespace, and if a namespace URI is specified, must match the registered prefix for that
+ /// namespace.
+ ///
+ /// @param propValue [out] A string object in which to return the value of the property, if the
+ /// property exists and has a value. Arrays and non-leaf levels of structs do not have values.
+ /// Can be null if the value is not wanted.
+ ///
+ /// @param options A buffer in which to return option flags describing the property. Can be null
+ /// if the flags are not wanted.
+ ///
+ /// @return True if the property exists.
+
+ bool GetProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ tStringObj * propValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetArrayItem() provides access to items within an array.
+ ///
+ /// Reports whether the item exists; if it does, and if it has a value, the function retrieves
+ /// the value. Items are accessed by an integer index, where the first item has index 1.
+ ///
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem
+ /// to specify the last existing array item.
+ ///
+ /// @param itemValue [out] A string object in which to return the value of the array item, if it
+ /// has a value. Arrays and non-leaf levels of structs do not have values. Can be null if the
+ /// value is not wanted.
+ ///
+ /// @param options [out] A buffer in which to return the option flags describing the array item.
+ /// Can be null if the flags are not wanted.
+ ///
+ /// @return True if the array item exists.
+
+ bool GetArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ tStringObj * itemValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetStructField() provides access to fields within a nested structure.
+ ///
+ /// Reports whether the field exists; if it does, and if it has a value, the function retrieves
+ /// the value.
+ ///
+ /// @param schemaNS The namespace URI for the struct; see \c GetProperty().
+ ///
+ /// @param structName The name of the struct. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param fieldNS The namespace URI for the field. Same URI and prefix usage as the \c schemaNS
+ /// and \c structName parameters.
+ ///
+ /// @param fieldName The name of the field. Must be a single XML name, must not be null or the
+ /// empty string. Same URI and prefix usage as the \c schemaNS and \c structName parameters.
+ ///
+ /// @param fieldValue [out] A string object in which to return the value of the field, if the
+ /// field has a value. Arrays and non-leaf levels of structs do not have values. Can be null if
+ /// the value is not wanted.
+ ///
+ /// @param options [out] A buffer in which to return the option flags describing the field. Can
+ /// be null if the flags are not wanted.
+ ///
+ /// @return True if the field exists.
+
+ bool GetStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ tStringObj * fieldValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetQualifier() provides access to a qualifier attached to a property.
+ ///
+ /// @note In this version of the Toolkit, qualifiers are supported only for simple leaf properties.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property to which the qualifier is attached. Can be a
+ /// general path expression, must not be null or the empty string; see \c GetProperty() for
+ /// namespace prefix usage.
+ ///
+ /// @param qualNS The namespace URI for the qualifier. Same URI and prefix usage as the
+ /// \c schemaNS and \c propName parameters.
+ ///
+ /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or
+ /// the empty string. Same URI and prefix usage as the \c schemaNS and \c propName parameters.
+ ///
+ /// @param qualValue [out] A string object in which to return the value of the qualifier, if the
+ /// qualifier has a value. Arrays and non-leaf levels of structs do not have values. Can be null
+ /// if the value is not wanted.
+ ///
+ /// @param options [out] A buffer in which to return the option flags describing the qualifier.
+ /// Can be null if the flags are not wanted.
+ ///
+ /// @return True if the qualifier exists.
+
+ bool GetQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ tStringObj * qualValue,
+ XMP_OptionBits * options ) const;
+
+ /// @}
+
+ // =============================================================================================
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Creating properties and setting their values
+ /// @{
+ ///
+ /// These functions all take a property specification; the top level namespace URI (the "schema"
+ /// namespace) and the basic name of the property being referenced. See the introductory
+ /// discussion of path expression usage for more information.
+ ///
+ /// All of the functions take a UTF-8 encoded Unicode string for the property value. Arrays and
+ /// non-leaf levels of structs do not have values. The value can be passed as an
+ /// \c #XMP_StringPtr (a pointer to a null-terminated string), or as a string object
+ /// (\c tStringObj).
+
+ /// Each function takes an options flag that describes the property. You can use these functions
+ /// to create empty arrays and structs by setting appropriate option flags. When you assign a
+ /// value, all levels of a struct that are implicit in the assignment are created if necessary.
+ /// \c TXMPMeta::AppendArrayItem() implicitly creates the named array if necessary.
+ ///
+ /// The allowed option bit-flags include:
+ /// \li \c #kXMP_PropValueIsStruct - Can be used to create an empty struct.
+ /// A struct is implicitly created when the first field is set.
+ /// \li \c #kXMP_PropValueIsArray - By default, a general unordered array (bag).
+ /// \li \c #kXMP_PropArrayIsOrdered - An ordered array.
+ /// \li \c #kXMP_PropArrayIsAlternate - An alternative array.
+ /// \li \c #kXMP_PropArrayIsAltText - An alt-text array. Each array element must
+ /// be a simple property with an \c xml:lang attribute.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty() creates or sets a property value.
+ ///
+ /// This is the simplest property setter. Use it for top-level simple properties, or after using
+ /// the path composition functions in \c TXMPUtils.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param propValue The new value, a pointer to a null terminated UTF-8 string. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
+ ///
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
+
+ void SetProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr propValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty() creates or sets a property value using a string object.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object
+ /// for the item value. It is otherwise identical; see details in the canonical form.
+
+ void SetProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ const tStringObj & propValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetArrayItem() creates or sets the value of an item within an array.
+ ///
+ /// Items are accessed by an integer index, where the first item has index 1. This function
+ /// creates the item if necessary, but the array itself must already exist Use
+ /// \c AppendArrayItem() to create arrays. A new item is automatically appended if the index is the
+ /// array size plus 1. To insert a new item before or after an existing item, use option flags.
+ ///
+ /// Use \c TXMPUtils::ComposeArrayItemPath() to create a complex path.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem
+ /// to specify the last existing array item.
+ ///
+ /// @param itemValue The new item value, a null-terminated UTF-8 string, if the array item has a
+ /// value.
+ ///
+ /// @param options Option flags describing the array type and insertion location for a new item;
+ /// a logical OR of allowed bit-flag constants. The type, if specified, must match the existing
+ /// array type, \c #kXMP_PropArrayIsOrdered, \c #kXMP_PropArrayIsAlternate, or
+ /// \c #kXMP_PropArrayIsAltText. Default (0 or \c #kXMP_NoOptions) matches the existing array type.
+ ///
+ /// To insert a new item before or after the specified index, set flag \c #kXMP_InsertBeforeItem
+ /// or \c #kXMP_InsertAfterItem.
+
+ void SetArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetArrayItem() creates or sets the value of an item within an array using a string object.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object in which to
+ /// return the item value. It is otherwise identical; see details in the canonical form.
+
+ void SetArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ const tStringObj & itemValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c AppendArrayItem() adds an item to an array, creating the array if necessary.
+ ///
+ /// This function simplifies construction of an array by not requiring that you pre-create an
+ /// empty array. The array that is assigned is created automatically if it does not yet exist.
+ /// If the array exists, it must have the form specified by the options. Each call appends a new
+ /// item to the array.
+ ///
+ /// Use \c TXMPUtils::ComposeArrayItemPath() to create a complex path.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param arrayOptions Option flags describing the array type to create; a logical OR of
+ /// allowed bit-flag constants, \c #kXMP_PropArrayIsOrdered, \c #kXMP_PropArrayIsAlternate, or
+ /// \c #kXMP_PropArrayIsAltText. If the array exists, must match the existing array type or be
+ /// null (0 or \c #kXMP_NoOptions).
+ ///
+ /// @param itemValue The new item value, a null-terminated UTF-8 string, if the array item has a
+ /// value.
+ ///
+ /// @param itemOptions Option flags describing the item type to create; one of the bit-flag
+ /// constants \c #kXMP_PropValueIsArray or \c #kXMP_PropValueIsStruct to create a complex array
+ /// item.
+
+ void AppendArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits arrayOptions,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits itemOptions = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c AppendArrayItem() adds an item to an array using a string object value, creating
+ /// the array if necessary.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object in which to
+ /// return the item value. It is otherwise identical; see details in the canonical form.
+
+ void AppendArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits arrayOptions,
+ const tStringObj & itemValue,
+ XMP_OptionBits itemOptions = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetStructField() creates or sets the value of a field within a nested structure.
+ ///
+ /// Use this to set a value within an existing structure, create a new field within an existing
+ /// structure, or create an empty structure of any depth. If you set a field in a structure that
+ /// does not exist, the structure is automatically created.
+ ///
+ /// Use \c TXMPUtils::ComposeStructFieldPath() to create a complex path.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param structName The name of the struct. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param fieldNS The namespace URI for the field. Same namespace and prefix usage as
+ /// \c GetProperty().
+ ///
+ /// @param fieldName The name of the field. Must be a single XML name, must not be null or the
+ /// empty string. Same namespace and prefix usage as \c GetProperty().
+ ///
+ /// @param fieldValue The new value, a null-terminated UTF-8 string, if the field has a value.
+ /// Null to create a new, empty struct or empty field in an existing struct.
+ ///
+ /// @param options Option flags describing the property, in which the bit-flag
+ /// \c #kXMP_PropValueIsStruct must be set to create a struct.
+
+ void SetStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ XMP_StringPtr fieldValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetStructField() creates or sets the value of a field within a nested structure,
+ /// using a string object.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object in which to
+ /// return the field value. It is otherwise identical; see details in the canonical form.
+
+ void SetStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ const tStringObj & fieldValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetQualifier() creates or sets a qualifier attached to a property.
+ ///
+ /// Use this to set a value for an existing qualifier, or create a new qualifier. <<how do
+ /// options work? macro vs bit-flag? interaction w/XMP_PropHasQualifier?>> Use
+ /// \c TXMPUtils::ComposeQualifierPath() to create a complex path.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property to which the qualifier is attached. Can be a
+ /// general path expression, must not be null or the empty string; see \c GetProperty() for
+ /// namespace prefix usage.
+ ///
+ /// @param qualNS The namespace URI for the qualifier. Same namespace and prefix usage as
+ /// \c GetProperty().
+ ///
+ /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or
+ /// the empty string. Same namespace and prefix usage as \c GetProperty().
+ ///
+ /// @param qualValue The new value, a null-terminated UTF-8 string, if the qualifier has a
+ /// value. Null to create a new, empty qualifier.
+ ///
+ /// @param options Option flags describing the <<qualified property? qualifier?>>, a logical OR
+ /// of property-type bit-flag constants. Use the macro \c #XMP_PropIsQualifier to create a
+ /// qualifier. <<??>>
+
+ void SetQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ XMP_StringPtr qualValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetQualifier() creates or sets a qualifier attached to a property using a string object.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object
+ /// for the qualifier value. It is otherwise identical; see details in the canonical form.
+
+ void SetQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ const tStringObj & qualValue,
+ XMP_OptionBits options = 0 );
+
+ /// @}
+
+ // =============================================================================================
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Detecting and deleting properties.
+ /// @{
+ ///
+ /// The namespace URI and prefix usage for property specifiers in these functions is the same as
+ /// for \c TXMPMeta::GetProperty().
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DeleteProperty() deletes an XMP subtree rooted at a given property.
+ ///
+ /// It is not an error if the property does not exist.
+ ///
+ /// @param schemaNS The namespace URI for the property; see \c GetProperty().
+ ///
+ /// @param propName The name of the property; see \c GetProperty().
+
+ void DeleteProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DeleteArrayItem() deletes an XMP subtree rooted at a given array item.
+ ///
+ /// It is not an error if the array item does not exist. Use
+ /// \c TXMPUtils::ComposeArrayItemPath() to create a complex path.
+ ///
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem
+ /// to specify the last existing array item.
+
+ void DeleteArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DeleteStructField() deletes an XMP subtree rooted at a given struct field.
+ ///
+ /// It is not an error if the field does not exist.
+ ///
+ /// @param schemaNS The namespace URI for the struct; see \c GetProperty().
+ ///
+ /// @param structName The name of the struct. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param fieldNS The namespace URI for the field. Same namespace and prefix usage as
+ /// \c GetProperty().
+ ///
+ /// @param fieldName The name of the field. Must be a single XML name, must not be null or the
+ /// empty string. Same namespace and prefix usage as \c GetProperty().
+
+ void DeleteStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DeleteQualifier() deletes an XMP subtree rooted at a given qualifier.
+ ///
+ /// It is not an error if the qualifier does not exist.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property to which the qualifier is attached. Can be a
+ /// general path expression, must not be null or the empty string; see \c GetProperty() for
+ /// namespace prefix usage.
+ ///
+ /// @param qualNS The namespace URI for the qualifier. Same namespace and prefix usage as
+ /// \c GetProperty().
+ ///
+ /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or
+ /// the empty string. Same namespace and prefix usage as \c GetProperty().
+
+ void DeleteQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DoesPropertyExist() reports whether a property currently exists.
+ ///
+ /// @param schemaNS The namespace URI for the property; see \c GetProperty().
+ ///
+ /// @param propName The name of the property; see \c GetProperty().
+ ///
+ /// @return True if the property exists.
+
+ bool DoesPropertyExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DoesArrayItemExist() reports whether an array item currently exists.
+ ///
+ /// Use \c TXMPUtils::ComposeArrayItemPath() to create a complex path.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param itemIndex The 1-based index of the desired item. Use the macro \c #kXMP_ArrayLastItem
+ /// to specify the last existing array item.
+ ///
+ /// @return True if the array item exists.
+
+ bool DoesArrayItemExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DoesStructFieldExist() reports whether a struct field currently exists.
+ ///
+ /// Use \c TXMPUtils::ComposeStructFieldPath() to create a complex path.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param structName The name of the struct. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param fieldNS The namespace URI for the field. Same namespace and prefix usage as
+ /// \c GetProperty().
+ ///
+ /// @param fieldName The name of the field. Must be a single XML name, must not be null or the
+ /// empty string. Same namespace and prefix usage as \c GetProperty().
+ ///
+ /// @return True if the field exists.
+
+ bool DoesStructFieldExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DoesQualifierExist() reports whether a qualifier currently exists.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property to which the qualifier is attached. Can be a
+ /// general path expression, must not be null or the empty string; see \c GetProperty() for
+ /// namespace prefix usage.
+ ///
+ /// @param qualNS The namespace URI for the qualifier. Same namespace and prefix usage as
+ /// \c GetProperty().
+ ///
+ /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or
+ /// the empty string. Same namespace and prefix usage as \c GetProperty().
+ ///
+ /// @return True if the qualifier exists.
+
+ bool DoesQualifierExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName ) const;
+
+ /// @}
+
+ // =============================================================================================
+ // Specialized Get and Set functions
+ // =============================================================================================
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Accessing properties as binary values.
+ /// @{
+ ///
+ /// These are very similar to \c TXMPMeta::GetProperty() and \c TXMPMeta::SetProperty(), except
+ /// that the value is returned or provided in binary form instead of as a UTF-8 string.
+ /// \c TXMPUtils provides functions for converting between binary and string values.
+ /// Use the path composition functions in \c TXMPUtils to compose complex path expressions
+ /// for fields or items in nested structures or arrays, or for qualifiers.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty_Bool() retrieves the value of a Boolean property as a C++ bool.
+ ///
+ /// Reports whether a property exists, and retrieves its binary value and property type information.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param propValue [out] A buffer in which to return the binary value. Can be null if the
+ /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have
+ /// values.
+ ///
+ /// @param options [out] A buffer in which to return the option flags describing the property, a
+ /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can
+ /// be null if flags are not wanted.
+ ///
+ /// @return True if the property exists.
+
+ bool GetProperty_Bool ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ bool * propValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty_Int() retrieves the value of an integer property as a C long integer.
+ ///
+ /// Reports whether a property exists, and retrieves its binary value and property type information.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param propValue [out] A buffer in which to return the binary value. Can be null if the
+ /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have
+ /// values.
+ ///
+ /// @param options [out] A buffer in which to return the option flags describing the property, a
+ /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can
+ /// be null if flags are not wanted.
+ ///
+ /// @return True if the property exists.
+
+ bool GetProperty_Int ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int32 * propValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty_Int64() retrieves the value of an integer property as a C long long integer.
+ ///
+ /// Reports whether a property exists, and retrieves its binary value and property type information.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param propValue [out] A buffer in which to return the binary value. Can be null if the
+ /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have
+ /// values.
+ ///
+ /// @param options [out] A buffer in which to return the option flags describing the property, a
+ /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can
+ /// be null if flags are not wanted.
+ ///
+ /// @return True if the property exists.
+
+ bool GetProperty_Int64 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int64 * propValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty_Float() retrieves the value of a floating-point property as a C double float.
+ ///
+ /// Reports whether a property exists, and retrieves its binary value and property type information.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param propValue [out] A buffer in which to return the binary value. Can be null if the
+ /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have
+ /// values.
+ ///
+ /// @param options [out] A buffer in which to return the option flags describing the property, a
+ /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can
+ /// be null if flags are not wanted.
+ ///
+ /// @return True if the property exists.
+
+ bool GetProperty_Float ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ double * propValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetProperty_Date() retrieves the value of a date-time property as an \c #XMP_DateTime structure.
+ ///
+ /// Reports whether a property exists, and retrieves its binary value and property type information.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param propValue [out] A buffer in which to return the binary value. Can be null if the
+ /// value is not wanted. Must be null for arrays and non-leaf levels of structs that do not have
+ /// values.
+ ///
+ /// @param options [out] A buffer in which to return the option flags describing the property, a
+ /// logical OR of allowed bit-flag constants; see \c #kXMP_PropValueIsStruct and following. Can
+ /// be null if flags are not wanted.
+ ///
+ /// @return True if the property exists.
+
+ bool GetProperty_Date ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_DateTime * propValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty_Bool() sets the value of a Boolean property using a C++ bool.
+ ///
+ /// Sets a property with a binary value, creating it if necessary.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param propValue The new binary value. Can be null if creating the property. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
+ ///
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
+
+ void SetProperty_Bool ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ bool propValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty_Int() sets the value of an integer property using a C long integer.
+ ///
+ /// Sets a property with a binary value, creating it if necessary.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param propValue The new binary value. Can be null if creating the property. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
+ ///
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
+
+ void SetProperty_Int ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int32 propValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty_Int64() sets the value of an integer property using a C long long integer.
+ ///
+ /// Sets a property with a binary value, creating it if necessary.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param propValue The new binary value. Can be null if creating the property. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
+ ///
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
+
+ void SetProperty_Int64 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int64 propValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty_Float() sets the value of a floating-point property using a C double float.
+ ///
+ /// Sets a property with a binary value, creating it if necessary.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param propValue The new binary value. Can be null if creating the property. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
+ ///
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
+
+ void SetProperty_Float ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ double propValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetProperty_Date() sets the value of a date/time property using an \c #XMP_DateTime structure.
+ ///
+ /// Sets a property with a binary value, creating it if necessary.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param propValue The new binary value. Can be null if creating the property. Must be null
+ /// for arrays and non-leaf levels of structs that do not have values.
+ ///
+ /// @param options Option flags describing the property; a logical OR of allowed bit-flag
+ /// constants; see \c #kXMP_PropValueIsStruct and following. Must match the type of a property
+ /// that already exists.
+
+ void SetProperty_Date ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ const XMP_DateTime & propValue,
+ XMP_OptionBits options = 0 );
+
+ /// @}
+ // =============================================================================================
+ /// \name Accessing localized text (alt-text) properties.
+ /// @{
+ ///
+ /// Localized text properties are stored in alt-text arrays. They allow multiple concurrent
+ /// localizations of a property value, for example a document title or copyright in several
+ /// languages.
+ ///
+ /// These functions provide convenient support for localized text properties, including a
+ /// number of special and obscure aspects. The most important aspect of these functions is that
+ /// they select an appropriate array item based on one or two RFC 3066 language tags. One of
+ /// these languages, the "specific" language, is preferred and selected if there is an exact
+ /// match. For many languages it is also possible to define a "generic" language that can be
+ /// used if there is no specific language match. The generic language must be a valid RFC 3066
+ /// primary subtag, or the empty string.
+ ///
+ /// For example, a specific language of "en-US" should be used in the US, and a specific
+ /// language of "en-UK" should be used in England. It is also appropriate to use "en" as the
+ /// generic language in each case. If a US document goes to England, the "en-US" title is
+ /// selected by using the "en" generic language and the "en-UK" specific language.
+ ///
+ /// It is considered poor practice, but allowed, to pass a specific language that is just an
+ /// RFC 3066 primary tag. For example "en" is not a good specific language, it should only be
+ /// used as a generic language. Passing "i" or "x" as the generic language is also considered
+ /// poor practice but allowed.
+ ///
+ /// Advice from the W3C about the use of RFC 3066 language tags can be found at:
+ /// \li http://www.w3.org/International/articles/language-tags/
+ ///
+ /// \note RFC 3066 language tags must be treated in a case insensitive manner. The XMP toolkit
+ /// does this by normalizing their capitalization:
+ /// \li The primary subtag is lower case, the suggested practice of ISO 639.
+ /// \li All 2 letter secondary subtags are upper case, the suggested practice of ISO 3166.
+ /// \li All other subtags are lower case.
+ ///
+ /// The XMP specification defines an artificial language, "x-default", that is used to
+ /// explicitly denote a default item in an alt-text array. The XMP toolkit normalizes alt-text
+ /// arrays such that the x-default item is the first item. The \c SetLocalizedText() function
+ /// has several special features related to the x-default item, see its description for details.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetLocalizedText() retrieves information about a selected item in an alt-text array.
+ ///
+ /// The array item is selected according to these rules:
+ /// \li Look for an exact match with the specific language.
+ /// \li If a generic language is given, look for a partial match.
+ /// \li Look for an x-default item.
+ /// \li Choose the first item.
+ ///
+ /// A partial match with the generic language is where the start of the item's language matches
+ /// the generic string and the next character is '-'. An exact match is also recognized as a
+ /// degenerate case.
+ ///
+ /// You can pass "x-default" as the specific language. In this case, selection of an
+ /// \c x-default item is an exact match by the first rule, not a selection by the 3rd rule. The
+ /// last 2 rules are fallbacks used when the specific and generic languages fail to produce a
+ /// match.
+ ///
+ /// The return value reports whether a match was successfully made.
+ ///
+ /// @param schemaNS The namespace URI for the alt-text array; see \c GetProperty().
+ ///
+ /// @param altTextName The name of the alt-text array. Can be a general path expression, must
+ /// not be null or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param genericLang The name of the generic language as an RFC 3066 primary subtag. Can be
+ /// null or the empty string if no generic language is wanted.
+ ///
+ /// @param specificLang The name of the specific language as an RFC 3066 tag, or "x-default".
+ /// Must not be null or the empty string.
+ ///
+ /// @param actualLang [out] A string object in which to return the language of the selected
+ /// array item, if an appropriate array item is found. Can be null if the language is not wanted.
+ ///
+ /// @param itemValue [out] A string object in which to return the value of the array item, if an
+ /// appropriate array item is found. Can be null if the value is not wanted.
+ ///
+ /// @param options A buffer in which to return the option flags that describe the array item, if
+ /// an appropriate array item is found. Can be null if the flags are not wanted.
+ ///
+ /// @return True if an appropriate array item exists.
+
+ bool GetLocalizedText ( XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ tStringObj * actualLang,
+ tStringObj * itemValue,
+ XMP_OptionBits * options ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetLocalizedText() modifies the value of a selected item in an alt-text array.
+ ///
+ /// Creates an appropriate array item if necessary, and handles special cases for the x-default
+ /// item.
+ ///
+ /// The array item is selected according to these rules:
+ /// \li Look for an exact match with the specific language.
+ /// \li If a generic language is given, look for a partial match.
+ /// \li Look for an x-default item.
+ /// \li Choose the first item.
+ ///
+ /// A partial match with the generic language is where the start of the item's language matches
+ /// the generic string and the next character is '-'. An exact match is also recognized as a
+ /// degenerate case.
+ ///
+ /// You can pass "x-default" as the specific language. In this case, selection of an
+ /// \c x-default item is an exact match by the first rule, not a selection by the 3rd rule. The
+ /// last 2 rules are fallbacks used when the specific and generic languages fail to produce a
+ /// match.
+ ///
+ /// Item values are modified according to these rules:
+ ///
+ /// \li If the selected item is from a match with the specific language, the value of that
+ /// item is modified. If the existing value of that item matches the existing value of the
+ /// x-default item, the x-default item is also modified. If the array only has 1 existing item
+ /// (which is not x-default), an x-default item is added with the given value.
+ ///
+ /// \li If the selected item is from a match with the generic language and there are no other
+ /// generic matches, the value of that item is modified. If the existing value of that item
+ /// matches the existing value of the x-default item, the x-default item is also modified. If
+ /// the array only has 1 existing item (which is not x-default), an x-default item is added
+ /// with the given value.
+ ///
+ /// \li If the selected item is from a partial match with the generic language and there are
+ /// other partial matches, a new item is created for the specific language. The x-default item
+ /// is not modified.
+ ///
+ /// \li If the selected item is from the last 2 rules then a new item is created for the
+ /// specific language. If the array only had an x-default item, the x-default item is also
+ /// modified. If the array was empty, items are created for the specific language and
+ /// x-default.
+ ///
+ /// @param schemaNS The namespace URI for the alt-text array; see \c GetProperty().
+ ///
+ /// @param altTextName The name of the alt-text array. Can be a general path expression, must
+ /// not be null or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param genericLang The name of the generic language as an RFC 3066 primary subtag. Can be
+ /// null or the empty string if no generic language is wanted.
+ ///
+ /// @param specificLang The name of the specific language as an RFC 3066 tag, or "x-default".
+ /// Must not be null or the empty string.
+ ///
+ /// @param itemValue The new value for the matching array item, specified as a null-terminated
+ /// UTF-8 string.
+ ///
+ /// @param options Option flags, none currently defined.
+
+ void SetLocalizedText ( XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetLocalizedText() modifies the value of a selected item in an alt-text array using
+ /// a string object.
+ ///
+ /// Creates an appropriate array item if necessary, and handles special cases for the x-default
+ /// item.
+ ///
+ /// The array item is selected according to these rules:
+ /// \li Look for an exact match with the specific language.
+ /// \li If a generic language is given, look for a partial match.
+ /// \li Look for an x-default item.
+ /// \li Choose the first item.
+ ///
+ /// A partial match with the generic language is where the start of the item's language matches
+ /// the generic string and the next character is '-'. An exact match is also recognized as a
+ /// degenerate case.
+ ///
+ /// You can pass "x-default" as the specific language. In this case, selection of an \c x-default
+ /// item is an exact match by the first rule, not a selection by the 3rd rule. The last 2 rules
+ /// are fallbacks used when the specific and generic languages fail to produce a match.
+ ///
+ /// Item values are modified according to these rules:
+ ///
+ /// \li If the selected item is from a match with the specific language, the value of that
+ /// item is modified. If the existing value of that item matches the existing value of the
+ /// x-default item, the x-default item is also modified. If the array only has 1 existing item
+ /// (which is not x-default), an x-default item is added with the given value.
+ ///
+ /// \li If the selected item is from a match with the generic language and there are no other
+ /// generic matches, the value of that item is modified. If the existing value of that item
+ /// matches the existing value of the x-default item, the x-default item is also modified. If
+ /// the array only has 1 existing item (which is not x-default), an x-default item is added
+ /// with the given value.
+ ///
+ /// \li If the selected item is from a partial match with the generic language and there are
+ /// other partial matches, a new item is created for the specific language. The x-default item
+ /// is not modified.
+ ///
+ /// \li If the selected item is from the last 2 rules then a new item is created for the
+ /// specific language. If the array only had an x-default item, the x-default item is also
+ /// modified. If the array was empty, items are created for the specific language and
+ /// x-default.
+ ///
+ /// @param schemaNS The namespace URI for the alt-text array; see \c GetProperty().
+ ///
+ /// @param altTextName The name of the alt-text array. Can be a general path expression, must
+ /// not be null or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param genericLang The name of the generic language as an RFC 3066 primary subtag. Can be
+ /// null or the empty string if no generic language is wanted.
+ ///
+ /// @param specificLang The name of the specific language as an RFC 3066 tag, or "x-default".
+ /// Must not be null or the empty string.
+ ///
+ /// @param itemValue The new value for the matching array item, specified as a string object.
+ ///
+ /// @param options Option flags, none currently defined.
+
+ void SetLocalizedText ( XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ const tStringObj & itemValue,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DeleteLocalizedText() deletes specific language alternatives from an alt-text array.
+ ///
+ /// The rules for finding the language value to delete are similar to those for \c #SetLocalizedText().
+ ///
+ /// @param schemaNS The namespace URI for the alt-text array; see \c #GetProperty().
+ ///
+ /// @param altTextName The name of the alt-text array. Can be a general path expression, must
+ /// not be null or the empty string; see \c #GetProperty() for namespace prefix usage.
+ ///
+ /// @param genericLang The name of the generic language as an RFC 3066 primary subtag. Can be
+ /// null or the empty string if no generic language is wanted.
+ ///
+ /// @param specificLang The name of the specific language as an RFC 3066 tag, or "x-default".
+ /// Must not be null or the empty string.
+ ///
+ void
+ DeleteLocalizedText ( XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang );
+
+ /// @}
+
+ // =============================================================================================
+ /// \name Creating and reading serialized RDF.
+ /// @{
+ ///
+ /// The metadata contained in an XMP object must be serialized as RDF for storage in an XMP
+ /// packet and output to a file. Similarly, metadata in the form of serialized RDF (such as
+ /// metadata read from a file using \c TXMPFiles) must be parsed into an XMP object for
+ /// manipulation with the XMP Toolkit.
+ ///
+ /// These functions support parsing serialized RDF into an XMP object, and serializing an XMP
+ /// object into RDF. The input for parsing can be any valid Unicode encoding. ISO Latin-1 is
+ /// also recognized, but its use is strongly discouraged. Serialization is always as UTF-8.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ParseFromBuffer() parses RDF from a series of input buffers into this XMP object.
+ ///
+ /// Use this to convert metadata from serialized RDF form (as, for example, read from an XMP
+ /// packet embedded in a file) into an XMP object that you can manipulate with the XMP Toolkit.
+ /// If this XMP object is empty and the input buffer contains a complete XMP packet, this is the
+ /// same as creating a new XMP object from that buffer with the constructor.
+ ///
+ /// You can use this function to combine multiple buffers into a single metadata tree. To
+ /// terminate an input loop conveniently, pass the option \c #kXMP_ParseMoreBuffers for all
+ /// real input, then make a final call with a zero length and \c #kXMP_NoOptions. The buffers
+ /// can be any length. The buffer boundaries need not respect XML tokens or even Unicode
+ /// characters.
+ ///
+ /// @param buffer A pointer to a buffer of input. Can be null if \c bufferSize is 0.
+ ///
+ /// @param bufferSize The length of the input buffer in bytes. Zero is a valid value.
+ ///
+ /// @param options An options flag that controls how the parse operation is performed. A logical
+ /// OR of these bit-flag constants:
+ /// \li \c #kXMP_ParseMoreBuffers - This is not the last buffer of input, more calls follow.
+ /// \li \c #kXMP_RequireXMPMeta - The \c x:xmpmeta XML element is required around \c rdf:RDF.
+ ///
+ /// @see \c TXMPFiles::GetXMP()
+
+ void ParseFromBuffer ( XMP_StringPtr buffer,
+ XMP_StringLen bufferSize,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.
+ ///
+ /// Use this to prepare metadata for storage as an XMP packet embedded in a file. See \c TXMPFiles::PutXMP().
+ ///
+ /// @param rdfString [out] A string object in which to return the serialized RDF. Must not be null.
+ ///
+ /// @param options An options flag that controls how the serialization operation is performed.
+ /// The specified options must be logically consistent; an exception is thrown if they are not.
+ /// A logical OR of these bit-flag constants:
+ /// \li \c kXMP_OmitPacketWrapper - Do not include an XML packet wrapper. This cannot be
+ /// specified together with \c #kXMP_ReadOnlyPacket, \c #kXMP_IncludeThumbnailPad, or
+ /// \c #kXMP_ExactPacketLength.
+ /// \li \c kXMP_ReadOnlyPacket - Create a read-only XML packet wapper. Cannot be specified
+ /// together with \c kXMP_OmitPacketWrapper.
+ /// \li \c kXMP_UseCompactFormat - Use a highly compact RDF syntax and layout.
+ /// \li \c kXMP_IncludeThumbnailPad - Include typical space for a JPEG thumbnail in the
+ /// padding if no \c xmp:Thumbnails property is present. Cannot be specified together with
+ /// \c kXMP_OmitPacketWrapper.
+ /// \li \c kXMP_ExactPacketLength - The padding parameter provides the overall packet length.
+ /// The actual amount of padding is computed. An exception is thrown if the packet exceeds
+ /// this length with no padding. Cannot be specified together with
+ /// \c kXMP_OmitPacketWrapper.
+ ///
+ /// In addition to the above options, you can include one of the following encoding options:
+ /// \li \c #kXMP_EncodeUTF8 - Encode as UTF-8, the default.
+ /// \li \c #kXMP_EncodeUTF16Big - Encode as big-endian UTF-16.
+ /// \li \c #kXMP_EncodeUTF16Little - Encode as little-endian UTF-16.
+ /// \li \c #kXMP_EncodeUTF32Big - Encode as big-endian UTF-32.
+ /// \li \c #kXMP_EncodeUTF32Little - Encode as little-endian UTF-32.
+ ///
+ /// @param padding The amount of padding to be added if a writeable XML packet is created. If
+ /// zero (the default) an appropriate amount of padding is computed.
+ ///
+ /// @param newline The string to be used as a line terminator. If empty, defaults to linefeed,
+ /// U+000A, the standard XML newline.
+ ///
+ /// @param indent The string to be used for each level of indentation in the serialized RDF. If
+ /// empty, defaults to two ASCII spaces, U+0020.
+ ///
+ /// @param baseIndent The number of levels of indentation to be used for the outermost XML
+ /// element in the serialized RDF. This is convenient when embedding the RDF in other text.
+
+ void SerializeToBuffer ( tStringObj * rdfString,
+ XMP_OptionBits options,
+ XMP_StringLen padding,
+ XMP_StringPtr newline,
+ XMP_StringPtr indent = "",
+ XMP_Index baseIndent = 0 ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SerializeToBuffer() serializes metadata in this XMP object into a string as RDF.
+ ///
+ /// This simpler form of the function uses default values for the \c newline, \c indent, and
+ /// \c baseIndent parameters.
+ ///
+ /// @param rdfString [out] A string object in which to return the serialized RDF. Must not be null.
+ ///
+ /// @param options An options flag that controls how the serialization operation is performed.
+ /// The specified options must be logically consistent; an exception is thrown if they are not.
+ /// A logical OR of these bit-flag constants:
+ /// \li \c kXMP_OmitPacketWrapper - Do not include an XML packet wrapper. This cannot be
+ /// specified together with \c #kXMP_ReadOnlyPacket, \c #kXMP_IncludeThumbnailPad, or
+ /// \c #kXMP_ExactPacketLength.
+ /// \li \c kXMP_ReadOnlyPacket - Create a read-only XML packet wapper. Cannot be specified
+ /// together with \c kXMP_OmitPacketWrapper.
+ /// \li \c kXMP_UseCompactFormat - Use a highly compact RDF syntax and layout.
+ /// \li \c kXMP_IncludeThumbnailPad - Include typical space for a JPEG thumbnail in the
+ /// padding if no \c xmp:Thumbnails property is present. Cannot be specified together with
+ /// \c kXMP_OmitPacketWrapper.
+ /// \li \c kXMP_ExactPacketLength - The padding parameter provides the overall packet length.
+ /// The actual amount of padding is computed. An exception is thrown if the packet exceeds
+ /// this length with no padding. Cannot be specified together with
+ /// \c kXMP_OmitPacketWrapper.
+ ///
+ /// In addition to the above options, you can include one of the following encoding options:
+ /// \li \c #kXMP_EncodeUTF8 - Encode as UTF-8, the default.
+ /// \li \c #kXMP_EncodeUTF16Big - Encode as big-endian UTF-16.
+ /// \li \c #kXMP_EncodeUTF16Little - Encode as little-endian UTF-16.
+ /// \li \c #kXMP_EncodeUTF32Big - Encode as big-endian UTF-32.
+ /// \li \c #kXMP_EncodeUTF32Little - Encode as little-endian UTF-32.
+ ///
+ /// @param padding The amount of padding to be added if a writeable XML packet is created.
+ /// If zero (the default) an appropriate amount of padding is computed.
+
+ void SerializeToBuffer ( tStringObj * rdfString,
+ XMP_OptionBits options = 0,
+ XMP_StringLen padding = 0 ) const;
+
+ /// @}
+ // =============================================================================================
+ // Miscellaneous Member Functions
+ // ==============================
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Helper functions.
+ /// @{
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Retrieves an internal reference that can be safely passed across DLL boundaries and
+ /// reconstructed.
+ ///
+ /// The \c TXMPMeta class is a normal C++ template, it is instantiated and local to each client
+ /// executable, as are the other \c TXMP* classes. Different clients might not use the same
+ /// string type to instantiate \c TXMPMeta.
+ ///
+ /// Because of this you should not pass \c SXMPMeta objects, or pointers to \c SXMPMeta objects,
+ /// across DLL boundaries. Use this function to obtain a safe internal reference that you can
+ /// pass, then construct a local object on the callee side. This construction does not create a
+ /// cloned XMP tree, it is the same underlying XMP object safely wrapped in each client's
+ /// \c SXMPMeta object.
+ ///
+ /// Use this function and the associated constructor like this:
+ /// \li The callee's header contains:
+ /// <pre>
+ /// CalleeMethod ( XMPMetaRef xmpRef );
+ /// </pre>
+ ///
+ /// \li The caller's code contains:
+ /// <pre>
+ /// SXMPMeta callerXMP;
+ /// CalleeMethod ( callerXMP.GetInternalRef() );
+ /// </pre>
+ ///
+ /// \li The callee's code contains:
+ /// <pre>
+ /// SXMPMeta calleeXMP ( xmpRef );
+ /// </pre>
+ ///
+ /// @return The reference object.
+
+ XMPMetaRef GetInternalRef() const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c GetObjectName() retrieves the client-assigned name of this XMP object.
+ ///
+ /// Assign this name with \c SetObjectName().
+ ///
+ /// @param name [out] A string object in which to return the name.
+
+ void GetObjectName ( tStringObj * name ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetObjectName() assigns a name to this XMP object.
+ ///
+ /// Retrieve this client-assigned name with \c GetObjectName().
+ ///
+ /// @param name The name as a null-terminated UTF-8 string.
+
+ void SetObjectName ( XMP_StringPtr name );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetObjectName() assigns a name to this XMP object.
+ ///
+ /// Retrieve this client-assigned name with \c GetObjectName().
+ ///
+ /// @param name The name as a string object.
+
+ void SetObjectName ( tStringObj name );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Sort() sorts the data model tree of an XMP object.
+ ///
+ /// Use this function to sort the data model of an XMP object into a canonical order. This can
+ /// be convenient when comparing data models, (e.g. by text comparison of DumpObject output).
+ ///
+ /// At the top level the namespaces are sorted by their prefixes. Within a namespace, the top
+ /// level properties are sorted by name. Within a struct, the fields are sorted by their
+ /// qualified name, i.e. their XML prefix:local form. Unordered arrays of simple items are
+ /// sorted by value. Language Alternative arrays are sorted by the xml:lang qualifiers, with
+ /// the "x-default" item placed first.
+
+ void Sort();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Erase() restores the object to a "just constructed" state.
+
+ void Erase();
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c Clone() creates a deep copy of an XMP object.
+ ///
+ /// Use this function to copy an entire XMP metadata tree. Assignment and copy constructors only
+ /// increment a reference count, they do not do a deep copy. This function returns an object,
+ /// not a pointer. The following shows correct usage:
+ ///
+ /// <pre>
+ /// SXMPMeta * clone1 = new SXMPMeta ( sourceXMP.Clone() ); // This works.
+ /// SXMPMeta clone2 ( sourceXMP.Clone ); // This works also. (Not a pointer.)
+ /// </pre>
+ /// The \c clone2 example does not use an explicit pointer.
+ /// This is good for local usage, protecting against memory leaks.
+ ///
+ /// This is an example of incorrect usage:
+ /// <pre>
+ /// SXMPMeta * clone3 = &sourceXMP.Clone(); // ! This does not work!
+ /// </pre>
+ /// The assignment to \c clone3 creates a temporary object, initializes it with the clone,
+ /// assigns the address of the temporary to \c clone3, then deletes the temporary.
+ ///
+ /// @param options Option flags, not currently defined..
+ ///
+ /// @return An XMP object cloned from the original.
+
+ TXMPMeta Clone ( XMP_OptionBits options = 0 ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CountArrayItems() reports the number of items currently defined in an array.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @return The number of items.
+
+ XMP_Index CountArrayItems ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DumpObject() outputs the content of an XMP object to a callback handler for debugging.
+ ///
+ /// Invokes a client-defined callback for each line of output.
+ ///
+ /// @param outProc The client-defined procedure to handle each line of output.
+ ///
+ /// @param clientData A pointer to client-defined data to pass to the handler.
+ ///
+ /// @return A success-fail status value, returned from the handler. Zero is success, failure
+ /// values are client-defined.
+ ///
+ /// @see Static function \c DumpNamespaces()
+
+ XMP_Status DumpObject ( XMP_TextOutputProc outProc,
+ void * clientData ) const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Not implemented
+ XMP_OptionBits GetObjectOptions() const;
+
+ // ---------------------------------------------------------------------------------------------
+ /// \brief Not implemented
+ void SetObjectOptions ( XMP_OptionBits options );
+
+ /// @}
+
+ // =============================================================================================
+ // Error notifications
+ // ===================
+
+ // ---------------------------------------------------------------------------------------------
+ /// \name Error notifications
+ /// @{
+ ///
+ /// From the beginning through version 5.5, XMP Tookit errors result in throwing an \c XMP_Error
+ /// exception. For the most part exceptions were thrown early and thus API calls aborted as soon
+ /// as an error was detected. Starting in version 5.5, support has been added for notifications
+ /// of errors arising in calls to \c TXMPMeta functions.
+ ///
+ /// A client can register an error notification callback function for a \c TXMPMeta object. This
+ /// can be done as a global default or individually to each object. The global default applies
+ /// to all objects created after it is registered. Within the object there is no difference
+ /// between the global default or explicitly registered callback. The callback function returns
+ /// a \c bool value indicating if recovery should be attempted (true) or an exception thrown
+ /// (false). If no callback is registered, a best effort at recovery and continuation will be
+ /// made with an exception thrown if recovery is not possible.
+ ///
+ /// The number of notifications delivered for a given TXMPMeta object can be limited. This is
+ /// intended to reduce chatter from multiple or cascading errors. The limit is set when the
+ /// callback function is registered. This limits the number of notifications of the highest
+ /// severity delivered or less. If a higher severity error occurs, the counting starts again.
+ /// The limit and counting can be reset at any time, see \c ResetErrorCallbackLimit.
+
+ // --------------------------------------------------------------------------------------------
+ /// @brief SetDefaultErrorCallback() registers a global default error notification callback.
+ ///
+ /// @param proc The client's callback function.
+ ///
+ /// @param context Client-provided context for the callback.
+ ///
+ /// @param limit A limit on the number of notifications to be delivered.
+
+ static void SetDefaultErrorCallback ( XMPMeta_ErrorCallbackProc proc, void* context = 0, XMP_Uns32 limit = 1 );
+
+ // --------------------------------------------------------------------------------------------
+ /// @brief SetErrorCallback() registers an error notification callback.
+ ///
+ /// @param proc The client's callback function.
+ ///
+ /// @param context Client-provided context for the callback.
+ ///
+ /// @param limit A limit on the number of notifications to be delivered.
+
+ void SetErrorCallback ( XMPMeta_ErrorCallbackProc proc, void* context = 0, XMP_Uns32 limit = 1 );
+
+ // --------------------------------------------------------------------------------------------
+ /// @brief ResetErrorCallbackLimit() resets the error notification limit and counting. It has no
+ /// effect if an error notification callback function is not registered.
+ ///
+ /// @param limit A limit on the number of notifications to be delivered.
+
+ void ResetErrorCallbackLimit ( XMP_Uns32 limit = 1 );
+
+ /// @}
+
+ // =============================================================================================
+
+ XMPMetaRef xmpRef; // *** Should be private, see below.
+
+private:
+
+#if 0 // *** VS.Net and gcc seem to not handle the friend declarations properly.
+ friend class TXMPIterator <class tStringObj>;
+ friend class TXMPUtils <class tStringObj>;
+#endif
+
+ static void SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen );
+
+}; // class TXMPMeta
+
+#endif // __TXMPMeta_hpp__
diff --git a/gpr/source/lib/xmp_core/public/include/TXMPUtils.hpp b/gpr/source/lib/xmp_core/public/include/TXMPUtils.hpp
new file mode 100644
index 0000000..79ade07
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/TXMPUtils.hpp
@@ -0,0 +1,967 @@
+#ifndef __TXMPUtils_hpp__
+#define __TXMPUtils_hpp__ 1
+
+#if ( ! __XMP_hpp__ )
+ #error "Do not directly include, use XMP.hpp"
+#endif
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// =================================================================================================
+/// \file TXMPUtils.hpp
+/// \brief API for access to the XMP Toolkit utility services.
+///
+/// \c TXMPUtils is the template class providing utility services for the XMP Toolkit. It must be
+/// instantiated with a string class such as \c std::string. See the instructions in XMP.hpp, and
+/// the Overview for a discussion of the overall architecture of the XMP API.
+// =================================================================================================
+
+// =================================================================================================
+/// \class TXMPUtils TXMPUtils.hpp
+/// @brief API for access to the XMP Toolkit utility services.
+///
+/// \c TXMPUtils is a template class which must be instantiated with a string class such as
+/// \c std::string. See the instructions in XMP.hpp, and the Overview for a discussion of the overall
+/// architecture of the XMP API.
+///
+/// This class defines helper functions that support the basic metadata manipulation provided by
+/// \c TXMPMeta. All of the functions are static; that is, you call them directly from the concrete
+/// class (\c SXMPUtils), which is never itself instantiated.
+///
+/// General categories of utilities include:
+///
+/// \li Composing complex path expressions, which you can then pass to the property access
+/// functions in \c TXMPMeta
+/// \li Converting between binary and string forms of property values
+/// \li Manipulating date/time values
+/// \li Encoding and decoding base-64 strings
+/// \li JPEG file handling
+/// \li Editing aids for creating a user interface for the XMP Toolkit
+// =================================================================================================
+
+template <class tStringObj> class TXMPUtils {
+
+public:
+
+ // =============================================================================================
+ // No constructors or destructor declared or needed
+ // ================================================
+
+ // ============================================================================================
+ /// \name Path composition
+ /// @{
+ ///
+ /// These functions provide support for composing path expressions to deeply nested properties.
+ /// The functions in \c TXMPMeta such as \c TXMPMeta::GetProperty(),
+ /// \c TXMPMeta::GetArrayItem(), and \c TXMPMeta::GetStructField() provide easy access to top level
+ /// simple properties, items in top level arrays, and fields of top level structs. They are
+ /// not as convenient for more complex things, such as fields several levels deep in a complex
+ /// struct, or fields within an array of structs, or items of an array that is a field of a
+ /// struct. You can use these utility functions to compose these paths, which you can then pass
+ /// to the property access functions. You can also compose paths to top-level array items or
+ /// struct fields so that you can use the binary accessors such as
+ /// \c TXMPMeta::GetProperty_Int().
+ ///
+ /// You can use these functions is to compose a complete path expression, or all but the last
+ /// component. For example, suppose you have a property that is an array of integers within a
+ /// struct. You can access one of the array items like this:
+ ///
+ /// <pre>
+ /// SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &path );
+ /// SXMPUtils::ComposeArrayItemPath ( schemaNS, path, index, &path );
+ /// exists = xmpObj.GetProperty_Int ( schemaNS, path, &value, &options );
+ /// </pre>
+ ///
+ /// You could also use this code if you want the string form of the integer:
+ ///
+ /// <pre>
+ /// SXMPUtils::ComposeStructFieldPath ( schemaNS, "Struct", fieldNS, "Array", &path );
+ /// xmpObj.GetArrayItem ( schemaNS, path, index, &value, &options );
+ /// </pre>
+ ///
+ /// \note It might look confusing that the \c schemaNS is passed in all of the calls above. This
+ /// is because the XMP Toolkit keeps the top-level "schema" namespace separate from the rest of
+ /// the path expression.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeArrayItemPath() composes the path expression for an item in an array.
+ ///
+ /// The returned string is in the form <tt>ns:arrayName[i]</tt>, where "ns" is the prefix for
+ /// the specified namespace, and "i" is the decimal representation of specified item index.
+ /// If the last item was specified, the path is <tt>ns:arrayName[last()]</tt>.
+ ///
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param itemIndex The 1-based index of the desired item. Use the macro
+ /// \c #kXMP_ArrayLastItem to specify the last existing array item.
+ ///
+ /// @param fullPath [out] A string in which to return the composed path.
+
+ static void ComposeArrayItemPath ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ tStringObj * fullPath );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeStructFieldPath() composes the path expression for a field in a struct.
+ ///
+ /// The returned string is in the form <tt>ns:structName/fNS:fieldName</tt>, where "ns" is the
+ /// prefix for the schema namespace, and "fNS" is the prefix for field namespace.
+ ///
+ /// @param schemaNS The namespace URI for the struct; see \c GetProperty().
+ ///
+ /// @param structName The name of the struct. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param fieldNS The namespace URI for the field. Same URI and prefix usage as the
+ /// \c schemaNS and \c structName parameters.
+ ///
+ /// @param fieldName The name of the field. Must be a single XML name, must not be null or the
+ /// empty string. Same URI and prefix usage as the \c schemaNS and \c structName parameters.
+ ///
+ /// @param fullPath [out] A string in which to return the composed path.
+
+ static void ComposeStructFieldPath ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ tStringObj * fullPath );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeQualifierPath() composes the path expression for a qualifier.
+ ///
+ /// The returned string is in the form <tt>ns:propName/?qNS:qualName</tt>, where "ns" is the
+ /// prefix for the schema namespace, and "qNS" is the prefix for the qualifier namespace.
+ ///
+ /// @param schemaNS The namespace URI; see \c GetProperty().
+ ///
+ /// @param propName The name of the property to which the qualifier is attached. Can be a
+ /// general path expression, must not be null or the empty string; see \c GetProperty() for
+ /// namespace prefix usage.
+ ///
+ /// @param qualNS The namespace URI for the qualifier. Same URI and prefix usage as the
+ /// \c schemaNS and \c propName parameters.
+ ///
+ /// @param qualName The name of the qualifier. Must be a single XML name, must not be null or the
+ /// empty string. Same URI and prefix usage as the \c schemaNS and \c propName parameters.
+ ///
+ /// @param fullPath [out] A string in which to return the composed path.
+
+ static void ComposeQualifierPath ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ tStringObj * fullPath );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeLangSelector() composes the path expression to select an alternate item by language.
+ ///
+ /// Path syntax allows two forms of "content addressing" to select an item in an array of
+ /// alternatives. The form used in this function lets you select an item in an alt-text array
+ /// based on the value of its \c xml:lang qualifier. The other form of content addressing is
+ /// shown in \c ComposeFieldSelector().
+ ///
+ /// The returned string is in the form <tt>ns:arrayName[\@xml:lang='langName']</tt>, where
+ /// "ns" is the prefix for the schema namespace
+ ///
+ /// This function provides a path expression that is explicitly and only for a specific
+ /// language. In most cases, \c TXMPMeta::SetLocalizedText() and \c TXMPMeta::GetLocalizedText()
+ /// are preferred, because they provide extra logic to choose the appropriate language and
+ /// maintain consistency with the 'x-default' value.
+ ///
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param langName The RFC 3066 code for the desired language, as a null-terminated UTF-8 string.
+ ///
+ /// @param fullPath [out] A string in which to return the composed path.
+
+ static void ComposeLangSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr langName,
+ tStringObj * fullPath );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeLangSelector() composes a path expression to select an alternate item by language.
+ ///
+ /// Path syntax allows two forms of "content addressing" to select an item in an array of
+ /// alternatives. The form used in this function lets you select an item in an alt-text array
+ /// based on the value of its \c xml:lang qualifier. The other form of content addressing is
+ /// shown in \c ComposeFieldSelector().
+ ///
+ /// The returned string is in the form <tt>ns:arrayName[\@xml:lang='langName']</tt>, where
+ /// "ns" is the prefix for the schema namespace
+ ///
+ /// This function provides a path expression that is explicitly and only for a specific
+ /// language. In most cases, \c TXMPMeta::SetLocalizedText() and \c TXMPMeta::GetLocalizedText()
+ /// are preferred, because they provide extra logic to choose the appropriate language and
+ /// maintain consistency with the 'x-default' value.
+ ///
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param langName The RFC 3066 code for the desired language, as a string object.
+ ///
+ /// @param fullPath [out] A string in which to return the composed path.
+
+ static void ComposeLangSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ const tStringObj & langName,
+ tStringObj * fullPath );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeFieldSelector() composes a path expression to select an alternate item by a field's value.
+ ///
+ /// Path syntax allows two forms of "content addressing" to select an item in an array of
+ /// alternatives. The form used in this function lets you select an item in an array of structs
+ /// based on the value of one of the fields in the structs. The other form of content addressing
+ /// is shown in \c ComposeLangSelector().
+ ///
+ /// For example, consider a simple struct that has two fields, the name of a city and the URI of
+ /// an FTP site in that city. Use this to create an array of download alternatives. You can show
+ /// the user a popup built from the values of the city fields, then get the corresponding URI as
+ /// follows:
+ /// <pre>
+ /// ComposeFieldSelector ( schemaNS, "Downloads", fieldNS, "City", chosenCity, &path );
+ /// exists = GetStructField ( schemaNS, path, fieldNS, "URI", &uri );
+ /// </pre>
+ ///
+ /// The returned string is in the form <tt>ns:arrayName[fNS:fieldName='fieldValue']</tt>, where
+ /// "ns" is the prefix for the schema namespace and "fNS" is the prefix for the field namespace.
+ ///
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param fieldNS The namespace URI for the field used as the selector. Same URI and prefix
+ /// usage as the \c schemaNS and \c arrayName parameters.
+ ///
+ /// @param fieldName The name of the field used as the selector. Must be a single XML name, must
+ /// not be null or the empty string. It must be the name of a field that is itself simple.
+ ///
+ /// @param fieldValue The desired value of the field, specified as a null-terminated UTF-8 string.
+ ///
+ /// @param fullPath [out] A string in which to return the composed path.
+
+ static void ComposeFieldSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ XMP_StringPtr fieldValue,
+ tStringObj * fullPath );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ComposeFieldSelector() composes a path expression to select an alternate item by a field's value.
+ ///
+ /// Path syntax allows two forms of "content addressing" to select an item in an array of
+ /// alternatives. The form used in this function lets you select an item in an array of structs
+ /// based on the value of one of the fields in the structs. The other form of content addressing
+ /// is shown in \c ComposeLangSelector().
+ ///
+ /// For example, consider a simple struct that has two fields, the name of a city and the URI of
+ /// an FTP site in that city. Use this to create an array of download alternatives. You can show
+ /// the user a popup built from the values of the city fields, then get the corresponding URI as
+ /// follows:
+ /// <pre>
+ /// ComposeFieldSelector ( schemaNS, "Downloads", fieldNS, "City", chosenCity, &path );
+ /// exists = GetStructField ( schemaNS, path, fieldNS, "URI", &uri );
+ /// </pre>
+ ///
+ /// The returned string is in the form <tt>ns:arrayName[fNS:fieldName='fieldValue']</tt>, where
+ /// "ns" is the prefix for the schema namespace and "fNS" is the prefix for the field namespace.
+ ///
+ /// @param schemaNS The namespace URI for the array; see \c GetProperty().
+ ///
+ /// @param arrayName The name of the array. Can be a general path expression, must not be null
+ /// or the empty string; see \c GetProperty() for namespace prefix usage.
+ ///
+ /// @param fieldNS The namespace URI for the field used as the selector. Same URI and prefix
+ /// usage as the \c schemaNS and \c arrayName parameters.
+ ///
+ /// @param fieldName The name of the field used as the selector. Must be a single XML name, must
+ /// not be null or the empty string. It must be the name of a field that is itself simple.
+ ///
+ /// @param fieldValue The desired value of the field, specified as a string object.
+ ///
+ /// @param fullPath [out] A string in which to return the composed path.
+
+ static void ComposeFieldSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ const tStringObj & fieldValue,
+ tStringObj * fullPath );
+
+ /// @}
+
+ // =============================================================================================
+ /// \name Conversion between binary types and strings
+ /// @{
+ ///
+ /// The main accessors in \c TXMPMeta set and retrieve property values as strings. additional
+ /// functions, such as \c TXMPMeta::SetPropertyInt(), set and retrieve property values as
+ /// explicit binary data types. Use these functions to convert between binary and string
+ /// values.
+ ///
+ /// Strings can be specified as null-terminated UTF-8 (\c #XMP_StringPtr), or as string
+ /// objects (\c tStringObj) of the type declared when instantiating the XMP classes; see
+ /// \c XMP.hpp. Alternate forms of each conversion function allow either type of string.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertFromBool() converts a Boolean value to a string.
+ ///
+ /// The string values of Booleans are returned by the macros \c #kXMP_TrueStr and
+ /// \c #kXMP_FalseStr in \c XMP_Const.h.
+ ///
+ /// @param binValue The Boolean value to be converted.
+ ///
+ /// @param strValue [out] A buffer in which to return the string representation of the value.
+
+ static void ConvertFromBool ( bool binValue,
+ tStringObj * strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertFromInt() converts a 32-bit integer value to a string.
+ ///
+ /// @param binValue The integer value to be converted.
+ ///
+ /// @param format Optional. A C \c sprintf format for the conversion. Default is "%d".
+ ///
+ /// @param strValue [out] A buffer in which to return the string representation of the value.
+
+ static void ConvertFromInt ( long binValue,
+ XMP_StringPtr format,
+ tStringObj * strValue );
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertFromInt64() converts a 64-bit integer value to a string.
+ ///
+ /// @param binValue The integer value to be converted.
+ ///
+ /// @param format Optional. A C \c sprintf format for the conversion. Default is "%d".
+ ///
+ /// @param strValue [out] A buffer in which to return the string representation of the value.
+
+ static void ConvertFromInt64 ( long long binValue,
+ XMP_StringPtr format,
+ tStringObj * strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertFromFloat() converts a floating-point value to a string.
+ ///
+ /// @param binValue The floating-point value to be converted.
+ ///
+ /// @param format Optional. A C \c sprintf format for the conversion. Default is "%d".
+ ///
+ /// @param strValue [out] A buffer in which to return the string representation of the value.
+
+ static void ConvertFromFloat ( double binValue,
+ XMP_StringPtr format,
+ tStringObj * strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertFromDate() converts a date/time value to a string.
+ ///
+ /// Formats a date according to the ISO 8601 profile in http://www.w3.org/TR/NOTE-datetime:
+ /// <pre>
+ /// YYYY
+ /// YYYY-MM
+ /// YYYY-MM-DD
+ /// YYYY-MM-DDThh:mmTZD
+ /// YYYY-MM-DDThh:mm:ssTZD
+ /// YYYY-MM-DDThh:mm:ss.sTZD
+ /// </pre>
+ ///
+ /// \c YYYY = four-digit year, formatted as "%.4d" <br>
+ /// \c MM = two-digit month (01=January) <br>
+ /// \c DD = two-digit day of month (01 through 31) <br>
+ /// \c hh = two digits of hour (00 through 23) <br>
+ /// \c mm = two digits of minute (00 through 59) <br>
+ /// \c ss = two digits of second (00 through 59) <br>
+ /// \c s = one or more digits representing a decimal fraction of a second <br>
+ /// \c TZD = time zone designator (Z or +hh:mm or -hh:mm)
+ ///
+ /// Time-only input is allowed where the year, month, and day are all zero. This is output as
+ /// "0000-00-00...".
+ ///
+ /// @note ISO 8601 does not allow years less than 1000 or greater than 9999. This API allows
+ /// any year, even negative ones. The W3C profile also requires a time zone designator if a time
+ /// is present, this API treats the time zone designator as optional. The XMP_DateTime type has
+ /// an explicit notion of zone-less time.
+ ///
+ /// @param binValue The date/time value to be converted.
+ ///
+ /// @param strValue [out] A buffer in which to return the ISO 8601 string representation of the date/time.
+
+ static void ConvertFromDate ( const XMP_DateTime & binValue,
+ tStringObj * strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToBool() converts a string to a Boolean value.
+ ///
+ /// The preferred strings are those returned by the macros \c #kXMP_TrueStr and \c #kXMP_FalseStr.
+ /// If these do not match, the function does a case insensitive comparison, then simply 't' or 'f',
+ /// and finally non-zero and zero integer representations.
+ ///
+ /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string.
+ ///
+ /// @return The appropriate C++ bool value for the string.
+
+ static bool ConvertToBool ( XMP_StringPtr strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToBool() converts a string to a Boolean value.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object,
+ /// rather than a <tt>const * char</tt>. It is otherwise identical; see details in the canonical form.
+ ///
+ /// @param strValue The string representation of the value, specified as a string object.
+ ///
+ /// @return The appropriate C++ bool value for the string.
+
+ static bool ConvertToBool ( const tStringObj & strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToInt() converts a string to a 32-bit integer value.
+ ///
+ /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string.
+ ///
+ /// @return The 32-bit integer value.
+
+ static long ConvertToInt ( XMP_StringPtr strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToInt() converts a string to a 32-bit integer value.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object,
+ /// rather than a <tt>const * char</tt>. It is otherwise identical.
+ ///
+ /// @param strValue The string representation of the value, specified as a string object.
+ ///
+ /// @return The 32-bit integer value.
+
+ static long ConvertToInt ( const tStringObj & strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToInt64() converts a string to a 64-bit integer value.
+ ///
+ /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string.
+ ///
+ /// @return The 64-bit integer value.
+
+ static long long ConvertToInt64 ( XMP_StringPtr strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToInt64() converts a string to a 64-bit integer value.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object,
+ /// rather than a <tt>const * char</tt>. It is otherwise identical.
+ ///
+ /// @param strValue The string representation of the value, specified as a string object.
+ ///
+ /// @return The 64-bit integer value.
+
+ static long long ConvertToInt64 ( const tStringObj & strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToFloat() converts a string to a floating-point value.
+ ///
+ /// @param strValue The string representation of the value, specified as a null-terminated UTF-8 string.
+ ///
+ /// @return The floating-point value.
+
+ static double ConvertToFloat ( XMP_StringPtr strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToFloat() converts a string to a floating-point value.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object,
+ /// rather than a <tt>const * char</tt>. It is otherwise identical.
+ ///
+ /// @param strValue The string representation of the value, specified as a string object.
+ ///
+ /// @return The floating-point value.
+
+ static double ConvertToFloat ( const tStringObj & strValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToDate() converts a string to a date/time value.
+ ///
+ /// Parses a date according to the ISO 8601 profile in http://www.w3.org/TR/NOTE-datetime:
+ /// <pre>
+ /// YYYY
+ /// YYYY-MM
+ /// YYYY-MM-DD
+ /// YYYY-MM-DDThh:mmTZD
+ /// YYYY-MM-DDThh:mm:ssTZD
+ /// YYYY-MM-DDThh:mm:ss.sTZD
+ /// </pre>
+ ///
+ /// \c YYYY = four-digit year, formatted as "%.4d" <br>
+ /// \c MM = two-digit month (01=January) <br>
+ /// \c DD = two-digit day of month (01 through 31) <br>
+ /// \c hh = two digits of hour (00 through 23) <br>
+ /// \c mm = two digits of minute (00 through 59) <br>
+ /// \c ss = two digits of second (00 through 59) <br>
+ /// \c s = one or more digits representing a decimal fraction of a second <br>
+ /// \c TZD = time zone designator (Z or +hh:mm or -hh:mm)
+ ///
+ /// A missing date portion or missing TZD are tolerated. A missing date value can begin with
+ /// "Thh:" or "hh:"; the year, month, and day are all set to zero in the \c #XMP_DateTime value.
+ /// A missing TZD is assumed to be UTC.
+ ///
+ /// @note ISO 8601 does not allow years less than 1000 or greater than 9999. This API allows
+ /// any year, even negative ones. The W3C profile also requires a time zone designator if a time
+ /// is present, this API treats the time zone designator as optional. The XMP_DateTime type has
+ /// an explicit notion of zone-less time.
+ ///
+ /// @param strValue The ISO 8601 string representation of the date/time, specified as a
+ /// null-terminated UTF-8 string.
+ ///
+ /// @param binValue [out] A buffer in which to return the binary date/time value.
+
+ static void ConvertToDate ( XMP_StringPtr strValue,
+ XMP_DateTime * binValue );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToDate() converts a string to a date/time value.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object,
+ /// rather than a <tt>const * char</tt>. It is otherwise identical.
+ /// See details for the canonical form.
+ ///
+ ///
+ /// @param strValue The ISO 8601 string representation of the date/time, specified as a string
+ /// object.
+ ///
+ /// @param binValue [out] A buffer in which to return the binary date/time value.
+
+ static void ConvertToDate ( const tStringObj & strValue,
+ XMP_DateTime * binValue );
+
+ /// @}
+
+ // =============================================================================================
+ /// \name Date-time manipulation
+ /// @{
+ ///
+ /// In addition to the type-conversion functions that convert between strings and binary
+ /// date-time values, these functions create, manipulate, and compare date-time values.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CurrentDateTime() obtains the current date and time.
+ ///
+ /// Creates and returns a binary \c #XMP_DateTime value. The returned time is UTC, properly
+ /// adjusted for the local time zone. The resolution of the time is not guaranteed to be finer
+ /// than seconds.
+ ///
+ /// @param time [out] A buffer in which to return the date/time value.
+
+ static void CurrentDateTime ( XMP_DateTime * time );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SetTimeZone() sets the time zone in a date/time value to the local time zone.
+ ///
+ /// Any existing time zone value is replaced. The other date/time fields are not adjusted in any way.
+ ///
+ /// @param time A pointer to the date-time value, which is modified in place.
+
+ static void SetTimeZone ( XMP_DateTime * time );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToUTCTime() ensures that a time is UTC.
+ ///
+ /// If the time zone is not UTC, the time is adjusted and the time zone set to be UTC. The value
+ /// is not modified if the time zone is already UTC or if the value has no time zone.
+ ///
+ /// @param time A pointer to the date-time value, which is modified in place.
+
+ static void ConvertToUTCTime ( XMP_DateTime * time );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c ConvertToLocalTime() ensures that a time is local.
+ ///
+ /// If the time zone is not the local zone, the time is adjusted and the time zone set to be local.
+ /// The value is not modified if the time zone is already the local zone or if the value has no
+ /// time zone.
+ ///
+ /// @param time A pointer to the date-time value, which is modified in place.
+
+ static void ConvertToLocalTime ( XMP_DateTime * time );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CompareDateTime() compares the order of two date/time values.
+ ///
+ /// Both values are treated as in the same time zone if either has no time zone.
+ ///
+ /// @param left The left-side date/time value.
+ ///
+ /// @param right The right-side date/time value.
+ ///
+ /// @return An integer indicating the order:
+ /// \li -1 if left is earlier than right
+ /// \li 0 if left matches right
+ /// \li +1 if left is later than right
+
+ static int CompareDateTime ( const XMP_DateTime & left,
+ const XMP_DateTime & right );
+
+ /// @}
+
+ // =============================================================================================
+ /// \name Base64 encoding and decoding
+ /// @{
+ ///
+ /// These functions convert between raw data values and Base64-encoded strings.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c EncodeToBase64() converts a raw data value to a Base64-encoded string.
+ ///
+ /// @param rawStr An \c #XMP_StringPtr (char *) string containing the raw data to be converted.
+ ///
+ /// @param rawLen The number of characters of raw data to be converted.
+ ///
+ /// @param encodedStr [out] A string object in which to return the encoded string.
+
+ static void EncodeToBase64 ( XMP_StringPtr rawStr,
+ XMP_StringLen rawLen,
+ tStringObj * encodedStr );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c EncodeToBase64() converts a raw data value passed in a string object to a Base64-encoded string.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object as input.
+ /// It is otherwise identical.
+ ///
+ /// @param rawStr A string object containing the raw data to be converted.
+ ///
+ /// @param encodedStr [out] A string object in which to return the encoded string.
+
+ static void EncodeToBase64 ( const tStringObj & rawStr,
+ tStringObj * encodedStr );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DecodeFromBase64() Decodes a Base64-encoded string to raw data.
+ ///
+ /// @param encodedStr An \c #XMP_StringPtr (char *) string containing the encoded data to be converted.
+ ///
+ /// @param encodedLen The number of characters of raw data to be converted.
+ ///
+ /// @param rawStr [out] A string object in which to return the decoded data.
+
+ static void DecodeFromBase64 ( XMP_StringPtr encodedStr,
+ XMP_StringLen encodedLen,
+ tStringObj * rawStr );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DecodeFromBase64() Decodes a Base64-encoded string, passed as a string object, to raw data.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object as input.
+ /// It is otherwise identical.
+ ///
+ /// @param encodedStr An string object containing the encoded data to be converted.
+ ///
+ /// @param rawStr [out] A string object in which to return the decoded data.
+
+ static void DecodeFromBase64 ( const tStringObj & encodedStr,
+ tStringObj * rawStr );
+
+ /// @}
+
+ // =============================================================================================
+ // =============================================================================================
+ /// \name JPEG file handling
+ /// @{
+ ///
+ /// These functions support the partitioning of XMP in JPEG files into standard and extended
+ /// portions in order to work around the 64KB size limit of JPEG marker segments.
+ ///
+ /// @note (Doc note) Add detail about how to write out and read back extended data
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c PackageForJPEG() creates XMP serializations appropriate for a JPEG file.
+ ///
+ /// The standard XMP in a JPEG file is limited to 64K bytes. This function serializes the XMP
+ /// metadata in an XMP object into a string of RDF (see \c TXMPMeta::SerializeToBuffer()). If
+ /// the data does not fit into the 64K byte limit, it creates a second packet string with the
+ /// extended data.
+ ///
+ /// @param xmpObj The XMP object containing the metadata.
+ ///
+ /// @param standardXMP [out] A string object in which to return the full standard XMP packet.
+ ///
+ /// @param extendedXMP [out] A string object in which to return the serialized extended XMP,
+ /// empty if not needed.
+ ///
+ /// @param extendedDigest [out] A string object in which to return an MD5 digest of the serialized
+ /// extended XMP, empty if not needed.
+ ///
+ /// @see \c MergeFromJPEG()
+
+ static void PackageForJPEG ( const TXMPMeta<tStringObj> & xmpObj,
+ tStringObj * standardXMP,
+ tStringObj * extendedXMP,
+ tStringObj * extendedDigest );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c MergeFromJPEG() merges standard and extended XMP retrieved from a JPEG file.
+ ///
+ /// When an extended partition stores properties that do not fit into the JPEG file limitation
+ /// of 64K bytes, this function integrates those properties back into the same XMP object with
+ /// those from the standard XMP packet.
+ ///
+ /// @param fullXMP [in, out] An XMP object which the caller has initialized from the standard
+ /// XMP packet in a JPEG file. The extended XMP is added to this object.
+ ///
+ /// @param extendedXMP An XMP object which the caller has initialized from the extended XMP
+ /// packet in a JPEG file.
+ ///
+ /// @see \c PackageForJPEG()
+
+ static void MergeFromJPEG ( TXMPMeta<tStringObj> * fullXMP,
+ const TXMPMeta<tStringObj> & extendedXMP );
+
+ /// @}
+
+ // =============================================================================================
+ /// \name Editing utilities
+ /// @{
+ ///
+ /// These functions are useful in implementing a user interface for editing XMP. They
+ /// convert sets of property values to and from displayable and manipulable strings, and perform
+ /// operations on sets of metadata, such as those available from the File Info dialog box.
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c CatenateArrayItems() creates a single edit string from a set of array item values.
+ ///
+ /// Collects the values of all items in an array into a single string, using a specified
+ /// separation string. Each item in the specified array must be a simple string value.
+ ///
+ /// @param xmpObj The XMP object containing the array to be catenated.
+ ///
+ /// @param schemaNS The schema namespace URI for the array. Must not be null or the empty string.
+ ///
+ /// @param arrayName The name of the array. May be a general path expression, must not be null
+ /// or the empty string.
+ ///
+ /// @param separator The string with which to separate the items in the catenated string.
+ /// Defaults to "; ", ASCII semicolon and space (U+003B, U+0020).
+ ///
+ /// @param quotes The character or characters to use as quotes around array items that contain a
+ /// separator. Defaults to the double-quote character ("), ASCII quote (U+0022).
+ ///
+ /// @param options Option flags to control the catenation. <<what options?>>
+ ///
+ /// @param catedStr [out] A string object in which to return the catenated array items.
+ ///
+ /// @see \c SeparateArrayItems()
+
+ static void CatenateArrayItems ( const TXMPMeta<tStringObj> & xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr separator,
+ XMP_StringPtr quotes,
+ XMP_OptionBits options,
+ tStringObj * catedStr );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SeparateArrayItems() updates an array from a concatenated edit string of values.
+ ///
+ /// This reverses the action of \c CatenateArrayItems(), separating out individual array items
+ /// from the edit string and updating the array with the new values. Each item in the array must
+ /// be a simple string value.
+ ///
+ /// @param xmpObj The XMP object containing the array to be updated.
+ ///
+ /// @param schemaNS The schema namespace URI for the array. Must not be null or the empty string.
+ ///
+ /// @param arrayName The name of the array. May be a general path expression, must not be null
+ /// or the empty string.
+ ///
+ /// @param options Option flags to control the separation. <<what options?>>
+ ///
+ /// @param catedStr The concatenated array items, as created by \c CatenateArrayItems(),
+ /// specified as a null-terminated UTF-8 string.
+
+ static void SeparateArrayItems ( TXMPMeta<tStringObj> * xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits options,
+ XMP_StringPtr catedStr );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c SeparateArrayItems() updates an array from a concatenated edit string of values.
+ ///
+ /// Overloads the basic form of the function, allowing you to pass a string object in which
+ /// to return the concatenated string. It is otherwise identical; see details for the canonical form.
+ ///
+
+ static void SeparateArrayItems ( TXMPMeta<tStringObj> * xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits options,
+ const tStringObj & catedStr );
+
+ /// @brief \c ApplyTemplate() modifies a working XMP object according to a template object.
+ ///
+ /// The XMP template can be used to add, replace or delete properties from the working XMP object.
+ /// This function replaces the previous \c AppendProperties() function, which is no longer available.
+ /// The actions that you specify determine how the template is applied. Each action can be applied
+ /// individually or combined; if you do not specify any actions, the properties and values in the working
+ /// XMP object do not change.
+ ///
+ /// These actions are available:
+ /// \li Clear (\c #kXMPTemplate_ClearUnnamedProperties): Deletes top-level properties.
+ /// Any top-level property that is present in the template (even with empty value)
+ /// is retained. All other top-level properties in the working object are deleted.
+ ///
+ /// \li Add (\c #kXMPTemplate_AddNewProperties): Adds new properties to the working object if the
+ /// template properties have values. See additional detail below.
+ ///
+ /// \li Replace (\c #kXMPTemplate_ReplaceExistingProperties): Replaces the values of existing top-level
+ /// properties in the working XMP if the value forms match those in the template. Properties
+ /// with empty values in the template are ignored. If combined with Clear or Add actions,
+ /// those take precedence; values are cleared or added, rather than replaced.
+ ///
+ /// \li Replace/Delete empty (\c #kXMPTemplate_ReplaceWithDeleteEmpty): Replaces values in the same way
+ /// as the simple Replace action, and also deletes properties if the value in the template is empty.
+ /// If combined with Clear or Add actions, those take precedence; values are cleared or added,
+ /// rather than replaced.
+ ///
+ /// \li Include internal (\c #kXMPTemplate_IncludeInternalProperties): Performs specified action
+ /// on internal properties as well as external properties. By default, internal properties
+ /// are ignored for all actions.
+ ///
+ /// The Add behavior depends on the type of property:
+ /// <ul>
+ /// <li> If a top-level property is not in the working XMP, and has a value in the template,
+ /// the property and value are added. Empty properties are not added. </li>
+ /// <li> If a property is in both the working XMP and template, the value forms must match, otherwise
+ /// the template is ignored for that property.</li>
+ /// <li> If a struct is present in both the working XMP and template, the individual fields of the
+ /// template struct are added as appropriate; that is, the logic is recursively applied to the fields.
+ /// Struct values are equivalent if they have the same fields with equivalent values. </li>
+ /// <li> If an array is present in both the working XMP and template, items from the template are
+ /// added if the value forms match. Array values match if they have sets of equivalent items,
+ /// regardless of order.</li>
+ /// <li> Alt-text arrays use the \c xml:lang qualifier as a key, adding languages that are missing. </li>
+ /// </ul>
+ /// Array item checking is n-squared; this can be time-intensive if the Replace option is
+ /// not specified. Each source item is checked to see if it already exists in the destination,
+ /// without regard to order or duplicates. Simple items are compared by value and \c xml:lang
+ /// qualifier; other qualifiers are ignored. Structs are recursively compared by field names,
+ /// without regard to field order. Arrays are compared by recursively comparing all items.
+
+ /// @param workingXMP The destination XMP object.
+ ///
+ /// @param templateXMP The template to apply to the destination XMP object.
+ ///
+ /// @param actions Option flags to control the copying. If none are specified, the properties and values
+ /// in the working XMP do not change. A logical OR of these bit-flag constants:
+ /// \li \c #kXMPTemplate_ClearUnnamedProperties -- Delete anything that is not in the template
+ /// \li \c #kXMPTemplate_AddNewProperties -- Add properties; see detailed description.
+ /// \li \c #kXMPTemplate_ReplaceExistingProperties -- Replace the values of existing properties.
+ /// \li \c #kXMPTemplate_ReplaceWithDeleteEmpty -- Replace the values of existing properties
+ /// and delete properties if the new value is empty.
+ /// \li \c #kXMPTemplate_IncludeInternalProperties -- Operate on internal properties as well as
+ /// external properties.
+ ///
+
+ static void ApplyTemplate ( TXMPMeta<tStringObj> * workingXMP,
+ const TXMPMeta<tStringObj> & templateXMP,
+ XMP_OptionBits actions );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c RemoveProperties() removes multiple properties from an XMP object.
+ ///
+ /// The operation depends on how the namespace and property are specified:
+ ///
+ /// \li Non-empty \c schemaNS and \c propName - The named property is removed if it is an
+ /// external property, or if the \c #kXMPUtil_DoAllProperties option flag is set. It does not
+ /// matter whether the named property is an actual property or an alias.
+ ///
+ /// \li Non-empty \c schemaNS and empty \c propName - All external properties in the named
+ /// schema are removed. Internal properties are also removed if the
+ /// \c #kXMPUtil_DoAllProperties option flag is set. In addition, aliases from the named schema
+ /// are removed if the \c #kXMPUtil_IncludeAliases option flag is set.
+ ///
+ /// \li Empty \c schemaNS and empty \c propName - All external properties in all schemas are
+ /// removed. Internal properties are also removed if the \c #kXMPUtil_DoAllProperties option
+ /// flag is set. Aliases are handled implicitly, because the associated actuals are removed or
+ /// not.
+ ///
+ /// \li It is an error to pass an empty \c schemaNS and non-empty \c propName.
+ ///
+ /// @param xmpObj The XMP object containing the properties to be removed.
+ ///
+ /// @param schemaNS Optional schema namespace URI for the properties to be removed.
+ ///
+ /// @param propName Optional path expression for the property to be removed.
+ ///
+ /// @param options Option flags to control the deletion operation. A logical OR of these
+ /// bit-flag constants:
+ /// \li \c #kXMPUtil_DoAllProperties - Delete internal properties in addition to external properties.
+ /// \li \c #kXMPUtil_IncludeAliases - Include aliases if the schema is explicitly specified.
+
+ static void RemoveProperties ( TXMPMeta<tStringObj> * xmpObj,
+ XMP_StringPtr schemaNS = 0,
+ XMP_StringPtr propName = 0,
+ XMP_OptionBits options = 0 );
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief \c DuplicateSubtree() replicates a subtree from one XMP object into another.
+ ///
+ /// The destination can be a different namespace and root location in the same object, or the
+ /// same or a different location in another XMP object.
+ ///
+ /// @param source The source XMP object.
+ ///
+ /// @param dest The destination XMP object.
+ ///
+ /// @param sourceNS The schema namespace URI for the source subtree.
+ ///
+ /// @param sourceRoot The root location for the source subtree. Can be a general path expression,
+ /// must not be null or the empty string.
+ ///
+ /// @param destNS The schema namespace URI for the destination. Defaults to the source namespace.
+ ///
+ /// @param destRoot The root location for the destination. Can be a general path expression.
+ /// Defaults to the source location.
+ ///
+ /// @param options Option flags to control the operation. <<options?>>
+
+ static void DuplicateSubtree ( const TXMPMeta<tStringObj> & source,
+ TXMPMeta<tStringObj> * dest,
+ XMP_StringPtr sourceNS,
+ XMP_StringPtr sourceRoot,
+ XMP_StringPtr destNS = 0,
+ XMP_StringPtr destRoot = 0,
+ XMP_OptionBits options = 0 );
+
+ /// @}
+
+ // =============================================================================================
+
+private:
+
+ static void SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen );
+
+}; // class TXMPUtils
+
+// =================================================================================================
+
+#endif // __TXMPUtils_hpp__
diff --git a/gpr/source/lib/xmp_core/public/include/XMP.hpp b/gpr/source/lib/xmp_core/public/include/XMP.hpp
new file mode 100644
index 0000000..8ec39eb
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/XMP.hpp
@@ -0,0 +1,98 @@
+#ifndef __XMP_hpp__
+#define __XMP_hpp__ 1
+
+// =================================================================================================
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// ================================================================================================
+/// \file XMP.hpp
+/// \brief Overall header file for the XMP Toolkit
+///
+/// This is an overall header file, the only one that C++ clients should include.
+///
+/// The full client API is in the \c TXMPMeta.hpp, \c TXMPIterator.hpp, \c TXMPUtils.hpp headers.
+/// Read these for information, but do not include them directly. The \c TXMP... classes are C++
+/// template classes that must be instantiated with a string class such as \c std::string. The
+/// string class is used to return text strings for property values, serialized XMP, and so on.
+/// Clients must also compile \c XMP.incl_cpp to ensure that all client-side glue code is generated.
+/// This should be done by including it in exactly one client source file.
+///
+/// There are two C preprocessor macros that simplify use of the templates:
+///
+/// \li \c TXMP_STRING_TYPE - Define this as the string class to use with the template. You will get
+/// the template headers included and typedefs (\c SXMPMeta, and so on) to use in your code.
+///
+/// \li \c TXMP_EXPAND_INLINE - Define this as 1 if you want to have the template functions expanded
+/// inline in your code. Leave it undefined, or defined as 0, to use out-of-line instantiations of
+/// the template functions. Compiling \c XMP.incl_cpp generates explicit out-of-line
+/// instantiations if \c TXMP_EXPAND_INLINE is off.
+///
+/// The template parameter, class \c tStringObj, must have the following member functions (which
+/// match those for \c std::string):
+///
+/// <pre>
+/// tStringObj& assign ( const char * str, size_t len )
+/// size_t size() const
+/// const char * c_str() const
+/// </pre>
+///
+/// The string class must be suitable for at least UTF-8. This is the encoding used for all general
+/// values, and is the default encoding for serialized XMP. The string type must also be suitable
+/// for UTF-16 or UTF-32 if those serialization encodings are used. This mainly means tolerating
+/// embedded 0 bytes, which \c std::string does.
+// ================================================================================================
+
+/// /c XMP_Environment.h must be the first included header.
+#include "XMP_Environment.h"
+
+#include "XMP_Version.h"
+#include "XMP_Const.h"
+
+#if XMP_WinBuild
+ #if XMP_DebugBuild
+ #pragma warning ( push, 4 )
+ #else
+ #pragma warning ( push, 3 )
+ #endif
+ #pragma warning ( disable : 4702 ) // unreachable code
+ #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning)
+#endif
+
+#if defined ( TXMP_STRING_TYPE )
+
+ #include "TXMPMeta.hpp"
+ #include "TXMPIterator.hpp"
+ #include "TXMPUtils.hpp"
+ typedef class TXMPMeta <TXMP_STRING_TYPE> SXMPMeta; // For client convenience.
+ typedef class TXMPIterator <TXMP_STRING_TYPE> SXMPIterator;
+ typedef class TXMPUtils <TXMP_STRING_TYPE> SXMPUtils;
+ #if TXMP_EXPAND_INLINE
+ #error "TXMP_EXPAND_INLINE is not working at present. Please don't use it."
+ #include "client-glue/TXMPMeta.incl_cpp"
+ #include "client-glue/TXMPIterator.incl_cpp"
+ #include "client-glue/TXMPUtils.incl_cpp"
+ #include "client-glue/TXMPFiles.incl_cpp"
+ #endif
+
+ #if XMP_INCLUDE_XMPFILES
+ #include "TXMPFiles.hpp" // ! Needs typedef for SXMPMeta.
+ typedef class TXMPFiles <TXMP_STRING_TYPE> SXMPFiles;
+ #if TXMP_EXPAND_INLINE
+ #include "client-glue/TXMPFiles.incl_cpp"
+ #endif
+ #endif
+
+#endif // TXMP_STRING_TYPE
+
+#if XMP_WinBuild
+ #pragma warning ( pop )
+#endif
+
+// =================================================================================================
+
+#endif // __XMP_hpp__
diff --git a/gpr/source/lib/xmp_core/public/include/XMP.incl_cpp b/gpr/source/lib/xmp_core/public/include/XMP.incl_cpp
new file mode 100644
index 0000000..fe2a6fa
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/XMP.incl_cpp
@@ -0,0 +1,69 @@
+#ifndef __XMP_incl_cpp__
+#define __XMP_incl_cpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// ================================================================================================
+/// \file XMP.incl_cpp
+/// \brief Overall client glue file for the XMP toolkit.
+///
+/// This is an overall client source file of XMP toolkit glue, the only XMP-specific one that
+/// clients should build in projects. This ensures that all of the client-side glue code for the
+/// XMP toolkit gets compiled.
+///
+/// You cannot compile this file directly, because the template's string type must be declared and
+/// only the client can do that. Instead, include this in some other source file. For example,
+/// to use <tt>std::string</tt> you only need these two lines:
+///
+/// \code
+/// #include <string>
+/// #include "XMP.incl_cpp"
+/// \endcode
+
+
+#include "XMP.hpp" // ! This must be the first include!
+
+#define XMP_ClientBuild 1
+
+#if XMP_WinBuild
+ #if XMP_DebugBuild
+ #pragma warning ( push, 4 )
+ #else
+ #pragma warning ( push, 3 )
+ #endif
+
+ #pragma warning ( disable : 4127 ) // conditional expression is constant
+ #pragma warning ( disable : 4189 ) // local variable is initialized but not referenced
+ #pragma warning ( disable : 4702 ) // unreachable code
+ #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning)
+#endif
+
+#if defined ( TXMP_STRING_TYPE ) && (! TXMP_EXPAND_INLINE)
+
+ // We're using a single out of line instantiation. Do it here.
+
+ #include "client-glue/TXMPMeta.incl_cpp"
+ #include "client-glue/TXMPIterator.incl_cpp"
+ #include "client-glue/TXMPUtils.incl_cpp"
+ template class TXMPMeta <TXMP_STRING_TYPE>;
+ template class TXMPIterator <TXMP_STRING_TYPE>;
+ template class TXMPUtils <TXMP_STRING_TYPE>;
+ #if XMP_INCLUDE_XMPFILES
+ #include "client-glue/TXMPFiles.incl_cpp"
+ template class TXMPFiles <TXMP_STRING_TYPE>;
+ #endif
+
+#endif
+
+#if XMP_WinBuild
+ #pragma warning ( pop )
+#endif
+
+#endif // __XMP_incl_cpp__
diff --git a/gpr/source/lib/xmp_core/public/include/XMP_Const.h b/gpr/source/lib/xmp_core/public/include/XMP_Const.h
new file mode 100644
index 0000000..eadc267
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/XMP_Const.h
@@ -0,0 +1,1560 @@
+#ifndef __XMP_Const_h__
+#define __XMP_Const_h__ 1
+
+// =================================================================================================
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMP_Environment.h"
+
+ #include <stddef.h>
+
+#if XMP_MacBuild | XMP_iOSBuild // ! No stdint.h on Windows and some UNIXes.
+ #include <stdint.h>
+#endif
+#if XMP_UNIXBuild // hopefully an inttypes.h on all UNIXes...
+ #include <inttypes.h>
+#endif
+
+
+#if __cplusplus
+extern "C" {
+#endif
+
+// =================================================================================================
+/// \file XMP_Const.h
+/// \brief Common C/C++ types and constants for the XMP toolkit.
+// =================================================================================================
+
+// =================================================================================================
+// Basic types and constants
+// =========================
+
+// The XMP_... types are used on the off chance that the ..._t types present a problem. In that
+// case only the declarations of the XMP_... types needs to change, not all of the uses. These
+// types are used where fixed sizes are required in order to have a known ABI for a DLL build.
+
+#if XMP_MacBuild | XMP_iOSBuild
+
+ typedef int8_t XMP_Int8;
+ typedef int16_t XMP_Int16;
+ typedef int32_t XMP_Int32;
+ typedef int64_t XMP_Int64;
+
+ typedef uint8_t XMP_Uns8;
+ typedef uint16_t XMP_Uns16;
+ typedef uint32_t XMP_Uns32;
+ typedef uint64_t XMP_Uns64;
+
+#elif XMP_WinBuild
+
+ typedef signed char XMP_Int8;
+ typedef signed short XMP_Int16;
+ typedef signed long XMP_Int32;
+ typedef signed long long XMP_Int64;
+
+ typedef unsigned char XMP_Uns8;
+ typedef unsigned short XMP_Uns16;
+ typedef unsigned long XMP_Uns32;
+ typedef unsigned long long XMP_Uns64;
+
+#elif XMP_UNIXBuild
+
+ #if ! XMP_64
+
+ typedef signed char XMP_Int8;
+ typedef signed short XMP_Int16;
+ typedef signed long XMP_Int32;
+ typedef signed long long XMP_Int64;
+
+ typedef unsigned char XMP_Uns8;
+ typedef unsigned short XMP_Uns16;
+ typedef unsigned long XMP_Uns32;
+ typedef unsigned long long XMP_Uns64;
+
+ #else
+
+ typedef signed char XMP_Int8;
+ typedef signed short XMP_Int16;
+ typedef signed int XMP_Int32;
+ typedef signed long long XMP_Int64;
+
+ typedef unsigned char XMP_Uns8;
+ typedef unsigned short XMP_Uns16;
+ typedef unsigned int XMP_Uns32;
+ typedef unsigned long long XMP_Uns64;
+
+ #endif
+
+#else
+
+ #error "XMP environment error - must define one of XMP_MacBuild, XMP_WinBuild, XMP_UNIXBuild or XMP_iOSBuild"
+
+#endif
+
+typedef XMP_Uns8 XMP_Bool;
+
+const XMP_Uns8 kXMP_Bool_False = 0;
+
+#define ConvertXMP_BoolToBool(a) (a) != kXMP_Bool_False
+#define ConvertBoolToXMP_Bool(a) (a) ? !kXMP_Bool_False : kXMP_Bool_False
+
+static const XMP_Uns8 Min_XMP_Uns8 = ( (XMP_Uns8) 0x00 );
+static const XMP_Uns8 Max_XMP_Uns8 = ( (XMP_Uns8) 0xFF );
+static const XMP_Uns16 Min_XMP_Uns16 = ( (XMP_Uns16) 0x00 );
+static const XMP_Uns16 Max_XMP_Uns16 = ( (XMP_Uns16) 0xFFFF );
+static const XMP_Uns32 Min_XMP_Uns32 = ( (XMP_Uns32) 0x00 );
+static const XMP_Uns32 Max_XMP_Uns32 = ( (XMP_Uns32) 0xFFFFFFFF );
+static const XMP_Uns64 Min_XMP_Uns64 = ( (XMP_Uns64) 0x00 );
+static const XMP_Uns64 Max_XMP_Uns64 = ( (XMP_Uns64) 0xFFFFFFFFFFFFFFFFLL );
+
+static const XMP_Int8 Min_XMP_Int8 = ( (XMP_Int8) 0x80 );
+static const XMP_Int8 Max_XMP_Int8 = ( (XMP_Int8) 0x7F );
+static const XMP_Int16 Min_XMP_Int16 = ( (XMP_Int16) 0x8000 );
+static const XMP_Int16 Max_XMP_Int16 = ( (XMP_Int16) 0x7FFF );
+static const XMP_Int32 Min_XMP_Int32 = ( (XMP_Int32) 0x80000000 );
+static const XMP_Int32 Max_XMP_Int32 = ( (XMP_Int32) 0x7FFFFFFF );
+static const XMP_Int64 Min_XMP_Int64 = ( (XMP_Int64) 0x8000000000000000LL );
+static const XMP_Int64 Max_XMP_Int64 = ( (XMP_Int64) 0x7FFFFFFFFFFFFFFFLL );
+
+
+/// An "ABI safe" pointer to the internal part of an XMP object. Use to pass an XMP object across
+/// client DLL boundaries. See \c TXMPMeta::GetInternalRef().
+typedef struct __XMPMeta__ * XMPMetaRef;
+
+/// An "ABI safe" pointer to the internal part of an XMP iteration object. Use to pass an XMP
+/// iteration object across client DLL boundaries. See \c TXMPIterator.
+typedef struct __XMPIterator__ * XMPIteratorRef;
+
+/// An "ABI safe" pointer to the internal part of an XMP document operations object. Use to pass an
+/// XMP document operations object across client DLL boundaries. See \c TXMPDocOps.
+typedef struct __XMPDocOps__ * XMPDocOpsRef;
+
+/// An "ABI safe" pointer to the internal part of an XMP file-handling object. Use to pass an XMP
+/// file-handling object across client DLL boundaries. See \c TXMPFiles.
+typedef struct __XMPFiles__ * XMPFilesRef;
+
+// =================================================================================================
+
+/// \name General scalar types and constants
+/// @{
+
+/// \typedef XMP_StringPtr
+/// \brief The type for input string parameters. A <tt>const char *</tt>, a null-terminated UTF-8
+/// string.
+
+/// \typedef XMP_StringLen
+/// \brief The type for string length parameters. A 32-bit unsigned integer, as big as will be
+/// practically needed.
+
+/// \typedef XMP_Index
+/// \brief The type for offsets and indices. A 32-bit signed integer. It is signed to allow -1 for
+/// loop termination.
+
+/// \typedef XMP_OptionBits
+/// \brief The type for a collection of 32 flag bits. Individual flags are defined as enum value bit
+/// masks; see \c #kXMP_PropValueIsURI and following. A number of macros provide common set or set
+/// operations, such as \c XMP_PropIsSimple. For other tests use an expression like <code>options &
+/// kXMP_<theOption></code>. When passing multiple option flags use the bitwise-OR operator. '|',
+/// not the arithmatic plus, '+'.
+
+typedef const char * XMP_StringPtr; // Points to a null terminated UTF-8 string.
+typedef XMP_Uns32 XMP_StringLen;
+typedef XMP_Int32 XMP_Index; // Signed, sometimes -1 is handy.
+typedef XMP_Uns32 XMP_OptionBits; // Used as 32 individual bits.
+
+/// \def kXMP_TrueStr
+/// \brief The canonical true string value for Booleans in serialized XMP.
+///
+/// Code that converts from string to bool should be case insensitive, and also allow "1".
+
+/// \def kXMP_FalseStr
+/// \brief The canonical false string value for Booleans in serialized XMP.
+///
+/// Code that converts from string to bool should be case insensitive, and also allow "0".
+
+#define kXMP_TrueStr "True" // Serialized XMP spellings, not for the type bool.
+#define kXMP_FalseStr "False"
+
+/// Type for yes/no/maybe answers. The values are picked to allow Boolean-like usage. The yes and
+/// values are true (non-zero), the no value is false (zero).
+enum {
+ /// The part or parts have definitely changed.
+ kXMPTS_Yes = 1,
+ /// The part or parts have definitely not changed.
+ kXMPTS_No = 0,
+ /// The part or parts might, or might not, have changed.
+ kXMPTS_Maybe = -1
+};
+typedef XMP_Int8 XMP_TriState;
+
+/// @}
+
+// =================================================================================================
+
+/// \struct XMP_DateTime
+/// \brief The expanded type for a date and time.
+///
+/// Dates and time in the serialized XMP are ISO 8601 strings. The \c XMP_DateTime struct allows
+/// easy conversion with other formats.
+///
+/// All of the fields are 32 bit, even though most could be 8 bit. This avoids overflow when doing
+/// carries for arithmetic or normalization. All fields have signed values for the same reasons.
+///
+/// Date-time values are occasionally used with only a date or only a time component. A date without
+/// a time has zeros in the \c XMP_DateTime struct for all time fields. A time without a date has
+/// zeros for all date fields (year, month, and day).
+///
+/// \c TXMPUtils provides utility functions for manipulating date-time values.
+///
+/// @see \c TXMPUtils::ConvertToDate(), \c TXMPUtils::ConvertFromDate(),
+/// \c TXMPUtils::CompareDateTime(), \c TXMPUtils::ConvertToLocalTime(),
+/// \c TXMPUtils::ConvertToUTCTime(), \c TXMPUtils::CurrentDateTime(),
+/// \c TXMPUtils::SetTimeZone()
+
+struct XMP_DateTime {
+
+ /// The year, can be negative.
+ XMP_Int32 year;
+
+ /// The month in the range 1..12.
+ XMP_Int32 month;
+
+ /// The day of the month in the range 1..31.
+ XMP_Int32 day;
+
+ /// The hour in the range 0..23.
+ XMP_Int32 hour;
+
+ /// The minute in the range 0..59.
+ XMP_Int32 minute;
+
+ /// The second in the range 0..59.
+ XMP_Int32 second;
+
+ /// Is the date portion meaningful?
+ XMP_Bool hasDate;
+
+ /// Is the time portion meaningful?
+ XMP_Bool hasTime;
+
+ /// Is the time zone meaningful?
+ XMP_Bool hasTimeZone;
+
+ /// The "sign" of the time zone, \c #kXMP_TimeIsUTC (0) means UTC, \c #kXMP_TimeWestOfUTC (-1)
+ /// is west, \c #kXMP_TimeEastOfUTC (+1) is east.
+ XMP_Int8 tzSign;
+
+ /// The time zone hour in the range 0..23.
+ XMP_Int32 tzHour;
+
+ /// The time zone minute in the range 0..59.
+ XMP_Int32 tzMinute;
+
+ /// Nanoseconds within a second, often left as zero.
+ XMP_Int32 nanoSecond;
+
+ #if __cplusplus
+ XMP_DateTime() : year(0), month(0), day(0), hour(0), minute(0), second(0),
+ hasDate(false),hasTime(false), hasTimeZone(false), tzSign(0), tzHour(0), tzMinute(0), nanoSecond(0){};
+ #endif
+
+};
+
+/// Constant values for \c XMP_DateTime::tzSign field.
+enum {
+ /// Time zone is west of UTC.
+ kXMP_TimeWestOfUTC = -1,
+ /// UTC time.
+ kXMP_TimeIsUTC = 0,
+ /// Time zone is east of UTC.
+ kXMP_TimeEastOfUTC = +1
+};
+
+#define XMPDateTime_IsDateOnly(dt) ((dt).hasDate & (! (dt).hasTime))
+#define XMPDateTime_IsTimeOnly(dt) ((dt).hasTime & (! (dt).hasDate))
+
+#define XMPDateTime_ClearTimeZone(dt) { (dt).hasTimeZone = (dt).tzSign = (dt).tzHour = (dt).tzMinute = 0; }
+
+// =================================================================================================
+// Standard namespace URI constants
+// ================================
+
+/// \name XML namespace constants for standard XMP schema.
+/// @{
+///
+/// \def kXMP_NS_XMP
+/// \brief The XML namespace for the XMP "basic" schema.
+///
+/// \def kXMP_NS_XMP_Rights
+/// \brief The XML namespace for the XMP copyright schema.
+///
+/// \def kXMP_NS_XMP_MM
+/// \brief The XML namespace for the XMP digital asset management schema.
+///
+/// \def kXMP_NS_XMP_BJ
+/// \brief The XML namespace for the job management schema.
+///
+/// \def kXMP_NS_XMP_T
+/// \brief The XML namespace for the XMP text document schema.
+///
+/// \def kXMP_NS_XMP_T_PG
+/// \brief The XML namespace for the XMP paged document schema.
+///
+/// \def kXMP_NS_PDF
+/// \brief The XML namespace for the PDF schema.
+///
+/// \def kXMP_NS_Photoshop
+/// \brief The XML namespace for the Photoshop custom schema.
+///
+/// \def kXMP_NS_EXIF
+/// \brief The XML namespace for Adobe's EXIF schema.
+///
+/// \def kXMP_NS_TIFF
+/// \brief The XML namespace for Adobe's TIFF schema.
+///
+/// @}
+
+#define kXMP_NS_XMP "http://ns.adobe.com/xap/1.0/"
+
+#define kXMP_NS_XMP_Rights "http://ns.adobe.com/xap/1.0/rights/"
+#define kXMP_NS_XMP_MM "http://ns.adobe.com/xap/1.0/mm/"
+#define kXMP_NS_XMP_BJ "http://ns.adobe.com/xap/1.0/bj/"
+
+#define kXMP_NS_PDF "http://ns.adobe.com/pdf/1.3/"
+#define kXMP_NS_Photoshop "http://ns.adobe.com/photoshop/1.0/"
+#define kXMP_NS_PSAlbum "http://ns.adobe.com/album/1.0/"
+#define kXMP_NS_EXIF "http://ns.adobe.com/exif/1.0/"
+#define kXMP_NS_EXIF_Aux "http://ns.adobe.com/exif/1.0/aux/"
+#define kXMP_NS_TIFF "http://ns.adobe.com/tiff/1.0/"
+#define kXMP_NS_PNG "http://ns.adobe.com/png/1.0/"
+#define kXMP_NS_SWF "http://ns.adobe.com/swf/1.0/"
+#define kXMP_NS_JPEG "http://ns.adobe.com/jpeg/1.0/"
+#define kXMP_NS_JP2K "http://ns.adobe.com/jp2k/1.0/"
+#define kXMP_NS_CameraRaw "http://ns.adobe.com/camera-raw-settings/1.0/"
+#define kXMP_NS_DM "http://ns.adobe.com/xmp/1.0/DynamicMedia/"
+#define kXMP_NS_Script "http://ns.adobe.com/xmp/1.0/Script/"
+#define kXMP_NS_ASF "http://ns.adobe.com/asf/1.0/"
+#define kXMP_NS_WAV "http://ns.adobe.com/xmp/wav/1.0/"
+#define kXMP_NS_BWF "http://ns.adobe.com/bwf/bext/1.0/"
+#define kXMP_NS_AEScart "http://ns.adobe.com/aes/cart/"
+#define kXMP_NS_RIFFINFO "http://ns.adobe.com/riff/info/"
+
+#define kXMP_NS_XMP_Note "http://ns.adobe.com/xmp/note/"
+
+#define kXMP_NS_AdobeStockPhoto "http://ns.adobe.com/StockPhoto/1.0/"
+#define kXMP_NS_CreatorAtom "http://ns.adobe.com/creatorAtom/1.0/"
+
+#define kXMP_NS_ExifEX "http://cipa.jp/exif/1.0/"
+
+/// \name XML namespace constants for qualifiers and structured property fields.
+/// @{
+///
+/// \def kXMP_NS_XMP_IdentifierQual
+/// \brief The XML namespace for qualifiers of the xmp:Identifier property.
+///
+/// \def kXMP_NS_XMP_Dimensions
+/// \brief The XML namespace for fields of the Dimensions type.
+///
+/// \def kXMP_NS_XMP_Image
+/// \brief The XML namespace for fields of a graphical image. Used for the Thumbnail type.
+///
+/// \def kXMP_NS_XMP_ResourceEvent
+/// \brief The XML namespace for fields of the ResourceEvent type.
+///
+/// \def kXMP_NS_XMP_ResourceRef
+/// \brief The XML namespace for fields of the ResourceRef type.
+///
+/// \def kXMP_NS_XMP_ST_Version
+/// \brief The XML namespace for fields of the Version type.
+///
+/// \def kXMP_NS_XMP_ST_Job
+/// \brief The XML namespace for fields of the JobRef type.
+///
+/// @}
+
+#define kXMP_NS_XMP_IdentifierQual "http://ns.adobe.com/xmp/Identifier/qual/1.0/"
+#define kXMP_NS_XMP_Dimensions "http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+#define kXMP_NS_XMP_Text "http://ns.adobe.com/xap/1.0/t/"
+#define kXMP_NS_XMP_PagedFile "http://ns.adobe.com/xap/1.0/t/pg/"
+#define kXMP_NS_XMP_Graphics "http://ns.adobe.com/xap/1.0/g/"
+#define kXMP_NS_XMP_Image "http://ns.adobe.com/xap/1.0/g/img/"
+#define kXMP_NS_XMP_Font "http://ns.adobe.com/xap/1.0/sType/Font#"
+#define kXMP_NS_XMP_ResourceEvent "http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+#define kXMP_NS_XMP_ResourceRef "http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+#define kXMP_NS_XMP_ST_Version "http://ns.adobe.com/xap/1.0/sType/Version#"
+#define kXMP_NS_XMP_ST_Job "http://ns.adobe.com/xap/1.0/sType/Job#"
+#define kXMP_NS_XMP_ManifestItem "http://ns.adobe.com/xap/1.0/sType/ManifestItem#"
+
+// Deprecated XML namespace constants
+#define kXMP_NS_XMP_T "http://ns.adobe.com/xap/1.0/t/"
+#define kXMP_NS_XMP_T_PG "http://ns.adobe.com/xap/1.0/t/pg/"
+#define kXMP_NS_XMP_G_IMG "http://ns.adobe.com/xap/1.0/g/img/"
+
+/// \name XML namespace constants from outside Adobe.
+/// @{
+///
+/// \def kXMP_NS_DC
+/// \brief The XML namespace for the Dublin Core schema.
+///
+/// \def kXMP_NS_IPTCCore
+/// \brief The XML namespace for the IPTC Core schema.
+///
+/// \def kXMP_NS_IPTCExt
+/// \brief The XML namespace for the IPTC Extension schema.
+///
+/// \def kXMP_NS_RDF
+/// \brief The XML namespace for RDF.
+///
+/// \def kXMP_NS_XML
+/// \brief The XML namespace for XML.
+///
+/// @}
+
+#define kXMP_NS_DC "http://purl.org/dc/elements/1.1/"
+
+#define kXMP_NS_IPTCCore "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/"
+#define kXMP_NS_IPTCExt "http://iptc.org/std/Iptc4xmpExt/2008-02-29/"
+
+#define kXMP_NS_DICOM "http://ns.adobe.com/DICOM/"
+
+#define kXMP_NS_PLUS "http://ns.useplus.org/ldf/xmp/1.0/"
+
+#define kXMP_NS_PDFA_Schema "http://www.aiim.org/pdfa/ns/schema#"
+#define kXMP_NS_PDFA_Property "http://www.aiim.org/pdfa/ns/property#"
+#define kXMP_NS_PDFA_Type "http://www.aiim.org/pdfa/ns/type#"
+#define kXMP_NS_PDFA_Field "http://www.aiim.org/pdfa/ns/field#"
+#define kXMP_NS_PDFA_ID "http://www.aiim.org/pdfa/ns/id/"
+#define kXMP_NS_PDFA_Extension "http://www.aiim.org/pdfa/ns/extension/"
+
+#define kXMP_NS_PDFX "http://ns.adobe.com/pdfx/1.3/"
+#define kXMP_NS_PDFX_ID "http://www.npes.org/pdfx/ns/id/"
+
+#define kXMP_NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+#define kXMP_NS_XML "http://www.w3.org/XML/1998/namespace"
+
+// =================================================================================================
+// Enums and macros used for option bits
+// =====================================
+
+/// \name Macros for standard option selections.
+/// @{
+///
+/// \def kXMP_ArrayLastItem
+/// \brief Options macro accesses last array item.
+///
+/// \def kXMP_UseNullTermination
+/// \brief Options macro sets string style.
+///
+/// \def kXMP_NoOptions
+/// \brief Options macro clears all property-type bits.
+///
+/// @}
+
+#define kXMP_ArrayLastItem ((XMP_Index)(-1L))
+#define kXMP_UseNullTermination ((XMP_StringLen)(~0UL))
+#define kXMP_NoOptions ((XMP_OptionBits)0UL)
+
+/// \name Macros for setting and testing general option bits.
+/// @{
+///
+/// \def XMP_SetOption
+/// \brief Macro sets an option flag bit.
+/// \param var A variable storing an options flag.
+/// \param opt The bit-flag constant to set.
+///
+/// \def XMP_ClearOption
+/// \brief Macro clears an option flag bit.
+/// \param var A variable storing an options flag.
+/// \param opt The bit-flag constant to clear.
+///
+/// \def XMP_TestOption
+/// \brief Macro reports whether an option flag bit is set.
+/// \param var A variable storing an options flag.
+/// \param opt The bit-flag constant to test.
+/// \return True if the bit is set.
+///
+/// \def XMP_OptionIsSet
+/// \brief Macro reports whether an option flag bit is set.
+/// \param var A variable storing an options flag.
+/// \param opt The bit-flag constant to test.
+/// \return True if the bit is set.
+///
+/// \def XMP_OptionIsClear
+/// \brief Macro reports whether an option flag bit is clear.
+/// \param var A variable storing an options flag.
+/// \param opt The bit-flag constant to test.
+/// \return True if the bit is clear.
+///
+/// @}
+
+#define XMP_SetOption(var,opt) var |= (opt)
+#define XMP_ClearOption(var,opt) var &= ~(opt)
+#define XMP_TestOption(var,opt) (((var) & (opt)) != 0)
+#define XMP_OptionIsSet(var,opt) (((var) & (opt)) != 0)
+#define XMP_OptionIsClear(var,opt) (((var) & (opt)) == 0)
+
+/// \name Macros for setting and testing specific option bits.
+/// @{
+///
+/// \def XMP_PropIsSimple
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropIsStruct
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropIsArray
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_ArrayIsUnordered
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_ArrayIsOrdered
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_ArrayIsAlternate
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_ArrayIsAltText
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropHasQualifiers
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropIsQualifier
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropHasLang
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_NodeIsSchema
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// \def XMP_PropIsAlias
+/// \brief Macro reports the property type specified by an options flag.
+/// \param opt The options flag to check.
+///
+/// @}
+
+#define XMP_PropIsSimple(opt) (((opt) & kXMP_PropCompositeMask) == 0)
+#define XMP_PropIsStruct(opt) (((opt) & kXMP_PropValueIsStruct) != 0)
+#define XMP_PropIsArray(opt) (((opt) & kXMP_PropValueIsArray) != 0)
+
+#define XMP_ArrayIsUnordered(opt) (((opt) & kXMP_PropArrayIsOrdered) == 0)
+#define XMP_ArrayIsOrdered(opt) (((opt) & kXMP_PropArrayIsOrdered) != 0)
+#define XMP_ArrayIsAlternate(opt) (((opt) & kXMP_PropArrayIsAlternate) != 0)
+#define XMP_ArrayIsAltText(opt) (((opt) & kXMP_PropArrayIsAltText) != 0)
+
+#define XMP_PropHasQualifiers(opt) (((opt) & kXMP_PropHasQualifiers) != 0)
+#define XMP_PropIsQualifier(opt) (((opt) & kXMP_PropIsQualifier) != 0)
+#define XMP_PropHasLang(opt) (((opt) & kXMP_PropHasLang) != 0)
+
+#define XMP_NodeIsSchema(opt) (((opt) & kXMP_SchemaNode) != 0)
+#define XMP_PropIsAlias(opt) (((opt) & kXMP_PropIsAlias) != 0)
+
+// -------------------------------------------------------------------------------------------------
+
+/// Option bit flags for the \c TXMPMeta property accessor functions.
+enum {
+
+ /// The XML string form of the property value is a URI, use rdf:resource attribute. DISCOURAGED
+ kXMP_PropValueIsURI = 0x00000002UL,
+
+ // ------------------------------------------------------
+ // Options relating to qualifiers attached to a property.
+
+ /// The property has qualifiers, includes \c rdf:type and \c xml:lang.
+ kXMP_PropHasQualifiers = 0x00000010UL,
+
+ /// This is a qualifier for some other property, includes \c rdf:type and \c xml:lang.
+ /// Qualifiers can have arbitrary structure, and can themselves have qualifiers. If the
+ /// qualifier itself has a structured value, this flag is only set for the top node of the
+ /// qualifier's subtree.
+ kXMP_PropIsQualifier = 0x00000020UL,
+
+ /// Implies \c #kXMP_PropHasQualifiers, property has \c xml:lang.
+ kXMP_PropHasLang = 0x00000040UL,
+
+ /// Implies \c #kXMP_PropHasQualifiers, property has \c rdf:type.
+ kXMP_PropHasType = 0x00000080UL,
+
+ // --------------------------------------------
+ // Options relating to the data structure form.
+
+ /// The value is a structure with nested fields.
+ kXMP_PropValueIsStruct = 0x00000100UL,
+
+ /// The value is an array (RDF alt/bag/seq). The "ArrayIs..." flags identify specific types
+ /// of array; default is a general unordered array, serialized using an \c rdf:Bag container.
+ kXMP_PropValueIsArray = 0x00000200UL,
+
+ /// The item order does not matter.
+ kXMP_PropArrayIsUnordered = kXMP_PropValueIsArray,
+
+ /// Implies \c #kXMP_PropValueIsArray, item order matters. It is serialized using an \c rdf:Seq container.
+ kXMP_PropArrayIsOrdered = 0x00000400UL,
+
+ /// Implies \c #kXMP_PropArrayIsOrdered, items are alternates. It is serialized using an \c rdf:Alt container.
+ kXMP_PropArrayIsAlternate = 0x00000800UL,
+
+ // ------------------------------------
+ // Additional struct and array options.
+
+ /// Implies \c #kXMP_PropArrayIsAlternate, items are localized text. Each array element is a
+ /// simple property with an \c xml:lang attribute.
+ kXMP_PropArrayIsAltText = 0x00001000UL,
+
+ // kXMP_InsertBeforeItem = 0x00004000UL, ! Used by SetXyz functions.
+ // kXMP_InsertAfterItem = 0x00008000UL, ! Used by SetXyz functions.
+
+ // ----------------------------
+ // Other miscellaneous options.
+
+ /// This property is an alias name for another property. This is only returned by
+ /// \c TXMPMeta::GetProperty() and then only if the property name is simple, not an path expression.
+ kXMP_PropIsAlias = 0x00010000UL,
+
+ /// This property is the base value (actual) for a set of aliases.This is only returned by
+ /// \c TXMPMeta::GetProperty() and then only if the property name is simple, not an path expression.
+ kXMP_PropHasAliases = 0x00020000UL,
+
+ /// The value of this property is "owned" by the application, and should not generally be editable in a UI.
+ kXMP_PropIsInternal = 0x00040000UL,
+
+ /// The value of this property is not derived from the document content.
+ kXMP_PropIsStable = 0x00100000UL,
+
+ /// The value of this property is derived from the document content.
+ kXMP_PropIsDerived = 0x00200000UL,
+
+ // kXMPUtil_AllowCommas = 0x10000000UL, ! Used by TXMPUtils::CatenateArrayItems and ::SeparateArrayItems.
+ // kXMP_DeleteExisting = 0x20000000UL, ! Used by TXMPMeta::SetXyz functions to delete any pre-existing property.
+ // kXMP_SchemaNode = 0x80000000UL, ! Returned by iterators - #define to avoid warnings
+
+ // ------------------------------
+ // Masks that are multiple flags.
+
+ /// Property type bit-flag mask for all array types
+ kXMP_PropArrayFormMask = kXMP_PropValueIsArray | kXMP_PropArrayIsOrdered | kXMP_PropArrayIsAlternate | kXMP_PropArrayIsAltText,
+
+ /// Property type bit-flag mask for composite types (array and struct)
+ kXMP_PropCompositeMask = kXMP_PropValueIsStruct | kXMP_PropArrayFormMask,
+
+ /// Mask for bits that are reserved for transient use by the implementation.
+ kXMP_ImplReservedMask = 0x70000000L
+
+};
+
+#define kXMP_SchemaNode ((XMP_OptionBits)0x80000000UL)
+
+/// Option bit flags for the \c TXMPMeta property setting functions. These option bits are shared
+/// with the accessor functions:
+/// \li \c #kXMP_PropValueIsURI
+/// \li \c #kXMP_PropValueIsStruct
+/// \li \c #kXMP_PropValueIsArray
+/// \li \c #kXMP_PropArrayIsOrdered
+/// \li \c #kXMP_PropArrayIsAlternate
+/// \li \c #kXMP_PropArrayIsAltText
+enum {
+
+ /// Option for array item location: Insert a new item before the given index.
+ kXMP_InsertBeforeItem = 0x00004000UL,
+
+ /// Option for array item location: Insert a new item after the given index.
+ kXMP_InsertAfterItem = 0x00008000UL,
+
+ /// Delete any pre-existing property.
+ kXMP_DeleteExisting = 0x20000000UL,
+
+ /// Bit-flag mask for property-value option bits
+ kXMP_PropValueOptionsMask = kXMP_PropValueIsURI,
+
+ /// Bit-flag mask for array-item location bits
+ kXMP_PropArrayLocationMask = kXMP_InsertBeforeItem | kXMP_InsertAfterItem
+
+};
+
+// -------------------------------------------------------------------------------------------------
+
+/// Option bit flags for \c TXMPMeta::ParseFromBuffer().
+enum {
+
+ /// Require a surrounding \c x:xmpmeta element.
+ kXMP_RequireXMPMeta = 0x0001UL,
+
+ /// This is the not last input buffer for this parse stream.
+ kXMP_ParseMoreBuffers = 0x0002UL,
+
+ /// Do not reconcile alias differences, throw an exception.
+ kXMP_StrictAliasing = 0x0004UL
+
+};
+
+/// Option bit flags for \c TXMPMeta::SerializeToBuffer().
+enum {
+
+ // *** Option to remove empty struct/array, or leaf with empty value?
+
+ /// Omit the XML packet wrapper.
+ kXMP_OmitPacketWrapper = 0x0010UL,
+
+ /// Default is a writeable packet.
+ kXMP_ReadOnlyPacket = 0x0020UL,
+
+ /// Use a compact form of RDF.
+ kXMP_UseCompactFormat = 0x0040UL,
+
+ /// Use a canonical form of RDF.
+ kXMP_UseCanonicalFormat = 0x0080UL,
+
+ /// Include a padding allowance for a thumbnail image.
+ kXMP_IncludeThumbnailPad = 0x0100UL,
+
+ /// The padding parameter is the overall packet length.
+ kXMP_ExactPacketLength = 0x0200UL,
+
+ /// Omit all formatting whitespace.
+ kXMP_OmitAllFormatting = 0x0800UL,
+
+ /// Omit the x:xmpmeta element surrounding the rdf:RDF element.
+ kXMP_OmitXMPMetaElement = 0x1000UL,
+
+ /// Include a rdf Hash and Merged flag in x:xmpmeta element.
+ kXMP_IncludeRDFHash = 0x2000UL,
+
+ _XMP_LittleEndian_Bit = 0x0001UL, // ! Don't use directly, see the combined values below!
+ _XMP_UTF16_Bit = 0x0002UL,
+ _XMP_UTF32_Bit = 0x0004UL,
+
+ /// Bit-flag mask for encoding-type bits
+ kXMP_EncodingMask = 0x0007UL,
+
+ /// Use UTF8 encoding
+ kXMP_EncodeUTF8 = 0UL,
+
+ /// Use UTF16 big-endian encoding
+ kXMP_EncodeUTF16Big = _XMP_UTF16_Bit,
+
+ /// Use UTF16 little-endian encoding
+ kXMP_EncodeUTF16Little = _XMP_UTF16_Bit | _XMP_LittleEndian_Bit,
+
+ /// Use UTF32 big-endian encoding
+ kXMP_EncodeUTF32Big = _XMP_UTF32_Bit,
+
+ /// Use UTF13 little-endian encoding
+ kXMP_EncodeUTF32Little = _XMP_UTF32_Bit | _XMP_LittleEndian_Bit
+
+};
+
+// -------------------------------------------------------------------------------------------------
+
+/// Option bit flags for \c TXMPIterator construction.
+enum {
+
+ /// The low 8 bits are an enum of what data structure to iterate.
+ kXMP_IterClassMask = 0x00FFUL,
+
+ /// Iterate the property tree of a TXMPMeta object.
+ kXMP_IterProperties = 0x0000UL,
+
+ /// Iterate the global alias table.
+ kXMP_IterAliases = 0x0001UL,
+
+ /// Iterate the global namespace table.
+ kXMP_IterNamespaces = 0x0002UL,
+
+ /// Just do the immediate children of the root, default is subtree.
+ kXMP_IterJustChildren = 0x0100UL,
+
+ /// Just do the leaf nodes, default is all nodes in the subtree.
+ kXMP_IterJustLeafNodes = 0x0200UL,
+
+ /// Return just the leaf part of the path, default is the full path.
+ kXMP_IterJustLeafName = 0x0400UL,
+
+ /// Omit all qualifiers.
+ kXMP_IterOmitQualifiers = 0x1000UL
+
+};
+
+/// Option bit flags for \c TXMPIterator::Skip().
+enum {
+
+ /// Skip the subtree below the current node.
+ kXMP_IterSkipSubtree = 0x0001UL,
+
+ /// Skip the subtree below and remaining siblings of the current node.
+ kXMP_IterSkipSiblings = 0x0002UL
+
+};
+
+// -------------------------------------------------------------------------------------------------
+
+/// Option bit flags for \c TXMPUtils::CatenateArrayItems() and \c TXMPUtils::SeparateArrayItems().
+/// These option bits are shared with the accessor functions:
+/// \li \c #kXMP_PropValueIsArray,
+/// \li \c #kXMP_PropArrayIsOrdered,
+/// \li \c #kXMP_PropArrayIsAlternate,
+/// \li \c #kXMP_PropArrayIsAltText
+enum {
+
+ /// Allow commas in item values, default is separator.
+ kXMPUtil_AllowCommas = 0x10000000UL
+
+};
+
+/// Option bit flags for \c TXMPUtils::ApplyTemplate().
+enum {
+
+ /// Do all properties, default is just external properties.
+ kXMPTemplate_IncludeInternalProperties = 0x0001UL,
+
+ /// Perform a Replace operation, add new properties and modify existing ones.
+ kXMPTemplate_ReplaceExistingProperties = 0x0002UL,
+
+ /// Similar to Replace, also delete if the template has an empty value.
+ kXMPTemplate_ReplaceWithDeleteEmpty = 0x0004UL,
+
+ /// Perform an Add operation, add properties if they don't already exist.
+ kXMPTemplate_AddNewProperties = 0x0008UL,
+
+ /// Perform a Clear operation, keep named properties and delete everything else.
+ kXMPTemplate_ClearUnnamedProperties = 0x0010UL
+
+};
+
+/// Option bit flags for \c TXMPUtils::RemoveProperties() and \c TXMPUtils::AppendProperties().
+enum {
+
+ /// Do all properties, default is just external properties.
+ kXMPUtil_DoAllProperties = 0x0001UL,
+
+ /// Replace existing values, default is to leave them.
+ kXMPUtil_ReplaceOldValues = 0x0002UL,
+
+ /// Delete properties if the new value is empty.
+ kXMPUtil_DeleteEmptyValues = 0x0004UL,
+
+ /// Include aliases, default is just actual properties.
+ kXMPUtil_IncludeAliases = 0x0800UL
+
+};
+
+// =================================================================================================
+// Types and Constants for XMPFiles
+// ================================
+
+/// Seek mode constants for use with XMP_IO and inside XMPFiles library code.
+enum SeekMode { kXMP_SeekFromStart, kXMP_SeekFromCurrent, kXMP_SeekFromEnd };
+
+/// File format constants for use with XMPFiles.
+enum {
+
+ // ! Hex used to avoid gcc warnings. Leave the constants so the text reads big endian. There
+ // ! seems to be no decent way on UNIX to determine the target endianness at compile time.
+ // ! Forcing it on the client isn't acceptable.
+
+ // --------------------
+ // Public file formats.
+
+ /// Public file format constant: 'PDF '
+ kXMP_PDFFile = 0x50444620UL,
+ /// Public file format constant: 'PS ', general PostScript following DSC conventions
+ kXMP_PostScriptFile = 0x50532020UL,
+ /// Public file format constant: 'EPS ', encapsulated PostScript
+ kXMP_EPSFile = 0x45505320UL,
+
+ /// Public file format constant: 'JPEG'
+ kXMP_JPEGFile = 0x4A504547UL,
+ /// Public file format constant: 'JPX ', JPEG 2000, ISO 15444-1
+ kXMP_JPEG2KFile = 0x4A505820UL,
+ /// Public file format constant: 'TIFF'
+ kXMP_TIFFFile = 0x54494646UL,
+ /// Public file format constant: 'GIF '
+ kXMP_GIFFile = 0x47494620UL,
+ /// Public file format constant: 'PNG '
+ kXMP_PNGFile = 0x504E4720UL,
+
+ /// Public file format constant: 'SWF '
+ kXMP_SWFFile = 0x53574620UL,
+ /// Public file format constant: 'FLA '
+ kXMP_FLAFile = 0x464C4120UL,
+ /// Public file format constant: 'FLV '
+ kXMP_FLVFile = 0x464C5620UL,
+
+ /// Public file format constant: 'MOV ', Quicktime
+ kXMP_MOVFile = 0x4D4F5620UL,
+ /// Public file format constant: 'AVI '
+ kXMP_AVIFile = 0x41564920UL,
+ /// Public file format constant: 'CIN ', Cineon
+ kXMP_CINFile = 0x43494E20UL,
+ /// Public file format constant: 'WAV '
+ kXMP_WAVFile = 0x57415620UL,
+ /// Public file format constant: 'MP3 '
+ kXMP_MP3File = 0x4D503320UL,
+ /// Public file format constant: 'SES ', Audition session
+ kXMP_SESFile = 0x53455320UL,
+ /// Public file format constant: 'CEL ', Audition loop
+ kXMP_CELFile = 0x43454C20UL,
+ /// Public file format constant: 'MPEG'
+ kXMP_MPEGFile = 0x4D504547UL,
+ /// Public file format constant: 'MP2 '
+ kXMP_MPEG2File = 0x4D503220UL,
+ /// Public file format constant: 'MP4 ', ISO 14494-12 and -14
+ kXMP_MPEG4File = 0x4D503420UL,
+ /// Public file format constant: 'MXF '
+ kXMP_MXFFile = 0x4D584620UL,
+ /// Public file format constant: 'WMAV', Windows Media Audio and Video
+ kXMP_WMAVFile = 0x574D4156UL,
+ /// Public file format constant: 'AIFF'
+ kXMP_AIFFFile = 0x41494646UL,
+ /// Public file format constant: 'RED ', RED file format
+ kXMP_REDFile = 0x52454420UL,
+ /// Public file format constant: 'P2 ', a collection not really a single file
+ kXMP_P2File = 0x50322020UL,
+ /// Public file format constant: 'XDCF', a collection not really a single file
+ kXMP_XDCAM_FAMFile = 0x58444346UL,
+ /// Public file format constant: 'XDCS', a collection not really a single file
+ kXMP_XDCAM_SAMFile = 0x58444353UL,
+ /// Public file format constant: 'XDCX', a collection not really a single file
+ kXMP_XDCAM_EXFile = 0x58444358UL,
+ /// Public file format constant: 'AVHD', a collection not really a single file
+ kXMP_AVCHDFile = 0x41564844UL,
+ /// Public file format constant: 'SHDV', a collection not really a single file
+ kXMP_SonyHDVFile = 0x53484456UL,
+ /// Public file format constant: 'CNXF', a collection not really a single file
+ kXMP_CanonXFFile = 0x434E5846UL,
+
+ /// Public file format constant: 'HTML'
+ kXMP_HTMLFile = 0x48544D4CUL,
+ /// Public file format constant: 'XML '
+ kXMP_XMLFile = 0x584D4C20UL,
+ /// Public file format constant: 'text'
+ kXMP_TextFile = 0x74657874UL,
+
+ // -------------------------------
+ // Adobe application file formats.
+
+ /// Adobe application file format constant: 'PSD '
+ kXMP_PhotoshopFile = 0x50534420UL,
+ /// Adobe application file format constant: 'AI '
+ kXMP_IllustratorFile = 0x41492020UL,
+ /// Adobe application file format constant: 'INDD'
+ kXMP_InDesignFile = 0x494E4444UL,
+ /// Adobe application file format constant: 'AEP '
+ kXMP_AEProjectFile = 0x41455020UL,
+ /// Adobe application file format constant: 'AET ', After Effects Project Template
+ kXMP_AEProjTemplateFile = 0x41455420UL,
+ /// Adobe application file format constant: 'FFX '
+ kXMP_AEFilterPresetFile = 0x46465820UL,
+ /// Adobe application file format constant: 'NCOR'
+ kXMP_EncoreProjectFile = 0x4E434F52UL,
+ /// Adobe application file format constant: 'PRPJ'
+ kXMP_PremiereProjectFile = 0x5052504AUL,
+ /// Adobe application file format constant: 'PRTL'
+ kXMP_PremiereTitleFile = 0x5052544CUL,
+ /// Adobe application file format constant: 'UCF ', Universal Container Format
+ kXMP_UCFFile = 0x55434620UL,
+
+ // -------
+ // Others.
+
+ /// Unknown file format constant: ' '
+ kXMP_UnknownFile = 0x20202020UL
+
+};
+
+/// Type for file format identification constants. See \c #kXMP_PDFFile and following.
+typedef XMP_Uns32 XMP_FileFormat;
+
+// -------------------------------------------------------------------------------------------------
+
+/// Byte-order masks, do not use directly
+enum {
+ kXMP_CharLittleEndianMask = 1,
+ kXMP_Char16BitMask = 2,
+ kXMP_Char32BitMask = 4
+};
+
+/// Constants to allow easy testing for 16/32 bit and big/little endian.
+enum {
+ /// 8-bit
+ kXMP_Char8Bit = 0,
+ /// 16-bit big-endian
+ kXMP_Char16BitBig = kXMP_Char16BitMask,
+ /// 16-bit little-endian
+ kXMP_Char16BitLittle = kXMP_Char16BitMask | kXMP_CharLittleEndianMask,
+ /// 32-bit big-endian
+ kXMP_Char32BitBig = kXMP_Char32BitMask,
+ /// 32-bit little-endian
+ kXMP_Char32BitLittle = kXMP_Char32BitMask | kXMP_CharLittleEndianMask,
+ /// Variable or not-yet-known cases
+ kXMP_CharUnknown = 1
+};
+
+/// \name Macros to test components of the character form mask
+/// @{
+///
+/// \def XMP_CharFormIs16Bit
+/// \brief Macro reports the encoding of a character.
+/// \param f The character to check.
+///
+/// \def XMP_CharFormIs32Bit
+/// \brief Macro reports the encoding of a character.
+/// \param f The character to check.
+///
+/// \def XMP_CharFormIsBigEndian
+/// \brief Macro reports the byte-order of a character.
+/// \param f The character to check.
+///
+/// \def XMP_CharFormIsLittleEndian
+/// \brief Macro reports the byte-order of a character.
+/// \param f The character to check.
+///
+/// \def XMP_GetCharSize
+/// \brief Macro reports the byte-size of a character.
+/// \param f The character to check.
+///
+/// \def XMP_CharToSerializeForm
+/// \brief Macro converts \c XMP_Uns8 to \c XMP_OptionBits.
+/// \param cf The character to convert.
+///
+/// \def XMP_CharFromSerializeForm
+/// \brief Macro converts \c XMP_OptionBits to \c XMP_Uns8.
+/// \param sf The character to convert.
+///
+/// @}
+
+#define XMP_CharFormIs16Bit(f) ( ((int)(f) & kXMP_Char16BitMask) != 0 )
+#define XMP_CharFormIs32Bit(f) ( ((int)(f) & kXMP_Char32BitMask) != 0 )
+#define XMP_CharFormIsBigEndian(f) ( ((int)(f) & kXMP_CharLittleEndianMask) == 0 )
+#define XMP_CharFormIsLittleEndian(f) ( ((int)(f) & kXMP_CharLittleEndianMask) != 0 )
+#define XMP_GetCharSize(f) ( ((int)(f)&6) == 0 ? 1 : (int)(f)&6 )
+#define XMP_CharToSerializeForm(cf) ( (XMP_OptionBits)(cf) )
+#define XMP_CharFromSerializeForm(sf) ( (XMP_Uns8)(sf) )
+
+/// \def kXMPFiles_UnknownOffset
+/// \brief Constant for an unknown packet offset within a file.
+#define kXMPFiles_UnknownOffset ((XMP_Int64)-1)
+
+/// \def kXMPFiles_UnknownLength
+/// \brief Constant for an unknown packet length within a file.
+#define kXMPFiles_UnknownLength ((XMP_Int32)-1)
+
+/// XMP packet description
+struct XMP_PacketInfo {
+
+ /// Packet offset in the file in bytes, -1 if unknown.
+ XMP_Int64 offset;
+ /// Packet length in the file in bytes, -1 if unknown.
+ XMP_Int32 length;
+ /// Packet padding size in bytes, zero if unknown.
+ XMP_Int32 padSize; // Zero if unknown.
+
+ /// Character format using the values \c kXMP_Char8Bit, \c kXMP_Char16BitBig, etc.
+ XMP_Uns8 charForm;
+ /// True if there is a packet wrapper and the trailer says writeable by dumb packet scanners.
+ XMP_Bool writeable;
+ /// True if there is a packet wrapper, the "<?xpacket...>" XML processing instructions.
+ XMP_Bool hasWrapper;
+
+ /// Padding to make the struct's size be a multiple 4.
+ XMP_Uns8 pad;
+
+ /// Default constructor.
+ XMP_PacketInfo() : offset(kXMPFiles_UnknownOffset), length(kXMPFiles_UnknownLength),
+ padSize(0), charForm(0), writeable(0), hasWrapper(0), pad(0) {};
+
+};
+
+/// Version of the XMP_PacketInfo type
+enum {
+ /// Version of the XMP_PacketInfo type
+ kXMP_PacketInfoVersion = 3
+};
+
+// -------------------------------------------------------------------------------------------------
+
+/// Option bit flags for \c TXMPFiles::Initialize().
+enum {
+ /// Ignore non-XMP text that uses an undefined "local" encoding.
+ kXMPFiles_IgnoreLocalText = 0x0002,
+ /// Combination of flags necessary for server products using XMPFiles.
+ kXMPFiles_ServerMode = kXMPFiles_IgnoreLocalText
+};
+
+/// Option bit flags for \c TXMPFiles::GetFormatInfo().
+enum {
+
+ /// Can inject first-time XMP into an existing file.
+ kXMPFiles_CanInjectXMP = 0x00000001,
+
+ /// Can expand XMP or other metadata in an existing file.
+ kXMPFiles_CanExpand = 0x00000002,
+
+ /// Can copy one file to another, writing new metadata.
+ kXMPFiles_CanRewrite = 0x00000004,
+
+ /// Can expand, but prefers in-place update.
+ kXMPFiles_PrefersInPlace = 0x00000008,
+
+ /// Supports reconciliation between XMP and other forms.
+ kXMPFiles_CanReconcile = 0x00000010,
+
+ /// Allows access to just the XMP, ignoring other forms.
+ kXMPFiles_AllowsOnlyXMP = 0x00000020,
+
+ /// File handler returns raw XMP packet information.
+ kXMPFiles_ReturnsRawPacket = 0x00000040,
+
+ /// The file handler does the file open and close.
+ kXMPFiles_HandlerOwnsFile = 0x00000100,
+
+ /// The file handler allows crash-safe file updates.
+ kXMPFiles_AllowsSafeUpdate = 0x00000200,
+
+ /// The file format needs the XMP packet to be read-only.
+ kXMPFiles_NeedsReadOnlyPacket = 0x00000400,
+
+ /// The file handler uses a "sidecar" file for the XMP.
+ kXMPFiles_UsesSidecarXMP = 0x00000800,
+
+ /// The format is folder oriented, for example the P2 video format.
+ kXMPFiles_FolderBasedFormat = 0x00001000,
+
+ /// The file Handler is capable of notifying progress notifications
+ kXMPFiles_CanNotifyProgress = 0x00002000,
+
+ /// The plugin handler is not capable for delay loading
+ kXMPFiles_NeedsPreloading = 0x00004000
+
+};
+
+/// Option bit flags for \c TXMPFiles::OpenFile().
+enum {
+
+ /// Open for read-only access.
+ kXMPFiles_OpenForRead = 0x00000001,
+
+ /// Open for reading and writing.
+ kXMPFiles_OpenForUpdate = 0x00000002,
+
+ /// Only the XMP is wanted, allows space/time optimizations.
+ kXMPFiles_OpenOnlyXMP = 0x00000004,
+
+ /// Force use of the given handler (format), do not even verify the format.
+ kXMPFiles_ForceGivenHandler = 0x00000008,
+
+ /// Be strict about only attempting to use the designated file handler, no fallback to other handlers.
+ kXMPFiles_OpenStrictly = 0x00000010,
+
+ /// Require the use of a smart handler.
+ kXMPFiles_OpenUseSmartHandler = 0x00000020,
+
+ /// Force packet scanning, do not use a smart handler.
+ kXMPFiles_OpenUsePacketScanning = 0x00000040,
+
+ /// Only packet scan files "known" to need scanning.
+ kXMPFiles_OpenLimitedScanning = 0x00000080,
+
+ /// Attempt to repair a file opened for update, default is to not open (throw an exception).
+ kXMPFiles_OpenRepairFile = 0x00000100,
+
+ /// When updating a file, spend the effort necessary to optimize file layout.
+ kXMPFiles_OptimizeFileLayout = 0x00000200
+
+};
+
+/// Option bit flags for \c TXMPFiles::CloseFile().
+enum {
+ /// Write into a temporary file and swap for crash safety.
+ kXMPFiles_UpdateSafely = 0x0001
+};
+
+// =================================================================================================
+// Error notification and Exceptions
+// =================================
+
+/// \name Error notification and Exceptions
+/// @{
+///
+/// From the beginning through version 5.5, XMP Tookit errors result in throwing an \c XMP_Error
+/// exception. For the most part exceptions were thrown early and thus API calls aborted as soon as
+/// an error was detected. Starting in version 5.5, support has been added for notifications of
+/// errors arising in calls to \c TXMPMeta and \c TXMPFiles functions.
+///
+/// A client can register an error notification callback function for a \c TXMPMeta or \c TXMPFiles
+/// object. This can be done as a global default or individually to each object. The global default
+/// applies to all objects created after it is registered. Within the object there is no difference
+/// between the global default or explicitly registered callback. The callback function returns a
+/// \c bool value indicating if recovery should be attempted (true) or an exception thrown (false).
+/// If no callback is registered, a best effort at recovery and continuation will be made with an
+/// exception thrown if recovery is not possible. More details can be found in the \c TXMPMeta and
+/// \c TXMPFiles documentation.
+///
+/// The \c XMP_Error class contains a numeric code and an English explanation. New numeric codes may
+/// be added at any time. There are typically many possible explanations for each numeric code. The
+/// explanations try to be precise about the specific circumstances causing the error.
+///
+/// \note The explanation string is for debugging use only. It must not be shown to users in a
+/// final product. It is written for developers not users, and never localized.
+
+typedef XMP_Uns8 XMP_ErrorSeverity;
+
+/// Severity codes for error notifications
+enum {
+ /// Partial recovery and continuation is possible.
+ kXMPErrSev_Recoverable = 0,
+ /// Recovery is not possible, an exception will be thrown aborting the API call.
+ kXMPErrSev_OperationFatal = 1,
+ /// Recovery is not possible, an exception will be thrown, the file is corrupt and possibly unusable.
+ kXMPErrSev_FileFatal = 2,
+ /// Recovery is not possible, an exception will be thrown, the entire process should be aborted.
+ kXMPErrSev_ProcessFatal = 3
+};
+
+// -------------------------------------------------------------------------------------------------
+/// The signature of a client-defined callback for TXMPMeta error notifications.
+///
+/// @param context A pointer used to carry client-private context.
+///
+/// @param severity The severity of the error, see the \c XMP_ErrorSeverity values.
+///
+/// @param cause A numeric code for the cause of the error, from the XMP_Error exception codes.
+/// Codes used with TXMPMeta error notifications:
+/// \li \c kXMPErr_BadXML - An XML syntax error found during parsing.
+/// \li \c kXMPErr_BadRDF - A syntax or semantic parsing error in the XMP subset of RDF.
+/// \li \c kXMPErr_BadXMP - A semantic XMP data model error.
+/// \li \c kXMPErr_BadValue - An XMP value error, wrong type, out of range, etc.
+/// \li \c kXMPErr_NoMemory - A heap allocation failure.
+///
+/// @param message An explanation of the error, for debugging use only. This should not be displayed
+/// to users in a final product.
+///
+/// @return True if the operation should continue with a best effort attempt at recovery, false if
+/// it should be aborted with an exception thrown from the library back to the original caller.
+/// Recovery is possible only if the severity is kXMPErrSev_Recoverable, an exception will be
+/// thrown on return from the callback in all other cases.
+///
+/// @see \c TXMPMeta::SetDefaultErrorCallback() and \c TXMPMeta::SetErrorCallback()
+
+typedef bool (* XMPMeta_ErrorCallbackProc) ( void* context, XMP_ErrorSeverity severity, XMP_Int32 cause, XMP_StringPtr message );
+
+// -------------------------------------------------------------------------------------------------
+/// The signature of a client-defined callback for TXMPFiles error notifications.
+///
+/// @param context A pointer used to carry client-private context.
+///
+/// @param filePath The path for the file involved in the error.
+///
+/// @param severity The severity of the error, see the \c XMP_ErrorSeverity values.
+///
+/// @param cause A numeric code for the cause of the error, from the XMP_Error exception codes.
+/// Codes used with TXMPFiles error notifications:
+/// \li \c kXMPErr_NoFile - A file does not exist
+/// \li \c kXMPErr_FilePermission - A file exists but cannot be opened
+/// \li \c kXMPErr_FilePathNotAFile - A path exists which is not a file
+/// \li \c dXMPErr_RejectedFileExtension - Any Operation called on rejected file extension
+/// \li \c KXMPErr_NoFileHandler - No suitable handler is found for the file
+/// \li \c kXMPErr_DiskSpace - A file write fails due to lack of disk space
+/// \li \c kXMPErr_ReadError - A file read fails
+/// \li \c kXMPErr_WriteError - A file write fails for some other reason than space
+/// \li \c kXMPErr_BadFileFormat - A file is corrupt or ill-formed
+/// \li \c kXMPErr_BadBlockFormat - A portion of a file is corrupt or ill-formed
+/// \li \c kXMPErr_BadValue - An XMP or non-XMP metadata item has an invalid value
+/// \li \c kXMPErr_NoMemory - A heap allocation failure
+///
+/// @param message An explanation of the error, for debugging use only. This should not be displayed
+/// to users in a final product.
+///
+/// @return True if the operation should continue with a best effort attempt at recovery, false if
+/// it should be aborted with an exception thrown from the library back to the original caller.
+/// Recovery is possible only if the severity is kXMPErrSev_Recoverable, an exception will be
+/// thrown on return from the callback in all other cases.
+///
+/// @see \c TXMPFiles::SetDefaultErrorCallback() and \c TXMPFiles::SetErrorCallback()
+
+typedef bool (* XMPFiles_ErrorCallbackProc) ( void* context, XMP_StringPtr filePath, XMP_ErrorSeverity severity, XMP_Int32 cause, XMP_StringPtr message );
+
+// -------------------------------------------------------------------------------------------------
+/// Internal: The signatures of client-side wrappers for the error notification callbacks.
+
+typedef XMP_Bool (* XMPMeta_ErrorCallbackWrapper) ( XMPMeta_ErrorCallbackProc clientProc, void* context,
+ XMP_ErrorSeverity severity, XMP_Int32 cause, XMP_StringPtr message );
+
+typedef XMP_Bool (* XMPFiles_ErrorCallbackWrapper) ( XMPFiles_ErrorCallbackProc clientProc, void* context,
+ XMP_StringPtr filePath, XMP_ErrorSeverity severity,
+ XMP_Int32 cause, XMP_StringPtr message );
+
+/// XMP Toolkit error, associates an error code with a descriptive error string.
+class XMP_Error {
+public:
+
+ /// @brief Constructor for an XMP_Error.
+ ///
+ /// @param _id The numeric code.
+ ///
+ /// @param _errMsg The descriptive string, for debugging use only. It must not be shown to users
+ /// in a final product. It is written for developers, not users, and never localized.
+ XMP_Error ( XMP_Int32 _id, XMP_StringPtr _errMsg ) : id(_id), errMsg(_errMsg), notified(false) {};
+
+ /// Retrieves the numeric code from an XMP_Error.
+ inline XMP_Int32 GetID() const { return id; };
+
+ /// Retrieves the descriptive string from an XMP_Error.
+ inline XMP_StringPtr GetErrMsg() const { return errMsg; };
+
+ /// Retrieves the information whether particular error is notified or not
+ inline XMP_Bool IsNotified() const { return notified; }
+
+ /// Sets the notification status for an error
+ inline void SetNotified() { notified = true; };
+
+private:
+ /// Exception code. See constants \c #kXMPErr_Unknown and following.
+ XMP_Int32 id;
+ /// Descriptive string, for debugging use only. It must not be shown to users in a final
+ /// product. It is written for developers, not users, and never localized.
+ XMP_StringPtr errMsg;
+ /// Variable to store whether this particular error is notified to user or not
+ XMP_Bool notified;
+};
+
+/// XMP_Error exception code constants
+enum {
+
+ // --------------------
+ /// Generic error codes.
+
+ /// No error
+ kXMPErr_NoError = -1,
+
+ /// Generic unknown error
+ kXMPErr_Unknown = 0,
+ /// Generic undefined error
+ kXMPErr_TBD = 1,
+ /// Generic unavailable error
+ kXMPErr_Unavailable = 2,
+ /// Generic bad object error
+ kXMPErr_BadObject = 3,
+ /// Generic bad parameter error
+ kXMPErr_BadParam = 4,
+ /// Generic bad value error
+ kXMPErr_BadValue = 5,
+ /// Generic assertion failure
+ kXMPErr_AssertFailure = 6,
+ /// Generic enforcement failure
+ kXMPErr_EnforceFailure = 7,
+ /// Generic unimplemented error
+ kXMPErr_Unimplemented = 8,
+ /// Generic internal failure
+ kXMPErr_InternalFailure = 9,
+ /// Generic deprecated error
+ kXMPErr_Deprecated = 10,
+ /// Generic external failure
+ kXMPErr_ExternalFailure = 11,
+ /// Generic user abort error
+ kXMPErr_UserAbort = 12,
+ /// Generic standard exception
+ kXMPErr_StdException = 13,
+ /// Generic unknown exception
+ kXMPErr_UnknownException = 14,
+ /// Generic out-of-memory error
+ kXMPErr_NoMemory = 15,
+ /// Progress reporting callback requested abort
+ kXMPErr_ProgressAbort = 16,
+
+ // ------------------------------------
+ // More specific parameter error codes.
+
+ /// Bad schema parameter
+ kXMPErr_BadSchema = 101,
+ /// Bad XPath parameter
+ kXMPErr_BadXPath = 102,
+ /// Bad options parameter
+ kXMPErr_BadOptions = 103,
+ /// Bad index parameter
+ kXMPErr_BadIndex = 104,
+ /// Bad iteration position
+ kXMPErr_BadIterPosition = 105,
+ /// XML parsing error (deprecated)
+ kXMPErr_BadParse = 106,
+ /// Serialization error
+ kXMPErr_BadSerialize = 107,
+ /// File format error
+ kXMPErr_BadFileFormat = 108,
+ /// No file handler found for format
+ kXMPErr_NoFileHandler = 109,
+ /// Data too large for JPEG file format
+ kXMPErr_TooLargeForJPEG = 110,
+ /// A file does not exist
+ kXMPErr_NoFile = 111,
+ /// A file exists but cannot be opened
+ kXMPErr_FilePermission = 112,
+ /// A file write failed due to lack of disk space
+ kXMPErr_DiskSpace = 113,
+ /// A file read failed
+ kXMPErr_ReadError = 114,
+ /// A file write failed for a reason other than lack of disk space
+ kXMPErr_WriteError = 115,
+ /// A block of a file is ill-formed, e.g. invalid IPTC-IIM in a photo
+ kXMPErr_BadBlockFormat = 116,
+ /// File Path is not a file
+ kXMPErr_FilePathNotAFile = 117,
+ /// Rejected File extension
+ kXMPErr_RejectedFileExtension = 118,
+
+ // -----------------------------------------------
+ // File format and internal structure error codes.
+
+ /// XML format error
+ kXMPErr_BadXML = 201,
+ /// RDF format error
+ kXMPErr_BadRDF = 202,
+ /// XMP format error
+ kXMPErr_BadXMP = 203,
+ /// Empty iterator
+ kXMPErr_EmptyIterator = 204,
+ /// Unicode error
+ kXMPErr_BadUnicode = 205,
+ /// TIFF format error
+ kXMPErr_BadTIFF = 206,
+ /// JPEG format error
+ kXMPErr_BadJPEG = 207,
+ /// PSD format error
+ kXMPErr_BadPSD = 208,
+ /// PSIR format error
+ kXMPErr_BadPSIR = 209,
+ /// IPTC format error
+ kXMPErr_BadIPTC = 210,
+ /// MPEG format error
+ kXMPErr_BadMPEG = 211
+
+};
+
+/// @}
+
+// =================================================================================================
+// Client callbacks
+// ================
+
+// -------------------------------------------------------------------------------------------------
+/// \name Special purpose callback functions
+/// @{
+
+/// A signed 32-bit integer used as a status result for the output callback routine,
+/// \c XMP_TextOutputProc. Zero means no error, all other values except -1 are private to the callback.
+/// The callback is wrapped to prevent exceptions being thrown across DLL boundaries. Any exceptions
+/// thrown out of the callback cause a return status of -1.
+
+typedef XMP_Int32 XMP_Status;
+
+// -------------------------------------------------------------------------------------------------
+/// The signature of a client-defined callback for text output from XMP Toolkit debugging
+/// operations. The callback is invoked one or more times for each line of output. The end of a line
+/// is signaled by a '\\n' character at the end of the buffer. Formatting newlines are never present
+/// in the middle of a buffer, but values of properties might contain any UTF-8 characters.
+///
+/// @param refCon A pointer to client-defined data passed to the TextOutputProc.
+///
+/// @param buffer A string containing one line of output.
+///
+/// @param bufferSize The number of characters in the output buffer.
+///
+/// @return A success/fail status value. Any failure result aborts the output.
+///
+/// @see \c TXMPMeta::DumpObject()
+
+typedef XMP_Status (* XMP_TextOutputProc) ( void * refCon,
+ XMP_StringPtr buffer,
+ XMP_StringLen bufferSize );
+
+// -------------------------------------------------------------------------------------------------
+/// The signature of a client-defined callback to check for a user request to abort a time-consuming
+/// operation within XMPFiles.
+///
+/// @param arg A pointer to caller-defined data passed from the registration call.
+///
+/// @return True to abort the current operation, which results in an exception being thrown.
+///
+/// @see \c TXMPFiles::SetAbortProc()
+
+typedef bool (* XMP_AbortProc) ( void * arg );
+
+// -------------------------------------------------------------------------------------------------
+/// The signature of a client-defined callback for progress report notifications.
+///
+/// @param context A pointer used to carry client-private context.
+///
+/// @param elapsedTime The time in seconds since the progress reporting started.
+///
+/// @param fractionDone A float value estimating the amount of work already done, in the range of
+/// 0.0 to 1.0. A value of 0.0 is given if the amount is not known, this happens if there is no
+/// estimate total for the total work. The units of work are not defined, but should usually be
+/// related to the number of bytes of I/O. This will go backwards if total work estimate changes.
+///
+/// @param secondsToGo A float value estimating the number of seconds left to complete the file
+/// operation. A value of 0.0 is given if the amount is not known, this happens if the amount of
+/// total work is unknown. This can go backwards according to throughput or if work estimate changes.
+///
+/// @return True if the file operation should continue, false if it should be aborted with an
+/// exception being thrown from the XMPFiles library back to the original caller.
+///
+/// @see \c TXMPFiles::SetDefaultProgressCallback() and \c TXMPFiles::SetProgressCallback()
+
+typedef bool (* XMP_ProgressReportProc) ( void * context, float elapsedTime, float fractionDone, float secondsToGo );
+
+// -------------------------------------------------------------------------------------------------
+/// Internal: The signature of a client-side wrapper for the progress report callback.
+
+typedef XMP_Bool (* XMP_ProgressReportWrapper) ( XMP_ProgressReportProc proc, void * context,
+ float elapsedTime, float fractionDone, float secondsToGo );
+
+/// @}
+
+// =================================================================================================
+// Stuff with no better place to be
+// ================================
+
+/// XMP Toolkit version information
+typedef struct XMP_VersionInfo {
+ /// The primary release number, the "1" in version "1.2.3".
+ XMP_Uns8 major;
+ /// The secondary release number, the "2" in version "1.2.3".
+ XMP_Uns8 minor;
+ /// The tertiary release number, the "3" in version "1.2.3".
+ XMP_Uns8 micro;
+ /// A 0/1 boolean value, true if this is a debug build.
+ XMP_Bool isDebug;
+ /// A rolling build number, monotonically increasing in a release.
+ XMP_Uns32 build;
+ /// Individual feature implementation flags.
+ XMP_Uns32 flags;
+ /// A comprehensive version information string.
+ XMP_StringPtr message;
+} XMP_VersionInfo;
+
+// =================================================================================================
+
+#if __cplusplus
+} // extern "C"
+#endif
+
+#include <vector>
+
+#endif // __XMP_Const_h__
diff --git a/gpr/source/lib/xmp_core/public/include/XMP_Environment.h b/gpr/source/lib/xmp_core/public/include/XMP_Environment.h
new file mode 100644
index 0000000..fd459ad
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/XMP_Environment.h
@@ -0,0 +1,165 @@
+#ifndef __XMP_Environment_h__
+#define __XMP_Environment_h__ 1
+
+// =================================================================================================
+// XMP_Environment.h - Build environment flags for the XMP toolkit.
+// ================================================================
+//
+// This header is just C preprocessor macro definitions to set up the XMP toolkit build environment.
+// It must be the first #include in any chain since it might affect things in other #includes.
+//
+// =================================================================================================
+
+// =================================================================================================
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// =================================================================================================
+// Determine the Platform
+// =================================================================================================
+
+#ifdef _WIN32
+
+ #define XMP_MacBuild 0
+ #define XMP_iOSBuild 0
+ #define XMP_WinBuild 1
+ #define XMP_UNIXBuild 0
+
+#elif __APPLE__
+
+ #include "TargetConditionals.h"
+
+ #if TARGET_OS_IPHONE
+
+ #define XMP_MacBuild 0
+ #define XMP_iOSBuild 1
+ #define XMP_WinBuild 0
+ #define XMP_UNIXBuild 0
+
+ #else
+
+ #define XMP_MacBuild 1
+ #define XMP_iOSBuild 0
+ #define XMP_WinBuild 0
+ #define XMP_UNIXBuild 0
+
+ #endif
+
+#elif __ANDROID__
+
+#elif __linux__ || __unix__
+
+ #define XMP_MacBuild 0
+ #define XMP_WinBuild 0
+ #define XMP_UNIXBuild 1
+ #define XMP_iOSBuild 0
+
+#else
+ #error "XMP environment error - Unknown compiler"
+#endif
+
+// =================================================================================================
+// Common Macros
+// =============
+
+#if defined ( DEBUG )
+ #if defined ( NDEBUG )
+ #error "XMP environment error - both DEBUG and NDEBUG are defined"
+ #endif
+ #define XMP_DebugBuild 1
+#endif
+
+#if defined ( NDEBUG )
+ #define XMP_DebugBuild 0
+#endif
+
+#ifndef XMP_DebugBuild
+ #define XMP_DebugBuild 0
+#endif
+
+#if XMP_DebugBuild
+ #include <stdio.h> // The assert macro needs printf.
+#endif
+
+#ifndef DISABLE_SERIALIZED_IMPORT_EXPORT
+ #define DISABLE_SERIALIZED_IMPORT_EXPORT 0
+#endif
+
+#ifndef XMP_64
+ #if _WIN64 || defined(_LP64)
+ #define XMP_64 1
+ #else
+ #define XMP_64 0
+ #endif
+#endif
+
+// =================================================================================================
+// Macintosh Specific Settings
+// ===========================
+#if (XMP_MacBuild)
+ #define XMP_HELPER_DLL_IMPORT __attribute__((visibility("default")))
+ #define XMP_HELPER_DLL_EXPORT __attribute__((visibility("default")))
+ #define XMP_HELPER_DLL_PRIVATE __attribute__((visibility("hidden")))
+#endif
+
+// =================================================================================================
+// Windows Specific Settings
+// =========================
+#if (XMP_WinBuild)
+ #define XMP_HELPER_DLL_IMPORT
+ #define XMP_HELPER_DLL_EXPORT
+ #define XMP_HELPER_DLL_PRIVATE
+#endif
+
+// =================================================================================================
+// UNIX Specific Settings
+// ======================
+#if (XMP_UNIXBuild)
+ #define XMP_HELPER_DLL_IMPORT
+ #define XMP_HELPER_DLL_EXPORT
+ #define XMP_HELPER_DLL_PRIVATE
+#endif
+
+// =================================================================================================
+// IOS Specific Settings
+// ===========================
+#if (XMP_iOSBuild)
+ #include <TargetConditionals.h>
+ #if (TARGET_CPU_ARM)
+ #define XMP_IOS_ARM 1
+ #else
+ #define XMP_IOS_ARM 0
+ #endif
+ #define XMP_HELPER_DLL_IMPORT __attribute__((visibility("default")))
+ #define XMP_HELPER_DLL_EXPORT __attribute__((visibility("default")))
+ #define XMP_HELPER_DLL_PRIVATE __attribute__((visibility("hidden")))
+#endif
+
+// =================================================================================================
+// Banzai Specific Settings
+// ======================
+#if (XMP_Banzai)
+ #define XMP_HELPER_DLL_IMPORT
+ #define XMP_HELPER_DLL_EXPORT
+ #define XMP_HELPER_DLL_PRIVATE
+#endif
+
+
+// =================================================================================================
+
+#if (XMP_DynamicBuild)
+ #define XMP_PUBLIC XMP_HELPER_DLL_EXPORT
+ #define XMP_PRIVATE XMP_HELPER_DLL_PRIVATE
+#elif (XMP_StaticBuild)
+ #define XMP_PUBLIC
+ #define XMP_PRIVATE
+#else
+ #define XMP_PUBLIC XMP_HELPER_DLL_IMPORT
+ #define XMP_PRIVATE XMP_HELPER_DLL_PRIVATE
+#endif
+
+#endif // __XMP_Environment_h__
diff --git a/gpr/source/lib/xmp_core/public/include/XMP_IO.hpp b/gpr/source/lib/xmp_core/public/include/XMP_IO.hpp
new file mode 100644
index 0000000..d485392
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/XMP_IO.hpp
@@ -0,0 +1,171 @@
+#ifndef __XMP_IO_hpp__
+#define __XMP_IO_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2010 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "XMP_Environment.h" // ! XMP_Environment.h must be the first included header.
+
+#include "XMP_Const.h"
+
+// =================================================================================================
+/// \class XMP_IO XMP_IO.hpp
+/// \brief Abstract base class for client-managed I/O with \c TXMPFiles.
+///
+/// \c XMP_IO is an abstract base class for client-managed I/O with \c TXMPFiles. This allows a
+/// client to use the embedded metadata processing logic of \c TXMPFiles in cases where a string
+/// file path cannot be provided, or where it is impractical to allow \c TXMPFiles to separately
+/// open the file and do its own I/O. Although described in terms of files, any form of storage may
+/// be used as long as the functions operate as defined.
+///
+/// This is not a general purpose I/O class. It contains only the necessary functions needed by the
+/// internals of \c TXMPFiles. It is intended to be used as an adaptor for an existing I/O mechanism
+/// that the client wants \c TXMPFiles to use.
+///
+/// To use \c XMP_IO, a client creates a derived class then uses the form of \c TCMPFiles::OpenFile
+/// that takes an \c XMP_IO parameter instead of a string file path. The derived \c XMP_IO object
+/// must be ready for use when \c TCMPFiles::OpenFile is called.
+///
+/// There are no Open or Close functions in \c XMP_IO, they are specific to each implementation. The
+/// derived \c XMP_IO object must be open and ready for use before being passed to \c
+/// TXMP_Files::OpenFile, and remain open and ready for use until \c TXMP_Files::CloseFile returns,
+/// or some other fatal error occurs. The client has final responsibility for closing and
+/// terminating the derived \c XMP_IO object.
+// =================================================================================================
+
+class XMP_IO {
+public:
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Read into a buffer, returning the number of bytes read.
+ ///
+ /// Read into a buffer, returning the number of bytes read. Returns the actual number of bytes
+ /// read. Throws an exception if requireSuccess is true and not enough data is available.
+ /// Throwing \c XMPError is recommended. The buffer content and I/O position after a throw are
+ /// undefined.
+ ///
+ /// @param buffer A pointer to the buffer.
+ /// @param count The length of the buffer in bytes.
+ /// @param readAll True if reading less than the requested amount is a failure.
+ ///
+ /// @return Returns the number of bytes read.
+
+ enum { kReadAll = true };
+
+ virtual XMP_Uns32 Read ( void* buffer, XMP_Uns32 count, bool readAll = false ) = 0;
+
+ inline XMP_Uns32 ReadAll ( void* buffer, XMP_Uns32 bytes )
+ { return this->Read ( buffer, bytes, kReadAll ); };
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Write from a buffer.
+ ///
+ /// Write from a buffer, overwriting existing data and extending the file as necesary. All data
+ /// must be written or an exception thrown. Throwing \c XMPError is recommended.
+ ///
+ /// @param buffer A pointer to the buffer.
+ /// @param count The length of the buffer in bytes.
+
+ virtual void Write ( const void* buffer, XMP_Uns32 count ) = 0;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Set the I/O position, returning the new absolute offset in bytes.
+ ///
+ /// Set the I/O position, returning the new absolute offset in bytes. The offset parameter may
+ /// be positive or negative. A seek beyond EOF is allowed when writing and extends the file, it
+ /// is equivalent to seeking to EOF then writing the needed amount of undefined data. A
+ /// read-only seek beyond EOF throws an exception. Throwing \c XMPError is recommended.
+ ///
+ /// @param offset The offset relative to the mode.
+ /// @param mode The mode, or origin, of the seek.
+ ///
+ /// @return The new absolute offset in bytes.
+
+ virtual XMP_Int64 Seek ( XMP_Int64 offset, SeekMode mode ) = 0;
+
+ inline XMP_Int64 Offset() { return this->Seek ( 0, kXMP_SeekFromCurrent ); };
+ inline XMP_Int64 Rewind() { return this->Seek ( 0, kXMP_SeekFromStart ); }; // Always returns 0.
+ inline XMP_Int64 ToEOF() { return this->Seek ( 0, kXMP_SeekFromEnd ); };
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Return the length of the file in bytes.
+ ///
+ /// Return the length of the file in bytes. The I/O position is unchanged.
+ ///
+ /// @return The length of the file in bytes.
+
+ virtual XMP_Int64 Length() = 0;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Truncate the file to the given length.
+ ///
+ /// Truncate the file to the given length. The I/O position after truncation is unchanged if
+ /// still valid, otherwise it is set to the new EOF. Throws an exception if the new length is
+ /// longer than the file's current length. Throwing \c XMPError is recommended.
+ ///
+ /// @param length The new length for the file, must be less than or equal to the current length.
+
+ virtual void Truncate ( XMP_Int64 length ) = 0;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Create an associated temp file for use in a safe-save style operation.
+ ///
+ /// Create an associated temp file, for example in the same directory and with a related name.
+ /// Returns an already existing temp with no other action. The temp must be opened for
+ /// read-write access. It will be used in a safe-save style operation, using some of the
+ /// original file plus new portions to write the temp, then replacing the original from the temp
+ /// when done. Throws an exception if the owning object is opened for read-only access, or if
+ /// the temp file cannot be created. Throwing \c XMPError is recommended.
+ ///
+ /// The temp file is normally closed and deleted, and the temporary \c XMP_IO object deleted, by
+ /// a call to \c AbsorbTemp or \c DeleteTemp. It must be closed and deleted by the derived \c
+ /// XMP_IO object's destructor if necessary.
+ ///
+ /// \c DeriveTemp may be called on a temporary \c XMP_IO object.
+ ///
+ /// @return A pointer to the associated temporary \c XMP_IO object.
+
+ virtual XMP_IO* DeriveTemp() = 0;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Replace the owning file's content with that of the temp.
+ ///
+ /// Used at the end of a safe-save style operation to replace the original content with that
+ /// from the associated temp file. The temp file must be closed and deleted after the content
+ /// swap. The temporary \c XMP_IO object is deleted. Throws an exception if the temp file cannot
+ /// be absorbed. Throwing \c XMPError is recommended.
+
+ virtual void AbsorbTemp() = 0;
+
+ // ---------------------------------------------------------------------------------------------
+ /// @brief Delete a temp file, leaving the original alone.
+ ///
+ /// Used for a failed safe-save style operation. The temp file is closed and deleted without
+ /// being absorbed, and the temporary \c XMP_IO object is deleted. Does nothing if no temp
+ /// exists.
+
+ virtual void DeleteTemp() = 0;
+
+ // ---------------------------------------------------------------------------------------------
+
+ XMP_IO() {};
+ virtual ~XMP_IO() {};
+
+private:
+
+ // ---------------------------------------------------------------------------------------------
+ /// Copy construction and assignment are not public. That would require the implementation to
+ /// share state across multiple XMP_IO objects.
+
+ XMP_IO ( const XMP_IO & original );
+ void operator= ( const XMP_IO& in ) { *this = in; /* Avoid Win compile warnings. */ };
+
+};
+
+#endif // __XMP_IO_hpp__
diff --git a/gpr/source/lib/xmp_core/public/include/XMP_Version.h b/gpr/source/lib/xmp_core/public/include/XMP_Version.h
new file mode 100644
index 0000000..53707b1
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/XMP_Version.h
@@ -0,0 +1,52 @@
+#ifndef __XMP_Version_h__
+#define __XMP_Version_h__ 1
+
+/* --------------------------------------------------------------------------------------------- */
+/* ** IMPORTANT ** This file must be usable by strict ANSI C compilers. No "//" comments, etc. */
+/* --------------------------------------------------------------------------------------------- */
+
+/*
+// =================================================================================================
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+*/
+
+/* ============================================================================================= */
+/**
+XMP Toolkit Version Information
+
+Version information for the XMP toolkit is stored in the executable and available through a runtime
+call, <tt>SXMPMeta::GetVersionInfo</tt>. In addition a static version number is defined in this
+header. The information in the executable or returned by <tt>SXMPMeta::GetVersionInfo</tt> is about
+the implementation internals, it is runtime version information. The values defined in this header
+describe the version of the API used at client compile time. They do not necessarily relate to the
+runtime version.
+
+Important: Do not display the static values defined here to users as the version of XMP in use. Do
+not base runtime decisions on just this static version. It is OK to compare the static and runtime
+versions.
+
+*/
+/* ============================================================================================= */
+
+#define XMPCORE_API_VERSION_MAJOR 5
+#define XMPCORE_API_VERSION_MINOR 5
+#define XMPCORE_API_VERSION_MICRO 0
+
+#define XMPCORE_API_VERSION 5.5.0
+#define XMPCORE_API_VERSION_STRING "5.5.0"
+
+#define XMPFILES_API_VERSION_MAJOR 5
+#define XMPFILES_API_VERSION_MINOR 6
+#define XMPFILES_API_VERSION_MICRO 0
+
+#define XMPFILES_API_VERSION 5.6.0
+#define XMPFILES_API_VERSION_STRING "5.6.0"
+
+/* ============================================================================================= */
+
+#endif /* __XMP_Version_h__ */
diff --git a/gpr/source/lib/xmp_core/public/include/client-glue/TXMPFiles.incl_cpp b/gpr/source/lib/xmp_core/public/include/client-glue/TXMPFiles.incl_cpp
new file mode 100644
index 0000000..eb19887
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/client-glue/TXMPFiles.incl_cpp
@@ -0,0 +1,484 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// ================================================================================================
+/// \file TXMPFiles.incl_cpp
+/// \brief The implementation of the TXMPFiles template class.
+
+#if XMP_WinBuild
+ #pragma warning ( disable : 4003 ) // not enough actual parameters for macro
+ #pragma warning ( disable : 4800 ) // forcing value to bool 'true' or 'false' (performance warning)
+#endif
+
+#include "client-glue/WXMP_Common.hpp"
+
+#include "client-glue/WXMPFiles.hpp"
+
+// =================================================================================================
+// Implementation Guidelines
+// =========================
+//
+// The implementations of the template functions are very stylized. The jobs done in this code are:
+//
+// 1. ...
+//
+// =================================================================================================
+
+#ifndef XMPFiles_TraceCTorDTor
+ #define XMPFiles_TraceCTorDTor 0
+#endif
+
+#if XMPFiles_TraceCTorDTor
+ class XFPeek { // Hack to peek at the client ref count in the internal object.
+ public:
+ XFPeek();
+ virtual ~XFPeek();
+ XMP_Int32 clientRefs;
+ };
+#endif
+
+// =================================================================================================
+
+XMP_MethodIntro(TXMPFiles,void)::
+SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen )
+{
+ tStringObj * clientStr = (tStringObj*) clientPtr;
+ clientStr->assign ( valuePtr, valueLen );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+SetClientStringVector ( void * clientPtr, XMP_StringPtr * arrayPtr, XMP_Uns32 stringCount )
+{
+ std::vector<tStringObj>* clientVec = (std::vector<tStringObj>*) clientPtr;
+ clientVec->clear();
+ for ( XMP_Uns32 i = 0; i < stringCount; ++i ) {
+ tStringObj nextValue ( arrayPtr[i] );
+ clientVec->push_back ( nextValue );
+ }
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+GetVersionInfo ( XMP_VersionInfo * versionInfo )
+{
+ WrapNoCheckVoid ( zXMPFiles_GetVersionInfo_1 ( versionInfo ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+Initialize()
+{
+ WrapCheckBool ( ok, zXMPFiles_Initialize_1 ( 0 ) );
+ return ok;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+Initialize( const char* pluginFolder, const char* plugins )
+{
+ WrapCheckBool ( ok, zXMPFiles_Initialize_2 ( 0, pluginFolder, plugins ) );
+ return ok;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+Initialize ( XMP_OptionBits options )
+{
+ WrapCheckBool ( ok, zXMPFiles_Initialize_1 ( options ) );
+ return ok;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+Initialize ( XMP_OptionBits options, const char* pluginFolder, const char* plugins )
+{
+ WrapCheckBool ( ok, zXMPFiles_Initialize_2 ( options, pluginFolder, plugins ) );
+ return ok;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+Terminate()
+{
+ WrapNoCheckVoid ( zXMPFiles_Terminate_1() );
+}
+
+// =================================================================================================
+
+static XMPFilesRef Default_CTor()
+{
+ WrapCheckXMPFilesRef ( newRef, zXMPFiles_CTor_1() );
+ return newRef;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPFiles)::
+TXMPFiles() : xmpFilesRef(Default_CTor())
+{
+ #if XMPFiles_TraceCTorDTor
+ XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
+ printf ( "Default construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPFiles)::
+TXMPFiles ( const TXMPFiles<tStringObj> & original ) : xmpFilesRef(original.xmpFilesRef)
+{
+ WXMPFiles_IncrementRefCount_1 ( this->xmpFilesRef );
+ #if XMPFiles_TraceCTorDTor
+ XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
+ printf ( "Copy construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+operator= ( const TXMPFiles<tStringObj> & rhs )
+{
+ #if XMPFiles_TraceCTorDTor
+ XFPeek* xfLHS = (XFPeek*)this->xmpFilesRef;
+ XFPeek* xfRHS = (XFPeek*)rhs.xmpFilesRef;
+ printf ( "Assign TXMPFiles, lhs @ %.8X, rhs @ %.8X\n", this, &rhs );
+ printf ( " original lhs ref = %.8X, count = %d\n", xfLHS, xfLHS->clientRefs );
+ printf ( " original rhs ref = %.8X, count = %d\n", xfRHS, xfRHS->clientRefs );
+ #endif
+ XMPFilesRef oldRef = this->xmpFilesRef; // ! Decrement last so errors leave client object OK.
+ this->xmpFilesRef = rhs.xmpFilesRef;
+ WXMPFiles_IncrementRefCount_1 ( this->xmpFilesRef ); // Increment the count on the new ref.
+ WXMPFiles_DecrementRefCount_1 ( oldRef ); // Decrement the count on the old ref.
+ #if XMPFiles_TraceCTorDTor
+ printf ( " result lhs ref = %.8X, count = %d\n", xfLHS, xfLHS->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPFiles)::
+TXMPFiles ( XMPFilesRef _xmpFilesRef ) : xmpFilesRef(_xmpFilesRef)
+{
+ WXMPFiles_IncrementRefCount_1 ( this->xmpFilesRef );
+ #if XMPFiles_TraceCTorDTor
+ XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
+ printf ( "Ref construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPFiles)::
+TXMPFiles ( XMP_StringPtr filePath,
+ XMP_FileFormat format /* = kXMP_UnknownFile */,
+ XMP_OptionBits openFlags /* = 0 */ ) : xmpFilesRef(Default_CTor())
+{
+ #if XMPFiles_TraceCTorDTor
+ XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
+ printf ( "File construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
+ #endif
+ bool ok = this->OpenFile ( filePath, format, openFlags );
+ if ( ! ok ) throw XMP_Error ( kXMPErr_NoFileHandler, "OpenFile returned false" );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPFiles)::
+TXMPFiles ( const tStringObj & filePath,
+ XMP_FileFormat format /* = kXMP_UnknownFile */,
+ XMP_OptionBits openFlags /* = 0 */ ) : xmpFilesRef(Default_CTor())
+{
+ #if XMPFiles_TraceCTorDTor
+ XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
+ printf ( "File construct TXMPFiles @ %.8X, ref = %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
+ #endif
+ bool ok = this->OpenFile ( filePath.c_str(), format, openFlags );
+ if ( ! ok ) throw XMP_Error ( kXMPErr_NoFileHandler, "OpenFile returned false" );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPFiles)::
+~TXMPFiles () throw()
+{
+ #if XMPFiles_TraceCTorDTor
+ XFPeek* xfPtr = (XFPeek*)this->xmpFilesRef;
+ printf ( "Destruct TXMPFiles @ %.8X, ref= %.8X, count = %d\n", this, xfPtr, xfPtr->clientRefs );
+ #endif
+ WXMPFiles_DecrementRefCount_1 ( this->xmpFilesRef );
+ this->xmpFilesRef = 0;
+}
+
+// =================================================================================================
+
+XMP_MethodIntro(TXMPFiles,bool)::
+GetFormatInfo ( XMP_FileFormat format,
+ XMP_OptionBits * flags )
+{
+ WrapCheckBool ( found, zXMPFiles_GetFormatInfo_1 ( format, flags ) );
+ return found;
+}
+
+// =================================================================================================
+
+XMP_MethodIntro(TXMPFiles,XMPFilesRef)::
+GetInternalRef()
+{
+ return this->xmpFilesRef;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,XMP_FileFormat)::
+CheckFileFormat ( XMP_StringPtr filePath )
+{
+ WrapCheckFormat ( format, zXMPFiles_CheckFileFormat_1 ( filePath ) );
+ return format;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,XMP_FileFormat)::
+CheckPackageFormat ( XMP_StringPtr folderPath )
+{
+ WrapCheckFormat ( format, zXMPFiles_CheckPackageFormat_1 ( folderPath ) );
+ return format;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+GetFileModDate ( XMP_StringPtr filePath, XMP_DateTime * modDate, XMP_FileFormat * format, XMP_OptionBits options )
+{
+ WrapCheckBool ( ok, zXMPFiles_GetFileModDate_1 ( filePath, modDate, format, options ) );
+ return ok;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+GetAssociatedResources ( XMP_StringPtr filePath,
+ std::vector<tStringObj>* resourceList,
+ XMP_FileFormat format /* = kXMP_UnknownFile */,
+ XMP_OptionBits options /* = 0 */)
+{
+ WrapCheckBool ( ok, zXMPFiles_GetAssociatedResources_1 ( filePath, resourceList, format, options, SetClientStringVector ) );
+ return ok;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+IsMetadataWritable ( XMP_StringPtr filePath,
+ bool * writable,
+ XMP_FileFormat format /* = kXMP_UnknownFile */,
+ XMP_OptionBits options /* = 0 */)
+{
+ if ( writable)
+ {
+ XMP_Bool internalWritable = ConvertBoolToXMP_Bool( *writable );
+ WrapCheckBool ( ok, zXMPFiles_IsMetadataWritable_1 ( filePath, &internalWritable, format, options ) );
+ *writable = ConvertXMP_BoolToBool( internalWritable );
+ return ok;
+ }
+ else
+ {
+ WrapCheckBool ( ok, zXMPFiles_IsMetadataWritable_1 ( filePath, NULL, format, options ) );
+ return ok;
+ }
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+OpenFile ( XMP_StringPtr filePath,
+ XMP_FileFormat format /* = kXMP_UnknownFile */,
+ XMP_OptionBits openFlags /* = 0 */ )
+{
+ WrapCheckBool ( ok, zXMPFiles_OpenFile_1 ( filePath, format, openFlags ) );
+ return ok;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+OpenFile ( const tStringObj & filePath,
+ XMP_FileFormat format /* = kXMP_UnknownFile */,
+ XMP_OptionBits openFlags /* = 0 */ )
+{
+ return this->OpenFile ( filePath.c_str(), format, openFlags );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+#if XMP_StaticBuild // ! Client XMP_IO objects can only be used in static builds.
+XMP_MethodIntro(TXMPFiles,bool)::
+OpenFile ( XMP_IO * clientIO,
+ XMP_FileFormat format /* = kXMP_UnknownFile */,
+ XMP_OptionBits openFlags /* = 0 */ )
+{
+ WrapCheckBool ( ok, zXMPFiles_OpenFile_2 ( clientIO, format, openFlags ) );
+ return ok;
+}
+#endif
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+CloseFile ( XMP_OptionBits closeFlags /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPFiles_CloseFile_1 ( closeFlags ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+GetFileInfo ( tStringObj * filePath /* = 0 */,
+ XMP_OptionBits * openFlags /* = 0 */,
+ XMP_FileFormat * format /* = 0 */,
+ XMP_OptionBits * handlerFlags /* = 0 */ )
+{
+ WrapCheckBool ( isOpen, zXMPFiles_GetFileInfo_1 ( filePath, openFlags, format, handlerFlags, SetClientString ) );
+ return isOpen;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+SetAbortProc ( XMP_AbortProc abortProc,
+ void * abortArg )
+{
+ WrapCheckVoid ( zXMPFiles_SetAbortProc_1 ( abortProc, abortArg ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+GetXMP ( SXMPMeta * xmpObj /* = 0 */,
+ tStringObj * xmpPacket /* = 0 */,
+ XMP_PacketInfo * packetInfo /* = 0 */ )
+{
+ XMPMetaRef xmpRef = 0;
+ if ( xmpObj != 0 ) {
+ SXMPUtils::RemoveProperties ( xmpObj, 0, 0, kXMPUtil_DoAllProperties ); // *** Need an SXMPMeta::Clear method:
+ xmpRef = xmpObj->GetInternalRef();
+ }
+
+ WrapCheckBool ( hasXMP, zXMPFiles_GetXMP_1 ( xmpRef, xmpPacket, packetInfo, SetClientString ) );
+ return hasXMP;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+PutXMP ( const SXMPMeta & xmpObj )
+{
+ WrapCheckVoid ( zXMPFiles_PutXMP_1 ( xmpObj.GetInternalRef(), 0, 0 ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+PutXMP ( XMP_StringPtr xmpPacket,
+ XMP_StringLen xmpLength /* = kXMP_UseNullTermination */ )
+{
+ WrapCheckVoid ( zXMPFiles_PutXMP_1 ( 0, xmpPacket, xmpLength ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+PutXMP ( const tStringObj & xmpPacket )
+{
+ this->PutXMP ( xmpPacket.c_str(), (XMP_StringLen)xmpPacket.size() );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+CanPutXMP ( const SXMPMeta & xmpObj )
+{
+ WrapCheckBool ( canPut, zXMPFiles_CanPutXMP_1 ( xmpObj.GetInternalRef(), 0, 0 ) );
+ return canPut;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+CanPutXMP ( XMP_StringPtr xmpPacket,
+ XMP_StringLen xmpLength /* = kXMP_UseNullTermination */ )
+{
+ WrapCheckBool ( canPut, zXMPFiles_CanPutXMP_1 ( 0, xmpPacket, xmpLength ) );
+ return canPut;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,bool)::
+CanPutXMP ( const tStringObj & xmpPacket )
+{
+ return this->CanPutXMP ( xmpPacket.c_str(), (XMP_StringLen)xmpPacket.size() );
+}
+
+// =================================================================================================
+
+XMP_MethodIntro(TXMPFiles,void)::
+SetDefaultProgressCallback ( XMP_ProgressReportProc proc, void * context /* = 0 */,
+ float interval /* = 1.0 */, bool sendStartStop /* = false */ )
+{
+ XMP_Bool internalsendStartStop = ConvertBoolToXMP_Bool( sendStartStop );
+ WrapCheckVoid ( zXMPFiles_SetDefaultProgressCallback_1 ( proc, context, interval, internalsendStartStop ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+SetProgressCallback ( XMP_ProgressReportProc proc, void * context /* = 0 */,
+ float interval /* = 1.0 */, bool sendStartStop /* = false */ )
+{
+ XMP_Bool internalsendStartStop = ConvertBoolToXMP_Bool( sendStartStop );
+ WrapCheckVoid ( zXMPFiles_SetProgressCallback_1 ( proc, context, interval, internalsendStartStop ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+SetDefaultErrorCallback ( XMPFiles_ErrorCallbackProc proc,
+ void * context /* = 0 */, XMP_Uns32 limit /*= 1 */ )
+{
+ WrapCheckVoid ( zXMPFiles_SetDefaultErrorCallback_1 ( proc, context, limit ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+SetErrorCallback ( XMPFiles_ErrorCallbackProc proc,
+ void * context /* = 0 */, XMP_Uns32 limit /*= 1 */ )
+{
+ WrapCheckVoid ( zXMPFiles_SetErrorCallback_1 ( proc, context, limit ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPFiles,void)::
+ResetErrorCallbackLimit ( XMP_Uns32 limit /* = 1 */ )
+{
+ WrapCheckVoid ( zXMPFiles_ResetErrorCallbackLimit_1 ( limit ) );
+}
+
+// =================================================================================================
diff --git a/gpr/source/lib/xmp_core/public/include/client-glue/TXMPIterator.incl_cpp b/gpr/source/lib/xmp_core/public/include/client-glue/TXMPIterator.incl_cpp
new file mode 100644
index 0000000..0b39d01
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/client-glue/TXMPIterator.incl_cpp
@@ -0,0 +1,223 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// ================================================================================================
+/// \file TXMPIterator.incl_cpp
+/// \brief The implementation of the TXMPIterator template class.
+
+#include "XMP.hpp"
+#include "client-glue/WXMP_Common.hpp"
+#include "client-glue/WXMPIterator.hpp"
+
+// =================================================================================================
+// Implementation Guidelines
+// =========================
+//
+// The implementations of the template functions are very stylized. The jobs done in this code are:
+//
+// 1. Set up the xmpIter template data member in the constructors.
+// 2. Call through to the appropriate WXMPIterator function.
+// 3. Copy returned strings and release the threading lock.
+//
+// The various kinds of functions follow similar patterns, first assuming no returned string:
+//
+// Constructors - Use an initializer for the xmpIter data member to call the WXMPIterator constructor.
+// Destructor - Let the WXMPIterator destructor be implicitly called for the xmpIter data member.
+// Static function - Simply call the corresponding WXMPIterator static function.
+// Non-static function - Simply call the corresponding WXMPIterator function using xmpIter.
+//
+// If a member function has returned strings the code looks roughly like this:
+//
+// <<<callthrough>>>
+// <<<checkfailure>>>
+// if ( <<<appropriate>>> ) {
+// if ( outStr != 0 ) outStr->assign ( outPtr, outLen );
+// <<<unlock>>>
+// }
+// return result;
+//
+// The <<<callthrough>>> is the call to the wrapper, and <<<checkfailure>>> is the check and throw
+// if the wrapper reports failure. The <<<appropriate>>> check is used to determine if the string
+// should actually be assigned. For example, GetProperty can't assign the value if the property
+// does not exist. There is no <<<appropriate>>> check if it isn't, well, appropriate. Outputs are
+// always passed as explicit pointers, and null can be passed if the string is not wanted. The
+// inner implementation holds the threading lock if an output string is returned, regardless of
+// whether the client wants it or not (which the implementation does not know).
+//
+// =================================================================================================
+
+#ifndef XMP_TraceCTorDTor
+ #define XMP_TraceCTorDTor 0
+#endif
+
+#if XMP_TraceCTorDTor
+ class XIPeek { // Hack to peek at the client ref count in the internal object.
+ public:
+ XIPeek();
+ virtual ~XIPeek();
+ XMP_Int32 clientRefs;
+ };
+#endif
+
+// -------------------------------------------------------------------------------------------------
+
+#define PropIterCTor(xmpRef,schemaNS,propName,options) \
+ WrapCheckIterRef ( newRef, zXMPIterator_PropCTor_1 ( xmpRef, schemaNS, propName, options ) ); \
+ this->iterRef = newRef
+
+// -------------------------------------------------------------------------------------------------
+
+#define TableIterCTor(schemaNS,propName,options) \
+ WrapCheckIterRef ( newRef, zXMPIterator_TableCTor_1 ( schemaNS, propName, options ) ); \
+ this->iterRef = newRef
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPIterator,void)::
+SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen )
+{
+ tStringObj * clientStr = (tStringObj*) clientPtr;
+ clientStr->assign ( valuePtr, valueLen );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPIterator)::
+TXMPIterator ( const TXMPIterator<tStringObj> & original ) : iterRef(original.iterRef)
+{
+ WXMPIterator_IncrementRefCount_1 ( this->iterRef );
+ #if XMP_TraceCTorDTor
+ XIPeek* xiPtr = (XIPeek*)this->iterRef;
+ printf ( "Copy construct TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPIterator,void)::
+operator= ( const TXMPIterator<tStringObj> & rhs )
+{
+ #if XMP_TraceCTorDTor
+ XIPeek* xiLHS = (XIPeek*)this->iterRef;
+ XIPeek* xiRHS = (XIPeek*)rhs.iterRef;
+ printf ( "Assign TXMPIterator, lhs @ %.8X, rhs @ %.8X\n", this, &rhs );
+ printf ( " original lhs ref = %.8X, count = %d\n", xiLHS, xiLHS->clientRefs );
+ printf ( " original rhs ref = %.8X, count = %d\n", xiRHS, xiRHS->clientRefs );
+ #endif
+ XMPIteratorRef oldRef = this->iterRef; // ! Decrement last so errors leave client object OK.
+ this->iterRef = rhs.iterRef;
+ WXMPIterator_IncrementRefCount_1 ( this->iterRef );
+ WXMPIterator_DecrementRefCount_1 ( oldRef );
+ #if XMP_TraceCTorDTor
+ printf ( " result lhs ref = %.8X, count = %d\n", xiLHS, xiLHS->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPIterator)::
+TXMPIterator() : iterRef(0)
+{
+ throw XMP_Error ( kXMPErr_Unavailable, "No default construction for XMP iterators" );
+ #if XMP_TraceCTorDTor
+ XIPeek* xiPtr = (XIPeek*)this->iterRef;
+ printf ( "Default construct TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPIterator)::
+TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_OptionBits options /* = 0 */ ) : iterRef(0)
+{
+ PropIterCTor ( xmpObj.GetInternalRef(), schemaNS, propName, options );
+ #if XMP_TraceCTorDTor
+ XIPeek* xiPtr = (XIPeek*)this->iterRef;
+ printf ( "Construct property TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPIterator)::
+TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_OptionBits options /* = 0 */ ) : iterRef(0)
+{
+ PropIterCTor ( xmpObj.GetInternalRef(), schemaNS, "", options );
+ #if XMP_TraceCTorDTor
+ XIPeek* xiPtr = (XIPeek*)this->iterRef;
+ printf ( "Construct schema TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPIterator)::
+TXMPIterator ( const TXMPMeta<tStringObj> & xmpObj,
+ XMP_OptionBits options /* = 0 */ ) : iterRef(0)
+{
+ PropIterCTor ( xmpObj.GetInternalRef(), "", "", options );
+ #if XMP_TraceCTorDTor
+ XIPeek* xiPtr = (XIPeek*)this->iterRef;
+ printf ( "Construct tree TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPIterator)::
+TXMPIterator ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_OptionBits options ) : iterRef(0)
+{
+ TableIterCTor ( schemaNS, propName, options );
+ #if XMP_TraceCTorDTor
+ XIPeek* xiPtr = (XIPeek*)this->iterRef;
+ printf ( "Construct table TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPIterator)::
+~TXMPIterator () throw()
+{
+ #if XMP_TraceCTorDTor
+ XIPeek* xiPtr = (XIPeek*)this->iterRef;
+ printf ( "Destruct TXMPIterator @ %.8X, ref = %.8X, count = %d\n", this, xiPtr, xiPtr->clientRefs );
+ #endif
+ WXMPIterator_DecrementRefCount_1 ( this->iterRef );
+ this->iterRef = 0;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPIterator,bool)::
+Next ( tStringObj * schemaNS /* = 0 */,
+ tStringObj * propPath /* = 0 */,
+ tStringObj * propValue /* = 0 */,
+ XMP_OptionBits * options /* = 0 */ )
+{
+ WrapCheckBool ( found, zXMPIterator_Next_1 ( schemaNS, propPath, propValue, options, SetClientString ) );
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPIterator,void)::
+Skip ( XMP_OptionBits options )
+{
+ WrapCheckVoid ( zXMPIterator_Skip_1 ( options ) );
+}
+
+// =================================================================================================
diff --git a/gpr/source/lib/xmp_core/public/include/client-glue/TXMPMeta.incl_cpp b/gpr/source/lib/xmp_core/public/include/client-glue/TXMPMeta.incl_cpp
new file mode 100644
index 0000000..aa5f4b8
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/client-glue/TXMPMeta.incl_cpp
@@ -0,0 +1,914 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// ================================================================================================
+/// \file TXMPMeta.incl_cpp
+/// \brief The implementation of the TXMPMeta template class.
+
+#include "XMP.hpp"
+
+#include "client-glue/WXMP_Common.hpp"
+
+#include "client-glue/WXMPMeta.hpp"
+
+#if INCLUDE_XMP_NEW_DOM_MODEL
+ #include "XMPCore/XMPCore_Defines.h"
+
+ #if ENABLE_NEW_DOM_MODEL
+ #include "XMPCore/XMPCore_Defines.h"
+ #include "XMPCore/Interfaces/IXMPDOMFactory.h"
+ #endif
+#endif
+
+// =================================================================================================
+// Implementation Guidelines
+// =========================
+//
+// The implementations of the template functions are very stylized. ...
+//
+// =================================================================================================
+
+#ifndef XMP_TraceCTorDTor
+ #define XMP_TraceCTorDTor 0
+#endif
+
+#if XMP_TraceCTorDTor
+ class XMPeek { // Hack to peek at the client ref count in the internal object.
+ public:
+ XMPeek();
+ virtual ~XMPeek();
+ XMP_Int32 clientRefs;
+ };
+#endif
+
+// =================================================================================================
+// Local utilities
+// ===============
+
+class TOPW_Info {
+public:
+ XMP_TextOutputProc clientProc;
+ void * clientRefCon;
+ TOPW_Info ( XMP_TextOutputProc proc, void * refCon ) : clientProc(proc), clientRefCon(refCon) {};
+private:
+ TOPW_Info() {}; // ! Hide default constructor.
+};
+
+static XMP_Status TextOutputProcWrapper ( void * refCon,
+ XMP_StringPtr buffer,
+ XMP_StringLen bufferSize )
+{
+ try { // Don't let client callback exceptions propagate across DLL boundaries.
+ TOPW_Info * info = (TOPW_Info*)refCon;
+ return info->clientProc ( info->clientRefCon, buffer, bufferSize );
+ } catch ( ... ) {
+ return -1;
+ }
+}
+
+// =================================================================================================
+// Initialization and termination
+// ==============================
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen )
+{
+ tStringObj * clientStr = (tStringObj*) clientPtr;
+ clientStr->assign ( valuePtr, valueLen );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+GetVersionInfo ( XMP_VersionInfo * info )
+{
+ WrapNoCheckVoid ( zXMPMeta_GetVersionInfo_1 ( info ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+#if XMP_TraceClientCalls
+ FILE * xmpClientLog = stderr;
+#endif
+
+#ifndef XMP_TypeCheck
+ #if ! XMP_DebugBuild
+ #define XMP_TypeCheck(e,msg) /* nothing */
+ #else
+ #define XMP_TypeCheck(e,msg) if ( ! (e) ) throw XMP_Error ( kXMPErr_AssertFailure, msg );
+ #endif
+#endif
+
+XMP_MethodIntro(TXMPMeta,bool)::
+Initialize()
+{
+ // Verify critical type sizes.
+ XMP_TypeCheck ( (sizeof(XMP_Int8) == 1), "Size wrong for critical type XMP_Int8" );
+ XMP_TypeCheck ( (sizeof(XMP_Int16) == 2), "Size wrong for critical type XMP_Int16" );
+ XMP_TypeCheck ( (sizeof(XMP_Int32) == 4), "Size wrong for critical type XMP_Int32" );
+ XMP_TypeCheck ( (sizeof(XMP_Int64) == 8), "Size wrong for critical type XMP_Int64" );
+ XMP_TypeCheck ( (sizeof(XMP_Uns8) == 1), "Size wrong for critical type XMP_Uns8" );
+ XMP_TypeCheck ( (sizeof(XMP_Uns16) == 2), "Size wrong for critical type XMP_Uns16" );
+ XMP_TypeCheck ( (sizeof(XMP_Uns32) == 4), "Size wrong for critical type XMP_Uns32" );
+ XMP_TypeCheck ( (sizeof(XMP_Uns64) == 8), "Size wrong for critical type XMP_Uns64" );
+ XMP_TypeCheck ( (sizeof(XMP_Bool) == 1), "Size wrong for critical type XMP_Bool" );
+
+ #if XMP_TraceClientCallsToFile
+ xmpClientLog = fopen ( "XMPClientLog.txt", "w" );
+ if ( xmpClientLog == 0 ) xmpClientLog = stderr;
+ #endif
+
+ WrapCheckBool ( ok, zXMPMeta_Initialize_1() );
+
+ #if ENABLE_NEW_DOM_MODEL
+ NS_XMPCOMMON::IXMPDOMFactory_latest::CreateInstance();
+ #endif
+
+ return ok;
+
+}
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+Terminate()
+{
+ WrapNoCheckVoid ( zXMPMeta_Terminate_1() );
+
+ #if XMP_TraceClientCallsToFile
+ if ( xmpClientLog != stderr ) fclose ( xmpClientLog );
+ xmpClientLog = stderr;
+ #endif
+}
+
+// =================================================================================================
+// Constuctors, destructor, operators
+// ==================================
+
+static XMPMetaRef DefaultCTor()
+{
+ WrapCheckMetaRef ( newRef, zXMPMeta_CTor_1() );
+ return newRef;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPMeta)::
+TXMPMeta() : xmpRef(DefaultCTor())
+{
+ #if XMP_TraceCTorDTor
+ XMPeek* xmPtr = (XMPeek*)this->xmpRef;
+ printf ( "Default construct TXMPMeta @ %.8X, ref = %.8X, count = %d\n", this, xmPtr, xmPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPMeta)::
+TXMPMeta ( const TXMPMeta<tStringObj> & original ) : xmpRef(original.xmpRef)
+{
+ WXMPMeta_IncrementRefCount_1 ( this->xmpRef );
+ #if XMP_TraceCTorDTor
+ XMPeek* xmPtr = (XMPeek*)this->xmpRef;
+ printf ( "Copy construct TXMPMeta @ %.8X, ref = %.8X, count = %d\n", this, xmPtr, xmPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+operator= ( const TXMPMeta<tStringObj> & rhs )
+{
+ #if XMP_TraceCTorDTor
+ XMPeek* xmLHS = (XMPeek*)this->xmpRef;
+ XMPeek* xmRHS = (XMPeek*)rhs.xmpRef;
+ printf ( "Assign TXMPMeta, lhs @ %.8X, rhs @ %.8X\n", this, &rhs );
+ printf ( " original lhs ref = %.8X, count = %d\n", xmLHS, xmLHS->clientRefs );
+ printf ( " original rhs ref = %.8X, count = %d\n", xmRHS, xmRHS->clientRefs );
+ #endif
+ XMPMetaRef oldRef = this->xmpRef; // ! Decrement last so errors leave client object OK.
+ this->xmpRef = rhs.xmpRef;
+ WXMPMeta_IncrementRefCount_1 ( this->xmpRef ); // Increment the count on the new ref.
+ WXMPMeta_DecrementRefCount_1 ( oldRef ); // Decrement the count on the old ref.
+ #if XMP_TraceCTorDTor
+ printf ( " result lhs ref = %.8X, count = %d\n", xmLHS, xmLHS->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPMeta)::
+TXMPMeta ( XMPMetaRef _xmpRef ) : xmpRef(_xmpRef)
+{
+ WXMPMeta_IncrementRefCount_1 ( this->xmpRef );
+ #if XMP_TraceCTorDTor
+ XMPeek* xmPtr = (XMPeek*)this->xmpRef;
+ printf ( "Ref construct TXMPMeta @ %.8X, ref = %.8X, count = %d\n", this, xmPtr, xmPtr->clientRefs );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPMeta)::
+TXMPMeta ( XMP_StringPtr buffer,
+ XMP_StringLen xmpSize ) : xmpRef(DefaultCTor())
+{
+ #if XMP_TraceCTorDTor
+ XMPeek* xmPtr = (XMPeek*)this->xmpRef;
+ printf ( "Parse construct TXMPMeta @ %.8X, ref = %.8X, count = %d\n", this, xmPtr, xmPtr->clientRefs );
+ #endif
+ try {
+ this->ParseFromBuffer ( buffer, xmpSize );
+ } catch ( ... ) {
+ WXMPMeta_DecrementRefCount_1 ( this->xmpRef );
+ this->xmpRef = 0;
+ throw;
+ }
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_CTorDTorIntro(TXMPMeta)::
+~TXMPMeta() throw()
+{
+ #if XMP_TraceCTorDTor
+ XMPeek* xmPtr = (XMPeek*)this->xmpRef;
+ printf ( "Destruct TXMPMeta @ %.8X, ref = %.8X, count = %d\n", this, xmPtr, xmPtr->clientRefs );
+ #endif
+ WXMPMeta_DecrementRefCount_1 ( this->xmpRef );
+ this->xmpRef = 0;
+
+} // ~TXMPMeta ()
+
+// =================================================================================================
+// Global state functions
+// ======================
+
+XMP_MethodIntro(TXMPMeta,XMP_OptionBits)::
+GetGlobalOptions()
+{
+ WrapCheckOptions ( options, zXMPMeta_GetGlobalOptions_1() );
+ return options;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetGlobalOptions ( XMP_OptionBits options )
+{
+ WrapCheckVoid ( zXMPMeta_SetGlobalOptions_1 ( options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,XMP_Status)::
+DumpNamespaces ( XMP_TextOutputProc outProc,
+ void * refCon )
+{
+ TOPW_Info info ( outProc, refCon );
+ WrapCheckStatus ( status, zXMPMeta_DumpNamespaces_1 ( TextOutputProcWrapper, &info ) );
+ return status;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+RegisterNamespace ( XMP_StringPtr namespaceURI,
+ XMP_StringPtr suggestedPrefix,
+ tStringObj * registeredPrefix )
+{
+ WrapCheckBool ( prefixMatch, zXMPMeta_RegisterNamespace_1 ( namespaceURI, suggestedPrefix, registeredPrefix, SetClientString ) );
+ return prefixMatch;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetNamespacePrefix ( XMP_StringPtr namespaceURI,
+ tStringObj * namespacePrefix )
+{
+ WrapCheckBool ( found, zXMPMeta_GetNamespacePrefix_1 ( namespaceURI, namespacePrefix, SetClientString ) );
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetNamespaceURI ( XMP_StringPtr namespacePrefix,
+ tStringObj * namespaceURI )
+{
+ WrapCheckBool ( found, zXMPMeta_GetNamespaceURI_1 ( namespacePrefix, namespaceURI, SetClientString ) );
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+DeleteNamespace ( XMP_StringPtr namespaceURI )
+{
+ WrapCheckVoid ( zXMPMeta_DeleteNamespace_1 ( namespaceURI ) );
+}
+
+// =================================================================================================
+// Basic property manipulation functions
+// =====================================
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ tStringObj * propValue,
+ XMP_OptionBits * options ) const
+{
+ WrapCheckBool ( found, zXMPMeta_GetProperty_1 ( schemaNS, propName, propValue, options, SetClientString ) );
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ tStringObj * itemValue,
+ XMP_OptionBits * options ) const
+{
+ WrapCheckBool ( found, zXMPMeta_GetArrayItem_1 ( schemaNS, arrayName, itemIndex, itemValue, options, SetClientString ) );
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ tStringObj * fieldValue,
+ XMP_OptionBits * options ) const
+{
+ WrapCheckBool ( found, zXMPMeta_GetStructField_1 ( schemaNS, structName, fieldNS, fieldName, fieldValue, options, SetClientString ) );
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ tStringObj * qualValue,
+ XMP_OptionBits * options ) const
+{
+ WrapCheckBool ( found, zXMPMeta_GetQualifier_1 ( schemaNS, propName, qualNS, qualName, qualValue, options, SetClientString ) );
+ return found;
+} //GetQualifier ()
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr propValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetProperty_1 ( schemaNS, propName, propValue, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ const tStringObj & propValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ this->SetProperty ( schemaNS, propName, propValue.c_str(), options );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetArrayItem_1 ( schemaNS, arrayName, itemIndex, itemValue, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ const tStringObj & itemValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ this->SetArrayItem ( schemaNS, arrayName, itemIndex, itemValue.c_str(), options );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+AppendArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits arrayOptions,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_AppendArrayItem_1 ( schemaNS, arrayName, arrayOptions, itemValue, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+AppendArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits arrayOptions,
+ const tStringObj & itemValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ this->AppendArrayItem ( schemaNS, arrayName, arrayOptions, itemValue.c_str(), options );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ XMP_StringPtr fieldValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetStructField_1 ( schemaNS, structName, fieldNS, fieldName, fieldValue, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ const tStringObj & fieldValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ this->SetStructField ( schemaNS, structName, fieldNS, fieldName, fieldValue.c_str(), options );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ XMP_StringPtr qualValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetQualifier_1 ( schemaNS, propName, qualNS, qualName, qualValue, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ const tStringObj & qualValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ this->SetQualifier ( schemaNS, propName, qualNS, qualName, qualValue.c_str(), options );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+DeleteProperty ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName )
+{
+ WrapCheckVoid ( zXMPMeta_DeleteProperty_1 ( schemaNS, propName ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+DeleteArrayItem ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex )
+{
+ WrapCheckVoid ( zXMPMeta_DeleteArrayItem_1 ( schemaNS, arrayName, itemIndex ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+DeleteStructField ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName )
+{
+ WrapCheckVoid ( zXMPMeta_DeleteStructField_1 ( schemaNS, structName, fieldNS, fieldName ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+DeleteQualifier ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName )
+{
+ WrapCheckVoid ( zXMPMeta_DeleteQualifier_1 ( schemaNS, propName, qualNS, qualName ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+DoesPropertyExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName ) const
+{
+ WrapCheckBool ( exists, zXMPMeta_DoesPropertyExist_1 ( schemaNS, propName ) );
+ return exists;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+DoesArrayItemExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex ) const
+{
+ WrapCheckBool ( exists, zXMPMeta_DoesArrayItemExist_1 ( schemaNS, arrayName, itemIndex ) );
+ return exists;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+DoesStructFieldExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName ) const
+{
+ WrapCheckBool ( exists, zXMPMeta_DoesStructFieldExist_1 ( schemaNS, structName, fieldNS, fieldName ) );
+ return exists;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+DoesQualifierExist ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName ) const
+{
+ WrapCheckBool ( exists, zXMPMeta_DoesQualifierExist_1 ( schemaNS, propName, qualNS, qualName ) );
+ return exists;
+}
+
+// =================================================================================================
+// Specialized Get and Set functions
+// =================================
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetLocalizedText ( XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ tStringObj * actualLang,
+ tStringObj * itemValue,
+ XMP_OptionBits * options ) const
+{
+ WrapCheckBool ( found, zXMPMeta_GetLocalizedText_1 ( schemaNS, altTextName, genericLang, specificLang,
+ actualLang, itemValue, options, SetClientString ) );
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetLocalizedText ( XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetLocalizedText_1 ( schemaNS, altTextName, genericLang, specificLang, itemValue, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetLocalizedText ( XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ const tStringObj & itemValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ this->SetLocalizedText ( schemaNS, altTextName, genericLang, specificLang, itemValue.c_str(), options );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+DeleteLocalizedText ( XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang )
+{
+ WrapCheckVoid ( zXMPMeta_DeleteLocalizedText_1 ( schemaNS, altTextName, genericLang, specificLang ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetProperty_Bool ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ bool * propValue,
+ XMP_OptionBits * options ) const
+{
+ XMP_Bool binValue;
+ WrapCheckBool ( found, zXMPMeta_GetProperty_Bool_1 ( schemaNS, propName, &binValue, options ) );
+ if ( found && (propValue != 0) ) *propValue = binValue;
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetProperty_Int ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int32 * propValue,
+ XMP_OptionBits * options ) const
+{
+ WrapCheckBool ( found, zXMPMeta_GetProperty_Int_1 ( schemaNS, propName, propValue, options ) );
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetProperty_Int64 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int64 * propValue,
+ XMP_OptionBits * options ) const
+{
+ WrapCheckBool ( found, zXMPMeta_GetProperty_Int64_1 ( schemaNS, propName, propValue, options ) );
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetProperty_Float ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ double * propValue,
+ XMP_OptionBits * options ) const
+{
+ WrapCheckBool ( found, zXMPMeta_GetProperty_Float_1 ( schemaNS, propName, propValue, options ) );
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,bool)::
+GetProperty_Date ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_DateTime * propValue,
+ XMP_OptionBits * options ) const
+{
+ WrapCheckBool ( found, zXMPMeta_GetProperty_Date_1 ( schemaNS, propName, propValue, options ) );
+ return found;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetProperty_Bool ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ bool propValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetProperty_Bool_1 ( schemaNS, propName, propValue, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetProperty_Int ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int32 propValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetProperty_Int_1 ( schemaNS, propName, propValue, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetProperty_Int64 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int64 propValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetProperty_Int64_1 ( schemaNS, propName, propValue, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetProperty_Float ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ double propValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetProperty_Float_1 ( schemaNS, propName, propValue, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetProperty_Date ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ const XMP_DateTime & propValue,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetProperty_Date_1 ( schemaNS, propName, propValue, options ) );
+}
+
+// =================================================================================================
+// Miscellaneous Member Functions
+// ==============================
+
+XMP_MethodIntro(TXMPMeta,XMPMetaRef)::
+GetInternalRef() const
+{
+ return this->xmpRef;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+GetObjectName ( tStringObj * nameStr ) const
+{
+ WrapCheckVoid ( zXMPMeta_GetObjectName_1 ( nameStr, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetObjectName ( XMP_StringPtr name )
+{
+ WrapCheckVoid ( zXMPMeta_SetObjectName_1 ( name ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetObjectName ( tStringObj name )
+{
+ this->SetObjectName ( name.c_str() );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,XMP_OptionBits)::
+GetObjectOptions() const
+{
+ WrapCheckOptions ( options, zXMPMeta_GetObjectOptions_1() );
+ return options;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetObjectOptions ( XMP_OptionBits options )
+{
+ WrapCheckVoid ( zXMPMeta_SetObjectOptions_1 ( options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+Sort()
+{
+ WrapCheckVoid ( zXMPMeta_Sort_1() );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+Erase()
+{
+ WrapCheckVoid ( zXMPMeta_Erase_1() );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,TXMPMeta<tStringObj>)::
+Clone ( XMP_OptionBits options ) const
+{
+ WrapCheckMetaRef ( cloneRef, zXMPMeta_Clone_1 ( options ) );
+ return TXMPMeta<tStringObj> ( cloneRef ); // Ref construct will increment the clientRefs.
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,XMP_Index)::
+CountArrayItems ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName ) const
+{
+ WrapCheckIndex ( count, zXMPMeta_CountArrayItems_1 ( schemaNS, arrayName ) );
+ return count;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,XMP_Status)::
+DumpObject ( XMP_TextOutputProc outProc,
+ void * refCon ) const
+{
+ TOPW_Info info ( outProc, refCon );
+ WrapCheckStatus ( status, zXMPMeta_DumpObject_1 ( TextOutputProcWrapper, &info ) );
+ return status;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+ParseFromBuffer ( XMP_StringPtr buffer,
+ XMP_StringLen bufferSize,
+ XMP_OptionBits options /* = 0 */ )
+{
+ WrapCheckVoid ( zXMPMeta_ParseFromBuffer_1 ( buffer, bufferSize, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SerializeToBuffer ( tStringObj * pktString,
+ XMP_OptionBits options,
+ XMP_StringLen padding,
+ XMP_StringPtr newline,
+ XMP_StringPtr indent,
+ XMP_Index baseIndent /* = 0 */ ) const
+{
+ WrapCheckVoid ( zXMPMeta_SerializeToBuffer_1 ( pktString, options, padding, newline, indent, baseIndent, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SerializeToBuffer ( tStringObj * pktString,
+ XMP_OptionBits options /* = 0 */,
+ XMP_StringLen padding /* = 0 */ ) const
+{
+ this->SerializeToBuffer ( pktString, options, padding, "", "", 0 );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetDefaultErrorCallback ( XMPMeta_ErrorCallbackProc proc,
+ void * context /* = 0 */,
+ XMP_Uns32 limit /* = 1 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetDefaultErrorCallback_1 ( proc, context, limit ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+SetErrorCallback ( XMPMeta_ErrorCallbackProc proc,
+ void * context /* = 0 */,
+ XMP_Uns32 limit /* = 1 */ )
+{
+ WrapCheckVoid ( zXMPMeta_SetErrorCallback_1 ( proc, context, limit ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPMeta,void)::
+ResetErrorCallbackLimit ( XMP_Uns32 limit /* = 1 */ )
+{
+ WrapCheckVoid ( zXMPMeta_ResetErrorCallbackLimit_1 ( limit ) );
+}
+
+// =================================================================================================
diff --git a/gpr/source/lib/xmp_core/public/include/client-glue/TXMPUtils.incl_cpp b/gpr/source/lib/xmp_core/public/include/client-glue/TXMPUtils.incl_cpp
new file mode 100644
index 0000000..2cd5bae
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/client-glue/TXMPUtils.incl_cpp
@@ -0,0 +1,445 @@
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+// ================================================================================================
+/// \file TXMPUtils.incl_cpp
+/// \brief The implementation of the TXMPUtils template class.
+
+#include "XMP.hpp"
+#include "client-glue/WXMP_Common.hpp"
+#include "client-glue/WXMPUtils.hpp"
+
+// =================================================================================================
+// Implementation Guidelines
+// =========================
+//
+// The implementations of the template functions are very stylized. ...
+//
+// =================================================================================================
+
+XMP_MethodIntro(TXMPUtils,void)::
+SetClientString ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen )
+{
+ tStringObj * clientStr = (tStringObj*) clientPtr;
+ clientStr->assign ( valuePtr, valueLen );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ComposeArrayItemPath ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ tStringObj * fullPath )
+{
+ WrapCheckVoid ( zXMPUtils_ComposeArrayItemPath_1 ( schemaNS, arrayName, itemIndex, fullPath, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ComposeStructFieldPath ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ tStringObj * fullPath )
+{
+ WrapCheckVoid ( zXMPUtils_ComposeStructFieldPath_1 ( schemaNS, structName, fieldNS, fieldName, fullPath, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ComposeQualifierPath ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ tStringObj * fullPath )
+{
+ WrapCheckVoid ( zXMPUtils_ComposeQualifierPath_1 ( schemaNS, propName, qualNS, qualName, fullPath, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ComposeLangSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr langName,
+ tStringObj * fullPath )
+{
+ WrapCheckVoid ( zXMPUtils_ComposeLangSelector_1 ( schemaNS, arrayName, langName, fullPath, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ComposeLangSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ const tStringObj & langName,
+ tStringObj * fullPath )
+{
+ TXMPUtils::ComposeLangSelector ( schemaNS, arrayName, langName.c_str(), fullPath );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ComposeFieldSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ XMP_StringPtr fieldValue,
+ tStringObj * fullPath )
+{
+ WrapCheckVoid ( zXMPUtils_ComposeFieldSelector_1 ( schemaNS, arrayName, fieldNS, fieldName, fieldValue, fullPath, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ComposeFieldSelector ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ const tStringObj & fieldValue,
+ tStringObj * fullPath )
+{
+ TXMPUtils::ComposeFieldSelector ( schemaNS, arrayName, fieldNS, fieldName, fieldValue.c_str(), fullPath );
+}
+
+// -------------------------------------------------------------------------------------------------
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ConvertFromBool ( bool binValue,
+ tStringObj * strValue )
+{
+ WrapCheckVoid ( zXMPUtils_ConvertFromBool_1 ( binValue, strValue, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ConvertFromInt ( long binValue,
+ XMP_StringPtr format,
+ tStringObj * strValue )
+{
+ #if XMP_MacBuild & XMP_64 // This is checked because on Mac 64 bit environment, long is of 64 bit and hence gives a warning during implicit
+ // typecasting to XMP_Int32. Now doing it explicitly in that case.
+ WrapCheckVoid ( zXMPUtils_ConvertFromInt_1 ( (XMP_Int32)binValue, format, strValue, SetClientString ) );
+ #else
+ WrapCheckVoid ( zXMPUtils_ConvertFromInt_1 ( binValue, format, strValue, SetClientString ) );
+ #endif
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ConvertFromInt64 ( long long binValue,
+ XMP_StringPtr format,
+ tStringObj * strValue )
+{
+ WrapCheckVoid ( zXMPUtils_ConvertFromInt64_1 ( binValue, format, strValue, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ConvertFromFloat ( double binValue,
+ XMP_StringPtr format,
+ tStringObj * strValue )
+{
+ WrapCheckVoid ( zXMPUtils_ConvertFromFloat_1 ( binValue, format, strValue, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ConvertFromDate ( const XMP_DateTime & binValue,
+ tStringObj * strValue )
+{
+ WrapCheckVoid ( zXMPUtils_ConvertFromDate_1 ( binValue, strValue, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,bool)::
+ConvertToBool ( XMP_StringPtr strValue )
+{
+ WrapCheckBool ( value, zXMPUtils_ConvertToBool_1 ( strValue ) );
+ return value;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,bool)::
+ConvertToBool ( const tStringObj & strValue )
+{
+ return TXMPUtils::ConvertToBool ( strValue.c_str() );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,long)::
+ConvertToInt ( XMP_StringPtr strValue )
+{
+ WrapCheckInt32 ( value, zXMPUtils_ConvertToInt_1 ( strValue ) );
+ return value;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,long)::
+ConvertToInt ( const tStringObj & strValue )
+{
+ return TXMPUtils::ConvertToInt ( strValue.c_str() );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,long long)::
+ConvertToInt64 ( XMP_StringPtr strValue )
+{
+ WrapCheckInt64 ( value, zXMPUtils_ConvertToInt64_1 ( strValue ) );
+ return value;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,long long)::
+ConvertToInt64 ( const tStringObj & strValue )
+{
+ return TXMPUtils::ConvertToInt64 ( strValue.c_str() );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,double)::
+ConvertToFloat ( XMP_StringPtr strValue )
+{
+ WrapCheckFloat ( value, zXMPUtils_ConvertToFloat_1 ( strValue ) );
+ return value;
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,double)::
+ConvertToFloat ( const tStringObj & strValue )
+{
+ return TXMPUtils::ConvertToFloat ( strValue.c_str() );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ConvertToDate ( XMP_StringPtr strValue,
+ XMP_DateTime * binValue )
+{
+ WrapCheckVoid ( zXMPUtils_ConvertToDate_1 ( strValue, binValue ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ConvertToDate ( const tStringObj & strValue,
+ XMP_DateTime * binValue )
+{
+ TXMPUtils::ConvertToDate ( strValue.c_str(), binValue );
+}
+
+// -------------------------------------------------------------------------------------------------
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+CurrentDateTime ( XMP_DateTime * time )
+{
+ WrapCheckVoid ( zXMPUtils_CurrentDateTime_1 ( time ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+SetTimeZone ( XMP_DateTime * time )
+{
+ WrapCheckVoid ( zXMPUtils_SetTimeZone_1 ( time ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ConvertToUTCTime ( XMP_DateTime * time )
+{
+ WrapCheckVoid ( zXMPUtils_ConvertToUTCTime_1 ( time ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ConvertToLocalTime ( XMP_DateTime * time )
+{
+ WrapCheckVoid ( zXMPUtils_ConvertToLocalTime_1 ( time ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,int)::
+CompareDateTime ( const XMP_DateTime & left,
+ const XMP_DateTime & right )
+{
+ WrapCheckInt32 ( result, zXMPUtils_CompareDateTime_1 ( left, right ) );
+ return result;
+}
+
+// -------------------------------------------------------------------------------------------------
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+EncodeToBase64 ( XMP_StringPtr rawStr,
+ XMP_StringLen rawLen,
+ tStringObj * encodedStr )
+{
+ WrapCheckVoid ( zXMPUtils_EncodeToBase64_1 ( rawStr, rawLen, encodedStr, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+EncodeToBase64 ( const tStringObj & rawStr,
+ tStringObj * encodedStr )
+{
+ TXMPUtils::EncodeToBase64 ( rawStr.c_str(), (XMP_StringLen)rawStr.size(), encodedStr );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+DecodeFromBase64 ( XMP_StringPtr encodedStr,
+ XMP_StringLen encodedLen,
+ tStringObj * rawStr )
+{
+ WrapCheckVoid ( zXMPUtils_DecodeFromBase64_1 ( encodedStr, encodedLen, rawStr, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+DecodeFromBase64 ( const tStringObj & encodedStr,
+ tStringObj * rawStr )
+{
+ TXMPUtils::DecodeFromBase64 ( encodedStr.c_str(), (XMP_StringLen)encodedStr.size(), rawStr );
+}
+
+// -------------------------------------------------------------------------------------------------
+// -------------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+PackageForJPEG ( const TXMPMeta<tStringObj> & xmpObj,
+ tStringObj * standardXMP,
+ tStringObj * extendedXMP,
+ tStringObj * extendedDigest )
+{
+ WrapCheckVoid ( zXMPUtils_PackageForJPEG_1 ( xmpObj.GetInternalRef(), standardXMP, extendedXMP, extendedDigest, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+MergeFromJPEG ( TXMPMeta<tStringObj> * fullXMP,
+ const TXMPMeta<tStringObj> & extendedXMP )
+{
+ WrapCheckVoid ( zXMPUtils_MergeFromJPEG_1 ( fullXMP->GetInternalRef(), extendedXMP.GetInternalRef() ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+CatenateArrayItems ( const TXMPMeta<tStringObj> & xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr separator,
+ XMP_StringPtr quotes,
+ XMP_OptionBits options,
+ tStringObj * catedStr )
+{
+ WrapCheckVoid ( zXMPUtils_CatenateArrayItems_1 ( xmpObj.GetInternalRef(), schemaNS, arrayName,
+ separator, quotes, options, catedStr, SetClientString ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+SeparateArrayItems ( TXMPMeta<tStringObj> * xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits options,
+ XMP_StringPtr catedStr )
+{
+ if ( xmpObj == 0 ) throw XMP_Error ( kXMPErr_BadParam, "Null output SXMPMeta pointer" );
+ WrapCheckVoid ( zXMPUtils_SeparateArrayItems_1 ( xmpObj->GetInternalRef(), schemaNS, arrayName, options, catedStr ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+SeparateArrayItems ( TXMPMeta<tStringObj> * xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits options,
+ const tStringObj & catedStr )
+{
+ TXMPUtils::SeparateArrayItems ( xmpObj, schemaNS, arrayName, options, catedStr.c_str() );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+ApplyTemplate ( TXMPMeta<tStringObj> * workingXMP,
+ const TXMPMeta<tStringObj> & templateXMP,
+ XMP_OptionBits actions )
+{
+ if ( workingXMP == 0 ) throw XMP_Error ( kXMPErr_BadParam, "Null working SXMPMeta pointer" );
+ WrapCheckVoid ( zXMPUtils_ApplyTemplate_1 ( workingXMP->GetInternalRef(), templateXMP.GetInternalRef(), actions ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+RemoveProperties ( TXMPMeta<tStringObj> * xmpObj,
+ XMP_StringPtr schemaNS /* = 0 */,
+ XMP_StringPtr propName /* = 0 */,
+ XMP_OptionBits options /* = 0 */ )
+{
+ if ( xmpObj == 0 ) throw XMP_Error ( kXMPErr_BadParam, "Null output SXMPMeta pointer" );
+ WrapCheckVoid ( zXMPUtils_RemoveProperties_1 ( xmpObj->GetInternalRef(), schemaNS, propName, options ) );
+}
+
+// -------------------------------------------------------------------------------------------------
+
+// -------------------------------------------------------------------------------------------------
+
+XMP_MethodIntro(TXMPUtils,void)::
+DuplicateSubtree ( const TXMPMeta<tStringObj> & source,
+ TXMPMeta<tStringObj> * dest,
+ XMP_StringPtr sourceNS,
+ XMP_StringPtr sourceRoot,
+ XMP_StringPtr destNS /*= 0 */,
+ XMP_StringPtr destRoot /* = 0 */,
+ XMP_OptionBits options /* = 0 */ )
+{
+ if ( dest == 0 ) throw XMP_Error ( kXMPErr_BadParam, "Null output SXMPMeta pointer" );
+ WrapCheckVoid ( zXMPUtils_DuplicateSubtree_1 ( source.GetInternalRef(), dest->GetInternalRef(),
+ sourceNS, sourceRoot, destNS, destRoot, options ) );
+}
+
+// =================================================================================================
+
+// =================================================================================================
diff --git a/gpr/source/lib/xmp_core/public/include/client-glue/WXMPFiles.hpp b/gpr/source/lib/xmp_core/public/include/client-glue/WXMPFiles.hpp
new file mode 100644
index 0000000..648a842
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/client-glue/WXMPFiles.hpp
@@ -0,0 +1,281 @@
+#ifndef __WXMPFiles_hpp__
+#define __WXMPFiles_hpp__ 1
+
+// =================================================================================================
+// ADOBE SYSTEMS INCORPORATED
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "client-glue/WXMP_Common.hpp"
+
+#if XMP_StaticBuild // ! Client XMP_IO objects can only be used in static builds.
+ #include "XMP_IO.hpp"
+#endif
+
+#if __cplusplus
+extern "C" {
+#endif
+
+// =================================================================================================
+/// \file WXMPFiles.h
+/// \brief High level support to access metadata in files of interest to Adobe applications.
+///
+/// This header ...
+///
+// =================================================================================================
+
+// =================================================================================================
+
+#define WrapCheckXMPFilesRef(result,WCallProto) \
+ WXMP_Result wResult; \
+ WCallProto; \
+ PropagateException ( wResult ); \
+ XMPFilesRef result = XMPFilesRef(wResult.ptrResult)
+
+static XMP_Bool WrapProgressReport ( XMP_ProgressReportProc proc, void * context,
+ float elapsedTime, float fractionDone, float secondsToGo )
+{
+ bool ok;
+ try {
+ ok = (*proc) ( context, elapsedTime, fractionDone, secondsToGo );
+ } catch ( ... ) {
+ ok = false;
+ }
+ return ConvertBoolToXMP_Bool( ok );
+}
+
+// =================================================================================================
+
+static XMP_Bool WrapFilesErrorNotify ( XMPFiles_ErrorCallbackProc proc, void * context,
+ XMP_StringPtr filePath, XMP_ErrorSeverity severity, XMP_Int32 cause, XMP_StringPtr message )
+{
+ bool ok;
+ try {
+ ok = (*proc) ( context, filePath, severity, cause, message );
+ } catch ( ... ) {
+ ok = false;
+ }
+ return ConvertBoolToXMP_Bool( ok );
+}
+
+// =================================================================================================
+
+#define zXMPFiles_GetVersionInfo_1(versionInfo) \
+ WXMPFiles_GetVersionInfo_1 ( versionInfo /* no wResult */ )
+
+#define zXMPFiles_Initialize_1(options) \
+ WXMPFiles_Initialize_1 ( options, &wResult )
+
+#define zXMPFiles_Initialize_2(options,pluginFolder,plugins) \
+ WXMPFiles_Initialize_2 ( options, pluginFolder, plugins, &wResult )
+
+#define zXMPFiles_Terminate_1() \
+ WXMPFiles_Terminate_1 ( /* no wResult */ )
+
+#define zXMPFiles_CTor_1() \
+ WXMPFiles_CTor_1 ( &wResult )
+
+#define zXMPFiles_GetFormatInfo_1(format,flags) \
+ WXMPFiles_GetFormatInfo_1 ( format, flags, &wResult )
+
+#define zXMPFiles_CheckFileFormat_1(filePath) \
+ WXMPFiles_CheckFileFormat_1 ( filePath, &wResult )
+
+#define zXMPFiles_CheckPackageFormat_1(folderPath) \
+ WXMPFiles_CheckPackageFormat_1 ( folderPath, &wResult )
+
+#define zXMPFiles_GetFileModDate_1(filePath,modDate,format,options) \
+ WXMPFiles_GetFileModDate_1 ( filePath, modDate, format, options, &wResult )
+
+#define zXMPFiles_GetAssociatedResources_1( filePath, resourceList, format, options, SetClientStringVector ) \
+ WXMPFiles_GetAssociatedResources_1 ( filePath, resourceList, format, options, SetClientStringVector, &wResult )
+
+#define zXMPFiles_IsMetadataWritable_1( filePath, writable, format, options ) \
+ WXMPFiles_IsMetadataWritable_1 ( filePath, writable, format, options, &wResult )
+
+#define zXMPFiles_OpenFile_1(filePath,format,openFlags) \
+ WXMPFiles_OpenFile_1 ( this->xmpFilesRef, filePath, format, openFlags, &wResult )
+
+#if XMP_StaticBuild // ! Client XMP_IO objects can only be used in static builds.
+#define zXMPFiles_OpenFile_2(clientIO,format,openFlags) \
+ WXMPFiles_OpenFile_2 ( this->xmpFilesRef, clientIO, format, openFlags, &wResult )
+#endif
+
+#define zXMPFiles_CloseFile_1(closeFlags) \
+ WXMPFiles_CloseFile_1 ( this->xmpFilesRef, closeFlags, &wResult )
+
+#define zXMPFiles_GetFileInfo_1(clientPath,openFlags,format,handlerFlags,SetClientString) \
+ WXMPFiles_GetFileInfo_1 ( this->xmpFilesRef, clientPath, openFlags, format, handlerFlags, SetClientString, &wResult )
+
+#define zXMPFiles_SetAbortProc_1(abortProc,abortArg) \
+ WXMPFiles_SetAbortProc_1 ( this->xmpFilesRef, abortProc, abortArg, &wResult )
+
+#define zXMPFiles_GetXMP_1(xmpRef,clientPacket,packetInfo,SetClientString) \
+ WXMPFiles_GetXMP_1 ( this->xmpFilesRef, xmpRef, clientPacket, packetInfo, SetClientString, &wResult )
+
+#define zXMPFiles_PutXMP_1(xmpRef,xmpPacket,xmpPacketLen) \
+ WXMPFiles_PutXMP_1 ( this->xmpFilesRef, xmpRef, xmpPacket, xmpPacketLen, &wResult )
+
+#define zXMPFiles_CanPutXMP_1(xmpRef,xmpPacket,xmpPacketLen) \
+ WXMPFiles_CanPutXMP_1 ( this->xmpFilesRef, xmpRef, xmpPacket, xmpPacketLen, &wResult )
+
+#define zXMPFiles_SetDefaultProgressCallback_1(proc,context,interval,sendStartStop) \
+ WXMPFiles_SetDefaultProgressCallback_1 ( WrapProgressReport, proc, context, interval, sendStartStop, &wResult )
+
+#define zXMPFiles_SetProgressCallback_1(proc,context,interval,sendStartStop) \
+ WXMPFiles_SetProgressCallback_1 ( this->xmpFilesRef, WrapProgressReport, proc, context, interval, sendStartStop, &wResult )
+
+#define zXMPFiles_SetDefaultErrorCallback_1(proc,context,limit) \
+ WXMPFiles_SetDefaultErrorCallback_1 ( WrapFilesErrorNotify, proc, context, limit, &wResult )
+
+#define zXMPFiles_SetErrorCallback_1(proc,context,limit) \
+ WXMPFiles_SetErrorCallback_1 ( this->xmpFilesRef, WrapFilesErrorNotify, proc, context, limit, &wResult )
+
+#define zXMPFiles_ResetErrorCallbackLimit_1(limit) \
+ WXMPFiles_ResetErrorCallbackLimit_1 ( this->xmpFilesRef, limit, &wResult )
+
+// =================================================================================================
+
+extern void WXMPFiles_GetVersionInfo_1 ( XMP_VersionInfo * versionInfo );
+
+extern void WXMPFiles_Initialize_1 ( XMP_OptionBits options,
+ WXMP_Result * result );
+
+extern void WXMPFiles_Initialize_2 ( XMP_OptionBits options,
+ const char* pluginFolder,
+ const char* plugins,
+ WXMP_Result * result );
+
+extern void WXMPFiles_Terminate_1();
+
+extern void WXMPFiles_CTor_1 ( WXMP_Result * result );
+
+extern void WXMPFiles_IncrementRefCount_1 ( XMPFilesRef xmpFilesRef );
+
+extern void WXMPFiles_DecrementRefCount_1 ( XMPFilesRef xmpFilesRef );
+
+extern void WXMPFiles_GetFormatInfo_1 ( XMP_FileFormat format,
+ XMP_OptionBits * flags, // ! Can be null.
+ WXMP_Result * result );
+
+extern void WXMPFiles_CheckFileFormat_1 ( XMP_StringPtr filePath,
+ WXMP_Result * result );
+
+extern void WXMPFiles_CheckPackageFormat_1 ( XMP_StringPtr folderPath,
+ WXMP_Result * result );
+
+extern void WXMPFiles_GetFileModDate_1 ( XMP_StringPtr filePath,
+ XMP_DateTime * modDate,
+ XMP_FileFormat * format, // ! Can be null.
+ XMP_OptionBits options,
+ WXMP_Result * result );
+
+
+extern void WXMPFiles_GetAssociatedResources_1 ( XMP_StringPtr filePath,
+ void * resourceList,
+ XMP_FileFormat format,
+ XMP_OptionBits options,
+ SetClientStringVectorProc SetClientStringVector,
+ WXMP_Result * result );
+
+extern void WXMPFiles_IsMetadataWritable_1 ( XMP_StringPtr filePath,
+ XMP_Bool * writable,
+ XMP_FileFormat format,
+ XMP_OptionBits options,
+ WXMP_Result * result );
+
+extern void WXMPFiles_OpenFile_1 ( XMPFilesRef xmpFilesRef,
+ XMP_StringPtr filePath,
+ XMP_FileFormat format,
+ XMP_OptionBits openFlags,
+ WXMP_Result * result );
+
+#if XMP_StaticBuild // ! Client XMP_IO objects can only be used in static builds.
+extern void WXMPFiles_OpenFile_2 ( XMPFilesRef xmpFilesRef,
+ XMP_IO * clientIO,
+ XMP_FileFormat format,
+ XMP_OptionBits openFlags,
+ WXMP_Result * result );
+#endif
+
+extern void WXMPFiles_CloseFile_1 ( XMPFilesRef xmpFilesRef,
+ XMP_OptionBits closeFlags,
+ WXMP_Result * result );
+
+extern void WXMPFiles_GetFileInfo_1 ( XMPFilesRef xmpFilesRef,
+ void * clientPath,
+ XMP_OptionBits * openFlags, // ! Can be null.
+ XMP_FileFormat * format, // ! Can be null.
+ XMP_OptionBits * handlerFlags, // ! Can be null.
+ SetClientStringProc SetClientString,
+ WXMP_Result * result );
+
+extern void WXMPFiles_SetAbortProc_1 ( XMPFilesRef xmpFilesRef,
+ XMP_AbortProc abortProc,
+ void * abortArg,
+ WXMP_Result * result );
+
+extern void WXMPFiles_GetXMP_1 ( XMPFilesRef xmpFilesRef,
+ XMPMetaRef xmpRef, // ! Can be null.
+ void * clientPacket,
+ XMP_PacketInfo * packetInfo, // ! Can be null.
+ SetClientStringProc SetClientString,
+ WXMP_Result * result );
+
+extern void WXMPFiles_PutXMP_1 ( XMPFilesRef xmpFilesRef,
+ XMPMetaRef xmpRef, // ! Only one of the XMP object or packet are passed.
+ XMP_StringPtr xmpPacket,
+ XMP_StringLen xmpPacketLen,
+ WXMP_Result * result );
+
+extern void WXMPFiles_CanPutXMP_1 ( XMPFilesRef xmpFilesRef,
+ XMPMetaRef xmpRef, // ! Only one of the XMP object or packet are passed.
+ XMP_StringPtr xmpPacket,
+ XMP_StringLen xmpPacketLen,
+ WXMP_Result * result );
+
+extern void WXMPFiles_SetDefaultProgressCallback_1 ( XMP_ProgressReportWrapper wrapperproc,
+ XMP_ProgressReportProc clientProc,
+ void * context,
+ float interval,
+ XMP_Bool sendStartStop,
+ WXMP_Result * result );
+
+extern void WXMPFiles_SetProgressCallback_1 ( XMPFilesRef xmpFilesRef,
+ XMP_ProgressReportWrapper wrapperproc,
+ XMP_ProgressReportProc clientProc,
+ void * context,
+ float interval,
+ XMP_Bool sendStartStop,
+ WXMP_Result * result );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void WXMPFiles_SetDefaultErrorCallback_1 ( XMPFiles_ErrorCallbackWrapper wrapperProc,
+ XMPFiles_ErrorCallbackProc clientProc,
+ void * context,
+ XMP_Uns32 limit,
+ WXMP_Result * wResult );
+
+extern void WXMPFiles_SetErrorCallback_1 ( XMPFilesRef xmpRef,
+ XMPFiles_ErrorCallbackWrapper wrapperProc,
+ XMPFiles_ErrorCallbackProc clientProc,
+ void * context,
+ XMP_Uns32 limit,
+ WXMP_Result * wResult );
+
+extern void WXMPFiles_ResetErrorCallbackLimit_1 ( XMPFilesRef xmpRef,
+ XMP_Uns32 limit,
+ WXMP_Result * wResult );
+
+// =================================================================================================
+
+#if __cplusplus
+}
+#endif
+
+#endif // __WXMPFiles_hpp__
diff --git a/gpr/source/lib/xmp_core/public/include/client-glue/WXMPIterator.hpp b/gpr/source/lib/xmp_core/public/include/client-glue/WXMPIterator.hpp
new file mode 100644
index 0000000..e40a1d4
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/client-glue/WXMPIterator.hpp
@@ -0,0 +1,74 @@
+#if ! __WXMPIterator_hpp__
+#define __WXMPIterator_hpp__ 1
+
+// =================================================================================================
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "client-glue/WXMP_Common.hpp"
+
+#if __cplusplus
+extern "C" {
+#endif
+
+// =================================================================================================
+
+#define zXMPIterator_PropCTor_1(xmpRef,schemaNS,propName,options) \
+ WXMPIterator_PropCTor_1 ( xmpRef, schemaNS, propName, options, &wResult );
+
+#define zXMPIterator_TableCTor_1(schemaNS,propName,options) \
+ WXMPIterator_TableCTor_1 ( schemaNS, propName, options, &wResult );
+
+
+#define zXMPIterator_Next_1(schemaNS,propPath,propValue,options,SetClientString) \
+ WXMPIterator_Next_1 ( this->iterRef, schemaNS, propPath, propValue, options, SetClientString, &wResult );
+
+#define zXMPIterator_Skip_1(options) \
+ WXMPIterator_Skip_1 ( this->iterRef, options, &wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPIterator_PropCTor_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPIterator_TableCTor_1 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPIterator_IncrementRefCount_1 ( XMPIteratorRef iterRef );
+
+extern void
+XMP_PUBLIC WXMPIterator_DecrementRefCount_1 ( XMPIteratorRef iterRef );
+
+extern void
+XMP_PUBLIC WXMPIterator_Next_1 ( XMPIteratorRef iterRef,
+ void * schemaNS,
+ void * propPath,
+ void * propValue,
+ XMP_OptionBits * options,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPIterator_Skip_1 ( XMPIteratorRef iterRef,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+// =================================================================================================
+
+#if __cplusplus
+} /* extern "C" */
+#endif
+
+#endif // __WXMPIterator_hpp__
diff --git a/gpr/source/lib/xmp_core/public/include/client-glue/WXMPMeta.hpp b/gpr/source/lib/xmp_core/public/include/client-glue/WXMPMeta.hpp
new file mode 100644
index 0000000..361ad9d
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/client-glue/WXMPMeta.hpp
@@ -0,0 +1,621 @@
+#if ! __WXMPMeta_hpp__
+#define __WXMPMeta_hpp__ 1
+
+// =================================================================================================
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "client-glue/WXMP_Common.hpp"
+
+#if __cplusplus
+extern "C" {
+#endif
+
+// =================================================================================================
+
+static XMP_Bool WrapErrorNotify ( XMPMeta_ErrorCallbackProc proc, void * context,
+ XMP_ErrorSeverity severity, XMP_Int32 cause, XMP_StringPtr message )
+{
+ bool ok;
+ try {
+ ok = (*proc) ( context, severity, cause, message );
+ } catch ( ... ) {
+ ok = false;
+ }
+ return ConvertBoolToXMP_Bool( ok );
+}
+
+// =================================================================================================
+
+#define zXMPMeta_GetVersionInfo_1(info) \
+ WXMPMeta_GetVersionInfo_1 ( info /* no wResult */ )
+
+#define zXMPMeta_Initialize_1() \
+ WXMPMeta_Initialize_1 ( &wResult )
+#define zXMPMeta_Terminate_1() \
+ WXMPMeta_Terminate_1 ( /* no wResult */ )
+
+#define zXMPMeta_CTor_1() \
+ WXMPMeta_CTor_1 ( &wResult )
+
+#define zXMPMeta_GetGlobalOptions_1() \
+ WXMPMeta_GetGlobalOptions_1 ( &wResult )
+
+#define zXMPMeta_SetGlobalOptions_1(options) \
+ WXMPMeta_SetGlobalOptions_1 ( options, &wResult )
+
+#define zXMPMeta_DumpNamespaces_1(outProc,refCon) \
+ WXMPMeta_DumpNamespaces_1 ( outProc, refCon, &wResult )
+
+#define zXMPMeta_RegisterNamespace_1(namespaceURI,suggestedPrefix,actualPrefix,SetClientString) \
+ WXMPMeta_RegisterNamespace_1 ( namespaceURI, suggestedPrefix, actualPrefix, SetClientString, &wResult )
+
+#define zXMPMeta_GetNamespacePrefix_1(namespaceURI,namespacePrefix,SetClientString) \
+ WXMPMeta_GetNamespacePrefix_1 ( namespaceURI, namespacePrefix, SetClientString, &wResult )
+
+#define zXMPMeta_GetNamespaceURI_1(namespacePrefix,namespaceURI,SetClientString) \
+ WXMPMeta_GetNamespaceURI_1 ( namespacePrefix, namespaceURI, SetClientString, &wResult )
+
+#define zXMPMeta_DeleteNamespace_1(namespaceURI) \
+ WXMPMeta_DeleteNamespace_1 ( namespaceURI, &wResult )
+
+#define zXMPMeta_GetProperty_1(schemaNS,propName,propValue,options,SetClientString) \
+ WXMPMeta_GetProperty_1 ( this->xmpRef, schemaNS, propName, propValue, options, SetClientString, &wResult )
+
+#define zXMPMeta_GetArrayItem_1(schemaNS,arrayName,itemIndex,itemValue,options,SetClientString) \
+ WXMPMeta_GetArrayItem_1 ( this->xmpRef, schemaNS, arrayName, itemIndex, itemValue, options, SetClientString, &wResult )
+
+#define zXMPMeta_GetStructField_1(schemaNS,structName,fieldNS,fieldName,fieldValue,options,SetClientString) \
+ WXMPMeta_GetStructField_1 ( this->xmpRef, schemaNS, structName, fieldNS, fieldName, fieldValue, options, SetClientString, &wResult )
+
+#define zXMPMeta_GetQualifier_1(schemaNS,propName,qualNS,qualName,qualValue,options,SetClientString) \
+ WXMPMeta_GetQualifier_1 ( this->xmpRef, schemaNS, propName, qualNS, qualName, qualValue, options, SetClientString, &wResult )
+
+#define zXMPMeta_SetProperty_1(schemaNS,propName,propValue,options) \
+ WXMPMeta_SetProperty_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult )
+
+#define zXMPMeta_SetArrayItem_1(schemaNS,arrayName,itemIndex,itemValue,options) \
+ WXMPMeta_SetArrayItem_1 ( this->xmpRef, schemaNS, arrayName, itemIndex, itemValue, options, &wResult )
+
+#define zXMPMeta_AppendArrayItem_1(schemaNS,arrayName,arrayOptions,itemValue,options) \
+ WXMPMeta_AppendArrayItem_1 ( this->xmpRef, schemaNS, arrayName, arrayOptions, itemValue, options, &wResult )
+
+#define zXMPMeta_SetStructField_1(schemaNS,structName,fieldNS,fieldName,fieldValue,options) \
+ WXMPMeta_SetStructField_1 ( this->xmpRef, schemaNS, structName, fieldNS, fieldName, fieldValue, options, &wResult )
+
+#define zXMPMeta_SetQualifier_1(schemaNS,propName,qualNS,qualName,qualValue,options) \
+ WXMPMeta_SetQualifier_1 ( this->xmpRef, schemaNS, propName, qualNS, qualName, qualValue, options, &wResult )
+
+#define zXMPMeta_DeleteProperty_1(schemaNS,propName) \
+ WXMPMeta_DeleteProperty_1 ( this->xmpRef, schemaNS, propName, &wResult )
+
+#define zXMPMeta_DeleteArrayItem_1(schemaNS,arrayName,itemIndex) \
+ WXMPMeta_DeleteArrayItem_1 ( this->xmpRef, schemaNS, arrayName, itemIndex, &wResult )
+
+#define zXMPMeta_DeleteStructField_1(schemaNS,structName,fieldNS,fieldName) \
+ WXMPMeta_DeleteStructField_1 ( this->xmpRef, schemaNS, structName, fieldNS, fieldName, &wResult )
+
+#define zXMPMeta_DeleteQualifier_1(schemaNS,propName,qualNS,qualName) \
+ WXMPMeta_DeleteQualifier_1 ( this->xmpRef, schemaNS, propName, qualNS, qualName, &wResult )
+
+#define zXMPMeta_DoesPropertyExist_1(schemaNS,propName) \
+ WXMPMeta_DoesPropertyExist_1 ( this->xmpRef, schemaNS, propName, &wResult )
+
+#define zXMPMeta_DoesArrayItemExist_1(schemaNS,arrayName,itemIndex) \
+ WXMPMeta_DoesArrayItemExist_1 ( this->xmpRef, schemaNS, arrayName, itemIndex, &wResult )
+
+#define zXMPMeta_DoesStructFieldExist_1(schemaNS,structName,fieldNS,fieldName) \
+ WXMPMeta_DoesStructFieldExist_1 ( this->xmpRef, schemaNS, structName, fieldNS, fieldName, &wResult )
+
+#define zXMPMeta_DoesQualifierExist_1(schemaNS,propName,qualNS,qualName) \
+ WXMPMeta_DoesQualifierExist_1 ( this->xmpRef, schemaNS, propName, qualNS, qualName, &wResult )
+
+#define zXMPMeta_GetLocalizedText_1(schemaNS,altTextName,genericLang,specificLang,clientLang,clientValue,options,SetClientString) \
+ WXMPMeta_GetLocalizedText_1 ( this->xmpRef, schemaNS, altTextName, genericLang, specificLang, clientLang, clientValue, options, SetClientString, &wResult )
+
+#define zXMPMeta_SetLocalizedText_1(schemaNS,altTextName,genericLang,specificLang,itemValue,options) \
+ WXMPMeta_SetLocalizedText_1 ( this->xmpRef, schemaNS, altTextName, genericLang, specificLang, itemValue, options, &wResult )
+
+#define zXMPMeta_DeleteLocalizedText_1(schemaNS,altTextName,genericLang,specificLang) \
+ WXMPMeta_DeleteLocalizedText_1 ( this->xmpRef, schemaNS, altTextName, genericLang, specificLang, &wResult )
+#define zXMPMeta_GetProperty_Bool_1(schemaNS,propName,propValue,options) \
+ WXMPMeta_GetProperty_Bool_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult )
+
+#define zXMPMeta_GetProperty_Int_1(schemaNS,propName,propValue,options) \
+ WXMPMeta_GetProperty_Int_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult )
+
+#define zXMPMeta_GetProperty_Int64_1(schemaNS,propName,propValue,options) \
+ WXMPMeta_GetProperty_Int64_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult )
+
+#define zXMPMeta_GetProperty_Float_1(schemaNS,propName,propValue,options) \
+ WXMPMeta_GetProperty_Float_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult )
+
+#define zXMPMeta_GetProperty_Date_1(schemaNS,propName,propValue,options) \
+ WXMPMeta_GetProperty_Date_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult )
+
+#define zXMPMeta_SetProperty_Bool_1(schemaNS,propName,propValue,options) \
+ WXMPMeta_SetProperty_Bool_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult )
+
+#define zXMPMeta_SetProperty_Int_1(schemaNS,propName,propValue,options) \
+ WXMPMeta_SetProperty_Int_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult )
+
+#define zXMPMeta_SetProperty_Int64_1(schemaNS,propName,propValue,options) \
+ WXMPMeta_SetProperty_Int64_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult )
+
+#define zXMPMeta_SetProperty_Float_1(schemaNS,propName,propValue,options) \
+ WXMPMeta_SetProperty_Float_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult )
+
+#define zXMPMeta_SetProperty_Date_1(schemaNS,propName,propValue,options) \
+ WXMPMeta_SetProperty_Date_1 ( this->xmpRef, schemaNS, propName, propValue, options, &wResult )
+
+#define zXMPMeta_GetObjectName_1(objName,SetClientString) \
+ WXMPMeta_GetObjectName_1 ( this->xmpRef, objName, SetClientString, &wResult )
+
+#define zXMPMeta_SetObjectName_1(name) \
+ WXMPMeta_SetObjectName_1 ( this->xmpRef, name, &wResult )
+
+#define zXMPMeta_GetObjectOptions_1() \
+ WXMPMeta_GetObjectOptions_1 ( this->xmpRef, &wResult )
+
+#define zXMPMeta_SetObjectOptions_1(options) \
+ WXMPMeta_SetObjectOptions_1 ( this->xmpRef, options, &wResult )
+
+#define zXMPMeta_Sort_1() \
+ WXMPMeta_Sort_1 ( this->xmpRef, &wResult )
+
+#define zXMPMeta_Erase_1() \
+ WXMPMeta_Erase_1 ( this->xmpRef, &wResult )
+
+#define zXMPMeta_Clone_1(options) \
+ WXMPMeta_Clone_1 ( this->xmpRef, options, &wResult )
+
+#define zXMPMeta_CountArrayItems_1(schemaNS,arrayName) \
+ WXMPMeta_CountArrayItems_1 ( this->xmpRef, schemaNS, arrayName, &wResult )
+
+#define zXMPMeta_DumpObject_1(outProc,refCon) \
+ WXMPMeta_DumpObject_1 ( this->xmpRef, outProc, refCon, &wResult )
+
+#define zXMPMeta_ParseFromBuffer_1(buffer,bufferSize,options) \
+ WXMPMeta_ParseFromBuffer_1 ( this->xmpRef, buffer, bufferSize, options, &wResult )
+
+#define zXMPMeta_SerializeToBuffer_1(pktString,options,padding,newline,indent,baseIndent,SetClientString) \
+ WXMPMeta_SerializeToBuffer_1 ( this->xmpRef, pktString, options, padding, newline, indent, baseIndent, SetClientString, &wResult )
+
+#define zXMPMeta_SetDefaultErrorCallback_1(proc,context,limit) \
+ WXMPMeta_SetDefaultErrorCallback_1 ( WrapErrorNotify, proc, context, limit, &wResult )
+
+#define zXMPMeta_SetErrorCallback_1(proc,context,limit) \
+ WXMPMeta_SetErrorCallback_1 ( this->xmpRef, WrapErrorNotify, proc, context, limit, &wResult )
+
+#define zXMPMeta_ResetErrorCallbackLimit_1(limit) \
+ WXMPMeta_ResetErrorCallbackLimit_1 ( this->xmpRef, limit, &wResult )
+
+// =================================================================================================
+
+extern void
+XMP_PUBLIC WXMPMeta_GetVersionInfo_1 ( XMP_VersionInfo * info );
+
+extern void
+XMP_PUBLIC WXMPMeta_Initialize_1 ( WXMP_Result * wResult );
+extern void
+XMP_PUBLIC WXMPMeta_Terminate_1();
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_CTor_1 ( WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_IncrementRefCount_1 ( XMPMetaRef xmpRef );
+
+extern void
+XMP_PUBLIC WXMPMeta_DecrementRefCount_1 ( XMPMetaRef xmpRef );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_GetGlobalOptions_1 ( WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_SetGlobalOptions_1 ( XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_DumpNamespaces_1 ( XMP_TextOutputProc outProc,
+ void * refCon,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_RegisterNamespace_1 ( XMP_StringPtr namespaceURI,
+ XMP_StringPtr suggestedPrefix,
+ void * actualPrefix,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_GetNamespacePrefix_1 ( XMP_StringPtr namespaceURI,
+ void * namespacePrefix,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_GetNamespaceURI_1 ( XMP_StringPtr namespacePrefix,
+ void * namespaceURI,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_DeleteNamespace_1 ( XMP_StringPtr namespaceURI,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_GetProperty_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ void * propValue,
+ XMP_OptionBits * options,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_GetArrayItem_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ void * itemValue,
+ XMP_OptionBits * options,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_GetStructField_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ void * fieldValue,
+ XMP_OptionBits * options,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_GetQualifier_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ void * qualValue,
+ XMP_OptionBits * options,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult ) /* const */ ;
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_SetProperty_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr propValue,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_SetArrayItem_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_AppendArrayItem_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits arrayOptions,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_SetStructField_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ XMP_StringPtr fieldValue,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_SetQualifier_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ XMP_StringPtr qualValue,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_DeleteProperty_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_DeleteArrayItem_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_DeleteStructField_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_DeleteQualifier_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_DoesPropertyExist_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_DoesArrayItemExist_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_DoesStructFieldExist_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_DoesQualifierExist_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ WXMP_Result * wResult ) /* const */ ;
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_GetLocalizedText_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ void * clientLang,
+ void * clientValue,
+ XMP_OptionBits * options,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_SetLocalizedText_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ XMP_StringPtr itemValue,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_DeleteLocalizedText_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr altTextName,
+ XMP_StringPtr genericLang,
+ XMP_StringPtr specificLang,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_GetProperty_Bool_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Bool * propValue,
+ XMP_OptionBits * options,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_GetProperty_Int_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int32 * propValue,
+ XMP_OptionBits * options,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_GetProperty_Int64_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int64 * propValue,
+ XMP_OptionBits * options,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_GetProperty_Float_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ double * propValue,
+ XMP_OptionBits * options,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_GetProperty_Date_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_DateTime * propValue,
+ XMP_OptionBits * options,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_SetProperty_Bool_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Bool propValue,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_SetProperty_Int_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int32 propValue,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_SetProperty_Int64_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_Int64 propValue,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_SetProperty_Float_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ double propValue,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_SetProperty_Date_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ const XMP_DateTime & propValue,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_GetObjectName_1 ( XMPMetaRef xmpRef,
+ void * objName,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_SetObjectName_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr name,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_GetObjectOptions_1 ( XMPMetaRef xmpRef,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_SetObjectOptions_1 ( XMPMetaRef xmpRef,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_Sort_1 ( XMPMetaRef xmpRef,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_Erase_1 ( XMPMetaRef xmpRef,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_Clone_1 ( XMPMetaRef xmpRef,
+ XMP_OptionBits options,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_CountArrayItems_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ WXMP_Result * wResult ) /* const */ ;
+
+extern void
+XMP_PUBLIC WXMPMeta_DumpObject_1 ( XMPMetaRef xmpRef,
+ XMP_TextOutputProc outProc,
+ void * refCon,
+ WXMP_Result * wResult ) /* const */ ;
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_ParseFromBuffer_1 ( XMPMetaRef xmpRef,
+ XMP_StringPtr buffer,
+ XMP_StringLen bufferSize,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_SerializeToBuffer_1 ( XMPMetaRef xmpRef,
+ void * pktString,
+ XMP_OptionBits options,
+ XMP_StringLen padding,
+ XMP_StringPtr newline,
+ XMP_StringPtr indent,
+ XMP_Index baseIndent,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult ) /* const */ ;
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPMeta_SetDefaultErrorCallback_1 ( XMPMeta_ErrorCallbackWrapper wrapperProc,
+ XMPMeta_ErrorCallbackProc clientProc,
+ void * context,
+ XMP_Uns32 limit,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_SetErrorCallback_1 ( XMPMetaRef xmpRef,
+ XMPMeta_ErrorCallbackWrapper wrapperProc,
+ XMPMeta_ErrorCallbackProc clientProc,
+ void * context,
+ XMP_Uns32 limit,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPMeta_ResetErrorCallbackLimit_1 ( XMPMetaRef xmpRef,
+ XMP_Uns32 limit,
+ WXMP_Result * wResult );
+
+// =================================================================================================
+
+#if __cplusplus
+} /* extern "C" */
+#endif
+
+#endif // __WXMPMeta_hpp__
diff --git a/gpr/source/lib/xmp_core/public/include/client-glue/WXMPUtils.hpp b/gpr/source/lib/xmp_core/public/include/client-glue/WXMPUtils.hpp
new file mode 100644
index 0000000..3c96b83
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/client-glue/WXMPUtils.hpp
@@ -0,0 +1,315 @@
+#if ! __WXMPUtils_hpp__
+#define __WXMPUtils_hpp__ 1
+
+// =================================================================================================
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#include "client-glue/WXMP_Common.hpp"
+
+#if __cplusplus
+extern "C" {
+#endif
+
+// =================================================================================================
+
+#define zXMPUtils_ComposeArrayItemPath_1(schemaNS,arrayName,itemIndex,itemPath,SetClientString) \
+ WXMPUtils_ComposeArrayItemPath_1 ( schemaNS, arrayName, itemIndex, itemPath, SetClientString, &wResult );
+
+#define zXMPUtils_ComposeStructFieldPath_1(schemaNS,structName,fieldNS,fieldName,fieldPath,SetClientString) \
+ WXMPUtils_ComposeStructFieldPath_1 ( schemaNS, structName, fieldNS, fieldName, fieldPath, SetClientString, &wResult );
+
+#define zXMPUtils_ComposeQualifierPath_1(schemaNS,propName,qualNS,qualName,qualPath,SetClientString) \
+ WXMPUtils_ComposeQualifierPath_1 ( schemaNS, propName, qualNS, qualName, qualPath, SetClientString, &wResult );
+
+#define zXMPUtils_ComposeLangSelector_1(schemaNS,arrayName,langName,selPath,SetClientString) \
+ WXMPUtils_ComposeLangSelector_1 ( schemaNS, arrayName, langName, selPath, SetClientString, &wResult );
+
+#define zXMPUtils_ComposeFieldSelector_1(schemaNS,arrayName,fieldNS,fieldName,fieldValue,selPath,SetClientString) \
+ WXMPUtils_ComposeFieldSelector_1 ( schemaNS, arrayName, fieldNS, fieldName, fieldValue, selPath, SetClientString, &wResult );
+
+#define zXMPUtils_ConvertFromBool_1(binValue,strValue,SetClientString) \
+ WXMPUtils_ConvertFromBool_1 ( binValue, strValue, SetClientString, &wResult );
+
+#define zXMPUtils_ConvertFromInt_1(binValue,format,strValue,SetClientString) \
+ WXMPUtils_ConvertFromInt_1 ( binValue, format, strValue, SetClientString, &wResult );
+
+#define zXMPUtils_ConvertFromInt64_1(binValue,format,strValue,SetClientString) \
+ WXMPUtils_ConvertFromInt64_1 ( binValue, format, strValue, SetClientString, &wResult );
+
+#define zXMPUtils_ConvertFromFloat_1(binValue,format,strValue,SetClientString) \
+ WXMPUtils_ConvertFromFloat_1 ( binValue, format, strValue, SetClientString, &wResult );
+
+#define zXMPUtils_ConvertFromDate_1(binValue,strValue,SetClientString) \
+ WXMPUtils_ConvertFromDate_1 ( binValue, strValue, SetClientString, &wResult );
+
+#define zXMPUtils_ConvertToBool_1(strValue) \
+ WXMPUtils_ConvertToBool_1 ( strValue, &wResult );
+
+#define zXMPUtils_ConvertToInt_1(strValue) \
+ WXMPUtils_ConvertToInt_1 ( strValue, &wResult );
+
+#define zXMPUtils_ConvertToInt64_1(strValue) \
+ WXMPUtils_ConvertToInt64_1 ( strValue, &wResult );
+
+#define zXMPUtils_ConvertToFloat_1(strValue) \
+ WXMPUtils_ConvertToFloat_1 ( strValue, &wResult );
+
+#define zXMPUtils_ConvertToDate_1(strValue,binValue) \
+ WXMPUtils_ConvertToDate_1 ( strValue, binValue, &wResult );
+
+#define zXMPUtils_CurrentDateTime_1(time) \
+ WXMPUtils_CurrentDateTime_1 ( time, &wResult );
+
+#define zXMPUtils_SetTimeZone_1(time) \
+ WXMPUtils_SetTimeZone_1 ( time, &wResult );
+
+#define zXMPUtils_ConvertToUTCTime_1(time) \
+ WXMPUtils_ConvertToUTCTime_1 ( time, &wResult );
+
+#define zXMPUtils_ConvertToLocalTime_1(time) \
+ WXMPUtils_ConvertToLocalTime_1 ( time, &wResult );
+
+#define zXMPUtils_CompareDateTime_1(left,right) \
+ WXMPUtils_CompareDateTime_1 ( left, right, &wResult );
+
+#define zXMPUtils_EncodeToBase64_1(rawStr,rawLen,encodedStr,SetClientString) \
+ WXMPUtils_EncodeToBase64_1 ( rawStr, rawLen, encodedStr, SetClientString, &wResult );
+
+#define zXMPUtils_DecodeFromBase64_1(encodedStr,encodedLen,rawStr,SetClientString) \
+ WXMPUtils_DecodeFromBase64_1 ( encodedStr, encodedLen, rawStr, SetClientString, &wResult );
+
+#define zXMPUtils_PackageForJPEG_1(xmpObj,stdStr,extStr,digestStr,SetClientString) \
+ WXMPUtils_PackageForJPEG_1 ( xmpObj, stdStr, extStr, digestStr, SetClientString, &wResult );
+
+#define zXMPUtils_MergeFromJPEG_1(fullXMP,extendedXMP) \
+ WXMPUtils_MergeFromJPEG_1 ( fullXMP, extendedXMP, &wResult );
+
+#define zXMPUtils_CatenateArrayItems_1(xmpObj,schemaNS,arrayName,separator,quotes,options,catedStr,SetClientString) \
+ WXMPUtils_CatenateArrayItems_1 ( xmpObj, schemaNS, arrayName, separator, quotes, options, catedStr, SetClientString, &wResult );
+
+#define zXMPUtils_SeparateArrayItems_1(xmpObj,schemaNS,arrayName,options,catedStr) \
+ WXMPUtils_SeparateArrayItems_1 ( xmpObj, schemaNS, arrayName, options, catedStr, &wResult );
+
+#define zXMPUtils_ApplyTemplate_1(workingXMP,templateXMP,actions) \
+ WXMPUtils_ApplyTemplate_1 ( workingXMP, templateXMP, actions, &wResult );
+
+#define zXMPUtils_RemoveProperties_1(xmpObj,schemaNS,propName,options) \
+ WXMPUtils_RemoveProperties_1 ( xmpObj, schemaNS, propName, options, &wResult );
+
+#define zXMPUtils_DuplicateSubtree_1(source,dest,sourceNS,sourceRoot,destNS,destRoot,options) \
+ WXMPUtils_DuplicateSubtree_1 ( source, dest, sourceNS, sourceRoot, destNS, destRoot, options, &wResult );
+
+// =================================================================================================
+
+extern void
+XMP_PUBLIC WXMPUtils_ComposeArrayItemPath_1 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_Index itemIndex,
+ void * itemPath,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ComposeStructFieldPath_1 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr structName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ void * fieldPath,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ComposeQualifierPath_1 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_StringPtr qualNS,
+ XMP_StringPtr qualName,
+ void * qualPath,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ComposeLangSelector_1 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr langName,
+ void * selPath,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ComposeFieldSelector_1 ( XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr fieldNS,
+ XMP_StringPtr fieldName,
+ XMP_StringPtr fieldValue,
+ void * selPath,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertFromBool_1 ( XMP_Bool binValue,
+ void * strValue,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertFromInt_1 ( XMP_Int32 binValue,
+ XMP_StringPtr format,
+ void * strValue,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertFromInt64_1 ( XMP_Int64 binValue,
+ XMP_StringPtr format,
+ void * strValue,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertFromFloat_1 ( double binValue,
+ XMP_StringPtr format,
+ void * strValue,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertFromDate_1 ( const XMP_DateTime & binValue,
+ void * strValue,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertToBool_1 ( XMP_StringPtr strValue,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertToInt_1 ( XMP_StringPtr strValue,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertToInt64_1 ( XMP_StringPtr strValue,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertToFloat_1 ( XMP_StringPtr strValue,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertToDate_1 ( XMP_StringPtr strValue,
+ XMP_DateTime * binValue,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPUtils_CurrentDateTime_1 ( XMP_DateTime * time,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_SetTimeZone_1 ( XMP_DateTime * time,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertToUTCTime_1 ( XMP_DateTime * time,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ConvertToLocalTime_1 ( XMP_DateTime * time,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_CompareDateTime_1 ( const XMP_DateTime & left,
+ const XMP_DateTime & right,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPUtils_EncodeToBase64_1 ( XMP_StringPtr rawStr,
+ XMP_StringLen rawLen,
+ void * encodedStr,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_DecodeFromBase64_1 ( XMP_StringPtr encodedStr,
+ XMP_StringLen encodedLen,
+ void * rawStr,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPUtils_PackageForJPEG_1 ( XMPMetaRef xmpObj,
+ void * stdStr,
+ void * extStr,
+ void * digestStr,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_MergeFromJPEG_1 ( XMPMetaRef fullXMP,
+ XMPMetaRef extendedXMP,
+ WXMP_Result * wResult );
+
+// -------------------------------------------------------------------------------------------------
+
+extern void
+XMP_PUBLIC WXMPUtils_CatenateArrayItems_1 ( XMPMetaRef xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_StringPtr separator,
+ XMP_StringPtr quotes,
+ XMP_OptionBits options,
+ void * catedStr,
+ SetClientStringProc SetClientString,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_SeparateArrayItems_1 ( XMPMetaRef xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr arrayName,
+ XMP_OptionBits options,
+ XMP_StringPtr catedStr,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_ApplyTemplate_1 ( XMPMetaRef workingXMP,
+ XMPMetaRef templateXMP,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_RemoveProperties_1 ( XMPMetaRef xmpObj,
+ XMP_StringPtr schemaNS,
+ XMP_StringPtr propName,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+extern void
+XMP_PUBLIC WXMPUtils_DuplicateSubtree_1 ( XMPMetaRef source,
+ XMPMetaRef dest,
+ XMP_StringPtr sourceNS,
+ XMP_StringPtr sourceRoot,
+ XMP_StringPtr destNS,
+ XMP_StringPtr destRoot,
+ XMP_OptionBits options,
+ WXMP_Result * wResult );
+
+// =================================================================================================
+
+#if __cplusplus
+} /* extern "C" */
+#endif
+
+#endif // __WXMPUtils_hpp__
diff --git a/gpr/source/lib/xmp_core/public/include/client-glue/WXMP_Common.hpp b/gpr/source/lib/xmp_core/public/include/client-glue/WXMP_Common.hpp
new file mode 100644
index 0000000..97fb9fc
--- /dev/null
+++ b/gpr/source/lib/xmp_core/public/include/client-glue/WXMP_Common.hpp
@@ -0,0 +1,128 @@
+#if ! __WXMP_Common_hpp__
+#define __WXMP_Common_hpp__ 1
+
+// =================================================================================================
+// Copyright 2002 Adobe Systems Incorporated
+// All Rights Reserved.
+//
+// NOTICE: Adobe permits you to use, modify, and distribute this file in accordance with the terms
+// of the Adobe license agreement accompanying it.
+// =================================================================================================
+
+#ifndef XMP_Inline
+ #if TXMP_EXPAND_INLINE
+ #define XMP_Inline inline
+ #else
+ #define XMP_Inline /* not inline */
+ #endif
+#endif
+
+#define XMP_CTorDTorIntro(Class) template <class tStringObj> XMP_Inline Class<tStringObj>
+#define XMP_MethodIntro(Class,ResultType) template <class tStringObj> XMP_Inline ResultType Class<tStringObj>
+
+typedef void (* SetClientStringProc) ( void * clientPtr, XMP_StringPtr valuePtr, XMP_StringLen valueLen );
+typedef void (* SetClientStringVectorProc) ( void * clientPtr, XMP_StringPtr * arrayPtr, XMP_Uns32 stringCount );
+
+struct WXMP_Result {
+ XMP_StringPtr errMessage;
+ void * ptrResult;
+ double floatResult;
+ XMP_Uns64 int64Result;
+ XMP_Uns32 int32Result;
+ WXMP_Result() : errMessage(0),ptrResult(NULL),floatResult(0),int64Result(0),int32Result(0){};
+};
+
+#if __cplusplus
+extern "C" {
+#endif
+
+#define PropagateException(res) \
+ if ( res.errMessage != 0 ) throw XMP_Error ( res.int32Result, res.errMessage );
+
+#ifndef XMP_TraceClientCalls
+ #define XMP_TraceClientCalls 0
+ #define XMP_TraceClientCallsToFile 0
+#endif
+
+#if ! XMP_TraceClientCalls
+ #define InvokeCheck(WCallProto) \
+ WXMP_Result wResult; \
+ WCallProto; \
+ PropagateException ( wResult )
+#else
+ extern FILE * xmpClientLog;
+ #define InvokeCheck(WCallProto) \
+ WXMP_Result wResult; \
+ fprintf ( xmpClientLog, "WXMP calling: %s\n", #WCallProto ); fflush ( xmpClientLog ); \
+ WCallProto; \
+ if ( wResult.errMessage == 0 ) { \
+ fprintf ( xmpClientLog, "WXMP back, no error\n" ); fflush ( xmpClientLog ); \
+ } else { \
+ fprintf ( xmpClientLog, "WXMP back, error: %s\n", wResult.errMessage ); fflush ( xmpClientLog ); \
+ } \
+ PropagateException ( wResult )
+#endif
+
+// =================================================================================================
+
+#define WrapNoCheckVoid(WCallProto) \
+ WCallProto;
+
+#define WrapCheckVoid(WCallProto) \
+ InvokeCheck(WCallProto);
+
+#define WrapCheckMetaRef(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMPMetaRef result = XMPMetaRef(wResult.ptrResult)
+
+#define WrapCheckIterRef(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMPIteratorRef result = XMPIteratorRef(wResult.ptrResult)
+
+#define WrapCheckDocOpsRef(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMPDocOpsRef result = XMPDocOpsRef(wResult.ptrResult)
+
+#define WrapCheckBool(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ bool result = bool(wResult.int32Result)
+
+#define WrapCheckTriState(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMP_TriState result = XMP_TriState(wResult.int32Result)
+
+#define WrapCheckOptions(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMP_OptionBits result = XMP_OptionBits(wResult.int32Result)
+
+#define WrapCheckStatus(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMP_Status result = XMP_Status(wResult.int32Result)
+
+#define WrapCheckIndex(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMP_Index result = XMP_Index(wResult.int32Result)
+
+#define WrapCheckInt32(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMP_Int32 result = wResult.int32Result
+
+#define WrapCheckInt64(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMP_Int64 result = wResult.int64Result
+
+#define WrapCheckFloat(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ double result = wResult.floatResult
+
+#define WrapCheckFormat(result,WCallProto) \
+ InvokeCheck(WCallProto); \
+ XMP_FileFormat result = wResult.int32Result
+
+// =================================================================================================
+
+#if __cplusplus
+} // extern "C"
+#endif
+
+#endif // __WXMP_Common_hpp__