libpurple/protocols/sametime/im_mime.c

Fri, 29 Mar 2019 20:05:41 -0400

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Fri, 29 Mar 2019 20:05:41 -0400
changeset 39523
415b0705e48b
child 39524
b49e731857a2
permissions
-rw-r--r--

sametime: Move MIME handling to a separate file.

39523
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
1 /*
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
2 * purple - Sametime Protocol Plugin
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
3 *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
4 * Purple is the legal property of its developers, whose names are too numerous
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
5 * to list here. Please refer to the COPYRIGHT file distributed with this
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
6 * source distribution.
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
7 *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
8 * This program is free software; you can redistribute it and/or modify
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
9 * it under the terms of the GNU General Public License as published by
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
11 * (at your option) any later version.
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
12 *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
13 * This program is distributed in the hope that it will be useful,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
16 * GNU General Public License for more details.
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
17 *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
18 * You should have received a copy of the GNU General Public License
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
19 * along with this program; if not, write to the Free Software
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
21 *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
22 */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
23
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
24 #include "internal.h"
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
25
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
26 #include <glib.h>
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
27
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
28 /* purple includes */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
29 #include "image-store.h"
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
30 #include "mime.h"
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
31
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
32 /* plugin includes */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
33 #include "sametime.h"
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
34 #include "im_mime.h"
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
35
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
36
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
37 /** generate "cid:908@20582notesbuddy" from "<908@20582notesbuddy>" */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
38 static char *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
39 make_cid(const char *cid)
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
40 {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
41 gsize n;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
42 char *c, *d;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
43
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
44 g_return_val_if_fail(cid != NULL, NULL);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
45
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
46 n = strlen(cid);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
47 g_return_val_if_fail(n > 2, NULL);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
48
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
49 c = g_strndup(cid+1, n-2);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
50 d = g_strdup_printf("cid:%s", c);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
51
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
52 g_free(c);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
53 return d;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
54 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
55
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
56
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
57 gchar *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
58 im_mime_parse(const char *data)
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
59 {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
60 GHashTable *img_by_cid;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
61
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
62 GString *str;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
63
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
64 PurpleMimeDocument *doc;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
65 GList *parts;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
66
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
67 img_by_cid = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
68 g_object_unref);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
69
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
70 /* don't want the contained string to ever be NULL */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
71 str = g_string_new("");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
72
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
73 doc = purple_mime_document_parse(data);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
74
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
75 /* handle all the MIME parts */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
76 parts = purple_mime_document_get_parts(doc);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
77 for (; parts; parts = parts->next) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
78 PurpleMimePart *part = parts->data;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
79 const char *type;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
80
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
81 type = purple_mime_part_get_field(part, "content-type");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
82 purple_debug_info("sametime", "MIME part Content-Type: %s\n",
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
83 type);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
84
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
85 if (!type) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
86 ; /* feh */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
87
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
88 } else if (purple_str_has_prefix(type, "image")) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
89 /* put images into the image store */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
90
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
91 guchar *d_dat;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
92 gsize d_len;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
93 char *cid;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
94 PurpleImage *image;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
95
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
96 /* obtain and unencode the data */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
97 purple_mime_part_get_data_decoded(part, &d_dat, &d_len);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
98
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
99 /* look up the content id */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
100 cid = (char *)purple_mime_part_get_field(part,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
101 "Content-ID");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
102 cid = make_cid(cid);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
103
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
104 /* add image to the purple image store */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
105 image = purple_image_new_from_data(d_dat, d_len);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
106 purple_image_set_friendly_filename(image, cid);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
107
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
108 /* map the cid to the image store identifier */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
109 g_hash_table_insert(img_by_cid, cid, image);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
110
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
111 } else if (purple_str_has_prefix(type, "text")) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
112
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
113 /* concatenate all the text parts together */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
114 guchar *data;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
115 gsize len;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
116
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
117 purple_mime_part_get_data_decoded(part, &data, &len);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
118 g_string_append(str, (const char *)data);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
119 g_free(data);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
120 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
121 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
122
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
123 purple_mime_document_free(doc);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
124
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
125 /* @todo should put this in its own function */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
126 { /* replace each IMG tag's SRC attribute with an ID attribute. This
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
127 actually modifies the contents of str */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
128 GData *attribs;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
129 char *start, *end;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
130 char *tmp = str->str;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
131
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
132 while (*tmp &&
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
133 purple_markup_find_tag("img", tmp,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
134 (const char **) &start, (const char **) &end,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
135 &attribs)) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
136
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
137 char *alt, *align, *border, *src;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
138 int img = 0;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
139
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
140 alt = g_datalist_get_data(&attribs, "alt");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
141 align = g_datalist_get_data(&attribs, "align");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
142 border = g_datalist_get_data(&attribs, "border");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
143 src = g_datalist_get_data(&attribs, "src");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
144
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
145 if (src) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
146 img = GPOINTER_TO_INT(g_hash_table_lookup(img_by_cid, src));
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
147 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
148
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
149 if (img) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
150 GString *atstr;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
151 gsize len = (end - start);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
152 gsize mov;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
153
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
154 atstr = g_string_new("");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
155 if (alt) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
156 g_string_append_printf(atstr,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
157 " alt=\"%s\"", alt);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
158 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
159 if (align) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
160 g_string_append_printf(atstr,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
161 " align=\"%s\"", align);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
162 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
163 if (border) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
164 g_string_append_printf(atstr,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
165 " border=\"%s\"", border);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
166 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
167
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
168 mov = g_snprintf(start, len,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
169 "<img src=\"" PURPLE_IMAGE_STORE_PROTOCOL
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
170 "%u\"%s", img, atstr->str);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
171 while (mov < len) start[mov++] = ' ';
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
172
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
173 g_string_free(atstr, TRUE);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
174 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
175
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
176 g_datalist_clear(&attribs);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
177 tmp = end + 1;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
178 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
179 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
180
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
181 /* clean up the cid table */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
182 g_hash_table_destroy(img_by_cid);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
183
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
184 return g_string_free(str, FALSE);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
185 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
186
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
187
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
188 static int
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
189 mw_rand(void)
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
190 {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
191 static int seed = 0;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
192
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
193 /* for diversity, not security. don't touch */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
194 srand(time(NULL) ^ seed);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
195 seed = rand();
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
196
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
197 return seed;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
198 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
199
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
200
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
201 /** generates a random-ish content id string */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
202 static char *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
203 im_mime_content_id(void)
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
204 {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
205 return g_strdup_printf("%03x@%05xmeanwhile",
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
206 mw_rand() & 0xfff, mw_rand() & 0xfffff);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
207 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
208
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
209
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
210 /** generates a multipart/related content type with a random-ish
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
211 boundary value */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
212 static char *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
213 im_mime_content_type(void)
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
214 {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
215 return g_strdup_printf(
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
216 "multipart/related; boundary=related_MW%03x_%04x",
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
217 mw_rand() & 0xfff, mw_rand() & 0xffff);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
218 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
219
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
220 /** determine content type from contents */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
221 static gchar *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
222 im_mime_img_content_type(PurpleImage *img)
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
223 {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
224 const gchar *mimetype;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
225
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
226 mimetype = purple_image_get_mimetype(img);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
227 if (!mimetype) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
228 mimetype = "image";
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
229 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
230
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
231 return g_strdup_printf("%s; name=\"%s\"", mimetype,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
232 purple_image_get_friendly_filename(img));
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
233 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
234
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
235
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
236 static char *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
237 im_mime_img_content_disp(PurpleImage *img)
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
238 {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
239 return g_strdup_printf("attachment; filename=\"%s\"",
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
240 purple_image_get_friendly_filename(img));
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
241 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
242
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
243
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
244 gchar *
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
245 im_mime_generate(const char *message)
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
246 {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
247 GString *str;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
248 PurpleMimeDocument *doc;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
249 PurpleMimePart *part;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
250
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
251 GData *attr;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
252 char *tmp, *start, *end;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
253
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
254 str = g_string_new(NULL);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
255
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
256 doc = purple_mime_document_new();
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
257
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
258 purple_mime_document_set_field(doc, "Mime-Version", "1.0");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
259 purple_mime_document_set_field(doc, "Content-Disposition", "inline");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
260
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
261 tmp = im_mime_content_type();
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
262 purple_mime_document_set_field(doc, "Content-Type", tmp);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
263 g_free(tmp);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
264
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
265 tmp = (char *)message;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
266 while (*tmp &&
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
267 purple_markup_find_tag("img", tmp, (const char **) &start,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
268 (const char **) &end, &attr)) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
269 gchar *uri;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
270 PurpleImage *img = NULL;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
271
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
272 gsize len = (start - tmp);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
273
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
274 /* append the in-between-tags text */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
275 if (len) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
276 g_string_append_len(str, tmp, len);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
277 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
278
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
279 uri = g_datalist_get_data(&attr, "src");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
280 if (uri) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
281 img = purple_image_store_get_from_uri(uri);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
282 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
283
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
284 if (img) {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
285 char *cid;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
286 gpointer data;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
287 gsize size;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
288
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
289 part = purple_mime_part_new(doc);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
290
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
291 data = im_mime_img_content_disp(img);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
292 purple_mime_part_set_field(part, "Content-Disposition",
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
293 data);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
294 g_free(data);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
295
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
296 data = im_mime_img_content_type(img);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
297 purple_mime_part_set_field(part, "Content-Type", data);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
298 g_free(data);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
299
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
300 cid = im_mime_content_id();
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
301 data = g_strdup_printf("<%s>", cid);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
302 purple_mime_part_set_field(part, "Content-ID", data);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
303 g_free(data);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
304
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
305 purple_mime_part_set_field(part,
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
306 "Content-transfer-encoding", "base64");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
307
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
308 /* obtain and base64 encode the image data, and put it
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
309 in the mime part */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
310 size = purple_image_get_data_size(img);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
311 data = g_base64_encode(purple_image_get_data(img), size);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
312 purple_mime_part_set_data(part, data);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
313 g_free(data);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
314
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
315 /* append the modified tag */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
316 g_string_append_printf(str, "<img src=\"cid:%s\">", cid);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
317 g_free(cid);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
318
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
319 } else {
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
320 /* append the literal image tag, since we couldn't find
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
321 a relative PurpleImage object */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
322 gsize len = (end - start) + 1;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
323 g_string_append_len(str, start, len);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
324 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
325
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
326 g_datalist_clear(&attr);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
327 tmp = end + 1;
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
328 }
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
329
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
330 /* append left-overs */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
331 g_string_append(str, tmp);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
332
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
333 /* add the text/html part */
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
334 part = purple_mime_part_new(doc);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
335 purple_mime_part_set_field(part, "Content-Disposition", "inline");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
336
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
337 tmp = purple_utf8_ncr_encode(str->str);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
338 purple_mime_part_set_field(part, "Content-Type", "text/html");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
339 purple_mime_part_set_field(part, "Content-Transfer-Encoding", "7bit");
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
340 purple_mime_part_set_data(part, tmp);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
341 g_free(tmp);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
342
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
343 g_string_free(str, TRUE);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
344
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
345 str = g_string_new(NULL);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
346 purple_mime_document_write(doc, str);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
347 return g_string_free(str, FALSE);
415b0705e48b sametime: Move MIME handling to a separate file.
Elliott Sales de Andrade <qulogic@pidgin.im>
parents:
diff changeset
348 }

mercurial