Mon, 01 Nov 2010 19:08:08 +0000
Removed unhelpful warning.
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
1 | /* |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
2 | * Purple's oscar protocol plugin |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
3 | * This file is the legal property of its developers. |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
4 | * Please see the AUTHORS file distributed alongside this file. |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
5 | * |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
6 | * This library is free software; you can redistribute it and/or |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
7 | * modify it under the terms of the GNU Lesser General Public |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
8 | * License as published by the Free Software Foundation; either |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
9 | * version 2 of the License, or (at your option) any later version. |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
10 | * |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
11 | * This library is distributed in the hope that it will be useful, |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
14 | * Lesser General Public License for more details. |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
15 | * |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
16 | * You should have received a copy of the GNU Lesser General Public |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
17 | * License along with this library; if not, write to the Free Software |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
19 | */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
20 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
21 | #include "encoding.h" |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
22 | |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
23 | static gchar * |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
24 | encoding_extract(const char *encoding) |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
25 | { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
26 | char *begin, *end; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
27 | |
|
30667
68619fe61c8b
encoding can be NULL in encoding_extract(); this is not an error and
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30666
diff
changeset
|
28 | if (encoding == NULL) { |
|
68619fe61c8b
encoding can be NULL in encoding_extract(); this is not an error and
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30666
diff
changeset
|
29 | return NULL; |
|
68619fe61c8b
encoding can be NULL in encoding_extract(); this is not an error and
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30666
diff
changeset
|
30 | } |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
31 | |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
32 | if (!g_str_has_prefix(encoding, "text/aolrtf; charset=") && |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
33 | !g_str_has_prefix(encoding, "text/x-aolrtf; charset=") && |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
34 | !g_str_has_prefix(encoding, "text/plain; charset=")) { |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
35 | return g_strdup(encoding); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
36 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
37 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
38 | begin = strchr(encoding, '"'); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
39 | end = strrchr(encoding, '"'); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
40 | |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
41 | if ((begin == NULL) || (end == NULL) || (begin >= end)) { |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
42 | return g_strdup(encoding); |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
43 | } |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
44 | |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
45 | return g_strndup(begin+1, (end-1) - begin); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
46 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
47 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
48 | gchar * |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
49 | oscar_encoding_to_utf8(const char *encoding, const char *text, int textlen) |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
50 | { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
51 | gchar *utf8 = NULL; |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
52 | const gchar *glib_encoding = NULL; |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
53 | gchar *extracted_encoding = encoding_extract(encoding); |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
54 | |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
55 | if (extracted_encoding == NULL || *extracted_encoding == '\0') { |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
56 | purple_debug_info("oscar", "Empty encoding, assuming UTF-8\n"); |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
57 | } else if (!g_ascii_strcasecmp(extracted_encoding, "iso-8859-1")) { |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
58 | glib_encoding = "iso-8859-1"; |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
59 | } else if (!g_ascii_strcasecmp(extracted_encoding, "ISO-8859-1-Windows-3.1-Latin-1") || !g_ascii_strcasecmp(extracted_encoding, "us-ascii")) { |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
60 | glib_encoding = "Windows-1252"; |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
61 | } else if (!g_ascii_strcasecmp(extracted_encoding, "unicode-2-0")) { |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
62 | glib_encoding = "UTF-16BE"; |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
63 | } else if (g_ascii_strcasecmp(extracted_encoding, "utf-8")) { |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
64 | glib_encoding = extracted_encoding; |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
65 | } |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
66 | |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
67 | if (glib_encoding != NULL) { |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
68 | utf8 = g_convert(text, textlen, "UTF-8", glib_encoding, NULL, NULL, NULL); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
69 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
70 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
71 | /* |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
72 | * If utf8 is still NULL then either the encoding is utf-8 or |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
73 | * we have been unable to convert the text to utf-8 from the encoding |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
74 | * that was specified. So we check if the text is valid utf-8 then |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
75 | * just copy it. |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
76 | */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
77 | if (utf8 == NULL) { |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
78 | if (textlen != 0 && *text != '\0' && !g_utf8_validate(text, textlen, NULL)) |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
79 | utf8 = g_strdup(_("(There was an error receiving this message. The buddy you are speaking with is probably using a different encoding than expected. If you know what encoding he is using, you can specify it in the advanced account options for your AIM/ICQ account.)")); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
80 | else |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
81 | utf8 = g_strndup(text, textlen); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
82 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
83 | |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
84 | g_free(extracted_encoding); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
85 | return utf8; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
86 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
87 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
88 | gchar * |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
89 | oscar_utf8_try_convert(PurpleAccount *account, OscarData *od, const gchar *msg) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
90 | { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
91 | const char *charset = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
92 | char *ret = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
93 | |
|
30679
8e1fb05214d2
A couple of refactorings related to oscar_utf8_try_convert().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30675
diff
changeset
|
94 | if (msg == NULL) |
|
8e1fb05214d2
A couple of refactorings related to oscar_utf8_try_convert().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30675
diff
changeset
|
95 | return NULL; |
|
8e1fb05214d2
A couple of refactorings related to oscar_utf8_try_convert().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30675
diff
changeset
|
96 | |
|
8e1fb05214d2
A couple of refactorings related to oscar_utf8_try_convert().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30675
diff
changeset
|
97 | if (g_utf8_validate(msg, -1, NULL)) |
|
8e1fb05214d2
A couple of refactorings related to oscar_utf8_try_convert().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30675
diff
changeset
|
98 | return g_strdup(msg); |
|
8e1fb05214d2
A couple of refactorings related to oscar_utf8_try_convert().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30675
diff
changeset
|
99 | |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
100 | if (od->icq) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
101 | charset = purple_account_get_string(account, "encoding", NULL); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
102 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
103 | if(charset && *charset) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
104 | ret = g_convert(msg, -1, "UTF-8", charset, NULL, NULL, NULL); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
105 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
106 | if(!ret) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
107 | ret = purple_utf8_try_convert(msg); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
108 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
109 | return ret; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
110 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
111 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
112 | static gchar * |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
113 | oscar_convert_to_utf8(const gchar *data, gsize datalen, const char *charsetstr, gboolean fallback) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
114 | { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
115 | gchar *ret = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
116 | GError *err = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
117 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
118 | if ((charsetstr == NULL) || (*charsetstr == '\0')) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
119 | return NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
120 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
121 | if (g_ascii_strcasecmp("UTF-8", charsetstr)) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
122 | if (fallback) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
123 | ret = g_convert_with_fallback(data, datalen, "UTF-8", charsetstr, "?", NULL, NULL, &err); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
124 | else |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
125 | ret = g_convert(data, datalen, "UTF-8", charsetstr, NULL, NULL, &err); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
126 | if (err != NULL) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
127 | purple_debug_warning("oscar", "Conversion from %s failed: %s.\n", |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
128 | charsetstr, err->message); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
129 | g_error_free(err); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
130 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
131 | } else { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
132 | if (g_utf8_validate(data, datalen, NULL)) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
133 | ret = g_strndup(data, datalen); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
134 | else |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
135 | purple_debug_warning("oscar", "String is not valid UTF-8.\n"); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
136 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
137 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
138 | return ret; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
139 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
140 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
141 | gchar * |
|
30666
ff138d6c7bc4
Got rid of receiving multipart messages over channel 1, which simplified the code
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30661
diff
changeset
|
142 | oscar_decode_im(PurpleAccount *account, const char *sourcebn, guint16 charset, const gchar *data, gsize datalen) |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
143 | { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
144 | gchar *ret = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
145 | /* charsetstr1 is always set to what the correct encoding should be. */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
146 | const gchar *charsetstr1, *charsetstr2, *charsetstr3 = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
147 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
148 | if ((datalen == 0) || (data == NULL)) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
149 | return NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
150 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
151 | if (charset == AIM_CHARSET_UNICODE) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
152 | charsetstr1 = "UTF-16BE"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
153 | charsetstr2 = "UTF-8"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
154 | } else if (charset == AIM_CHARSET_LATIN_1) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
155 | if ((sourcebn != NULL) && oscar_util_valid_name_icq(sourcebn)) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
156 | charsetstr1 = purple_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
157 | else |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
158 | charsetstr1 = "ISO-8859-1"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
159 | charsetstr2 = "UTF-8"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
160 | } else if (charset == AIM_CHARSET_ASCII) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
161 | /* Should just be "ASCII" */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
162 | charsetstr1 = "ASCII"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
163 | charsetstr2 = purple_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
164 | } else if (charset == 0x000d) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
165 | /* iChat sending unicode over a Direct IM connection = UTF-8 */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
166 | /* Mobile AIM client on multiple devices (including Blackberry Tour, Nokia 3100, and LG VX6000) = ISO-8859-1 */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
167 | charsetstr1 = "UTF-8"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
168 | charsetstr2 = "ISO-8859-1"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
169 | charsetstr3 = purple_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
170 | } else { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
171 | /* Unknown, hope for valid UTF-8... */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
172 | charsetstr1 = "UTF-8"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
173 | charsetstr2 = purple_account_get_string(account, "encoding", OSCAR_DEFAULT_CUSTOM_ENCODING); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
174 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
175 | |
|
30666
ff138d6c7bc4
Got rid of receiving multipart messages over channel 1, which simplified the code
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30661
diff
changeset
|
176 | purple_debug_info("oscar", "Parsing IM, charset=0x%04hx, datalen=%" G_GSIZE_FORMAT ", choice1=%s, choice2=%s, choice3=%s\n", |
|
ff138d6c7bc4
Got rid of receiving multipart messages over channel 1, which simplified the code
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30661
diff
changeset
|
177 | charset, datalen, charsetstr1, charsetstr2, (charsetstr3 ? charsetstr3 : "")); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
178 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
179 | ret = oscar_convert_to_utf8(data, datalen, charsetstr1, FALSE); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
180 | if (ret == NULL) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
181 | if (charsetstr3 != NULL) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
182 | /* Try charsetstr2 without allowing substitutions, then fall through to charsetstr3 if needed */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
183 | ret = oscar_convert_to_utf8(data, datalen, charsetstr2, FALSE); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
184 | if (ret == NULL) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
185 | ret = oscar_convert_to_utf8(data, datalen, charsetstr3, TRUE); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
186 | } else { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
187 | /* Try charsetstr2, allowing substitutions */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
188 | ret = oscar_convert_to_utf8(data, datalen, charsetstr2, TRUE); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
189 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
190 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
191 | if (ret == NULL) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
192 | char *str, *salvage, *tmp; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
193 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
194 | str = g_malloc(datalen + 1); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
195 | strncpy(str, data, datalen); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
196 | str[datalen] = '\0'; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
197 | salvage = purple_utf8_salvage(str); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
198 | tmp = g_strdup_printf(_("(There was an error receiving this message. Either you and %s have different encodings selected, or %s has a buggy client.)"), |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
199 | sourcebn, sourcebn); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
200 | ret = g_strdup_printf("%s %s", salvage, tmp); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
201 | g_free(tmp); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
202 | g_free(str); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
203 | g_free(salvage); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
204 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
205 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
206 | return ret; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
207 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
208 | |
|
30669
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
209 | static guint16 |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
210 | get_simplest_charset(const char *utf8) |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
211 | { |
|
30675
0898ace5d43c
My esteemed mentor caught me red-handed. Thanks Mark!
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30669
diff
changeset
|
212 | while (*utf8) |
|
30669
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
213 | { |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
214 | if ((unsigned char)(*utf8) > 0x7f) { |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
215 | /* not ASCII! */ |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
216 | return AIM_CHARSET_UNICODE; |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
217 | } |
|
30675
0898ace5d43c
My esteemed mentor caught me red-handed. Thanks Mark!
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30669
diff
changeset
|
218 | utf8++; |
|
30669
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
219 | } |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
220 | return AIM_CHARSET_ASCII; |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
221 | } |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
222 | |
|
30660
cd134a2014f2
Stop using custom encodings (and LATIN-1, for that matter) for sending
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30658
diff
changeset
|
223 | gchar * |
|
30669
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
224 | oscar_encode_im(const gchar *msg, gsize *result_len, guint16 *charset, gchar **charsetstr) |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
225 | { |
|
30669
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
226 | guint16 msg_charset = get_simplest_charset(msg); |
|
30660
cd134a2014f2
Stop using custom encodings (and LATIN-1, for that matter) for sending
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30658
diff
changeset
|
227 | if (charset != NULL) { |
|
cd134a2014f2
Stop using custom encodings (and LATIN-1, for that matter) for sending
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30658
diff
changeset
|
228 | *charset = msg_charset; |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
229 | } |
|
30660
cd134a2014f2
Stop using custom encodings (and LATIN-1, for that matter) for sending
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30658
diff
changeset
|
230 | if (charsetstr != NULL) { |
|
cd134a2014f2
Stop using custom encodings (and LATIN-1, for that matter) for sending
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30658
diff
changeset
|
231 | *charsetstr = msg_charset == AIM_CHARSET_ASCII ? "us-ascii" : "unicode-2-0"; |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
232 | } |
|
30660
cd134a2014f2
Stop using custom encodings (and LATIN-1, for that matter) for sending
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30658
diff
changeset
|
233 | return g_convert(msg, -1, msg_charset == AIM_CHARSET_ASCII ? "ASCII" : "UTF-16BE", "UTF-8", NULL, result_len, NULL); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
234 | } |