[gthumb/ext] use strftime to get the formatted date
- From: Paolo Bacchilega <paobac src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gthumb/ext] use strftime to get the formatted date
- Date: Tue, 17 Nov 2009 16:12:11 +0000 (UTC)
commit 02ddc6853d6f82b9e1756521c87791ffe25c711a
Author: Paolo Bacchilega <paobac src gnome org>
Date: Tue Nov 17 17:11:21 2009 +0100
use strftime to get the formatted date
extensions/comments/gth-edit-comment-page.c | 6 +-
.../comments/gth-metadata-provider-comment.c | 30 ++++++---
extensions/comments/main.c | 19 ++++--
extensions/exiv2/exiv2-utils.cpp | 37 +++++++++--
extensions/exiv2/gth-metadata-provider-exiv2.c | 4 +
gthumb/glib-utils.c | 72 +++++++++++++++++++-
gthumb/glib-utils.h | 4 +
gthumb/gth-metadata-provider-file.c | 2 +-
gthumb/gth-time.c | 55 +--------------
9 files changed, 151 insertions(+), 78 deletions(-)
---
diff --git a/extensions/comments/gth-edit-comment-page.c b/extensions/comments/gth-edit-comment-page.c
index 4076a32..d77112a 100644
--- a/extensions/comments/gth-edit-comment-page.c
+++ b/extensions/comments/gth-edit-comment-page.c
@@ -88,7 +88,7 @@ gth_edit_comment_page_real_set_file (GthEditMetadataPage *base,
metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "Embedded::Image::DateTime");
if (metadata != NULL) {
gtk_combo_box_set_active (GTK_COMBO_BOX (self->priv->date_combobox), FOLLOWING_DATE);
- gth_time_selector_set_exif_date (GTH_TIME_SELECTOR (self->priv->date_selector), gth_metadata_get_formatted (metadata));
+ gth_time_selector_set_exif_date (GTH_TIME_SELECTOR (self->priv->date_selector), gth_metadata_get_raw (metadata));
/*gtk_widget_set_sensitive (self->priv->date_selector, TRUE);*/
}
else {
@@ -162,11 +162,11 @@ gth_edit_comment_page_real_update_info (GthEditMetadataPage *base,
gth_time_selector_get_value (GTH_TIME_SELECTOR (self->priv->date_selector), date_time);
exif_date = gth_datetime_to_exif_date (date_time);
metadata = g_object_new (GTH_TYPE_METADATA,
- "id", "Embedded::Image::Date",
+ "id", "Embedded::Image::DateTime",
"raw", exif_date,
"formatted", exif_date,
NULL);
- g_file_info_set_attribute_object (self->priv->file_data->info, "Embedded::Image::Date", G_OBJECT (metadata));
+ g_file_info_set_attribute_object (self->priv->file_data->info, "Embedded::Image::DateTime", G_OBJECT (metadata));
g_object_unref (metadata);
gth_datetime_free (date_time);
diff --git a/extensions/comments/gth-metadata-provider-comment.c b/extensions/comments/gth-metadata-provider-comment.c
index 866c493..42e6af0 100644
--- a/extensions/comments/gth-metadata-provider-comment.c
+++ b/extensions/comments/gth-metadata-provider-comment.c
@@ -43,14 +43,15 @@ static gpointer parent_class = NULL;
static void
set_attribute_from_string (GFileInfo *info,
const char *key,
- const char *value)
+ const char *value,
+ const char *formatted)
{
GthMetadata *metadata;
metadata = g_object_new (GTH_TYPE_METADATA,
"id", key,
"raw", value,
- "formatted", value,
+ "formatted", (formatted != NULL ? formatted : value),
NULL);
g_file_info_set_attribute_object (info, key, G_OBJECT (metadata));
}
@@ -76,13 +77,13 @@ gth_metadata_provider_comment_read (GthMetadataProvider *self,
value = gth_comment_get_note (comment);
if (value != NULL) {
g_file_info_set_attribute_string (file_data->info, "comment::note", value);
- set_attribute_from_string (file_data->info, "Embedded::Image::Comment", value);
+ set_attribute_from_string (file_data->info, "Embedded::Image::Comment", value, NULL);
}
value = gth_comment_get_place (comment);
if (value != NULL) {
g_file_info_set_attribute_string (file_data->info, "comment::place", value);
- set_attribute_from_string (file_data->info, "Embedded::Image::Location", value);
+ set_attribute_from_string (file_data->info, "Embedded::Image::Location", value, NULL);
}
categories = gth_comment_get_categories (comment);
@@ -97,8 +98,17 @@ gth_metadata_provider_comment_read (GthMetadataProvider *self,
comment_time = gth_comment_get_time_as_exif_format (comment);
if (comment_time != NULL) {
- g_file_info_set_attribute_string (file_data->info, "comment::time", comment_time);
- set_attribute_from_string (file_data->info, "Embedded::Image::DateTime", comment_time);
+ GTimeVal time_;
+ char *formatted;
+
+ if (_g_time_val_from_exif_date (comment_time, &time_))
+ formatted = _g_time_val_strftime (&time_, "%x %X");
+ else
+ formatted = g_strdup (comment_time);
+ set_attribute_from_string (file_data->info, "comment::time", comment_time, formatted);
+ set_attribute_from_string (file_data->info, "Embedded::Image::DateTime", comment_time, formatted);
+
+ g_free (formatted);
g_free (comment_time);
}
@@ -143,11 +153,13 @@ gth_metadata_provider_comment_write (GthMetadataProvider *self,
/* time */
- metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "Embedded::Image::Date");
+ metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "Embedded::Image::DateTime");
if (metadata == NULL)
- text = g_file_info_get_attribute_string (file_data->info, "comment::time");
- else
+ metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "comment::time");
+ if (metadata != NULL)
text = gth_metadata_get_raw (metadata);
+ else
+ text = NULL;
gth_comment_set_time_from_exif_format (comment, text);
/* keywords */
diff --git a/extensions/comments/main.c b/extensions/comments/main.c
index 2afccf7..1e2b707 100644
--- a/extensions/comments/main.c
+++ b/extensions/comments/main.c
@@ -92,7 +92,11 @@ comments__read_metadata_ready_cb (GthFileData *file_data,
comment = gth_comment_new ();
gth_comment_set_note (comment, g_file_info_get_attribute_string (file_data->info, "comment::note"));
gth_comment_set_place (comment, g_file_info_get_attribute_string (file_data->info, "comment::place"));
- gth_comment_set_time_from_exif_format (comment, g_file_info_get_attribute_string (file_data->info, "comment::time"));
+
+ metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "comment::time");
+ if (metadata != NULL)
+ gth_comment_set_time_from_exif_format (comment, gth_metadata_get_raw (metadata));
+
keywords = gth_comment_get_categories (comment);
for (i = 0; i < keywords->len; i++)
gth_comment_add_category (comment, g_ptr_array_index (keywords, i));
@@ -117,12 +121,15 @@ comments__read_metadata_ready_cb (GthFileData *file_data,
}
}
- metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "Embedded::Image::Date");
+ metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "Embedded::Image::DateTime");
if (metadata != NULL) {
- text = g_file_info_get_attribute_string (file_data->info, "comment::time");
- if (g_strcmp0 (gth_metadata_get_raw (metadata), text) != 0) {
- gth_comment_set_time_from_exif_format (comment, gth_metadata_get_raw (metadata));
- write_comment = TRUE;
+ metadata = (GthMetadata *) g_file_info_get_attribute_object (file_data->info, "comment::time");
+ if (metadata != NULL) {
+ text = gth_metadata_get_raw (metadata);
+ if (g_strcmp0 (gth_metadata_get_raw (metadata), text) != 0) {
+ gth_comment_set_time_from_exif_format (comment, gth_metadata_get_raw (metadata));
+ write_comment = TRUE;
+ }
}
}
diff --git a/extensions/exiv2/exiv2-utils.cpp b/extensions/exiv2/exiv2-utils.cpp
index 1d9d7ef..6145699 100644
--- a/extensions/exiv2/exiv2-utils.cpp
+++ b/extensions/exiv2/exiv2-utils.cpp
@@ -167,6 +167,20 @@ exiv2_key_to_attribute (const char *key)
}
+static gboolean
+attribute_is_date (const char *key)
+{
+ int i;
+
+ for (i = 0; _DATE_TAG_NAMES[i] != NULL; i++) {
+ if (strcmp (_DATE_TAG_NAMES[i], key) == 0)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
inline static void
set_file_info (GFileInfo *info,
const char *key,
@@ -186,7 +200,16 @@ set_file_info (GFileInfo *info,
attribute = exiv2_key_to_attribute (key);
description_utf8 = g_locale_to_utf8 (description, -1, NULL, NULL, NULL);
- formatted_value_utf8 = g_locale_to_utf8 (formatted_value, -1, NULL, NULL, NULL);
+ if (attribute_is_date (attribute)) {
+ GTimeVal time_;
+
+ if (_g_time_val_from_exif_date (raw_value, &time_))
+ formatted_value_utf8 = _g_time_val_strftime (&time_, "%x %X");
+ else
+ formatted_value_utf8 = g_locale_to_utf8 (formatted_value, -1, NULL, NULL, NULL);
+ }
+ else
+ formatted_value_utf8 = g_locale_to_utf8 (formatted_value, -1, NULL, NULL, NULL);
/*
g_print ("%s (%s): %s (%s)\n", key, description, formatted_value, raw_value);
@@ -614,11 +637,13 @@ exiv2_write_metadata_private (Exiv2::Image::AutoPtr image,
// Update the DateTime tag
- GTimeVal current_time;
- g_get_current_time (¤t_time);
- char *date_time = _g_time_val_to_exif_date (¤t_time);
- ed["Exif.Image.DateTime"] = date_time;
- g_free (date_time);
+ if (g_file_info_get_attribute_object (info, "Exif::Image::DateTime") == NULL) {
+ GTimeVal current_time;
+ g_get_current_time (¤t_time);
+ char *date_time = _g_time_val_to_exif_date (¤t_time);
+ ed["Exif.Image.DateTime"] = date_time;
+ g_free (date_time);
+ }
// IPTC Data
diff --git a/extensions/exiv2/gth-metadata-provider-exiv2.c b/extensions/exiv2/gth-metadata-provider-exiv2.c
index f611cd1..1e749cc 100644
--- a/extensions/exiv2/gth-metadata-provider-exiv2.c
+++ b/extensions/exiv2/gth-metadata-provider-exiv2.c
@@ -122,6 +122,10 @@ gth_metadata_provider_exiv2_write (GthMetadataProvider *self,
g_object_unref (meta);
}
+ metadata = g_file_info_get_attribute_object (file_data->info, "Embedded::Image::DateTime");
+ if (metadata != NULL)
+ g_file_info_set_attribute_object (file_data->info, "Exif::Image::DateTime", metadata);
+
if (exiv2_write_metadata_to_buffer (&buffer,
&size,
file_data->info,
diff --git a/gthumb/glib-utils.c b/gthumb/glib-utils.c
index 43e34f0..0b5dc45 100644
--- a/gthumb/glib-utils.c
+++ b/gthumb/glib-utils.c
@@ -332,6 +332,64 @@ performance (const char *file,
/* GTimeVal utils */
+/* taken from the glib function g_date_strftime */
+char *
+struct_tm_strftime (struct tm *tm,
+ const char *format)
+{
+ gsize locale_format_len = 0;
+ char *locale_format;
+ GError *error = NULL;
+ gsize tmpbufsize;
+ char *tmpbuf;
+ gsize tmplen;
+ char *retval;
+
+ locale_format = g_locale_from_utf8 (format, -1, NULL, &locale_format_len, &error);
+ if (error != NULL) {
+ g_warning (G_STRLOC "Error converting format to locale encoding: %s\n", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ tmpbufsize = MAX (128, locale_format_len * 2);
+ while (TRUE) {
+ tmpbuf = g_malloc (tmpbufsize);
+
+ /* Set the first byte to something other than '\0', to be able to
+ * recognize whether strftime actually failed or just returned "".
+ */
+ tmpbuf[0] = '\1';
+ tmplen = strftime (tmpbuf, tmpbufsize, locale_format, tm);
+
+ if ((tmplen == 0) && (tmpbuf[0] != '\0')) {
+ g_free (tmpbuf);
+ tmpbufsize *= 2;
+
+ if (tmpbufsize > 65536) {
+ g_warning (G_STRLOC "Maximum buffer size for gth_datetime_strftime exceeded: giving up\n");
+ g_free (locale_format);
+ return NULL;
+ }
+ }
+ else
+ break;
+ }
+ g_free (locale_format);
+
+ retval = g_locale_to_utf8 (tmpbuf, tmplen, NULL, NULL, &error);
+ if (error != NULL) {
+ g_warning (G_STRLOC "Error converting results of strftime to UTF-8: %s\n", error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ g_free (tmpbuf);
+
+ return retval;
+}
+
+
int
_g_time_val_cmp (GTimeVal *a,
GTimeVal *b)
@@ -455,7 +513,6 @@ _g_time_val_to_exif_date (GTimeVal *time_)
secs = time_->tv_sec;
tm = localtime (&secs);
-
retval = g_strdup_printf ("%4d:%02d:%02d %02d:%02d:%02d",
tm->tm_year + 1900,
tm->tm_mon + 1,
@@ -468,6 +525,19 @@ _g_time_val_to_exif_date (GTimeVal *time_)
}
+char *
+_g_time_val_strftime (GTimeVal *time_,
+ const char *format)
+{
+ time_t secs;
+ struct tm *tm;
+
+ secs = time_->tv_sec;
+ tm = localtime (&secs);
+ return struct_tm_strftime (tm, format);
+}
+
+
/* Bookmark file utils */
diff --git a/gthumb/glib-utils.h b/gthumb/glib-utils.h
index f0ed738..ac4a09c 100644
--- a/gthumb/glib-utils.h
+++ b/gthumb/glib-utils.h
@@ -126,12 +126,16 @@ void performance (const char *file,
/* GTimeVal utils */
+char * struct_tm_strftime (struct tm *tm,
+ const char *format);
int _g_time_val_cmp (GTimeVal *a,
GTimeVal *b);
void _g_time_val_reset (GTimeVal *time_);
gboolean _g_time_val_from_exif_date (const char *exif_date,
GTimeVal *time_);
char * _g_time_val_to_exif_date (GTimeVal *time_);
+char * _g_time_val_strftime (GTimeVal *time_,
+ const char *format);
/* Bookmark file utils */
diff --git a/gthumb/gth-metadata-provider-file.c b/gthumb/gth-metadata-provider-file.c
index d8dcaa7..5f85293 100644
--- a/gthumb/gth-metadata-provider-file.c
+++ b/gthumb/gth-metadata-provider-file.c
@@ -56,7 +56,7 @@ gth_metadata_provider_file_read (GthMetadataProvider *self,
g_free (value);
timeval_p = gth_file_data_get_modification_time (file_data);
- value = _g_time_val_to_exif_date (timeval_p);
+ value = _g_time_val_strftime (timeval_p, "%x %X");
g_file_info_set_attribute_string (file_data->info, "gth::file::display-mtime", value);
g_free (value);
diff --git a/gthumb/gth-time.c b/gthumb/gth-time.c
index c73a916..bca1bf8 100644
--- a/gthumb/gth-time.c
+++ b/gthumb/gth-time.c
@@ -22,6 +22,7 @@
#include <config.h>
#include <stdlib.h>
+#include "glib-utils.h"
#include "gth-time.h"
@@ -248,62 +249,12 @@ gth_datetime_to_struct_tm (GthDateTime *dt,
}
-/* started from the glib function g_date_strftime */
char *
gth_datetime_strftime (GthDateTime *dt,
const char *format)
{
- gsize locale_format_len = 0;
- char *locale_format;
- GError *error = NULL;
- struct tm tm;
- gsize tmpbufsize;
- char *tmpbuf;
- gsize tmplen;
- char *retval;
-
- locale_format = g_locale_from_utf8 (format, -1, NULL, &locale_format_len, &error);
- if (error != NULL) {
- g_warning (G_STRLOC "Error converting format to locale encoding: %s\n", error->message);
- g_error_free (error);
- return NULL;
- }
+ struct tm tm;
gth_datetime_to_struct_tm (dt, &tm);
- tmpbufsize = MAX (128, locale_format_len * 2);
- while (TRUE) {
- tmpbuf = g_malloc (tmpbufsize);
-
- /* Set the first byte to something other than '\0', to be able to
- * recognize whether strftime actually failed or just returned "".
- */
- tmpbuf[0] = '\1';
- tmplen = strftime (tmpbuf, tmpbufsize, locale_format, &tm);
-
- if ((tmplen == 0) && (tmpbuf[0] != '\0')) {
- g_free (tmpbuf);
- tmpbufsize *= 2;
-
- if (tmpbufsize > 65536) {
- g_warning (G_STRLOC "Maximum buffer size for gth_datetime_strftime exceeded: giving up\n");
- g_free (locale_format);
- return NULL;
- }
- }
- else
- break;
- }
- g_free (locale_format);
-
- retval = g_locale_to_utf8 (tmpbuf, tmplen, NULL, NULL, &error);
- if (error != NULL) {
- g_warning (G_STRLOC "Error converting results of strftime to UTF-8: %s\n", error->message);
- g_error_free (error);
- return NULL;
- }
-
- g_free (tmpbuf);
-
- return retval;
+ return struct_tm_strftime (&tm, format);
}
-
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]