commit 4d8e67fb75ad4be2aac7dc5c8bba4003caa6f5a1 Author: Les De Ridder Date: Sun Oct 16 17:12:05 2016 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4a00489 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.dub +docs.json +__dummy.html +*.o +*.obj +libexempi-d.a diff --git a/dub.sdl b/dub.sdl new file mode 100644 index 0000000..6e932cc --- /dev/null +++ b/dub.sdl @@ -0,0 +1,5 @@ +name "exempi-d" +description "D bindings for exempi" +authors "Les De Ridder" +license "BSD 3-clause" +targetType "library" diff --git a/source/exempi/xmp.d b/source/exempi/xmp.d new file mode 100644 index 0000000..7dbadda --- /dev/null +++ b/source/exempi/xmp.d @@ -0,0 +1,725 @@ +/* + * exempi-d - exempi.xmp + * + * Bindings by Les De Ridder + * + * 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 "" + /// 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); diff --git a/source/exempi/xmpconsts.d b/source/exempi/xmpconsts.d new file mode 100644 index 0000000..cf7f6c8 --- /dev/null +++ b/source/exempi/xmpconsts.d @@ -0,0 +1,63 @@ +/* + * exempi-d - exempi.xmpconsts + * + * Bindings by Les De Ridder + * + * 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.xmpconsts; + +extern(C): + +extern __gshared const char[] NS_XMP_META; +extern __gshared const char[] NS_RDF; +extern __gshared const char[] NS_EXIF; +extern __gshared const char[] NS_TIFF; +extern __gshared const char[] NS_XAP; +extern __gshared const char[] NS_XAP_RIGHTS; +extern __gshared const char[] NS_DC; +extern __gshared const char[] NS_EXIF_AUX; +extern __gshared const char[] NS_CRS; +extern __gshared const char[] NS_LIGHTROOM; +extern __gshared const char[] NS_PHOTOSHOP; +extern __gshared const char[] NS_CAMERA_RAW_SETTINGS; +extern __gshared const char[] NS_CAMERA_RAW_SAVED_SETTINGS; +extern __gshared const char[] NS_IPTC4XMP; +extern __gshared const char[] NS_TPG; +extern __gshared const char[] NS_DIMENSIONS_TYPE; +/** Creative Commons namespace */ +extern __gshared const char[] NS_CC; +/* Added in Exempi 2.1 */ +extern __gshared const char[] NS_PDF; diff --git a/source/exempi/xmperrors.d b/source/exempi/xmperrors.d new file mode 100644 index 0000000..2bd77f8 --- /dev/null +++ b/source/exempi/xmperrors.d @@ -0,0 +1,87 @@ +/* + * exempi-d - exempi.xmperrors + * + * Bindings by Les De Ridder + * + * 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.xmperrors; + +extern(C): + +enum { + /* More or less generic error codes. */ + XMPErr_Unknown = 0, + XMPErr_TBD = -1, + XMPErr_Unavailable = -2, + XMPErr_BadObject = -3, + XMPErr_BadParam = -4, + XMPErr_BadValue = -5, + XMPErr_AssertFailure = -6, + XMPErr_EnforceFailure = -7, + XMPErr_Unimplemented = -8, + XMPErr_InternalFailure = -9, + XMPErr_Deprecated = -10, + XMPErr_ExternalFailure = -11, + XMPErr_UserAbort = -12, + XMPErr_StdException = -13, + XMPErr_UnknownException = -14, + XMPErr_NoMemory = -15, + + /* More specific parameter error codes. */ + XMPErr_BadSchema = -101, + XMPErr_BadXPath = -102, + XMPErr_BadOptions = -103, + XMPErr_BadIndex = -104, + XMPErr_BadIterPosition = -105, + XMPErr_BadParse = -106, + XMPErr_BadSerialize = -107, + XMPErr_BadFileFormat = -108, + XMPErr_NoFileHandler = -109, + XMPErr_TooLargeForJPEG = -110, + + /* File format and internal structure error codes. */ + XMPErr_BadXML = -201, + XMPErr_BadRDF = -202, + XMPErr_BadXMP = -203, + XMPErr_EmptyIterator = -204, + XMPErr_BadUnicode = -205, + XMPErr_BadTIFF = -206, + XMPErr_BadJPEG = -207, + XMPErr_BadPSD = -208, + XMPErr_BadPSIR = -209, + XMPErr_BadIPTC = -210, + XMPErr_BadMPEG = -211 +};