[gexiv2] Add Exif support to gexiv2_metadata_*_tag_multiple()
- From: Jens Georg <jensgeorg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gexiv2] Add Exif support to gexiv2_metadata_*_tag_multiple()
- Date: Tue, 17 Nov 2020 21:31:28 +0000 (UTC)
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]