Mercurial > geeqie
diff src/exiv2.cc @ 1203:43bfcbb62cd6
prepared infrastructure for delayed metadata writting - refreshing
metadata immediately before writting is now possible
modified metadata are stored in fd->modified_xmp
author | nadvornik |
---|---|
date | Mon, 15 Dec 2008 22:47:31 +0000 |
parents | 4fe35e07308d |
children | 4742b47b75d1 |
line wrap: on
line diff
--- a/src/exiv2.cc Mon Dec 15 18:04:42 2008 +0000 +++ b/src/exiv2.cc Mon Dec 15 22:47:31 2008 +0000 @@ -201,6 +201,10 @@ } }; +extern "C" { +static void _ExifDataProcessed_update_xmp(gpointer key, gpointer value, gpointer data); +} + // This allows read-write access to the metadata struct _ExifDataProcessed : public _ExifData { @@ -215,7 +219,7 @@ #endif public: - _ExifDataProcessed(gchar *path, gchar *sidecar_path) + _ExifDataProcessed(gchar *path, gchar *sidecar_path, GHashTable *modified_xmp) { imageData_ = new _ExifDataOriginal(path); sidecarData_ = NULL; @@ -233,6 +237,10 @@ #if EXIV2_TEST_VERSION(0,17,0) syncExifWithXmp(exifData_, xmpData_); #endif + if (modified_xmp) + { + g_hash_table_foreach(modified_xmp, _ExifDataProcessed_update_xmp, this); + } } virtual ~_ExifDataProcessed() @@ -326,11 +334,16 @@ extern "C" { -ExifData *exif_read(gchar *path, gchar *sidecar_path) +static void _ExifDataProcessed_update_xmp(gpointer key, gpointer value, gpointer data) +{ + exif_update_metadata((ExifData *)data, (gchar *)key, (GList *)value); +} + +ExifData *exif_read(gchar *path, gchar *sidecar_path, GHashTable *modified_xmp) { DEBUG_1("exif read %s, sidecar: %s", path, sidecar_path ? sidecar_path : "-"); try { - return new _ExifDataProcessed(path, sidecar_path); + return new _ExifDataProcessed(path, sidecar_path, modified_xmp); } catch (Exiv2::AnyError& e) { std::cout << "Caught Exiv2 exception '" << e << "'\n"; @@ -731,48 +744,70 @@ } } -int exif_item_set_string(ExifItem *item, const char *str) +gint exif_update_metadata(ExifData *exif, const gchar *key, const GList *values) { try { - if (!item) return 0; - ((Exiv2::Metadatum *)item)->setValue(std::string(str)); + const GList *work = values; + + Exiv2::Metadatum *item = NULL; + try { + Exiv2::ExifKey ekey(key); + + Exiv2::ExifData::iterator pos = exif->exifData().findKey(ekey); + while (pos != exif->exifData().end()) + { + exif->exifData().erase(pos); + pos = exif->exifData().findKey(ekey); + } + + while (work) + { + exif->exifData()[key] = (gchar *)work->data; + work = work->next; + } + } + catch (Exiv2::AnyError& e) { + try { + Exiv2::IptcKey ekey(key); + Exiv2::IptcData::iterator pos = exif->iptcData().findKey(ekey); + while (pos != exif->iptcData().end()) + { + exif->iptcData().erase(pos); + pos = exif->iptcData().findKey(ekey); + } + + while (work) + { + exif->iptcData()[key] = (gchar *)work->data; + work = work->next; + } + } + catch (Exiv2::AnyError& e) { +#if EXIV2_TEST_VERSION(0,16,0) + Exiv2::XmpKey ekey(key); + Exiv2::XmpData::iterator pos = exif->xmpData().findKey(ekey); + while (pos != exif->xmpData().end()) + { + exif->xmpData().erase(pos); + pos = exif->xmpData().findKey(ekey); + } + + while (work) + { + exif->xmpData()[key] = (gchar *)work->data; + work = work->next; + } +#endif + } + } return 1; - } + } catch (Exiv2::AnyError& e) { + std::cout << "Caught Exiv2 exception '" << e << "'\n"; return 0; } } -int exif_item_delete(ExifData *exif, ExifItem *item) -{ - try { - if (!item) return 0; - for (Exiv2::ExifData::iterator i = exif->exifData().begin(); i != exif->exifData().end(); ++i) { - if (((Exiv2::Metadatum *)item) == &*i) { - i = exif->exifData().erase(i); - return 1; - } - } - for (Exiv2::IptcData::iterator i = exif->iptcData().begin(); i != exif->iptcData().end(); ++i) { - if (((Exiv2::Metadatum *)item) == &*i) { - i = exif->iptcData().erase(i); - return 1; - } - } -#if EXIV2_TEST_VERSION(0,16,0) - for (Exiv2::XmpData::iterator i = exif->xmpData().begin(); i != exif->xmpData().end(); ++i) { - if (((Exiv2::Metadatum *)item) == &*i) { - i = exif->xmpData().erase(i); - return 1; - } - } -#endif - return 0; - } - catch (Exiv2::AnyError& e) { - return 0; - } -} void exif_add_jpeg_color_profile(ExifData *exif, unsigned char *cp_data, guint cp_length) {