e-mail-formatter-vcard-inline.c 6.14 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
 * 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>
32
#include <em-format/e-mail-formatter-utils.h>
33
34
35
36
37
38
#include <em-format/e-mail-part-utils.h>

#include <camel/camel.h>

#define d(x)

39
40
typedef EMailFormatterExtension EMailFormatterVCardInline;
typedef EMailFormatterExtensionClass EMailFormatterVCardInlineClass;
41

Matthew Barnes's avatar
Matthew Barnes committed
42
43
typedef EExtension EMailFormatterVCardInlineLoader;
typedef EExtensionClass EMailFormatterVCardInlineLoaderClass;
44
45
46

GType e_mail_formatter_vcard_inline_get_type (void);

47
G_DEFINE_DYNAMIC_TYPE (
48
49
	EMailFormatterVCardInline,
	e_mail_formatter_vcard_inline,
50
	E_TYPE_MAIL_FORMATTER_EXTENSION)
51

52
53
54
55
56
57
static const gchar *formatter_mime_types[] = {
	"text/vcard",
	"text/x-vcard",
	"text/directory",
	NULL
};
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84

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 {
85
86
		CamelFolder *folder;
		const gchar *message_uid;
87
		const gchar *default_charset, *charset;
88
89
90
91
92
		gchar *str, *uri;
		gint length;
		const gchar *label = NULL;
		EABContactDisplayMode mode;
		const gchar *info = NULL;
93
		gchar *html_label, *access_key;
94
95
96
97
98

		length = g_slist_length (vcard_part->contact_list);
		if (length < 1)
			return FALSE;

99
100
		folder = e_mail_part_list_get_folder (context->part_list);
		message_uid = e_mail_part_list_get_message_uid (context->part_list);
101
102
103
104
105
106
107
		default_charset = e_mail_formatter_get_default_charset (formatter);
		charset = e_mail_formatter_get_charset (formatter);

		if (!default_charset)
			default_charset = "";
		if (!charset)
			charset = "";
108

109
110
111
112
113
		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);
114
115

		uri = e_mail_part_build_uri (
116
			folder, message_uid,
117
118
			"part_id", G_TYPE_STRING, part->id,
			"mode", G_TYPE_INT, E_MAIL_FORMATTER_MODE_RAW,
119
120
			"formatter_default_charset", G_TYPE_STRING, default_charset,
			"formatter_charset", G_TYPE_STRING, charset,
121
122
123
124
125
			NULL);

		mode = eab_contact_formatter_get_display_mode (vcard_part->formatter);
		if (mode == EAB_CONTACT_DISPLAY_RENDER_COMPACT) {
			mode = EAB_CONTACT_DISPLAY_RENDER_NORMAL;
126
			label = _("Show F_ull vCard");
127
128
		} else {
			mode = EAB_CONTACT_DISPLAY_RENDER_COMPACT;
129
			label = _("Show Com_pact vCard");
130
131
132
		}

		str = g_strdup_printf (
133
134
135
136
137
138
139
			"<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 (
140
141
142
			"<button type=\"button\" "
				"name=\"set-display-mode\" "
				"class=\"org-gnome-vcard-inline-display-mode-button\" "
143
144
145
146
147
148
149
150
151
152
153
154
				"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 (
155
156
157
			"<button type=\"button\" "
				"name=\"save-to-addressbook\" "
				"class=\"org-gnome-vcard-inline-save-button\" "
158
				"value=\"%s\" "
Milan Crha's avatar
Milan Crha committed
159
				"accesskey=\"%s\">%s</button><br>"
160
161
162
			"<iframe width=\"100%%\" height=\"auto\" frameborder=\"0\""
				"src=\"%s\" name=\"%s\"></iframe>"
			"</div>",
163
164
			part->id, access_key, html_label,
			uri, part->id);
165
166
		camel_stream_write_string (stream, str, cancellable, NULL);
		g_free (str);
167
168
169
		g_free (html_label);
		if (access_key)
			g_free (access_key);
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201

		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
202
e_mail_formatter_vcard_inline_class_init (EMailFormatterExtensionClass *class)
203
{
204
	class->display_name = _("Addressbook Contact");
205
	class->description = _("Display the part as an addressbook contact");
206
207
	class->mime_types = formatter_mime_types;
	class->format = emfe_vcard_inline_format;
208
209
210
}

static void
211
e_mail_formatter_vcard_inline_class_finalize (EMailFormatterExtensionClass *class)
212
213
214
215
{
}

static void
216
e_mail_formatter_vcard_inline_init (EMailFormatterExtension *extension)
217
218
219
{
}

Matthew Barnes's avatar
Matthew Barnes committed
220
221
222
223
224
225
void
e_mail_formatter_vcard_inline_type_register (GTypeModule *type_module)
{
	e_mail_formatter_vcard_inline_register_type (type_module);
}