2 * Claws Mail -- A GTK+ based, lightweight, and fast e-mail client
3 * Copyright(C) 2019 the Claws Mail Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write tothe Free Software
15 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #include "claws-features.h"
24 #include "common/utils.h"
25 #include "mainwindow.h"
26 #include "statusbar.h"
27 #include "lh_viewer.h"
29 static gchar *content_types[] = { "text/html", NULL };
31 MimeViewer *lh_viewer_create();
33 MimeViewerFactory lh_viewer_factory = {
39 static GtkWidget *lh_get_widget(MimeViewer *_viewer)
41 debug_print("LH: get_widget\n");
42 LHViewer *viewer = (LHViewer *)_viewer;
46 static gchar *get_utf8_string(const gchar *string) {
52 if (!g_utf8_validate(string, -1, NULL)) {
53 const gchar *cur_locale = conv_get_current_locale();
54 gchar* split = g_strstr_len(cur_locale, -1, ".");
58 locale = (gchar *) cur_locale;
60 debug_print("Try converting to UTF-8 from %s\n", locale);
61 if (g_ascii_strcasecmp("utf-8", locale) != 0) {
62 utf8 = g_convert(string, -1, "utf-8", locale, NULL, &length, &error);
64 debug_print("Failed convertion to current locale: %s\n", error->message);
65 g_clear_error(&error);
69 debug_print("Use iso-8859-1 as last resort\n");
70 utf8 = g_convert(string, -1, "utf-8", "iso-8859-1", NULL, &length, &error);
72 debug_print("Charset detection failed. Use text as is\n");
73 utf8 = g_strdup(string);
74 g_clear_error(&error);
78 utf8 = g_strdup(string);
84 static void lh_show_mimepart(MimeViewer *_viewer, const gchar *infile,
87 debug_print("LH: show_mimepart\n");
88 LHViewer *viewer = (LHViewer *)_viewer;
89 gchar *string = procmime_get_part_as_string(partinfo, TRUE);
94 g_warning("LH: couldn't get MIME part file");
98 charset = procmime_mimeinfo_get_parameter(partinfo, "charset");
99 if (charset != NULL && g_ascii_strcasecmp("utf-8", charset) != 0) {
101 GError *error = NULL;
102 debug_print("LH: converting mimepart to UTF-8 from %s\n", charset);
103 utf8 = g_convert(string, -1, "utf-8", charset, NULL, &length, &error);
105 g_warning("LH: failed mimepart conversion to UTF-8: %s", error->message);
110 debug_print("LH: successfully converted %" G_GSIZE_FORMAT " bytes\n", length);
115 lh_widget_set_partinfo(viewer->widget, partinfo);
116 lh_widget_open_html(viewer->widget, utf8);
120 static void lh_clear_viewer(MimeViewer *_viewer)
122 debug_print("LH: clear_viewer\n");
123 LHViewer *viewer = (LHViewer *)_viewer;
124 lh_widget_clear(viewer->widget);
127 static void lh_destroy_viewer(MimeViewer *_viewer)
129 LHViewer *viewer = (LHViewer *)_viewer;
131 debug_print("LH: destroy_viewer\n");
135 static void lh_print_viewer (MimeViewer *_viewer)
137 debug_print("LH: print_viewer\n");
139 LHViewer* viewer = (LHViewer *) _viewer;
140 lh_widget_print(viewer->widget);
144 static gboolean lh_scroll_page(MimeViewer *_viewer, gboolean up)
146 LHViewer *viewer = (LHViewer *)_viewer;
147 GtkAdjustment *vadj = NULL;
149 if (!viewer || (viewer->widget == NULL))
152 vadj = gtk_scrolled_window_get_vadjustment(
153 GTK_SCROLLED_WINDOW(lh_widget_get_widget(viewer->widget)));
154 return gtkutils_scroll_page(lh_widget_get_widget(viewer->widget), vadj, up);
157 static void lh_scroll_one_line(MimeViewer *_viewer, gboolean up)
159 LHViewer *viewer = (LHViewer *)_viewer;
160 GtkAdjustment *vadj = NULL;
162 if (!viewer || (viewer->widget == NULL))
165 vadj = gtk_scrolled_window_get_vadjustment(
166 GTK_SCROLLED_WINDOW(lh_widget_get_widget(viewer->widget)));
167 gtkutils_scroll_one_line(lh_widget_get_widget(viewer->widget), vadj, up);
170 /***************************************************************/
171 MimeViewer *lh_viewer_create()
173 debug_print("LH: viewer_create\n");
175 LHViewer *viewer = g_new0(LHViewer, 1);
176 viewer->mimeviewer.factory = &lh_viewer_factory;
177 viewer->widget = lh_widget_new();
179 viewer->mimeviewer.get_widget = lh_get_widget;
180 viewer->mimeviewer.show_mimepart = lh_show_mimepart;
182 viewer->mimeviewer.clear_viewer = lh_clear_viewer;
183 viewer->mimeviewer.destroy_viewer = lh_destroy_viewer;
185 viewer->mimeviewer.scroll_page = lh_scroll_page;
186 viewer->mimeviewer.scroll_one_line = lh_scroll_one_line;
188 viewer->vbox = gtk_vbox_new(FALSE, 0);
190 GtkWidget *w = lh_widget_get_widget(viewer->widget);
191 gtk_box_pack_start(GTK_BOX(viewer->vbox), w,
194 gtk_widget_show_all(viewer->vbox);
196 return (MimeViewer *)viewer;
199 void lh_widget_statusbar_push(const gchar* msg)
201 MainWindow *mainwin = mainwindow_get_mainwindow();
202 STATUSBAR_PUSH(mainwin, msg);
205 void lh_widget_statusbar_pop()
207 MainWindow *mainwin = mainwindow_get_mainwindow();
208 STATUSBAR_POP(mainwin);