Mercurial > pidgin
changeset 8560:832fd9b754d0
[gaim-migrate @ 9304]
" Here's a patch for the problem larsl_school reported on
#gaim on the 13th, mostly taken from the irc plugin.
Whenever
an incoming im (or chat message) doesn't parse as
utf-8, it will be automatically interpreted as a byte
stream in a fallback
character set, (defaulting to iso-8859-1), and converted to
utf-8. It adds an option to the zephyr plugin,
"Encoding",
which is a translateable string. It still sends outgoing
messages as utf-8 though.
(06:57:06) larsl_school: Hello, I'm using Gaim 0.71 in
school and when I get a Zephyr message containing
swedish characters from the zwrite client, Gaim just
displays the whole message as an empty string?
(07:04:00) larsl_school: In the logs it looks like GAIM
is using UTF-8, but the messages from zwrite are coded
as extended ASCII. Can I make GAIM understand extended
ASCII (or at least display the parts of the message
that is normal ASCII)?" --Arun A Tharuvai
apparently there are TWO gaim zepher users!
committer: Tailor Script <tailor@pidgin.im>
author | Luke Schierer <lschiere@pidgin.im> |
---|---|
date | Fri, 02 Apr 2004 06:06:45 +0000 |
parents | 1c20aa5bd389 |
children | 2d4ccd94e298 |
files | src/protocols/zephyr/zephyr.c |
diffstat | 1 files changed, 36 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/src/protocols/zephyr/zephyr.c Fri Apr 02 06:05:05 2004 +0000 +++ b/src/protocols/zephyr/zephyr.c Fri Apr 02 06:06:45 2004 +0000 @@ -37,6 +37,8 @@ #include <strings.h> +#define ZEPHYR_FALLBACK_CHARSET "ISO-8859-1" + extern Code_t ZGetLocations(ZLocations_t *, int *); extern Code_t ZSetLocation(char *); extern Code_t ZUnsetLocation(); @@ -181,6 +183,25 @@ return NULL; } +static gchar *zephyr_recv_convert(char *string, int len) +{ + gchar *utf8; + GError *err = NULL; + if (g_utf8_validate(string,len,NULL)) { + return g_strdup(string); + } else { + utf8 = g_convert(string, len, "UTF-8", + gaim_account_get_string(zgc->account, "encoding", ZEPHYR_FALLBACK_CHARSET), + NULL, NULL, &err); + if (err) { + gaim_debug(GAIM_DEBUG_ERROR, "zephyr", "recv conversion error: %s\n", err->message); + utf8 = g_strdup(_("(There was an error converting this message. Check the 'Encoding' option in the Account Editor)")); + } + + return utf8; + } +} + /* utility macros that are useful for zephyr_to_html */ #define IS_OPENER(c) ((c == '{') || (c == '[') || (c == '(') || (c == '<')) @@ -551,7 +572,7 @@ free(user); } } else { - char *buf, *buf2; + char *buf, *buf2, *buf3; char *send_inst; char *realmptr; GaimConversation *gconv1; @@ -562,18 +583,21 @@ GaimConvImFlags flags = 0; if (len > 0) { gchar* tmpescape; - buf = g_malloc(len + 1); - g_snprintf(buf, len + 1, "%s", ptr); - g_strchomp(buf); + buf = g_malloc(len + 1); + g_snprintf(buf, len + 1, "%s", ptr); + g_strchomp(buf); tmpescape = gaim_escape_html(buf); - buf2 = zephyr_to_html(tmpescape); - g_free(buf); + buf2 = zephyr_to_html(tmpescape); + buf3 = zephyr_recv_convert(buf2,strlen(buf2)); + g_free(buf2); + g_free(buf); g_free(tmpescape); + if (!g_ascii_strcasecmp(notice.z_class, "MESSAGE") && !g_ascii_strcasecmp(notice.z_class_inst, "PERSONAL")) { if (!g_ascii_strcasecmp(notice.z_message, "Automated reply:")) flags |= GAIM_CONV_IM_AUTO_RESP; - serv_got_im(zgc, notice.z_sender, buf2, flags, time(NULL)); + serv_got_im(zgc, notice.z_sender, buf3, flags, time(NULL)); } else { zephyr_triple *zt1, *zt2; zt1 = new_triple(notice.z_class, notice.z_class_inst, @@ -610,7 +634,7 @@ send_inst = g_strdup_printf("%s %s",sendertmp,notice.z_class_inst); } serv_got_chat_in(zgc, zt2->id, send_inst, FALSE, - buf2, time(NULL)); + buf3, time(NULL)); gconv1 = gaim_find_conversation_with_account(zt2->name,zgc->account); gcc = gaim_conversation_get_chat_data(gconv1); @@ -634,7 +658,7 @@ } free_triple(zt1); } - g_free(buf2); + g_free(buf3); } } } @@ -1397,6 +1421,9 @@ option = gaim_account_option_string_new(_("Exposure"),"exposure_level",tmp?tmp:EXPOSE_REALMVIS); prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,option); + option = gaim_account_option_string_new(_("Encoding"),"encoding",ZEPHYR_FALLBACK_CHARSET); + prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,option); + my_protocol = plugin; }