726 lines
27 KiB
D
726 lines
27 KiB
D
/*
|
|
* exempi-d - exempi.xmp
|
|
*
|
|
* Bindings by Les De Ridder <les@lesderid.net>
|
|
*
|
|
* Copyright (C) 2007-2016 Hubert Figuiere
|
|
* Copyright 2002-2007 Adobe Systems Incorporated
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
*
|
|
* 1 Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
*
|
|
* 2 Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the
|
|
* distribution.
|
|
*
|
|
* 3 Neither the name of the Authors, nor the names of its
|
|
* contributors may be used to endorse or promote products derived
|
|
* from this software wit hout specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
module exempi.xmp;
|
|
|
|
extern(C):
|
|
|
|
enum XmpOpenFileOptions {
|
|
XMP_OPEN_NOOPTION = 0x00000000, /**< No open option */
|
|
XMP_OPEN_READ = 0x00000001, /**< Open for read-only access. */
|
|
XMP_OPEN_FORUPDATE = 0x00000002, /**< Open for reading and writing. */
|
|
XMP_OPEN_ONLYXMP = 0x00000004, /**< Only the XMP is wanted,
|
|
* allows space/time optimizations. */
|
|
XMP_OPEN_CACHETNAIL = 0x00000008, /**< Cache thumbnail if possible,
|
|
* GetThumbnail will be called. */
|
|
XMP_OPEN_STRICTLY = 0x00000010, /**< Be strict about locating XMP
|
|
* and reconciling with other forms. */
|
|
XMP_OPEN_USESMARTHANDLER= 0x00000020, /**< Require the use of a smart
|
|
* handler. */
|
|
XMP_OPEN_USEPACKETSCANNING = 0x00000040, /**< Force packet scanning,
|
|
* don't use a smart handler. */
|
|
XMP_OPEN_LIMITSCANNING = 0x00000080, /**< Only packet scan files "known"
|
|
* to need scanning. */
|
|
XMP_OPEN_REPAIR_FILE = 0x00000100, /**< Attempt to repair a file opened for update,
|
|
* default is to not open (throw an exception). */
|
|
XMP_OPEN_INBACKGROUND = 0x10000000 /**< Set if calling from background
|
|
* thread. */
|
|
};
|
|
|
|
/** Option bits for xmp_files_close() */
|
|
enum XmpCloseFileOptions {
|
|
XMP_CLOSE_NOOPTION = 0x0000, /**< No close option */
|
|
XMP_CLOSE_SAFEUPDATE = 0x0001 /**< Write into a temporary file and
|
|
* swap for crash safety. */
|
|
};
|
|
|
|
enum XmpFileType {
|
|
|
|
/* Public file formats. Hex used to avoid gcc warnings. */
|
|
/* ! Leave them as 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. */
|
|
|
|
XMP_FT_PDF = 0x50444620UL, /* 'PDF ' */
|
|
XMP_FT_PS = 0x50532020UL, /* 'PS ', general PostScript following DSC conventions. */
|
|
XMP_FT_EPS = 0x45505320UL, /* 'EPS ', encapsulated PostScript. */
|
|
|
|
XMP_FT_JPEG = 0x4A504547UL, /* 'JPEG' */
|
|
XMP_FT_JPEG2K = 0x4A505820UL, /* 'JPX ', ISO 15444-1 */
|
|
XMP_FT_TIFF = 0x54494646UL, /* 'TIFF' */
|
|
XMP_FT_GIF = 0x47494620UL, /* 'GIF ' */
|
|
XMP_FT_PNG = 0x504E4720UL, /* 'PNG ' */
|
|
|
|
XMP_FT_SWF = 0x53574620UL, /* 'SWF ' */
|
|
XMP_FT_FLA = 0x464C4120UL, /* 'FLA ' */
|
|
XMP_FT_FLV = 0x464C5620UL, /* 'FLV ' */
|
|
|
|
XMP_FT_MOV = 0x4D4F5620UL, /* 'MOV ', Quicktime */
|
|
XMP_FT_AVI = 0x41564920UL, /* 'AVI ' */
|
|
XMP_FT_CIN = 0x43494E20UL, /* 'CIN ', Cineon */
|
|
XMP_FT_WAV = 0x57415620UL, /* 'WAV ' */
|
|
XMP_FT_MP3 = 0x4D503320UL, /* 'MP3 ' */
|
|
XMP_FT_SES = 0x53455320UL, /* 'SES ', Audition session */
|
|
XMP_FT_CEL = 0x43454C20UL, /* 'CEL ', Audition loop */
|
|
XMP_FT_MPEG = 0x4D504547UL, /* 'MPEG' */
|
|
XMP_FT_MPEG2 = 0x4D503220UL, /* 'MP2 ' */
|
|
XMP_FT_MPEG4 = 0x4D503420UL, /* 'MP4 ', ISO 14494-12 and -14 */
|
|
XMP_FT_WMAV = 0x574D4156UL, /* 'WMAV', Windows Media Audio and Video */
|
|
XMP_FT_AIFF = 0x41494646UL, /* 'AIFF' */
|
|
|
|
XMP_FT_HTML = 0x48544D4CUL, /* 'HTML' */
|
|
XMP_FT_XML = 0x584D4C20UL, /* 'XML ' */
|
|
XMP_FT_TEXT = 0x74657874UL, /* 'text' */
|
|
|
|
/* Adobe application file formats. */
|
|
XMP_FT_PHOTOSHOP = 0x50534420UL, /* 'PSD ' */
|
|
XMP_FT_ILLUSTRATOR = 0x41492020UL, /* 'AI ' */
|
|
XMP_FT_INDESIGN = 0x494E4444UL, /* 'INDD' */
|
|
XMP_FT_AEPROJECT = 0x41455020UL, /* 'AEP ' */
|
|
XMP_FT_AEPROJTEMPLATE = 0x41455420UL, /* 'AET ', After Effects Project Template */
|
|
XMP_FT_AEFILTERPRESET = 0x46465820UL, /* 'FFX ' */
|
|
XMP_FT_ENCOREPROJECT = 0x4E434F52UL, /* 'NCOR' */
|
|
XMP_FT_PREMIEREPROJECT = 0x5052504AUL, /* 'PRPJ' */
|
|
XMP_FT_PREMIERETITLE = 0x5052544CUL, /* 'PRTL' */
|
|
|
|
/* Catch all. */
|
|
XMP_FT_UNKNOWN = 0x20202020UL /* ' ' */
|
|
};
|
|
|
|
|
|
enum XmpFileFormatOptions {
|
|
|
|
XMP_FMT_CAN_INJECT_XMP = 0x00000001,
|
|
XMP_FMT_CAN_EXPAND = 0x00000002,
|
|
XMP_FMT_CAN_REWRITE = 0x00000004,
|
|
XMP_FMT_PREFERS_IN_PLACE = 0x00000008,
|
|
XMP_FMT_CAN_RECONCILE = 0x00000010,
|
|
XMP_FMT_ALLOWS_ONLY_XMP = 0x00000020,
|
|
XMP_FMT_RETURNS_RAW_PACKET = 0x00000040,
|
|
XMP_FMT_HANDLER_OWNS_FILE = 0x00000100,
|
|
XMP_FMT_ALLOW_SAFE_UPDATE = 0x00000200,
|
|
XMP_FMT_NEEDS_READONLY_PACKET = 0x00000400,
|
|
XMP_FMT_USE_SIDECAR_XMP = 0x00000800,
|
|
XMP_FMT_FOLDER_BASED_FORMAT = 0x00001000,
|
|
|
|
_XMP_FMT_LAST
|
|
};
|
|
|
|
|
|
|
|
enum XmpIterOptions {
|
|
XMP_ITER_CLASSMASK = 0x00FFUL, /**< The low 8 bits are an enum of
|
|
* what data structure to iterate. */
|
|
XMP_ITER_PROPERTIES = 0x0000UL, /**< Iterate the property tree of
|
|
* a TXMPMeta object. */
|
|
XMP_ITER_ALIASES = 0x0001UL, /**< Iterate the global alias table. */
|
|
XMP_ITER_NAMESPACES = 0x0002UL, /**< Iterate the global namespace table. */
|
|
XMP_ITER_JUSTCHILDREN = 0x0100UL, /**< Just do the immediate children
|
|
* of the root, default is subtree. */
|
|
XMP_ITER_JUSTLEAFNODES = 0x0200UL, /**< Just do the leaf nodes, default
|
|
* is all nodes in the subtree. */
|
|
XMP_ITER_JUSTLEAFNAME = 0x0400UL, /**< Return just the leaf part of the
|
|
* path, default is the full path. */
|
|
XMP_ITER_INCLUDEALIASES = 0x0800UL, /**< Include aliases, default is just
|
|
* actual properties. */
|
|
XMP_ITER_OMITQUALIFIERS = 0x1000UL /* Omit all qualifiers. */
|
|
};
|
|
|
|
enum XmpIterSkipOptions {
|
|
XMP_ITER_SKIPSUBTREE = 0x0001UL, /**< Skip the subtree below the
|
|
* current node. */
|
|
XMP_ITER_SKIPSIBLINGS = 0x0002UL /**< Skip the subtree below and remaining
|
|
* siblings of the current node. */
|
|
};
|
|
|
|
|
|
|
|
enum XmpPropsBits {
|
|
/** Options relating to the XML string form of the property value. */
|
|
XMP_PROP_VALUE_IS_URI = 0x00000002UL, /**< The value is a URI, use
|
|
* rdf:resource attribute.
|
|
* DISCOURAGED */
|
|
/** Options relating to qualifiers attached to a property. */
|
|
XMP_PROP_HAS_QUALIFIERS = 0x00000010UL, /**< The property has qualifiers,
|
|
* includes rdf:type and
|
|
* xml:lang. */
|
|
XMP_PROP_IS_QUALIFIER = 0x00000020UL, /**< This is a qualifier,
|
|
* includes rdf:type and
|
|
* xml:lang. */
|
|
XMP_PROP_HAS_LANG = 0x00000040UL, /**< Implies XMP_PropHasQualifiers,
|
|
* property has xml:lang. */
|
|
XMP_PROP_HAS_TYPE = 0x00000080UL, /**< Implies XMP_PropHasQualifiers,
|
|
* property has rdf:type. */
|
|
|
|
/* Options relating to the data structure form. */
|
|
XMP_PROP_VALUE_IS_STRUCT = 0x00000100UL, /**< The value is a structure
|
|
* with nested fields. */
|
|
XMP_PROP_VALUE_IS_ARRAY = 0x00000200UL, /**< The value is an array
|
|
* (RDF alt/bag/seq). */
|
|
XMP_PROP_ARRAY_IS_UNORDERED = XMP_PROP_VALUE_IS_ARRAY, /**< The item order
|
|
* does not matter.*/
|
|
XMP_PROP_ARRAY_IS_ORDERED = 0x00000400UL, /**< Implies XMP_PropValueIsArray,
|
|
* item order matters. */
|
|
XMP_PROP_ARRAY_IS_ALT = 0x00000800UL, /**< Implies XMP_PropArrayIsOrdered,
|
|
* items are alternates. */
|
|
|
|
/** Additional struct and array options. */
|
|
XMP_PROP_ARRAY_IS_ALTTEXT = 0x00001000UL, /**< Implies kXMP_PropArrayIsAlternate,
|
|
* items are localized text. */
|
|
XMP_PROP_ARRAY_INSERT_BEFORE = 0x00004000UL, /**< Used by array functions. */
|
|
XMP_PROP_ARRAY_INSERT_AFTER = 0x00008000UL, /**< Used by array functions. */
|
|
|
|
/* Other miscellaneous options. */
|
|
XMP_PROP_IS_ALIAS = 0x00010000UL, /**< This property is an alias name for another property. */
|
|
XMP_PROP_HAS_ALIASES = 0x00020000UL, /**< This property is the base value for a set of aliases. */
|
|
XMP_PROP_IS_INTERNAL = 0x00040000UL, /**< This property is an "internal" property, owned by applications. */
|
|
XMP_PROP_IS_STABLE = 0x00100000UL, /**< This property is not derived from the document content. */
|
|
XMP_PROP_IS_DERIVED = 0x00200000UL, /**< This property is derived from the document content. */
|
|
/* 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. */
|
|
XMP_PROP_ARRAY_FORM_MASK = XMP_PROP_VALUE_IS_ARRAY | XMP_PROP_ARRAY_IS_ORDERED | XMP_PROP_ARRAY_IS_ALT | XMP_PROP_ARRAY_IS_ALTTEXT,
|
|
XMP_PROP_COMPOSITE_MASK = XMP_PROP_VALUE_IS_STRUCT | XMP_PROP_ARRAY_FORM_MASK, /* Is it simple or composite (array or struct)? */
|
|
XMP_IMPL_RESERVED_MASK = 0x70000000L /**< Reserved for transient use by the implementation. */
|
|
};
|
|
|
|
|
|
/* convenience macros */
|
|
|
|
/** set option bits */
|
|
|
|
//TODO: Translate these to D
|
|
/+
|
|
#define XMP_SET_OPTION(var,opt) var |= (opt)
|
|
/** clear option bits */
|
|
#define XMP_CLEAR_OPTION(var,opt) var &= ~(opt)
|
|
/** test if option is set */
|
|
#define XMP_TEST_OPTION_SET(var,opt) (((var) & (opt)) != 0)
|
|
/** test if option is clear */
|
|
#define XMP_TEST_OPTION_CLEAR(var,opt) (((var) & (opt)) == 0)
|
|
|
|
|
|
#define XMP_IS_PROP_SIMPLE(opt) (((opt) & XMP_PROP_COMPOSITE_MASK) == 0)
|
|
#define XMP_IS_PROP_STRUCT(opt) (((opt) & XMP_PROP_VALUE_IS_STRUCT) != 0)
|
|
#define XMP_IS_PROP_ARRAY(opt) (((opt) & XMP_PROP_VALUE_IS_ARRAY) != 0)
|
|
#define XMP_IS_ARRAY_UNORDERED(opt) (((opt) & XMP_PROP_ARRAY_IS_ORDERED) == 0)
|
|
#define XMP_IS_ARRAY_ORDERED(opt) (((opt) & XMP_PROP_ARRAY_IS_ORDERED) != 0)
|
|
#define XMP_IS_ARRAY_ALT(opt) (((opt) & XMP_PROP_ARRAY_IS_ALT) != 0)
|
|
#define XMP_IS_ARRAY_ALTTEXT(opt) (((opt) & XMP_PROP_ARRAY_IS_ALTTEXT) != 0)
|
|
|
|
#define XMP_HAS_PROP_QUALIFIERS(opt) (((opt) & XMP_PROP_HAS_QUALIFIERS) != 0)
|
|
#define XMP_IS_PROP_QUALIFIER(opt) (((opt) & XMP_PROP_IS_QUALIFIER) != 0)
|
|
#define XMP_HAS_PROP_LANG(opt) (((opt) & XMP_PROP_HAS_LANG) != 0)
|
|
|
|
#define XMP_IS_NODE_SCHEMA(opt) (((opt) & XMP_SCHEMA_NODE) != 0)
|
|
#define XMP_IS_PROP_ALIAS(opt) (((opt) & XMP_PROP_IS_ALIAS) != 0)
|
|
+/
|
|
|
|
enum { /* Options for xmp_serialize */
|
|
XMP_SERIAL_OMITPACKETWRAPPER = 0x0010UL, /**< Omit the XML packet
|
|
* wrapper. */
|
|
XMP_SERIAL_READONLYPACKET = 0x0020UL, /**< Default is a writeable
|
|
* packet. */
|
|
XMP_SERIAL_USECOMPACTFORMAT = 0x0040UL, /**< Use a compact form of
|
|
* RDF. */
|
|
|
|
XMP_SERIAL_INCLUDETHUMBNAILPAD = 0x0100UL, /**< Include a padding allowance
|
|
* for a thumbnail image. */
|
|
XMP_SERIAL_EXACTPACKETLENGTH = 0x0200UL, /**< The padding parameter is
|
|
* the overall packet length. */
|
|
XMP_SERIAL_WRITEALIASCOMMENTS = 0x0400UL, /**< Show aliases as XML
|
|
* comments. */
|
|
XMP_SERIAL_OMITALLFORMATTING = 0x0800UL, /**< Omit all formatting
|
|
* whitespace. */
|
|
|
|
_XMP_LITTLEENDIAN_BIT = 0x0001UL, /* ! Don't use directly, see the combined values below! */
|
|
_XMP_UTF16_BIT = 0x0002UL,
|
|
_XMP_UTF32_BIT = 0x0004UL,
|
|
|
|
XMP_SERIAL_ENCODINGMASK = 0x0007UL,
|
|
XMP_SERIAL_ENCODEUTF8 = 0UL,
|
|
XMP_SERIAL_ENCODEUTF16BIG = _XMP_UTF16_BIT,
|
|
XMP_SERIAL_ENCODEUTF16LITTLE = _XMP_UTF16_BIT | _XMP_LITTLEENDIAN_BIT,
|
|
XMP_SERIAL_ENCODEUTF32BIG = _XMP_UTF32_BIT,
|
|
XMP_SERIAL_ENCODEUTF32LITTLE = _XMP_UTF32_BIT | _XMP_LITTLEENDIAN_BIT
|
|
};
|
|
|
|
/** pointer to XMP packet. Opaque. */
|
|
alias XmpPtr = void*;
|
|
alias XmpFilePtr = void*;
|
|
alias XmpStringPtr = void*;
|
|
alias XmpIteratorPtr = void*;
|
|
|
|
struct XmpDateTime {
|
|
int year;
|
|
int month; /* 1..12 */
|
|
int day; /* 1..31 */
|
|
int hour; /* 0..23 */
|
|
int minute; /* 0..59 */
|
|
int second; /* 0..59 */
|
|
int tzSign; /* -1..+1, 0 means UTC, -1 is west, +1 is east. */
|
|
int tzHour; /* 0..23 */
|
|
int tzMinute; /* 0..59 */
|
|
int nanoSecond;
|
|
};
|
|
|
|
struct XmpPacketInfo {
|
|
/// Packet offset in the file in bytes, -1 if unknown.
|
|
long offset;
|
|
/// Packet length in the file in bytes, -1 if unknown.
|
|
int length;
|
|
/// Packet padding size in bytes, zero if unknown.
|
|
int padSize;
|
|
|
|
/// Character format using the values \c kXMP_Char8Bit,
|
|
/// \c kXMP_Char16BitBig, etc.
|
|
ubyte charForm;
|
|
/// True if there is a packet wrapper and the trailer says writeable
|
|
/// by dumb packet scanners.
|
|
bool writeable;
|
|
/// True if there is a packet wrapper, the "<?xpacket...>"
|
|
/// XML processing instructions.
|
|
bool hasWrapper;
|
|
|
|
/// Padding to make the struct's size be a multiple 4.
|
|
ubyte pad;
|
|
};
|
|
|
|
/** Values used for tzSign field. */
|
|
enum {
|
|
XMP_TZ_WEST = -1, /**< West of UTC */
|
|
XMP_TZ_UTC = 0, /**< UTC */
|
|
XMP_TZ_EAST = +1 /**< East of UTC */
|
|
};
|
|
|
|
/** Init the library. Must be called before anything else */
|
|
bool xmp_init();
|
|
void xmp_terminate();
|
|
|
|
|
|
/** get the error code that last occurred.
|
|
* @todo make this thread-safe. Getting the error code
|
|
* from another thread than the on it occurred in is undefined.
|
|
*/
|
|
int xmp_get_error();
|
|
|
|
|
|
XmpFilePtr xmp_files_new();
|
|
XmpFilePtr xmp_files_open_new(const char *, XmpOpenFileOptions options);
|
|
|
|
bool xmp_files_open(XmpFilePtr xf, const char *, XmpOpenFileOptions options);
|
|
|
|
/** Close an XMP file. Will flush the changes
|
|
* @param xf the file object
|
|
* @param options the options to close.
|
|
* @return true on succes, false on error
|
|
* xmp_get_error() will give the error code.
|
|
*/
|
|
bool xmp_files_close(XmpFilePtr xf, XmpCloseFileOptions options);
|
|
|
|
/** Get the XMP packet from the file
|
|
* @param xf the %XmpFilePtr to get the XMP packet from
|
|
* @return a newly allocated XmpPtr. Use %xmp_free to release it.
|
|
*/
|
|
XmpPtr xmp_files_get_new_xmp(XmpFilePtr xf);
|
|
|
|
/** File the XMP packet from the file
|
|
* @param xf the %XmpFilePtr to get the XMP packet from
|
|
* @param xmp the XMP Packet to fill. Must be valid.
|
|
*/
|
|
bool xmp_files_get_xmp(XmpFilePtr xf, XmpPtr xmp);
|
|
bool xmp_files_get_xmp_xmpstring(XmpFilePtr xf, XmpStringPtr xmp_packet,
|
|
XmpPacketInfo* packet_info);
|
|
|
|
bool xmp_files_can_put_xmp(XmpFilePtr xf, XmpPtr xmp);
|
|
bool xmp_files_can_put_xmp_xmpstring(XmpFilePtr xf, XmpStringPtr xmp_packet);
|
|
bool xmp_files_can_put_xmp_cstr(XmpFilePtr xf, const char* xmp_packet,
|
|
size_t len);
|
|
|
|
bool xmp_files_put_xmp(XmpFilePtr xf, XmpPtr xmp);
|
|
bool xmp_files_put_xmp_xmpstring(XmpFilePtr xf, XmpStringPtr xmp_packet);
|
|
bool xmp_files_put_xmp_cstr(XmpFilePtr xf, const char* xmp_packet, size_t len);
|
|
|
|
/** Get the file info from the open file
|
|
* @param xf the file object
|
|
* @param[out] filePath the file path object to store the path in. Pass NULL if not needed.
|
|
* @param[out] options the options for open. Pass NULL if not needed.
|
|
* @param[out] file_format the detected file format. Pass NULL if not needed.
|
|
* @param[out] handler_flags the format options like from %xmp_files_get_format_info.
|
|
* @return false in case of error.
|
|
*/
|
|
bool xmp_files_get_file_info(XmpFilePtr xf, XmpStringPtr filePath,
|
|
XmpOpenFileOptions *options,
|
|
XmpFileType * file_format,
|
|
XmpFileFormatOptions *handler_flags);
|
|
|
|
/** Free a XmpFilePtr
|
|
* @param xf the file ptr. Cannot be NULL
|
|
* @return false on error.
|
|
* Calll %xmp_get_error to retrieve the error code.
|
|
*/
|
|
bool xmp_files_free(XmpFilePtr xf);
|
|
|
|
/** Get the format info
|
|
* @param format type identifier
|
|
* @param options the options for the file format handler
|
|
* @return false on error
|
|
*/
|
|
bool xmp_files_get_format_info(XmpFileType format,
|
|
XmpFileFormatOptions * options);
|
|
|
|
/** Check the file format of a file. Use the same logic as in xmp_files_open()
|
|
* @param filePath the path to the file
|
|
* @return XMP_FT_UNKNOWN on error or if the file type is unknown
|
|
*/
|
|
XmpFileType xmp_files_check_file_format(const char *filePath);
|
|
|
|
/** Register a new namespace to add properties to
|
|
* This is done automatically when reading the metadata block
|
|
* @param namespaceURI the namespace URI to register
|
|
* @param suggestedPrefix the suggested prefix
|
|
* @param registeredPrefix the really registered prefix. Not necessarily
|
|
* %suggestedPrefix.
|
|
* @return true if success, false otherwise.
|
|
*/
|
|
bool xmp_register_namespace(const char *namespaceURI,
|
|
const char *suggestedPrefix,
|
|
XmpStringPtr registeredPrefix);
|
|
|
|
|
|
/** Check is a namespace is registered
|
|
* @param ns the namespace to check.
|
|
* @param prefix The prefix associated if registered. Pass NULL
|
|
* if not interested.
|
|
* @return true if registered.
|
|
* NEW in 2.1
|
|
*/
|
|
bool xmp_namespace_prefix(const char *ns, XmpStringPtr prefix);
|
|
|
|
/** Check if a ns prefix is registered.
|
|
* @param prefix the prefix to check.
|
|
* @param ns the namespace associated if registered. Pass NULL
|
|
* if not interested.
|
|
* @return true if registered.
|
|
* NEW in 2.1
|
|
*/
|
|
bool xmp_prefix_namespace_uri(const char *prefix, XmpStringPtr ns);
|
|
|
|
|
|
/** Create a new empty XMP packet
|
|
* @return the packet pointer. Must be free with xmp_free()
|
|
*/
|
|
XmpPtr xmp_new_empty();
|
|
|
|
/** Create a new XMP packet
|
|
* @param buffer the buffer to load data from. UTF-8 encoded.
|
|
* @param len the buffer length in byte
|
|
* @return the packet pointer. Must be free with xmp_free()
|
|
*/
|
|
XmpPtr xmp_new(const char *buffer, size_t len);
|
|
|
|
/** Create a new XMP packet from the one passed.
|
|
* @param xmp the instance to copy. Can be NULL.
|
|
* @return the packet pointer. NULL is failer (or NULL is passed).
|
|
*/
|
|
XmpPtr xmp_copy(XmpPtr xmp);
|
|
|
|
/** Free the xmp packet
|
|
* @param xmp the xmp packet to free
|
|
*/
|
|
bool xmp_free(XmpPtr xmp);
|
|
|
|
/** Parse the XML passed through the buffer and load it.
|
|
* @param xmp the XMP packet.
|
|
* @param buffer the buffer.
|
|
* @param len the length of the buffer.
|
|
*/
|
|
bool xmp_parse(XmpPtr xmp, const char *buffer, size_t len);
|
|
|
|
/** Serialize the XMP Packet to the given buffer
|
|
* @param xmp the XMP Packet
|
|
* @param buffer the buffer to write the XMP to
|
|
* @param options options on how to write the XMP. See XMP_SERIAL_*
|
|
* @param padding number of bytes of padding, useful for modifying
|
|
* embedded XMP in place.
|
|
* @return TRUE if success.
|
|
*/
|
|
bool xmp_serialize(XmpPtr xmp, XmpStringPtr buffer, uint options,
|
|
uint padding);
|
|
|
|
/** Serialize the XMP Packet to the given buffer with formatting
|
|
* @param xmp the XMP Packet
|
|
* @param buffer the buffer to write the XMP to
|
|
* @param options options on how to write the XMP. See XMP_SERIAL_*
|
|
* @param padding number of bytes of padding, useful for modifying
|
|
* embedded XMP in place.
|
|
* @param newline the new line character to use
|
|
* @param tab the indentation character to use
|
|
* @param indent the initial indentation level
|
|
* @return TRUE if success.
|
|
*/
|
|
bool xmp_serialize_and_format(XmpPtr xmp, XmpStringPtr buffer,
|
|
uint options,
|
|
uint padding, const char *newline,
|
|
const char *tab, int indent);
|
|
|
|
|
|
/** Get an XMP property and it option bits from the XMP packet
|
|
* @param xmp the XMP packet
|
|
* @param schema
|
|
* @param name
|
|
* @param property the allocated XmpStringPtr
|
|
* @param propsBits pointer to the option bits. Pass NULL if not needed
|
|
* @return true if found
|
|
*/
|
|
bool xmp_get_property(XmpPtr xmp, const char *schema,
|
|
const char *name, XmpStringPtr property,
|
|
uint *propsBits);
|
|
|
|
bool xmp_get_property_date(XmpPtr xmp, const char *schema,
|
|
const char *name, XmpDateTime * property,
|
|
uint *propsBits);
|
|
bool xmp_get_property_float(XmpPtr xmp, const char *schema,
|
|
const char *name, double * property,
|
|
uint *propsBits);
|
|
bool xmp_get_property_bool(XmpPtr xmp, const char *schema,
|
|
const char *name, bool * property,
|
|
uint *propsBits);
|
|
bool xmp_get_property_int32(XmpPtr xmp, const char *schema,
|
|
const char *name, int * property,
|
|
uint *propsBits);
|
|
bool xmp_get_property_int64(XmpPtr xmp, const char *schema,
|
|
const char *name, long * property,
|
|
uint *propsBits);
|
|
|
|
/** Get an item frpm an array property
|
|
* @param xmp the xmp meta
|
|
* @param schema the schema
|
|
* @param name the property name
|
|
* @param index the index in the array
|
|
* @param property the property value
|
|
* @param propsBits the property bits. Pass NULL is unwanted.
|
|
* @return TRUE if success.
|
|
*/
|
|
bool xmp_get_array_item(XmpPtr xmp, const char *schema,
|
|
const char *name, int index, XmpStringPtr property,
|
|
uint *propsBits);
|
|
|
|
/** Set an XMP property in the XMP packet
|
|
* @param xmp the XMP packet
|
|
* @param schema
|
|
* @param name
|
|
* @param value 0 terminated string
|
|
* @param optionBits
|
|
* @return false if failure
|
|
*/
|
|
bool xmp_set_property(XmpPtr xmp, const char *schema,
|
|
const char *name, const char *value,
|
|
uint optionBits);
|
|
|
|
/** Set a date XMP property in the XMP packet
|
|
* @param xmp the XMP packet
|
|
* @param schema
|
|
* @param name
|
|
* @param value the date-time struct
|
|
* @param optionBits
|
|
* @return false if failure
|
|
*/
|
|
bool xmp_set_property_date(XmpPtr xmp, const char *schema,
|
|
const char *name, const XmpDateTime *value,
|
|
uint optionBits);
|
|
|
|
/** Set a float XMP property in the XMP packet
|
|
* @param xmp the XMP packet
|
|
* @param schema
|
|
* @param name
|
|
* @param value the float value
|
|
* @param optionBits
|
|
* @return false if failure
|
|
*/
|
|
bool xmp_set_property_float(XmpPtr xmp, const char *schema,
|
|
const char *name, double value,
|
|
uint optionBits);
|
|
bool xmp_set_property_bool(XmpPtr xmp, const char *schema,
|
|
const char *name, bool value,
|
|
uint optionBits);
|
|
bool xmp_set_property_int32(XmpPtr xmp, const char *schema,
|
|
const char *name, int value,
|
|
uint optionBits);
|
|
bool xmp_set_property_int64(XmpPtr xmp, const char *schema,
|
|
const char *name, long value,
|
|
uint optionBits);
|
|
|
|
bool xmp_set_array_item(XmpPtr xmp, const char *schema,
|
|
const char *name, int index, const char *value,
|
|
uint optionBits);
|
|
|
|
/** Append a value to the XMP Property array in the XMP Packet provided
|
|
* @param xmp the XMP packet
|
|
* @param schema the schema of the property
|
|
* @param name the name of the property
|
|
* @param arrayOptions option bits of the parent array
|
|
* @param value null-terminated string
|
|
* @param optionBits option bits of the value itself.
|
|
*/
|
|
bool xmp_append_array_item(XmpPtr xmp, const char *schema, const char *name,
|
|
uint arrayOptions, const char *value,
|
|
uint optionBits);
|
|
|
|
/** Delete a property from the XMP Packet provided
|
|
* @param xmp the XMP packet
|
|
* @param schema the schema of the property
|
|
* @param name the name of the property
|
|
*/
|
|
bool xmp_delete_property(XmpPtr xmp, const char *schema, const char *name);
|
|
|
|
/** Determines if a property exists in the XMP Packet provided
|
|
* @param xmp the XMP packet
|
|
* @param schema the schema of the property. Can't be NULL or empty.
|
|
* @param name the name of the property. Can't be NULL or empty.
|
|
* @return true is the property exists
|
|
*/
|
|
bool xmp_has_property(XmpPtr xmp, const char *schema, const char *name);
|
|
|
|
/** Get a localised text from a localisable property.
|
|
* @param xmp the XMP packet
|
|
* @param schema the schema
|
|
* @param name the property name.
|
|
* @param genericLang the generic language you may want as a fall back.
|
|
* Can be NULL or empty.
|
|
* @param specificLang the specific language you want. Can't be NULL or empty.
|
|
* @param actualLang the actual language of the value. Can be NULL if
|
|
* not wanted.
|
|
* @param itemValue the localized value. Can be NULL if not wanted.
|
|
* @param propBits the options flags describing the property. Can be NULL.
|
|
* @return true if found, false otherwise.
|
|
*/
|
|
bool xmp_get_localized_text(XmpPtr xmp, const char *schema, const char *name,
|
|
const char *genericLang, const char *specificLang,
|
|
XmpStringPtr actualLang, XmpStringPtr itemValue,
|
|
uint *propBits);
|
|
|
|
|
|
/** Set a localised text in a localisable property.
|
|
* @param xmp the XMP packet
|
|
* @param schema the schema
|
|
* @param name the property name.
|
|
* @param genericLang the generic language you may want to set too.
|
|
* Can be NULL or empty.
|
|
* @param specificLang the specific language you want. Can't be NULL or empty.
|
|
* @param value the localized value. Cannot be NULL.
|
|
* @param optionBits the options flags describing the property.
|
|
* @return true if set, false otherwise.
|
|
*/
|
|
bool xmp_set_localized_text(XmpPtr xmp, const char *schema, const char *name,
|
|
const char *genericLang, const char *specificLang,
|
|
const char *value, uint optionBits);
|
|
|
|
|
|
|
|
bool xmp_delete_localized_text(XmpPtr xmp, const char *schema,
|
|
const char *name, const char *genericLang,
|
|
const char *specificLang);
|
|
|
|
/** Instanciate a new string
|
|
* @return the new instance. Must be freed with
|
|
* xmp_string_free()
|
|
*/
|
|
XmpStringPtr xmp_string_new();
|
|
|
|
/** Free a XmpStringPtr
|
|
* @param s the string to free
|
|
*/
|
|
void xmp_string_free(XmpStringPtr s);
|
|
|
|
/** Get the C string from the XmpStringPtr
|
|
* @param s the string object
|
|
* @return the const char * for the XmpStringPtr. It
|
|
* belong to the object.
|
|
*/
|
|
const(char *) xmp_string_cstr(XmpStringPtr s);
|
|
|
|
/** Get the string length from the XmpStringPtr
|
|
* @param s the string object
|
|
* @return the string length. The unerlying implementation has it.
|
|
*/
|
|
size_t xmp_string_len(XmpStringPtr s);
|
|
|
|
/** Create a new iterator.
|
|
* @param xmp the packet
|
|
* @param schema the property schema
|
|
* @param propName the property name
|
|
* @param options
|
|
* @return an iterator must be freed with % xmp_iterator_free
|
|
*/
|
|
XmpIteratorPtr xmp_iterator_new(XmpPtr xmp, const char * schema,
|
|
const char * propName, XmpIterOptions options);
|
|
|
|
/** Free an iterator.
|
|
* @param iter the iterator to free.
|
|
*/
|
|
bool xmp_iterator_free(XmpIteratorPtr iter);
|
|
|
|
/** Iterate to the next value
|
|
* @param iter the iterator
|
|
* @param schema the schema name. Pass NULL if not wanted
|
|
* @param propName the property path. Pass NULL if not wanted
|
|
* @param propValue the value of the property. Pass NULL if not wanted.
|
|
* @param options the options for the property. Pass NULL if not wanted.
|
|
* @return true if still something, false if none
|
|
*/
|
|
bool xmp_iterator_next(XmpIteratorPtr iter, XmpStringPtr schema,
|
|
XmpStringPtr propName, XmpStringPtr propValue,
|
|
uint *options);
|
|
|
|
|
|
/**
|
|
*/
|
|
bool xmp_iterator_skip(XmpIteratorPtr iter, XmpIterSkipOptions options);
|
|
|
|
|
|
/** Compare two XmpDateTime
|
|
* @param left value
|
|
* @param right value
|
|
* @return if left < right, return < 0. If left > right, return > 0.
|
|
* if left == right, return 0.
|
|
*/
|
|
int xmp_datetime_compare(XmpDateTime* left, XmpDateTime* right);
|