diff options
| -rw-r--r-- | src/jpeg-utils.cpp | 23 |
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 (...) { } |
