Thu, 24 Mar 2011 22:37:29 +0000
Currently oscar (ICQ) protocol does not support comma-separated list of
encoding, what may cause problems with clients that using single-byte encoding,
while we using UTF-8 (for example: QIP2005).
This patch adds support for a comma-separated list of encodings.
for example:
{{{
utf-8,cp1251,us-ascii
}}}
This patch also fixes invalid encoding of buddy status and buddy info.
Fixes #13496.
committer: John Bailey <rekkanoryo@rekkanoryo.org>
|
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 * |
|
31616
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
24 | encoding_multi_convert_to_utf8(const gchar *text, gssize textlen, const gchar *encodings, GError **error, gboolean fallback) |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
25 | { |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
26 | gchar *utf8 = NULL; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
27 | const gchar *begin = encodings; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
28 | const gchar *end = NULL; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
29 | gchar *curr_encoding = NULL; /* allocated buffer for encoding name */ |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
30 | const gchar *curr_encoding_ro = NULL; /* read-only encoding name */ |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
31 | |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
32 | if (!encodings) { |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
33 | purple_debug_error("oscar", "encodings is NULL"); |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
34 | return NULL; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
35 | } |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
36 | |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
37 | for (;;) |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
38 | { |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
39 | /* extract next encoding */ |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
40 | end = strchr(begin, ','); |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
41 | if (!end) { |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
42 | curr_encoding_ro = begin; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
43 | } else { /* allocate buffer for encoding */ |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
44 | curr_encoding = g_strndup(begin, end - begin); |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
45 | if (!curr_encoding) { |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
46 | purple_debug_error("oscar", "Error allocating memory for encoding"); |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
47 | break; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
48 | } |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
49 | curr_encoding_ro = curr_encoding; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
50 | } |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
51 | |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
52 | if (!g_ascii_strcasecmp(curr_encoding_ro, "utf-8") && g_utf8_validate(text, textlen, NULL)) { |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
53 | break; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
54 | } |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
55 | |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
56 | utf8 = g_convert(text, textlen, "UTF-8", curr_encoding_ro, NULL, NULL, NULL); |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
57 | |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
58 | if (!end) /* last occurence. do not free curr_encoding: buffer was'nt allocated */ |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
59 | break; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
60 | |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
61 | g_free(curr_encoding); /* free allocated buffer for encoding here */ |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
62 | |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
63 | if (utf8) /* text was successfully converted */ |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
64 | break; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
65 | |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
66 | begin = end + 1; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
67 | } |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
68 | |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
69 | if (!utf8 && fallback) |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
70 | { /* "begin" points to last encoding */ |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
71 | utf8 = g_convert_with_fallback(text, textlen, "UTF-8", begin, "?", NULL, NULL, error); |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
72 | } |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
73 | |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
74 | return utf8; |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
75 | } |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
76 | |
|
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
77 | static gchar * |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
78 | encoding_extract(const char *encoding) |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
79 | { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
80 | char *begin, *end; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
81 | |
|
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
|
82 | 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
|
83 | 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
|
84 | } |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
85 | |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
86 | 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
|
87 | !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
|
88 | !g_str_has_prefix(encoding, "text/plain; charset=")) { |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
89 | return g_strdup(encoding); |
|
30658
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 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
92 | begin = strchr(encoding, '"'); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
93 | end = strrchr(encoding, '"'); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
94 | |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
95 | if ((begin == NULL) || (end == NULL) || (begin >= end)) { |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
96 | return g_strdup(encoding); |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
97 | } |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
98 | |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
99 | return g_strndup(begin+1, (end-1) - begin); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
100 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
101 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
102 | gchar * |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
103 | 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
|
104 | { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
105 | gchar *utf8 = NULL; |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
106 | const gchar *glib_encoding = NULL; |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
107 | gchar *extracted_encoding = encoding_extract(encoding); |
|
31294
73607ab89c6f
Remove trailing whitespace
Richard Laager <rlaager@pidgin.im>
parents:
31089
diff
changeset
|
108 | |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
109 | if (extracted_encoding == NULL || *extracted_encoding == '\0') { |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
110 | 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
|
111 | } 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
|
112 | glib_encoding = "iso-8859-1"; |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
113 | } 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
|
114 | glib_encoding = "Windows-1252"; |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
115 | } 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
|
116 | glib_encoding = "UTF-16BE"; |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
117 | } 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
|
118 | glib_encoding = extracted_encoding; |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
119 | } |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
120 | |
|
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
121 | if (glib_encoding != NULL) { |
|
31616
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
122 | utf8 = encoding_multi_convert_to_utf8(text, textlen, glib_encoding, NULL, FALSE); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
123 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
124 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
125 | /* |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
126 | * 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
|
127 | * 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
|
128 | * 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
|
129 | * just copy it. |
|
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 | if (utf8 == NULL) { |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
132 | 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
|
133 | 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
|
134 | else |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
135 | utf8 = g_strndup(text, textlen); |
|
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 | |
|
30661
b33b4612a753
Refactored oscar_encoding_to_utf8().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30660
diff
changeset
|
138 | g_free(extracted_encoding); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
139 | return utf8; |
|
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 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
142 | gchar * |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
143 | 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
|
144 | { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
145 | const char *charset = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
146 | char *ret = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
147 | |
|
30679
8e1fb05214d2
A couple of refactorings related to oscar_utf8_try_convert().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30675
diff
changeset
|
148 | if (msg == NULL) |
|
8e1fb05214d2
A couple of refactorings related to oscar_utf8_try_convert().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30675
diff
changeset
|
149 | return NULL; |
|
8e1fb05214d2
A couple of refactorings related to oscar_utf8_try_convert().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30675
diff
changeset
|
150 | |
|
8e1fb05214d2
A couple of refactorings related to oscar_utf8_try_convert().
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30675
diff
changeset
|
151 | 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
|
152 | 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
|
153 | |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
154 | if (od->icq) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
155 | charset = purple_account_get_string(account, "encoding", NULL); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
156 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
157 | if(charset && *charset) |
|
31616
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
158 | ret = encoding_multi_convert_to_utf8(msg, -1, charset, NULL, FALSE); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
159 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
160 | if(!ret) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
161 | ret = purple_utf8_try_convert(msg); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
162 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
163 | return ret; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
164 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
165 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
166 | static gchar * |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
167 | 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
|
168 | { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
169 | gchar *ret = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
170 | GError *err = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
171 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
172 | if ((charsetstr == NULL) || (*charsetstr == '\0')) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
173 | return NULL; |
|
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 | if (g_ascii_strcasecmp("UTF-8", charsetstr)) { |
|
31616
80c99f86c4f4
Currently oscar (ICQ) protocol does not support comma-separated list of
Dmitry Utkin <loentar@google.com>
parents:
31294
diff
changeset
|
176 | ret = encoding_multi_convert_to_utf8(data, datalen, charsetstr, &err, fallback); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
177 | if (err != NULL) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
178 | 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
|
179 | charsetstr, err->message); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
180 | g_error_free(err); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
181 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
182 | } else { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
183 | if (g_utf8_validate(data, datalen, NULL)) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
184 | ret = g_strndup(data, datalen); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
185 | else |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
186 | 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
|
187 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
188 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
189 | return ret; |
|
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 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
192 | 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
|
193 | 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
|
194 | { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
195 | gchar *ret = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
196 | /* 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
|
197 | const gchar *charsetstr1, *charsetstr2, *charsetstr3 = NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
198 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
199 | if ((datalen == 0) || (data == NULL)) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
200 | return NULL; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
201 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
202 | if (charset == AIM_CHARSET_UNICODE) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
203 | charsetstr1 = "UTF-16BE"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
204 | charsetstr2 = "UTF-8"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
205 | } else if (charset == AIM_CHARSET_LATIN_1) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
206 | if ((sourcebn != NULL) && oscar_util_valid_name_icq(sourcebn)) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
207 | 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
|
208 | else |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
209 | charsetstr1 = "ISO-8859-1"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
210 | charsetstr2 = "UTF-8"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
211 | } else if (charset == AIM_CHARSET_ASCII) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
212 | /* Should just be "ASCII" */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
213 | charsetstr1 = "ASCII"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
214 | 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
|
215 | } else if (charset == 0x000d) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
216 | /* 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
|
217 | /* 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
|
218 | charsetstr1 = "UTF-8"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
219 | charsetstr2 = "ISO-8859-1"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
220 | 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
|
221 | } else { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
222 | /* Unknown, hope for valid UTF-8... */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
223 | charsetstr1 = "UTF-8"; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
224 | 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
|
225 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
226 | |
|
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
|
227 | 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
|
228 | charset, datalen, charsetstr1, charsetstr2, (charsetstr3 ? charsetstr3 : "")); |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
229 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
230 | ret = oscar_convert_to_utf8(data, datalen, charsetstr1, FALSE); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
231 | if (ret == NULL) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
232 | if (charsetstr3 != NULL) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
233 | /* 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
|
234 | ret = oscar_convert_to_utf8(data, datalen, charsetstr2, FALSE); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
235 | if (ret == NULL) |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
236 | ret = oscar_convert_to_utf8(data, datalen, charsetstr3, TRUE); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
237 | } else { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
238 | /* Try charsetstr2, allowing substitutions */ |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
239 | ret = oscar_convert_to_utf8(data, datalen, charsetstr2, TRUE); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
240 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
241 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
242 | if (ret == NULL) { |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
243 | char *str, *salvage, *tmp; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
244 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
245 | str = g_malloc(datalen + 1); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
246 | strncpy(str, data, datalen); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
247 | str[datalen] = '\0'; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
248 | salvage = purple_utf8_salvage(str); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
249 | 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
|
250 | sourcebn, sourcebn); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
251 | ret = g_strdup_printf("%s %s", salvage, tmp); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
252 | g_free(tmp); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
253 | g_free(str); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
254 | g_free(salvage); |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
255 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
256 | |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
257 | return ret; |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
258 | } |
|
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
259 | |
|
30669
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
260 | static guint16 |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
261 | get_simplest_charset(const char *utf8) |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
262 | { |
|
30675
0898ace5d43c
My esteemed mentor caught me red-handed. Thanks Mark!
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30669
diff
changeset
|
263 | while (*utf8) |
|
30669
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
264 | { |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
265 | if ((unsigned char)(*utf8) > 0x7f) { |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
266 | /* not ASCII! */ |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
267 | return AIM_CHARSET_UNICODE; |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
268 | } |
|
30675
0898ace5d43c
My esteemed mentor caught me red-handed. Thanks Mark!
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30669
diff
changeset
|
269 | utf8++; |
|
30669
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
270 | } |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
271 | return AIM_CHARSET_ASCII; |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
272 | } |
|
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
273 | |
|
30660
cd134a2014f2
Stop using custom encodings (and LATIN-1, for that matter) for sending
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30658
diff
changeset
|
274 | gchar * |
|
30669
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
275 | 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
|
276 | { |
|
30669
e669bab0688e
Renames and cleanups.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30667
diff
changeset
|
277 | 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
|
278 | 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
|
279 | *charset = msg_charset; |
|
30658
478c8630e132
Forgot to add encoding.c.
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
diff
changeset
|
280 | } |
|
30660
cd134a2014f2
Stop using custom encodings (and LATIN-1, for that matter) for sending
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30658
diff
changeset
|
281 | 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
|
282 | *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
|
283 | } |
|
30660
cd134a2014f2
Stop using custom encodings (and LATIN-1, for that matter) for sending
Ivan Komarov <ivan.komarov@pidgin.im>
parents:
30658
diff
changeset
|
284 | 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
|
285 | } |