[evolution] Bug #730199 - [MessageList] Support dates with value larger than 2^32



commit b3819be9f7cc1f1f522e7fb4007c48c25ed09b0b
Author: Milan Crha <mcrha redhat com>
Date:   Fri May 23 18:57:12 2014 +0200

    Bug #730199 - [MessageList] Support dates with value larger than 2^32

 calendar/gui/e-memo-table.c    |    4 --
 e-util/e-cell-date.c           |   13 ++++++--
 e-util/e-table-extras.c        |   12 ++++++++
 e-util/e-table-sorting-utils.c |   18 +++++++++++
 mail/message-list.c            |   62 ++++++++++++++++++++++++++++++---------
 mail/message-list.etspec       |    6 ++--
 6 files changed, 89 insertions(+), 26 deletions(-)
---
diff --git a/calendar/gui/e-memo-table.c b/calendar/gui/e-memo-table.c
index c71c22c..092ea37 100644
--- a/calendar/gui/e-memo-table.c
+++ b/calendar/gui/e-memo-table.c
@@ -400,10 +400,6 @@ memo_table_constructed (GObject *object)
        cell = e_table_extras_get_cell (extras, "date");
        e_cell_date_set_format_component (E_CELL_DATE (cell), "calendar");
 
-       /* set proper format component for a default 'date' cell renderer */
-       cell = e_table_extras_get_cell (extras, "date");
-       e_cell_date_set_format_component (E_CELL_DATE (cell), "calendar");
-
        /* Construct the table */
 
        etspecfile = g_build_filename (
diff --git a/e-util/e-cell-date.c b/e-util/e-cell-date.c
index 973ae39..610151a 100644
--- a/e-util/e-cell-date.c
+++ b/e-util/e-cell-date.c
@@ -43,10 +43,12 @@ ecd_get_text (ECellText *cell,
               gint col,
               gint row)
 {
-       time_t date = GPOINTER_TO_INT (e_table_model_value_at (model, col, row));
+       gint64 *pdate = e_table_model_value_at (model, col, row);
        const gchar *fmt_component, *fmt_part = NULL;
+       gchar *res;
 
-       if (date == 0) {
+       if (!pdate || *pdate == 0) {
+               e_table_model_free_value (model, col, pdate);
                return g_strdup (_("?"));
        }
 
@@ -56,8 +58,11 @@ ecd_get_text (ECellText *cell,
        else
                fmt_part = "table";
 
-       return e_datetime_format_format (
-               fmt_component, fmt_part, DTFormatKindDateTime, date);
+       res = e_datetime_format_format (fmt_component, fmt_part, DTFormatKindDateTime, (time_t) *pdate);
+
+       e_table_model_free_value (model, col, pdate);
+
+       return res;
 }
 
 static void
diff --git a/e-util/e-table-extras.c b/e-util/e-table-extras.c
index b631dbd..07f81ba 100644
--- a/e-util/e-table-extras.c
+++ b/e-util/e-table-extras.c
@@ -107,6 +107,15 @@ e_strint_compare (gconstpointer data1,
        return e_int_compare (GINT_TO_POINTER (int1), GINT_TO_POINTER (int2));
 }
 
+static gint
+e_int64ptr_compare (gconstpointer data1,
+                   gconstpointer data2)
+{
+       const gint64 *pa = data1, *pb = data2;
+
+       return (*pa == *pb) ? 0 : (*pa < *pb) ? -1 : 1;
+}
+
 /* UTF-8 strncasecmp - not optimized */
 
 static gint
@@ -276,6 +285,9 @@ e_table_extras_init (ETableExtras *extras)
        e_table_extras_add_compare (
                extras, "string-integer",
                (GCompareDataFunc) e_strint_compare);
+       e_table_extras_add_compare (
+               extras, "pointer-integer64",
+               (GCompareDataFunc) e_int64ptr_compare);
 
        e_table_extras_add_search (extras, "string", e_string_search);
 
diff --git a/e-util/e-table-sorting-utils.c b/e-util/e-table-sorting-utils.c
index 494ebf4..972a3fc 100644
--- a/e-util/e-table-sorting-utils.c
+++ b/e-util/e-table-sorting-utils.c
@@ -391,6 +391,24 @@ e_table_sorting_utils_tree_sort (ETreeModel *source,
                map_table[i] = map_copy[map[i]];
        }
 
+       for (j = 0; j < cols; j++) {
+               ETableColumnSpecification *spec;
+               ETableCol *col;
+
+               spec = e_table_sort_info_sorting_get_nth (
+                       sort_info, j, &closure.sort_type[j]);
+
+               col = e_table_header_get_column_by_spec (full_header, spec);
+               if (col == NULL) {
+                       gint last = e_table_header_count (full_header) - 1;
+                       col = e_table_header_get_column (full_header, last);
+               }
+
+               for (i = 0; i < count; i++) {
+                       e_tree_model_free_value (source, col->spec->compare_col, closure.vals[i * cols + j]);
+               }
+       }
+
        g_free (map);
        g_free (map_copy);
 
diff --git a/mail/message-list.c b/mail/message-list.c
index 571788b..72f4893 100644
--- a/mail/message-list.c
+++ b/mail/message-list.c
@@ -1650,10 +1650,15 @@ ml_tree_value_at_ex (ETreeModel *etm,
 
                tag = camel_message_info_user_tag (msg_info, "due-by");
                if (tag && *tag) {
+                       gint64 *res;
+
                        due_by = camel_header_decode_date (tag, NULL);
-                       return GINT_TO_POINTER (due_by);
+                       res = g_new0 (gint64, 1);
+                       *res = (gint64) due_by;
+
+                       return res;
                } else {
-                       return GINT_TO_POINTER (0);
+                       return NULL;
                }
        }
        case COL_FOLLOWUP_FLAG:
@@ -1678,21 +1683,31 @@ ml_tree_value_at_ex (ETreeModel *etm,
                return (gpointer) get_normalised_string (message_list, msg_info, col);
        case COL_SENT: {
                struct LatestData ld;
+               gint64 *res;
+
                ld.sent = TRUE;
                ld.latest = 0;
 
                for_node_and_subtree_if_collapsed (message_list, node, msg_info, latest_foreach, &ld);
 
-               return GINT_TO_POINTER (ld.latest);
+               res = g_new0 (gint64, 1);
+               *res = (gint64) ld.latest;
+
+               return res;
        }
        case COL_RECEIVED: {
                struct LatestData ld;
+               gint64 *res;
+
                ld.sent = FALSE;
                ld.latest = 0;
 
                for_node_and_subtree_if_collapsed (message_list, node, msg_info, latest_foreach, &ld);
 
-               return GINT_TO_POINTER (ld.latest);
+               res = g_new0 (gint64, 1);
+               *res = (gint64) ld.latest;
+
+               return res;
        }
        case COL_TO:
                str = camel_message_info_to (msg_info);
@@ -1850,17 +1865,18 @@ ml_tree_value_at_ex (ETreeModel *etm,
 }
 
 static gchar *
-filter_date (time_t date)
+filter_date (const gint64 *pdate)
 {
        time_t nowdate = time (NULL);
-       time_t yesdate;
+       time_t yesdate, date;
        struct tm then, now, yesterday;
        gchar buf[26];
        gboolean done = FALSE;
 
-       if (date == 0)
+       if (!pdate || *pdate == 0)
                return g_strdup (_("?"));
 
+       date = (time_t) *pdate;
        localtime_r (&date, &then);
        localtime_r (&nowdate, &now);
        if (then.tm_mday == now.tm_mday &&
@@ -2913,6 +2929,7 @@ message_list_sort_value_at (ETreeModel *tree_model,
 {
        MessageList *message_list;
        struct LatestData ld;
+       gint64 *res;
 
        message_list = MESSAGE_LIST (tree_model);
 
@@ -2930,7 +2947,11 @@ message_list_sort_value_at (ETreeModel *tree_model,
                e_tree_model_node_traverse (
                        tree_model, path, latest_foreach, &ld);
 
-       return GINT_TO_POINTER (ld.latest);
+
+       res = g_new0 (gint64, 1);
+       *res = (gint64) ld.latest;
+
+       return res;
 }
 
 static gpointer
@@ -2965,12 +2986,9 @@ message_list_duplicate_value (ETreeModel *tree_model,
                case COL_ATTACHMENT:
                case COL_DELETED:
                case COL_UNREAD:
-               case COL_SENT:
-               case COL_RECEIVED:
                case COL_SIZE:
                case COL_FOLLOWUP_FLAG:
                case COL_FOLLOWUP_FLAG_STATUS:
-               case COL_FOLLOWUP_DUE_BY:
                        return (gpointer) value;
 
                case COL_FROM:
@@ -2984,6 +3002,20 @@ message_list_duplicate_value (ETreeModel *tree_model,
                case COL_LABELS:
                        return g_strdup (value);
 
+               case COL_SENT:
+               case COL_RECEIVED:
+               case COL_FOLLOWUP_DUE_BY:
+                       if (value) {
+                               gint64 *res;
+                               const gint64 *pvalue = value;
+
+                               res = g_new0 (gint64, 1);
+                               *res = *pvalue;
+
+                               return res;
+                       } else
+                               return value;
+
                default:
                        g_return_val_if_reached (NULL);
        }
@@ -3001,12 +3033,9 @@ message_list_free_value (ETreeModel *tree_model,
                case COL_ATTACHMENT:
                case COL_DELETED:
                case COL_UNREAD:
-               case COL_SENT:
-               case COL_RECEIVED:
                case COL_SIZE:
                case COL_FOLLOWUP_FLAG:
                case COL_FOLLOWUP_FLAG_STATUS:
-               case COL_FOLLOWUP_DUE_BY:
                case COL_FROM:
                case COL_FROM_NORM:
                case COL_TO:
@@ -3023,6 +3052,9 @@ message_list_free_value (ETreeModel *tree_model,
                case COL_MIXED_SENDER:
                case COL_MIXED_RECIPIENTS:
                case COL_LABELS:
+               case COL_SENT:
+               case COL_RECEIVED:
+               case COL_FOLLOWUP_DUE_BY:
                        g_free (value);
                        break;
 
@@ -3133,7 +3165,7 @@ message_list_value_to_string (ETreeModel *tree_model,
                case COL_SENT:
                case COL_RECEIVED:
                case COL_FOLLOWUP_DUE_BY:
-                       return filter_date (GPOINTER_TO_INT (value));
+                       return filter_date (value);
 
                case COL_SIZE:
                        return filter_size (GPOINTER_TO_INT (value));
diff --git a/mail/message-list.etspec b/mail/message-list.etspec
index 8d2a10e..efbf8c4 100644
--- a/mail/message-list.etspec
+++ b/mail/message-list.etspec
@@ -11,9 +11,9 @@
 
   <ETableColumn model_col="5" compare_col="21" _title="Subject" expansion="1.6" minimum_width="32" 
resizable="true" cell="render_tree" compare="string" search="string"/>
 
-  <ETableColumn model_col="6" _title="Date" expansion="0.4" minimum_width="32" resizable="true" 
cell="render_date" compare="integer"/>
+  <ETableColumn model_col="6" _title="Date" expansion="0.4" minimum_width="32" resizable="true" 
cell="render_date" compare="pointer-integer64"/>
 
-  <ETableColumn model_col="7" _title="Received" expansion="0.4" minimum_width="32" resizable="true" 
cell="render_date" compare="integer"/>
+  <ETableColumn model_col="7" _title="Received" expansion="0.4" minimum_width="32" resizable="true" 
cell="render_date" compare="pointer-integer64"/>
 
   <ETableColumn model_col="8" compare_col="22" _title="To" expansion="1.0" minimum_width="32" 
resizable="true" cell="render_text" compare="address_compare" search="string" priority="5"/>
 
@@ -23,7 +23,7 @@
 
   <ETableColumn model_col="11" _title="Follow Up Flag" expansion="0.2" minimum_width="32" resizable="true" 
cell="render_text" compare="collate"/>
 
-  <ETableColumn model_col="12" _title="Due By" expansion="0.2" minimum_width="32" resizable="true" 
cell="render_date" compare="integer"/>
+  <ETableColumn model_col="12" _title="Due By" expansion="0.2" minimum_width="32" resizable="true" 
cell="render_date" compare="pointer-integer64"/>
 
   <ETableColumn model_col="13" _title="Location" expansion="0.2" minimum_width="32" resizable="true" 
cell="render_text" compare="collate"/>
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]