X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-header-view-render.c;h=455c94ef15d72b6c1785300b74b2ec599c7606dc;hp=f1a72aa5712f67bcb55cea6851bf060b0516ed3e;hb=HEAD;hpb=659ff05d601f9f666a5925c1bae6965163aca716 diff --git a/src/widgets/modest-header-view-render.c b/src/widgets/modest-header-view-render.c index f1a72aa..455c94e 100644 --- a/src/widgets/modest-header-view-render.c +++ b/src/widgets/modest-header-view-render.c @@ -43,11 +43,13 @@ #include #ifdef MODEST_TOOLKIT_HILDON2 -#define SMALL_ICON_SIZE MODEST_ICON_SIZE_XSMALL +#define SMALL_ICON_SIZE MODEST_ICON_SIZE_SMALL #else #define SMALL_ICON_SIZE MODEST_ICON_SIZE_SMALL #endif +#define MODEST_HEADER_VIEW_MAX_TEXT_LENGTH 128 + static const gchar * get_status_string (ModestTnySendQueueStatus status) { @@ -71,7 +73,7 @@ get_status_string (ModestTnySendQueueStatus status) } static GdkPixbuf* -get_pixbuf_for_flag (TnyHeaderFlags flag) +get_pixbuf_for_flag (TnyHeaderFlags flag, gboolean is_calendar) { /* optimization */ static GdkPixbuf *deleted_pixbuf = NULL; @@ -80,6 +82,14 @@ get_pixbuf_for_flag (TnyHeaderFlags flag) static GdkPixbuf *attachments_pixbuf = NULL; static GdkPixbuf *high_pixbuf = NULL; static GdkPixbuf *low_pixbuf = NULL; + static GdkPixbuf *calendar_pixbuf = NULL; + + if (is_calendar) { + if (G_UNLIKELY(!calendar_pixbuf)) + calendar_pixbuf = modest_platform_get_icon (MODEST_HEADER_ICON_CALENDAR, + SMALL_ICON_SIZE); + return calendar_pixbuf; + } switch (flag) { case TNY_HEADER_FLAG_DELETED: @@ -127,14 +137,33 @@ set_common_flags (GtkCellRenderer *renderer, TnyHeaderFlags flags) } static void -set_cell_text (GtkCellRenderer *renderer, - const gchar *text, +set_cell_text (GtkCellRenderer *renderer, + const gchar *text, TnyHeaderFlags flags) { gboolean strikethrough; gboolean bold_is_active_color; - GdkColor *color; + GdkColor *color = NULL; PangoWeight weight; + gchar *newtext = NULL; + + /* We have to limit the size of the text. Otherwise Pango + could cause freezes trying to render too large texts. This + prevents DoS attacks with specially malformed emails */ + if (g_utf8_validate(text, -1, NULL)) { + if (g_utf8_strlen (text, -1) > MODEST_HEADER_VIEW_MAX_TEXT_LENGTH) { + /* UTF-8 bytes are 4 bytes length in the worst case */ + newtext = g_malloc0 (MODEST_HEADER_VIEW_MAX_TEXT_LENGTH * 4); + g_utf8_strncpy (newtext, text, MODEST_HEADER_VIEW_MAX_TEXT_LENGTH); + text = newtext; + } + } else { + if (strlen (text) > MODEST_HEADER_VIEW_MAX_TEXT_LENGTH) { + newtext = g_malloc0 (MODEST_HEADER_VIEW_MAX_TEXT_LENGTH); + strncpy (newtext, text, MODEST_HEADER_VIEW_MAX_TEXT_LENGTH); + text = newtext; + } + } bold_is_active_color = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (renderer), BOLD_IS_ACTIVE_COLOR)); if (bold_is_active_color) { @@ -165,6 +194,10 @@ set_cell_text (GtkCellRenderer *renderer, NULL); } } + + if (newtext) + g_free (newtext); + g_object_thaw_notify (G_OBJECT (renderer)); } @@ -179,7 +212,7 @@ _modest_header_view_attach_cell_data (GtkTreeViewColumn *column, GtkCellRenderer if (flags & TNY_HEADER_FLAG_ATTACHMENTS) g_object_set (G_OBJECT (renderer), "pixbuf", - get_pixbuf_for_flag (TNY_HEADER_FLAG_ATTACHMENTS), + get_pixbuf_for_flag (TNY_HEADER_FLAG_ATTACHMENTS, FALSE), NULL); } @@ -241,14 +274,14 @@ _modest_header_view_sender_receiver_cell_data (GtkTreeViewColumn *column, sender_receiver_col = TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN; else sender_receiver_col = TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN; - + gtk_tree_model_get (tree_model, iter, sender_receiver_col, &address, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, -1); - + modest_text_utils_get_display_address (address); /* string is changed in-place */ - + set_cell_text (renderer, (address && address[0] != '\0')?address:_("mail_va_no_to"), flags); g_free (address); @@ -262,27 +295,22 @@ void _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCellRenderer *renderer, GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer user_data) { - /* Note that GtkTreeModel is a GtkTreeModelFilter. */ - - /* printf ("DEBUG: %s: tree_model gtype=%s\n", __FUNCTION__, G_OBJECT_TYPE_NAME (tree_model)); */ - TnyHeaderFlags flags = 0; - gchar *address = NULL; + gchar *recipients = NULL, *addresses; gchar *subject = NULL; time_t date; - -#ifdef MAEMO_CHANGES -#ifdef HAVE_GTK_TREE_VIEW_COLUMN_GET_CELL_DATA_HINT - GtkTreeCellDataHint hint; -#endif -#endif - GtkCellRenderer *recipient_cell, *date_or_status_cell, *subject_cell, *attach_cell, *priority_cell, *recipient_box, *subject_box = NULL; TnyHeader *msg_header = NULL; TnyHeaderFlags prio = 0; + gboolean is_calendar = FALSE; +#ifdef MAEMO_CHANGES +#ifdef HAVE_GTK_TREE_VIEW_COLUMN_GET_CELL_DATA_HINT + GtkTreeCellDataHint hint; +#endif +#endif g_return_if_fail (GTK_IS_TREE_VIEW_COLUMN (column)); g_return_if_fail (GTK_IS_CELL_RENDERER (renderer)); @@ -296,7 +324,7 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe return; #endif #endif - + recipient_box = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (renderer), "recpt-box-renderer")); subject_box = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (renderer), "subject-box-renderer")); priority_cell = GTK_CELL_RENDERER (g_object_get_data (G_OBJECT (subject_box), "priority-renderer")); @@ -310,7 +338,7 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe if (header_mode == MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_IN) gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, - TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, &address, + TNY_GTK_HEADER_LIST_MODEL_FROM_COLUMN, &recipients, TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject, TNY_GTK_HEADER_LIST_MODEL_DATE_RECEIVED_TIME_T_COLUMN, &date, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &msg_header, @@ -318,7 +346,7 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe else gtk_tree_model_get (tree_model, iter, TNY_GTK_HEADER_LIST_MODEL_FLAGS_COLUMN, &flags, - TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, &address, + TNY_GTK_HEADER_LIST_MODEL_TO_COLUMN, &recipients, TNY_GTK_HEADER_LIST_MODEL_SUBJECT_COLUMN, &subject, TNY_GTK_HEADER_LIST_MODEL_DATE_SENT_TIME_T_COLUMN, &date, TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &msg_header, @@ -327,28 +355,32 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe /* FIXME: we might gain something by doing all the g_object_set's at once */ if (flags & TNY_HEADER_FLAG_ATTACHMENTS) g_object_set (G_OBJECT (attach_cell), "pixbuf", - get_pixbuf_for_flag (TNY_HEADER_FLAG_ATTACHMENTS), + get_pixbuf_for_flag (TNY_HEADER_FLAG_ATTACHMENTS, FALSE), NULL); else g_object_set (G_OBJECT (attach_cell), "pixbuf", NULL, NULL); - if (msg_header) + is_calendar = tny_header_get_user_flag (msg_header, "calendar"); + if (msg_header) { prio = tny_header_get_priority (msg_header); + } + g_object_set (G_OBJECT (priority_cell), "pixbuf", - get_pixbuf_for_flag (prio), + get_pixbuf_for_flag (prio, is_calendar), NULL); set_cell_text (subject_cell, (subject && subject[0] != 0)?subject:_("mail_va_no_subject"), flags); g_free (subject); - /* FIXME: we hardcode the color to #666666; instead we should use SecondaryTextColour from the - * theme (gtkrc file) */ - modest_text_utils_get_display_address (address); /* changed in-place */ - set_cell_text (recipient_cell, (address && address[0] != '\0')?address:_("mail_va_no_to"), flags); - g_free (address); - + /* Show the list of senders/recipients */ + addresses = modest_text_utils_get_display_addresses ((const gchar *) recipients); + set_cell_text (recipient_cell, (addresses) ? addresses : _("mail_va_no_to"), flags); + g_free (addresses); + g_free (recipients); + + /* Show status (outbox folder) or sent date */ if (header_mode == MODEST_HEADER_VIEW_COMPACT_HEADER_MODE_OUTBOX) { ModestTnySendQueueStatus status = MODEST_TNY_SEND_QUEUE_UNKNOWN; const gchar *status_str = ""; @@ -358,7 +390,7 @@ _modest_header_view_compact_header_cell_data (GtkTreeViewColumn *column, GtkCe tny_header_set_flag (msg_header, TNY_HEADER_FLAG_SUSPENDED); } } - + status_str = get_status_string (status); set_cell_text (date_or_status_cell, status_str, flags); } else {