X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fmodest-tny-msg-actions.c;h=60b3efc8aa9a1d632a948cde6a1326581ed65305;hb=f49581d6bcc26816371ce1e1351592f099b2f914;hp=cf405980c22404d588bf11ecd61e8c4ed2628ba8;hpb=8db724acde57179f20bbcba7298e631f9e6989f2;p=modest diff --git a/src/modest-tny-msg-actions.c b/src/modest-tny-msg-actions.c index cf40598..60b3efc 100644 --- a/src/modest-tny-msg-actions.c +++ b/src/modest-tny-msg-actions.c @@ -1,133 +1,164 @@ -/* 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 - -/* TODO: put in auto* */ #include -#include +#include +#include +#include +#include #ifdef HAVE_CONFIG_H #include -#endif /*HAVE_CONFIG_H*/ +#endif /*HAVE_CONFIG_H */ +#include "modest-tny-msg-actions.h" #include "modest-text-utils.h" - -/* private */ -static gchar *quote_msg(const TnyMsgIface *src, const gchar *from, time_t sent_date, gint limit, gboolean textorhtml); -static GtkTextBuffer *htmltotext(TnyMsgMimePartIface * body); - - -static GtkTextBuffer * -htmltotext(TnyMsgMimePartIface * body) +static gchar * +quote_msg (TnyMsgIface* src, const gchar * from, time_t sent_date, gint limit) { + TnyStreamIface *stream; + TnyMimePartIface *body; GtkTextBuffer *buf; -#ifdef ACTIVATE_HACKS - 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); - - gtk_html_set_editable (GTK_HTML(html), FALSE); - gtk_html_allow_selection (GTK_HTML(html), TRUE); - gtk_html_set_caret_mode (GTK_HTML(html), FALSE); - gtk_html_set_blocking (GTK_HTML(html), FALSE); - gtk_html_set_images_blocking (GTK_HTML(html), FALSE); - - stream = TNY_STREAM_IFACE(modest_tny_stream_gtkhtml_new( - gtk_html_begin(GTK_HTML(html)))); - + GtkTextIter start, end; + const gchar *to_quote; + gchar *quoted; + + 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_mime_part_iface_decode_to_stream (body, stream); tny_stream_iface_reset (stream); + g_object_unref (G_OBJECT(stream)); + g_object_unref (G_OBJECT(body)); - 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); - - 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; + 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; } -gchar * -modest_tny_msg_actions_quote(const TnyMsgIface *self, const gchar *from, time_t sent_date, gint limit, GtkTextBuffer *to_quote) + +gchar* +modest_tny_msg_actions_quote (TnyMsgIface * self, const gchar * from, + time_t sent_date, gint limit, + const gchar * to_quote) { - gchar *quoted; + /* 2 cases: */ - /* 3 cases: */ - /* a) quote text from selection */ - 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; + if (to_quote != NULL) + return modest_text_utils_quote (to_quote, from, sent_date, + limit); - /* c) if that fails, try text/html */ - return quote_msg(self, from, sent_date, limit, TRUE); + /* b) try to find a text/plain part in the msg and quote it */ + 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) + + + +TnyMimePartIface * +modest_tny_msg_actions_find_body_part (TnyMsgIface *msg, gboolean want_html) { + const gchar *mime_type = want_html ? "text/html" : "text/plain"; + TnyMimePartIface *part; + TnyListIface *parts; + TnyIteratorIface *iter; - GList *parts; /* LEAK? */ - TnyStreamIface* stream; - TnyTextBufferStream *dest; - TnyMsgMimePartIface *body = NULL; - TnyMsgMimePartIface *part; - GtkTextBuffer *buf; - gchar *quoted; - - /* is the warning in this line due to a bug in tinymail? */ - parts = (GList*) tny_msg_iface_get_parts (src); + if (!msg) + return NULL; - while (parts) { - part = TNY_MSG_MIME_PART_IFACE(parts->data); - if (tny_msg_mime_part_iface_content_type_is (part, textorhtml ? "text/html" : "text/plain")) { - body = part; + parts = TNY_LIST_IFACE(tny_list_new()); + tny_msg_iface_get_parts ((TnyMsgIface*)msg, parts); + + iter = tny_list_iface_create_iterator(parts); + + while (!tny_iterator_iface_is_done(iter)) { + + part = TNY_MIME_PART_IFACE(tny_iterator_iface_current (iter)); + + if (tny_mime_part_iface_content_type_is (part, mime_type) && + !tny_mime_part_iface_is_attachment (part)) { break; } - parts = parts->next; + part = NULL; + tny_iterator_iface_next (iter); } - - if (!body) { - 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); - } - - quoted = modest_text_utils_quote (buf, from, sent_date, limit); + + /* did we find a matching part? */ + if (part) + g_object_ref (G_OBJECT(part)); + + g_object_unref (G_OBJECT(iter)); + g_object_unref (G_OBJECT(parts)); + + /* if were trying to find an HTML part and couldn't find it, + * try to find a text/plain part instead + */ + if (!part && want_html) + return modest_tny_msg_actions_find_body_part (msg, FALSE); + + return part ? part : NULL; +} + + + +TnyMimePartIface * +modest_tny_msg_actions_find_nth_part (TnyMsgIface *msg, gint index) +{ + TnyMimePartIface *part; + TnyListIface *parts; + TnyIteratorIface *iter; + + g_return_val_if_fail (msg, NULL); + g_return_val_if_fail (index > 0, NULL); - g_object_unref(stream); - g_object_unref(buf); - return quoted; + parts = TNY_LIST_IFACE(tny_list_new()); + tny_msg_iface_get_parts ((TnyMsgIface*)msg, parts); + iter = tny_list_iface_create_iterator ((TnyListIface*)parts); + if (!tny_iterator_iface_has_first(iter)) + return NULL; + + part = TNY_MIME_PART_IFACE(tny_iterator_iface_nth (iter, index)); + + g_object_unref (G_OBJECT(iter)); + g_object_unref (G_OBJECT(parts)); + + return part; }