X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-tny-msg-actions.c;h=d084b7c1d7d25670ce7aaa28a15ee26688d3ae3f;hb=474ce7648923e3bf71993aebe7351b02295432d4;hp=e75d18875bef13d2d4d0e070867e35f0b14d6ac7;hpb=3165ffeeee3bfa260c86ad5ecee3f29bf686a798;p=modest diff --git a/src/modest-tny-msg-actions.c b/src/modest-tny-msg-actions.c index e75d188..d084b7c 100644 --- a/src/modest-tny-msg-actions.c +++ b/src/modest-tny-msg-actions.c @@ -1,6 +1,32 @@ -/* modest-ui.c */ +/* Copyright (c) 2006, Nokia Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the Nokia Corporation nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS + * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ -/* insert (c)/licensing information) */ #include #include @@ -9,6 +35,7 @@ #include #include #include +#include #ifdef HAVE_CONFIG_H #include @@ -20,129 +47,119 @@ /* private */ static gchar *quote_msg (const TnyMsgIface * src, const gchar * from, - time_t sent_date, gint limit, gboolean textorhtml); -static GtkTextBuffer *htmltotext (TnyMsgMimePartIface * body); + time_t sent_date, gint limit); - -static GtkTextBuffer * -htmltotext (TnyMsgMimePartIface * body) +static gchar * +quote_msg (const TnyMsgIface * src, const gchar * from, time_t sent_date, gint limit) { - GtkTextBuffer *buf; - -#ifdef ACTIVATE_HACKS /* it still doesn't work, don't bother! */ - GtkWidget *html, *win; TnyStreamIface *stream; - GtkClipboard *clip; - gchar *text; - - win = gtk_window_new (GTK_WINDOW_TOPLEVEL); - html = gtk_html_new (); - gtk_container_add (GTK_CONTAINER (win), html); + TnyMsgMimePartIface *body; + GtkTextBuffer *buf; + GtkTextIter start, end; + const gchar *to_quote; + gchar *quoted; - gtk_html_set_editable (GTK_HTML (html), FALSE); - gtk_html_allow_selection (GTK_HTML (html), TRUE); - stream = TNY_STREAM_IFACE (modest_tny_stream_gtkhtml_new - (gtk_html_begin (GTK_HTML (html)))); + /* the cast makes me uneasy... */ + body = modest_tny_msg_actions_find_body_part(src, FALSE); + if (!body) + return NULL; + buf = gtk_text_buffer_new (NULL); + stream = TNY_STREAM_IFACE (tny_text_buffer_stream_new (buf)); tny_stream_iface_reset (stream); tny_msg_mime_part_iface_decode_to_stream (body, stream); tny_stream_iface_reset (stream); - g_object_unref (G_OBJECT (stream)); - - gtk_widget_show_all (win); - gtk_html_select_all (GTK_HTML (html)); - clip = gtk_widget_get_clipboard (html, GDK_SELECTION_PRIMARY); - /*clip = gtk_widget_get_clipboard(html, GDK_SELECTION_CLIPBOARD);*/ - text = gtk_clipboard_wait_for_text (clip); + g_object_unref (stream); + + gtk_text_buffer_get_bounds (buf, &start, &end); + to_quote = gtk_text_buffer_get_text (buf, &start, &end, FALSE); + quoted = modest_text_utils_quote (to_quote, from, sent_date, limit); + g_object_unref (buf); - buf = gtk_text_buffer_new (NULL); - gtk_text_buffer_set_text (buf, text, -1); - g_free (text); - /* destroy win & html */ -#else - buf = gtk_text_buffer_new (NULL); -#endif - return buf; + return quoted; } -gchar * + +gchar* modest_tny_msg_actions_quote (const TnyMsgIface * self, const gchar * from, time_t sent_date, gint limit, - gchar * to_quote) + const gchar * to_quote) { gchar *quoted; - /* 3 cases: */ + /* 2 cases: */ /* a) quote text from selection */ - if (to_quote != NULL) { + if (to_quote != NULL) return modest_text_utils_quote (to_quote, from, sent_date, limit); - } - + /* b) try to find a text/plain part in the msg and quote it */ - quoted = quote_msg (self, from, sent_date, limit, FALSE); - if (quoted != NULL) - return quoted; - - /* c) if that fails, try text/html */ - return quote_msg (self, from, sent_date, limit, TRUE); + return quote_msg (self, from, sent_date, limit); } -static gchar * -quote_msg (const TnyMsgIface * src, const gchar * from, time_t sent_date, - gint limit, gboolean textorhtml) + +TnyMsgMimePartIface * +modest_tny_msg_actions_find_body_part (const TnyMsgIface *msg, gboolean want_html) { - TnyStreamIface *stream; - TnyMsgMimePartIface *body; - GtkTextBuffer *buf; - GtkTextIter start, end; - const gchar *to_quote; - gchar *quoted; + const gchar *mime_type = want_html ? "text/html" : "text/plain"; + TnyMsgMimePartIface *part; + const TnyListIface *parts; + TnyIteratorIface *iter; + gboolean found; - /* the cast makes me uneasy... */ - body = modest_tny_msg_actions_find_body_part((TnyMsgIface *) src, - textorhtml ? "text/html" : "text/plain"); - - if (!body) + if (!msg) return NULL; - if (textorhtml == TRUE) { - buf = htmltotext (body); - } else { - buf = gtk_text_buffer_new (NULL); - stream = TNY_STREAM_IFACE (tny_text_buffer_stream_new (buf)); - tny_stream_iface_reset (stream); - tny_msg_mime_part_iface_decode_to_stream (body, stream); - tny_stream_iface_reset (stream); - g_object_unref (stream); + found = FALSE; + parts = tny_msg_iface_get_parts ((TnyMsgIface *)msg); + iter = tny_list_iface_create_iterator ((TnyListIface*)parts); + + while (!tny_iterator_iface_is_done(iter)) { + part = TNY_MSG_MIME_PART_IFACE(tny_iterator_iface_current (iter)); + + if (tny_msg_mime_part_iface_content_type_is (part, mime_type) && + !tny_msg_mime_part_iface_is_attachment (part)) { + found = TRUE; + break; + } + tny_iterator_iface_next (iter); } - - gtk_text_buffer_get_bounds (buf, &start, &end); - to_quote = gtk_text_buffer_get_text (buf, &start, &end, FALSE); - quoted = modest_text_utils_quote (to_quote, from, sent_date, limit); - g_object_unref (buf); - return quoted; + + g_object_unref (G_OBJECT(iter)); + + /* if were trying to find an HTML part and could find it, + * try to find a text/plain part instead + */ + if (!found && want_html) + return modest_tny_msg_actions_find_body_part (msg, FALSE); + + return found ? part : NULL; } + + TnyMsgMimePartIface * -modest_tny_msg_actions_find_body_part (TnyMsgIface *self, const gchar *mime_type) +modest_tny_msg_actions_find_nth_part (const TnyMsgIface *msg, gint index) { - TnyMsgMimePartIface *part = NULL; - GList *parts; - - g_return_val_if_fail (self, NULL); - g_return_val_if_fail (mime_type, NULL); - - parts = (GList*) tny_msg_iface_get_parts (self); - while (parts && !part) { - part = TNY_MSG_MIME_PART_IFACE(parts->data); - if (!tny_msg_mime_part_iface_content_type_is (part, mime_type)) - part = NULL; - parts = parts->next; - } - + TnyMsgMimePartIface *part; + const TnyListIface *parts; + TnyIteratorIface *iter; + + g_return_val_if_fail (msg, NULL); + g_return_val_if_fail (index > 0, NULL); + + parts = tny_msg_iface_get_parts ((TnyMsgIface *)msg); + iter = tny_list_iface_create_iterator ((TnyListIface*)parts); + + if (!tny_iterator_iface_has_first(iter)) + return NULL; + + part = tny_iterator_iface_nth (iter, index); + + g_object_unref (G_OBJECT(iter)); + return part; }