/* * e-mail-formatter-vcard-inline.c * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) version 3. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with the program; if not, see <http://www.gnu.org/licenses/> * */ #ifdef HAVE_CONFIG_H #include <config.h> #endif #include "e-mail-formatter-vcard-inline.h" #include "e-mail-part-vcard-inline.h" #include <glib/gi18n-lib.h> #include <libebackend/libebackend.h> #include <em-format/e-mail-formatter-extension.h> #include <em-format/e-mail-formatter.h> #include <em-format/e-mail-formatter-utils.h> #include <em-format/e-mail-part-utils.h> #include <camel/camel.h> #define d(x) typedef EMailFormatterExtension EMailFormatterVCardInline; typedef EMailFormatterExtensionClass EMailFormatterVCardInlineClass; typedef EExtension EMailFormatterVCardInlineLoader; typedef EExtensionClass EMailFormatterVCardInlineLoaderClass; GType e_mail_formatter_vcard_inline_get_type (void); G_DEFINE_DYNAMIC_TYPE ( EMailFormatterVCardInline, e_mail_formatter_vcard_inline, E_TYPE_MAIL_FORMATTER_EXTENSION) static const gchar *formatter_mime_types[] = { "text/vcard", "text/x-vcard", "text/directory", NULL }; static gboolean emfe_vcard_inline_format (EMailFormatterExtension *extension, EMailFormatter *formatter, EMailFormatterContext *context, EMailPart *part, CamelStream *stream, GCancellable *cancellable) { EMailPartVCardInline *vcard_part; g_return_val_if_fail (E_MAIL_PART_IS (part, EMailPartVCardInline), FALSE); vcard_part = (EMailPartVCardInline *) part; if (context->mode == E_MAIL_FORMATTER_MODE_RAW) { EContact *contact; if (vcard_part->contact_list != NULL) contact = E_CONTACT (vcard_part->contact_list->data); else contact = NULL; eab_contact_formatter_format_contact_sync ( vcard_part->formatter, contact, stream, cancellable); } else { CamelFolder *folder; const gchar *message_uid; const gchar *default_charset, *charset; gchar *str, *uri; gint length; const gchar *label = NULL; EABContactDisplayMode mode; const gchar *info = NULL; gchar *html_label, *access_key; length = g_slist_length (vcard_part->contact_list); if (length < 1) return FALSE; folder = e_mail_part_list_get_folder (context->part_list); message_uid = e_mail_part_list_get_message_uid (context->part_list); default_charset = e_mail_formatter_get_default_charset (formatter); charset = e_mail_formatter_get_charset (formatter); if (!default_charset) default_charset = ""; if (!charset) charset = ""; if (vcard_part->message_uid == NULL && message_uid != NULL) vcard_part->message_uid = g_strdup (message_uid); if (vcard_part->folder == NULL && folder != NULL) vcard_part->folder = g_object_ref (folder); uri = e_mail_part_build_uri ( folder, message_uid, "part_id", G_TYPE_STRING, part->id, "mode", G_TYPE_INT, E_MAIL_FORMATTER_MODE_RAW, "formatter_default_charset", G_TYPE_STRING, default_charset, "formatter_charset", G_TYPE_STRING, charset, NULL); mode = eab_contact_formatter_get_display_mode (vcard_part->formatter); if (mode == EAB_CONTACT_DISPLAY_RENDER_COMPACT) { mode = EAB_CONTACT_DISPLAY_RENDER_NORMAL; label = _("Show F_ull vCard"); } else { mode = EAB_CONTACT_DISPLAY_RENDER_COMPACT; label = _("Show Com_pact vCard"); } str = g_strdup_printf ( "<div id=\"%s\">", part->id); camel_stream_write_string (stream, str, cancellable, NULL); g_free (str); html_label = e_mail_formatter_parse_html_mnemonics ( label, &access_key); str = g_strdup_printf ( "<button type=\"button\" " "name=\"set-display-mode\" " "class=\"org-gnome-vcard-inline-display-mode-button\" " "value=\"%d\" " "accesskey=\"%s\">%s</button>", mode, access_key, html_label); camel_stream_write_string (stream, str, cancellable, NULL); g_free (str); g_free (html_label); if (access_key) g_free (access_key); html_label = e_mail_formatter_parse_html_mnemonics ( _("Save _To Addressbook"), &access_key); str = g_strdup_printf ( "<button type=\"button\" " "name=\"save-to-addressbook\" " "class=\"org-gnome-vcard-inline-save-button\" " "value=\"%s\" " "accesskey=\"%s\">%s</button><br>" "<iframe width=\"100%%\" height=\"auto\" frameborder=\"0\"" "src=\"%s\" name=\"%s\"></iframe>" "</div>", part->id, access_key, html_label, uri, part->id); camel_stream_write_string (stream, str, cancellable, NULL); g_free (str); g_free (html_label); if (access_key) g_free (access_key); if (length == 2) { info = _("There is one other contact."); } else if (length > 2) { /* Translators: This will always be two or more. */ info = g_strdup_printf (ngettext ( "There is %d other contact.", "There are %d other contacts.", length - 1), length - 1); } if (info) { str = g_strdup_printf ( "<div class=\"attachment-info\">%s</div>", info); camel_stream_write_string (stream, str, cancellable, NULL); g_free (str); } g_free (uri); } return TRUE; } static void e_mail_formatter_vcard_inline_class_init (EMailFormatterExtensionClass *class) { class->display_name = _("Addressbook Contact"); class->description = _("Display the part as an addressbook contact"); class->mime_types = formatter_mime_types; class->format = emfe_vcard_inline_format; } static void e_mail_formatter_vcard_inline_class_finalize (EMailFormatterExtensionClass *class) { } static void e_mail_formatter_vcard_inline_init (EMailFormatterExtension *extension) { } void e_mail_formatter_vcard_inline_type_register (GTypeModule *type_module) { e_mail_formatter_vcard_inline_register_type (type_module); } </form></td></tr> <tr><td class='sub'>FreeBSD Ports (https://github.com/freebsd/freebsd-ports)</td><td class='sub right'></td></tr></table> <table class='tabs'><tr><td> <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/about/?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'>about</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'>summary</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/refs/?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&id=e13c8eaa1ccadcaf3319c3f4fd2d3d6585555d58'>refs</a><a class='active' href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/x11-wm/lxqt-session?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'>log</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/tree/x11-wm/lxqt-session?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&id=e13c8eaa1ccadcaf3319c3f4fd2d3d6585555d58'>tree</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/x11-wm/lxqt-session?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&id=e13c8eaa1ccadcaf3319c3f4fd2d3d6585555d58'>commit</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/diff/x11-wm/lxqt-session?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&id=e13c8eaa1ccadcaf3319c3f4fd2d3d6585555d58'>diff</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/stats/x11-wm/lxqt-session?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'>stats</a></td><td class='form'><form class='right' method='get' action='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/x11-wm/lxqt-session'> <input type='hidden' name='h' value='dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2'/><input type='hidden' name='id' value='e13c8eaa1ccadcaf3319c3f4fd2d3d6585555d58'/><select name='qt'> <option value='grep'>log msg</option> <option value='author'>author</option> <option value='committer'>committer</option> <option value='range'>range</option> </select> <input class='txt' type='search' size='10' name='q' value=''/> <input type='submit' value='search'/> </form> </td></tr></table> <div class='path'>path: <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&id=e13c8eaa1ccadcaf3319c3f4fd2d3d6585555d58'>root</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/x11-wm?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&id=e13c8eaa1ccadcaf3319c3f4fd2d3d6585555d58'>x11-wm</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/x11-wm/lxqt-session?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&id=e13c8eaa1ccadcaf3319c3f4fd2d3d6585555d58'>lxqt-session</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th></th><th class='left'>Commit message (<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/log/x11-wm/lxqt-session?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&id=e13c8eaa1ccadcaf3319c3f4fd2d3d6585555d58&showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/x11-wm/lxqt-session?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&id=3b6367eee1498800fea018412b864999052eb26d'>followup on the man page relocation for lxqt</a></td><td>bapt</td><td><span title='2020-01-16 16:35:22 +0800'>2020-01-16</span></td><td>1</td><td><span class='deletions'>-4</span>/<span class='insertions'>+4</span></td></tr> <tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports/commit/x11-wm/lxqt-session?h=dependabot/npm_and_yarn/devel/electron4/files/mixin-deep-1.3.2&id=7545bf0d9cb82b8838c144e06fed8d9c2bf5d88e'>Update LXQt to 0.14.1</a></td><td>jsm</td><td><span title='2019-12-30 23:20:27 +0800'>2019-12-30</span></td><td>2</td><td><span class='deletions'>-5</span>/<span class='insertions'>+4</span></td></tr>