[gexiv2] Add Exif support to gexiv2_metadata_*_tag_multiple()



commit 3b09fd635a4b7e9dcdcb43574ac2e3d3eac039b0
Author: postscript-dev <43813-postscript-dev users noreply gitlab gnome org>
Date:   Tue Nov 10 16:15:34 2020 +0000

    Add Exif support to gexiv2_metadata_*_tag_multiple()
    
    Closes Issue #10.

 gexiv2/gexiv2-metadata-exif.cpp  | 66 ++++++++++++++++++++++++++++++++++++++++
 gexiv2/gexiv2-metadata-private.h |  2 ++
 gexiv2/gexiv2-metadata.cpp       | 24 ++++++++++-----
 3 files changed, 84 insertions(+), 8 deletions(-)
---
diff --git a/gexiv2/gexiv2-metadata-exif.cpp b/gexiv2/gexiv2-metadata-exif.cpp
index 15cf116..50d3aa8 100644
--- a/gexiv2/gexiv2-metadata-exif.cpp
+++ b/gexiv2/gexiv2-metadata-exif.cpp
@@ -118,6 +118,72 @@ gchar* gexiv2_metadata_get_exif_tag_string (GExiv2Metadata *self, const gchar* t
     return NULL;
 }
 
+gchar** gexiv2_metadata_get_exif_tag_multiple(GExiv2Metadata* self, const gchar* tag) {
+    g_return_val_if_fail(GEXIV2_IS_METADATA(self), NULL);
+    g_return_val_if_fail(self->priv != NULL, FALSE);
+    g_return_val_if_fail(self->priv->image.get() != NULL, NULL);
+    g_return_val_if_fail(tag != NULL, NULL);
+
+    gchar** array = NULL;
+
+    try {
+        Exiv2::ExifData& exif_data = self->priv->image->exifData();
+        auto it = exif_data.findKey(Exiv2::ExifKey(tag));
+
+        while (it != exif_data.end() && it->count() == 0)
+            it++;
+
+        if (it != exif_data.end()) {
+            array = g_new(gchar*, 2);
+            array[0] = g_strdup(it->toString().c_str());
+            array[1] = NULL;
+
+            return array;
+        }
+    } catch (Exiv2::Error& e) {
+        LOG_ERROR(e);
+    }
+
+    array = g_new(gchar*, 1);
+    array[0] = NULL;
+
+    return array;
+}
+
+gboolean gexiv2_metadata_set_exif_tag_multiple(GExiv2Metadata* self, const gchar* tag, const gchar** values) 
{
+    g_return_val_if_fail(GEXIV2_IS_METADATA(self), FALSE);
+    g_return_val_if_fail(tag != NULL, FALSE);
+    g_return_val_if_fail(values != NULL, FALSE);
+    g_return_val_if_fail(self->priv != NULL, FALSE);
+    g_return_val_if_fail(self->priv->image.get() != NULL, FALSE);
+
+    try {
+        Exiv2::ExifData& exif_data = self->priv->image->exifData();
+
+        auto it = exif_data.findKey(Exiv2::ExifKey(tag));
+
+        if (it != exif_data.end())
+            exif_data.erase(it);
+
+        if (values[0]) {
+            // Exif tags only store one value, so find the last non NULL one
+            const gchar** val_it = values;
+            while (*val_it != NULL) {
+                ++val_it;
+            }
+
+            --val_it;
+
+            exif_data[tag] = static_cast<const std::string>(*val_it);
+        }
+        return TRUE;
+    } catch (Exiv2::Error& e) {
+        LOG_ERROR(e);
+    }
+
+    return FALSE;
+}
+
 gchar* gexiv2_metadata_get_exif_tag_interpreted_string (GExiv2Metadata *self, const gchar* tag) {
     g_return_val_if_fail(GEXIV2_IS_METADATA (self), NULL);
     g_return_val_if_fail(tag != NULL, NULL);
diff --git a/gexiv2/gexiv2-metadata-private.h b/gexiv2/gexiv2-metadata-private.h
index d31fa99..2968d19 100644
--- a/gexiv2/gexiv2-metadata-private.h
+++ b/gexiv2/gexiv2-metadata-private.h
@@ -44,6 +44,8 @@ G_GNUC_INTERNAL gboolean              gexiv2_metadata_has_exif_tag            
(GExiv2Metadata *self, c
 G_GNUC_INTERNAL gboolean               gexiv2_metadata_clear_exif_tag          (GExiv2Metadata *self, const 
gchar* tag);
 G_GNUC_INTERNAL gchar*                 gexiv2_metadata_get_exif_tag_string     (GExiv2Metadata *self, const 
gchar* tag);
 G_GNUC_INTERNAL gboolean               gexiv2_metadata_set_exif_tag_string     (GExiv2Metadata *self, const 
gchar* tag, const gchar* value);
+G_GNUC_INTERNAL gchar**         gexiv2_metadata_get_exif_tag_multiple(GExiv2Metadata* self, const gchar* 
tag);
+G_GNUC_INTERNAL gboolean        gexiv2_metadata_set_exif_tag_multiple(GExiv2Metadata* self, const gchar* 
tag, const gchar** values);
 G_GNUC_INTERNAL gchar*                 gexiv2_metadata_get_exif_tag_interpreted_string (GExiv2Metadata 
*self, const gchar* tag);
 G_GNUC_INTERNAL glong                  gexiv2_metadata_get_exif_tag_long       (GExiv2Metadata *self, const 
gchar* tag);
 G_GNUC_INTERNAL gboolean               gexiv2_metadata_set_exif_tag_long       (GExiv2Metadata *self, const 
gchar* tag, glong value);
diff --git a/gexiv2/gexiv2-metadata.cpp b/gexiv2/gexiv2-metadata.cpp
index aa39c98..48b11d4 100644
--- a/gexiv2/gexiv2-metadata.cpp
+++ b/gexiv2/gexiv2-metadata.cpp
@@ -1015,32 +1015,40 @@ gchar* gexiv2_metadata_get_tag_interpreted_string (GExiv2Metadata *self, const g
     return NULL;
 }
 
-gchar** gexiv2_metadata_get_tag_multiple(GExiv2Metadata *self, const gchar* tag) {
+gchar** gexiv2_metadata_get_tag_multiple(GExiv2Metadata* self, const gchar* tag) {
     g_return_val_if_fail(GEXIV2_IS_METADATA(self), NULL);
     g_return_val_if_fail(tag != NULL, NULL);
+    g_return_val_if_fail(self->priv != NULL, FALSE);
     g_return_val_if_fail(self->priv->image.get() != NULL, NULL);
-    
+
     if (gexiv2_metadata_is_xmp_tag(tag))
         return gexiv2_metadata_get_xmp_tag_multiple(self, tag);
-    
+
+    if (gexiv2_metadata_is_exif_tag(tag))
+        return gexiv2_metadata_get_exif_tag_multiple(self, tag);
+
     if (gexiv2_metadata_is_iptc_tag(tag))
         return gexiv2_metadata_get_iptc_tag_multiple(self, tag);
-    
+
     return NULL;
 }
 
-gboolean gexiv2_metadata_set_tag_multiple(GExiv2Metadata *self, const gchar* tag, const gchar** values) {
+gboolean gexiv2_metadata_set_tag_multiple(GExiv2Metadata* self, const gchar* tag, const gchar** values) {
     g_return_val_if_fail(GEXIV2_IS_METADATA(self), FALSE);
     g_return_val_if_fail(tag != NULL, FALSE);
     g_return_val_if_fail(values != NULL, FALSE);
+    g_return_val_if_fail(self->priv != NULL, FALSE);
     g_return_val_if_fail(self->priv->image.get() != NULL, FALSE);
-    
+
     if (gexiv2_metadata_is_xmp_tag(tag))
         return gexiv2_metadata_set_xmp_tag_multiple(self, tag, values);
-    
+
+    if (gexiv2_metadata_is_exif_tag(tag))
+        return gexiv2_metadata_set_exif_tag_multiple(self, tag, values);
+
     if (gexiv2_metadata_is_iptc_tag(tag))
         return gexiv2_metadata_set_iptc_tag_multiple(self, tag, values);
-    
+
     return FALSE;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]