Fix modest_tny_msg_header_get_all_recipients_list (in case from is empty)
[modest] / src / modest-datetime-formatter.c
index 2a4e73b..db50dc1 100644 (file)
 #include <modest-datetime-formatter.h>
 #ifdef MODEST_TOOLKIT_HILDON2
 #include <gconf/gconf-client.h>
-#include <glib/gi18n.h>
-#include <modest-text-utils.h>
 #include <gtk/gtkmarshal.h>
 #endif
+#include <glib/gi18n.h>
+#include "modest-text-utils.h"
+#ifdef MODEST_USE_LIBTIME
+#include <clockd/libtime.h>
+#include <libosso.h>
+#include <modest-platform.h>
+#endif
 
 typedef enum {
        DATETIME_FORMAT_12H,
@@ -42,7 +47,8 @@ typedef enum {
        DATETIME_FORMAT_LOCALE,
 } DatetimeFormat;
 
-#define HILDON2_GCONF_FORMAT_KEY "/apps/clock/time-format"
+#define HILDON2_GCONF_FORMAT_DIR "/apps/clock"
+#define HILDON2_GCONF_FORMAT_KEY HILDON2_GCONF_FORMAT_DIR "/time-format"
 
 /* 'private'/'protected' functions */
 static void   modest_datetime_formatter_class_init (ModestDatetimeFormatterClass *klass);
@@ -115,7 +121,7 @@ modest_datetime_formatter_class_init (ModestDatetimeFormatterClass *klass)
                              G_SIGNAL_RUN_FIRST,
                              G_STRUCT_OFFSET (ModestDatetimeFormatterClass, format_changed),
                              NULL, NULL,
-                             gtk_marshal_VOID__VOID,
+                             g_cclosure_marshal_VOID__VOID,
                              G_TYPE_NONE, 0);
 }
 
@@ -124,7 +130,7 @@ static void
 update_format (ModestDatetimeFormatter *obj)
 {
        GConfClient *gconf;
-       GError *error = NULL;
+       GError *err = NULL;
        gboolean gconf_value;
        ModestDatetimeFormatterPrivate *priv;
 
@@ -132,11 +138,11 @@ update_format (ModestDatetimeFormatter *obj)
 
        gconf = gconf_client_get_default ();
        gconf_value = gconf_client_get_bool (gconf, HILDON2_GCONF_FORMAT_KEY,
-                                            &error);
+                                            &err);
 
-       if (error != NULL) {
-               g_warning ("Error reading time format in gconf %s", error->message);
-               g_error_free (error);
+       if (err != NULL) {
+               g_warning ("Error reading time format in gconf %s", err->message);
+               g_error_free (err);
        } else {
                priv->current_format = gconf_value?DATETIME_FORMAT_24H:DATETIME_FORMAT_12H;
        }
@@ -155,6 +161,15 @@ clock_format_changed (GConfClient *gconf,
 }
 #endif
 
+#ifdef MODEST_USE_LIBTIME
+static void 
+time_changed_cb (gpointer userdata)
+{
+       time_get_synced ();
+       g_signal_emit (G_OBJECT (userdata), signals[FORMAT_CHANGED_SIGNAL], 0);
+}
+#endif
+
 static void
 init_format (ModestDatetimeFormatter *obj)
 {
@@ -166,28 +181,36 @@ init_format (ModestDatetimeFormatter *obj)
 
 #ifdef MODEST_TOOLKIT_HILDON2
        GConfClient *gconf;
-       GError *error = NULL;
+       GError *err = NULL;
 
        gconf = gconf_client_get_default ();
+       gconf_client_add_dir (gconf, HILDON2_GCONF_FORMAT_DIR,
+                             GCONF_CLIENT_PRELOAD_ONELEVEL,
+                             &err);
        priv->gconf_handler = gconf_client_notify_add (gconf, HILDON2_GCONF_FORMAT_KEY,
                                                       clock_format_changed, (gpointer) obj,
-                                                      NULL, &error);
+                                                      NULL, &err);
 
-       if (error != NULL) {
-               g_warning ("Error listening to time format in gconf %s", error->message);
-               g_error_free (error);
+       if (err != NULL) {
+               g_warning ("Error listening to time format in gconf %s", err->message);
+               g_error_free (err);
        }
+
        update_format (obj);
 #endif
+
+#ifdef MODEST_USE_LIBTIME
+       osso_time_set_notification_cb (modest_platform_get_osso_context (),
+                                      time_changed_cb,
+                                      obj);
+       time_get_synced ();
+#endif
+
 }
 
 static void
 modest_datetime_formatter_instance_init (ModestDatetimeFormatter *obj)
 {
-       ModestDatetimeFormatterPrivate *priv;
-
-       priv = MODEST_DATETIME_FORMATTER_GET_PRIVATE (obj);
-
        init_format (obj);
 }
 
@@ -196,11 +219,20 @@ modest_datetime_formatter_finalize   (GObject *obj)
 {
 #ifdef MODEST_TOOLKIT_HILDON2
        ModestDatetimeFormatterPrivate *priv;
+       GConfClient *gconf;
 
        priv = MODEST_DATETIME_FORMATTER_GET_PRIVATE (obj);
-       gconf_client_notify_remove (gconf_client_get_default (),
+       gconf = gconf_client_get_default ();
+       gconf_client_notify_remove (gconf,
                                    priv->gconf_handler);
        priv->gconf_handler = 0;
+       gconf_client_remove_dir (gconf, HILDON2_GCONF_FORMAT_DIR,
+                                NULL);
+
+       /* Disconnect notification */
+#ifdef MODEST_USE_LIBTIME
+       osso_time_set_notification_cb (modest_platform_get_osso_context (), NULL, NULL);
+#endif
 #endif
        G_OBJECT_CLASS (parent_class)->finalize (obj);
 }
@@ -248,15 +280,22 @@ modest_datetime_formatter_format_time (ModestDatetimeFormatter *self,
        ModestDatetimeFormatterPrivate *priv;
        const gchar *format_string = NULL;
        gboolean is_pm;
+       struct tm localtime_tm = {0, };
 
        g_return_val_if_fail (MODEST_IS_DATETIME_FORMATTER (self), NULL);
        priv = MODEST_DATETIME_FORMATTER_GET_PRIVATE (self);
-
-       is_pm = (date / (60 * 60 * 12)) % 2;
+#ifdef MODEST_USE_LIBTIME
+       time_get_local_ex (date, &localtime_tm);
+#else
+       time_t date_copy;
+       date_copy = date;
+       localtime_r (&date_copy, &localtime_tm);
+#endif
+       is_pm = (localtime_tm.tm_hour/12) % 2;
 
        switch (priv->current_format) {
        case DATETIME_FORMAT_12H:
-               format_string = is_pm?_HL("wdgt_12h_time_pm"):_HL("wdgt_12h_time_am");
+               format_string = is_pm?_HL("wdgt_va_12h_time_pm"):_HL("wdgt_va_12h_time_am");
                break;
        case DATETIME_FORMAT_24H:
                format_string = _HL("wdgt_va_24h_time");
@@ -271,14 +310,45 @@ modest_datetime_formatter_format_time (ModestDatetimeFormatter *self,
 }
 
 const gchar *
+modest_datetime_formatter_display_long_datetime (ModestDatetimeFormatter *self,
+                                                time_t date)
+{
+
+#define DATE_BUF_DOUBLE_SIZE 128 
+
+       static gchar date_buf[DATE_BUF_DOUBLE_SIZE];
+       
+       snprintf (date_buf, DATE_BUF_DOUBLE_SIZE, 
+                 "%s %s", modest_datetime_formatter_format_date (self, date), 
+                 modest_datetime_formatter_format_time (self, date));
+
+       return date_buf;
+}
+
+const gchar *
 modest_datetime_formatter_display_datetime (ModestDatetimeFormatter *self,
                                            time_t date)
 {
 
-       int day = time (NULL) / (24*60*60);
-       int date_day = date / (24*60*60);
+       struct tm today_localtime_tm = {0, };
+       struct tm date_localtime_tm = {0, };
+       time_t today;
+
+       today = time (NULL);
+#ifdef MODEST_USE_LIBTIME
+       time_get_local_ex (today, &today_localtime_tm);
+       time_get_local_ex (date, &date_localtime_tm);
+#else
+       time_t date_copy;
+       date_copy = today;
+       localtime_r (&date_copy, &today_localtime_tm);
+       date_copy = date;
+       localtime_r (&date_copy, &date_localtime_tm);
+#endif
 
-       if (day == date_day)
+       if (today_localtime_tm.tm_mday == date_localtime_tm.tm_mday &&
+           today_localtime_tm.tm_mon == date_localtime_tm.tm_mon &&
+           today_localtime_tm.tm_year == date_localtime_tm.tm_year)
                return modest_datetime_formatter_format_time (self, date);
        else
                return modest_datetime_formatter_format_date (self, date);