summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/jpeg-utils.cpp23
1 files changed, 15 insertions, 8 deletions
diff --git a/src/jpeg-utils.cpp b/src/jpeg-utils.cpp
index ece40e4..d7382c8 100644
--- a/src/jpeg-utils.cpp
+++ b/src/jpeg-utils.cpp
@@ -154,6 +154,11 @@ get_real_key_name (const gchar *key)
return key;
}
+
+/* Returns newly allocated string */
+/* FIXME: for some reason exiv2 returns const strings with unknown lifetime, can't really trust the library */
+#define exiv2_str_val(data,key) g_strdup(data[key].toString().c_str())
+
static gboolean
iptc_has_key (Exiv2::IptcData iptcData, const char *key)
{
@@ -188,14 +193,14 @@ get_exif_data (ExifData *exif, const gchar *key)
if (g_str_has_prefix (key, "Exif.")) {
Exiv2::ExifData &exifData = exif->priv->image->exifData();
if (! exifData.empty()) {
- return g_strdup (exifData[key].toString().c_str());
+ return exiv2_str_val (exifData, key);
}
}
if (g_str_has_prefix (key, "Iptc.")) {
Exiv2::IptcData &iptcData = exif->priv->image->iptcData();
if (iptc_has_key (iptcData, key)) {
- return g_strdup (iptcData[key].toString().c_str());
+ return exiv2_str_val (iptcData, key);
}
}
@@ -229,18 +234,18 @@ get_exif_data_fixed (ExifData *exif, const gchar *key)
g_str_equal (key, "Exif.Photo.DateTimeOriginal") ||
g_str_equal (key, "Exif.Photo.DateTimeDigitized") ||
g_str_equal (key, "Exif.Image.DateTime")) {
- const char *val = NULL;
+ gchar *val = NULL;
try {
- val = exifData["Exif.Photo.DateTimeOriginal"].toString().c_str();
+ val = exiv2_str_val (exifData, "Exif.Photo.DateTimeOriginal");
} catch (...) { }
if (! val || strlen (val) == 0)
try {
- val = exifData["Exif.Photo.DateTimeDigitized"].toString().c_str();
+ val = exiv2_str_val (exifData, "Exif.Photo.DateTimeDigitized");
} catch (...) { }
if (! val || strlen (val) == 0)
try {
/* usually a modification date */
- val = exifData["Exif.Image.DateTime"].toString().c_str();
+ val = exiv2_str_val (exifData, "Exif.Image.DateTime");
} catch (...) { }
if (val && strlen (val) > 0) {
@@ -270,6 +275,7 @@ get_exif_data_fixed (ExifData *exif, const gchar *key)
if (res)
return res;
}
+ g_free (val);
}
if (g_str_equal (key, EXIF_EXPOSURE)) {
@@ -552,14 +558,14 @@ static gboolean
shift_exif_time (Exiv2::ExifData& exifData, const char *key, int amount)
{
struct tm *tt;
- const char *s;
+ gchar *s;
gchar *st;
gboolean res;
res = FALSE;
try {
if (exifData[key].count() > 0) {
- s = exifData[key].toString().c_str();
+ s = exiv2_str_val (exifData, key);
if (s && strlen (s) > 0) {
tt = parse_exif_date (s);
@@ -573,6 +579,7 @@ shift_exif_time (Exiv2::ExifData& exifData, const char *key, int amount)
res = TRUE;
}
}
+ g_free (s);
}
} catch (...) { }