X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-attachment-view.c;h=3628204cdeb2c4f548e4974bc7e7f73d5a3d64f0;hp=ad94f8bc5841a1734c9dd5b424d79a4e26733609;hb=b3189f988bc953765fd3cdb325c4dd883ac9f608;hpb=947a72ce12b61b0dabe64b7e06de3841ff11bf9b diff --git a/src/widgets/modest-attachment-view.c b/src/widgets/modest-attachment-view.c index ad94f8b..3628204 100644 --- a/src/widgets/modest-attachment-view.c +++ b/src/widgets/modest-attachment-view.c @@ -38,17 +38,18 @@ #include #include #include +#include +#include +#include +#include -static GObjectClass *parent_class = NULL; +#define GET_SIZE_BUFFER_SIZE 128 -/* /\* signals *\/ */ -/* enum { */ -/* LAST_SIGNAL */ -/* }; */ +static GObjectClass *parent_class = NULL; -typedef struct _ModestAttachmentViewPriv ModestAttachmentViewPriv; +typedef struct _ModestAttachmentViewPrivate ModestAttachmentViewPrivate; -struct _ModestAttachmentViewPriv +struct _ModestAttachmentViewPrivate { TnyMimePart *mime_part; @@ -61,16 +62,14 @@ struct _ModestAttachmentViewPriv guint64 size; PangoLayout *layout_full_filename; + gboolean is_purged; }; #define UNKNOWN_FILE_ICON "qgn_list_gene_unknown_file" -#define GET_SIZE_BUFFER_SIZE 128 #define MODEST_ATTACHMENT_VIEW_GET_PRIVATE(o) \ - (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_ATTACHMENT_VIEW, ModestAttachmentViewPriv)) - -/* static guint signals[LAST_SIGNAL] = {0}; */ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), MODEST_TYPE_ATTACHMENT_VIEW, ModestAttachmentViewPrivate)) /* TnyMimePartView functions */ static TnyMimePart *modest_attachment_view_get_part (TnyMimePartView *self); @@ -91,10 +90,65 @@ static void tny_mime_part_view_init (gpointer g, gpointer iface_data); -static gboolean get_size_idle_func (gpointer data); static void update_filename_request (ModestAttachmentView *self); +static gboolean +idle_get_mime_part_size_cb (gpointer userdata) +{ + ModestAttachmentView *view = (ModestAttachmentView *) userdata; + ModestAttachmentViewPrivate *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (view); + gchar *size_str; + gchar *label_text; + gdk_threads_enter (); + + if (GTK_WIDGET_VISIBLE (view)) { + size_str = modest_text_utils_get_display_size (priv->size); + label_text = g_strdup_printf (" (%s)", size_str); + g_free (size_str); + gtk_label_set_text (GTK_LABEL (priv->size_view), label_text); + g_free (label_text); + } + + gdk_threads_leave (); + + g_object_unref (view); + + return FALSE; +} + +static gpointer +get_mime_part_size_thread (gpointer thr_user_data) +{ + ModestAttachmentView *view = (ModestAttachmentView *) thr_user_data; + ModestAttachmentViewPrivate *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (view); + gchar read_buffer[GET_SIZE_BUFFER_SIZE]; + TnyStream *stream; + gssize readed_size; + gssize total = 0; + + stream = tny_camel_mem_stream_new (); + tny_mime_part_decode_to_stream (priv->mime_part, stream); + tny_stream_reset (stream); + if (tny_stream_is_eos (stream)) { + tny_stream_close (stream); + stream = tny_mime_part_get_stream (priv->mime_part); + } + + while (!tny_stream_is_eos (stream)) { + readed_size = tny_stream_read (stream, read_buffer, GET_SIZE_BUFFER_SIZE); + total += readed_size; + } + + priv->size = total; + + g_idle_add (idle_get_mime_part_size_cb, g_object_ref (view)); + + g_object_unref (stream); + g_object_unref (view); + + return NULL; +} static TnyMimePart * modest_attachment_view_get_part (TnyMimePartView *self) @@ -105,7 +159,7 @@ modest_attachment_view_get_part (TnyMimePartView *self) static TnyMimePart * modest_attachment_view_get_part_default (TnyMimePartView *self) { - ModestAttachmentViewPriv *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (self); + ModestAttachmentViewPrivate *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (self); if (priv->mime_part) return TNY_MIME_PART (g_object_ref (priv->mime_part)); @@ -116,7 +170,7 @@ modest_attachment_view_get_part_default (TnyMimePartView *self) static void update_filename_request (ModestAttachmentView *self) { - ModestAttachmentViewPriv *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (self); + ModestAttachmentViewPrivate *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (self); /* gint width, height; */ pango_layout_set_text (PANGO_LAYOUT (priv->layout_full_filename), @@ -133,48 +187,13 @@ modest_attachment_view_set_part (TnyMimePartView *self, TnyMimePart *mime_part) } -static gboolean -get_size_idle_func (gpointer data) -{ - ModestAttachmentView *self = (ModestAttachmentView *) data; - ModestAttachmentViewPriv *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (self); - gssize readed_size; - gchar read_buffer[GET_SIZE_BUFFER_SIZE]; - gchar *size_string; - - if (priv->get_size_stream == NULL) { - priv->get_size_stream = tny_mime_part_get_stream (priv->mime_part); - } - - readed_size = tny_stream_read (priv->get_size_stream, read_buffer, GET_SIZE_BUFFER_SIZE); - priv->size += readed_size; - - if (tny_stream_is_eos (priv->get_size_stream)) { - gchar *display_size; - - display_size = modest_text_utils_get_display_size (priv->size); - size_string = g_strdup_printf (" (%s)", display_size); - g_free (display_size); - gtk_label_set_text (GTK_LABEL (priv->size_view), size_string); - g_free (size_string); - - g_object_unref (priv->get_size_stream); - - gtk_widget_queue_resize (priv->size_view); - priv->get_size_stream = NULL; - priv->get_size_idle_id = 0; - } - - return (priv->get_size_stream != NULL); - -} - static void modest_attachment_view_set_part_default (TnyMimePartView *self, TnyMimePart *mime_part) { - ModestAttachmentViewPriv *priv = NULL; - const gchar *filename = NULL; + ModestAttachmentViewPrivate *priv = NULL; + gchar *filename = NULL; gchar *file_icon_name = NULL; + gboolean show_size = FALSE; g_return_if_fail (TNY_IS_MIME_PART_VIEW (self)); g_return_if_fail (TNY_IS_MIME_PART (mime_part)); @@ -186,32 +205,32 @@ modest_attachment_view_set_part_default (TnyMimePartView *self, TnyMimePart *mim priv->mime_part = mime_part; - if (priv->get_size_idle_id != 0) { - g_source_remove (priv->get_size_idle_id); - priv->get_size_idle_id = 0; - } - - if (priv->get_size_stream != NULL) { - g_object_unref (priv->get_size_stream); - priv->get_size_stream = NULL; - } - priv->size = 0; + priv->is_purged = tny_mime_part_is_purged (mime_part); if (TNY_IS_MSG (mime_part)) { TnyHeader *header = tny_msg_get_header (TNY_MSG (mime_part)); if (TNY_IS_HEADER (header)) { - filename = tny_header_get_subject (header); - if (filename == NULL) - filename = _("mail_va_no_subject"); - file_icon_name = modest_platform_get_file_icon_name (NULL, tny_mime_part_get_content_type (mime_part), NULL); + filename = g_strdup (tny_header_get_subject (header)); + if (filename == NULL || filename[0] == '\0') + filename = g_strdup (_("mail_va_no_subject")); + if (priv->is_purged) + file_icon_name = modest_platform_get_file_icon_name (NULL, NULL, NULL); + else + file_icon_name = + modest_platform_get_file_icon_name ( + NULL, tny_mime_part_get_content_type (mime_part), NULL); g_object_unref (header); } } else { - filename = tny_mime_part_get_filename (mime_part); - file_icon_name = modest_platform_get_file_icon_name (filename, - tny_mime_part_get_content_type (mime_part), - NULL); + filename = g_strdup (tny_mime_part_get_filename (mime_part)); + if (priv->is_purged) { + file_icon_name = modest_platform_get_file_icon_name (NULL, NULL, NULL); + } else { + file_icon_name = modest_platform_get_file_icon_name ( + filename, tny_mime_part_get_content_type (mime_part), NULL); + show_size = TRUE; + } } if (file_icon_name) { @@ -221,12 +240,25 @@ modest_attachment_view_set_part_default (TnyMimePartView *self, TnyMimePart *mim gtk_image_set_from_icon_name (GTK_IMAGE (priv->icon), UNKNOWN_FILE_ICON, GTK_ICON_SIZE_MENU); } - gtk_label_set_text (GTK_LABEL (priv->filename_view), filename); + if (priv->is_purged) { + gchar * label_str = g_markup_printf_escaped( + "%s", + filename); + gtk_label_set_markup (GTK_LABEL (priv->filename_view), label_str); + g_free (label_str); + } else { + gtk_label_set_text (GTK_LABEL (priv->filename_view), filename); + } + g_free (filename); update_filename_request (MODEST_ATTACHMENT_VIEW (self)); - gtk_label_set_text (GTK_LABEL (priv->size_view), " "); + gtk_label_set_text (GTK_LABEL (priv->size_view), ""); - priv->get_size_idle_id = g_idle_add ((GSourceFunc) get_size_idle_func, (gpointer) self); + if (show_size) { + tny_camel_mem_stream_get_type (); + g_object_ref (self); + g_thread_create (get_mime_part_size_thread, self, FALSE, NULL); + } gtk_widget_queue_draw (GTK_WIDGET (self)); } @@ -241,7 +273,7 @@ modest_attachment_view_clear (TnyMimePartView *self) static void modest_attachment_view_clear_default (TnyMimePartView *self) { - ModestAttachmentViewPriv *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (self); + ModestAttachmentViewPrivate *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (self); if (priv->mime_part != NULL) { g_object_unref (priv->mime_part); @@ -283,8 +315,6 @@ GtkWidget* modest_attachment_view_new (TnyMimePart *mime_part) { ModestAttachmentView *self = g_object_new (MODEST_TYPE_ATTACHMENT_VIEW, - "homogeneous", FALSE, - "spacing", 0, NULL); modest_attachment_view_set_part (TNY_MIME_PART_VIEW (self), mime_part); @@ -295,7 +325,7 @@ modest_attachment_view_new (TnyMimePart *mime_part) static void modest_attachment_view_instance_init (GTypeInstance *instance, gpointer g_class) { - ModestAttachmentViewPriv *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (instance); + ModestAttachmentViewPrivate *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (instance); PangoContext *context; GtkWidget *box = NULL; @@ -330,7 +360,9 @@ modest_attachment_view_instance_init (GTypeInstance *instance, gpointer g_class) pango_layout_set_ellipsize (priv->layout_full_filename, PANGO_ELLIPSIZE_NONE); - gtk_event_box_set_above_child (GTK_EVENT_BOX (instance), TRUE); + gtk_event_box_set_above_child (GTK_EVENT_BOX (instance), FALSE); + gtk_event_box_set_visible_window (GTK_EVENT_BOX (instance), TRUE); + gtk_widget_set_events (GTK_WIDGET (instance), 0); GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (instance), GTK_CAN_FOCUS); @@ -340,7 +372,7 @@ modest_attachment_view_instance_init (GTypeInstance *instance, gpointer g_class) static void modest_attachment_view_finalize (GObject *object) { - ModestAttachmentViewPriv *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (object); + ModestAttachmentViewPrivate *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (object); if (priv->get_size_idle_id) { g_source_remove (priv->get_size_idle_id); @@ -365,7 +397,7 @@ modest_attachment_view_finalize (GObject *object) static void size_allocate (GtkWidget *widget, GtkAllocation *allocation) { - ModestAttachmentViewPriv *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (widget); + ModestAttachmentViewPrivate *priv = MODEST_ATTACHMENT_VIEW_GET_PRIVATE (widget); gint width, width_diff; GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation); @@ -402,11 +434,10 @@ modest_attachment_view_class_init (ModestAttachmentViewClass *klass) klass->get_part_func = modest_attachment_view_get_part_default; klass->set_part_func = modest_attachment_view_set_part_default; klass->clear_func = modest_attachment_view_clear_default; - klass->activate = NULL; widget_class->size_allocate = size_allocate; - g_type_class_add_private (object_class, sizeof (ModestAttachmentViewPriv)); + g_type_class_add_private (object_class, sizeof (ModestAttachmentViewPrivate)); return; }