Mercurial > pidgin
diff src/protocols/oscar/oscar.c @ 8225:9790cda80d52
[gaim-migrate @ 8948]
Various bits o' chat code cleanup for oscar.
Mostly I just wanted to re-use some code for incoming i18n chat messages.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Wed, 11 Feb 2004 04:06:16 +0000 |
parents | 862dc2839646 |
children | b01822d23da3 |
line wrap: on
line diff
--- a/src/protocols/oscar/oscar.c Wed Feb 11 04:04:48 2004 +0000 +++ b/src/protocols/oscar/oscar.c Wed Feb 11 04:06:16 2004 +0000 @@ -329,33 +329,51 @@ return encodingflag; } -static fu32_t oscar_encoding_parse(const char *enc) +/* + * Take a string of the form charset="bleh" where bleh is + * one of us-ascii, utf-8, iso-8859-1, or unicode-2-0, and + * return a newly allocated string containing bleh. + */ +static gchar *oscar_encoding_extract(const char *encoding) { - char *charset; - - /* If anything goes wrong, fall back on ASCII and print a message */ - if (enc == NULL) { - gaim_debug(GAIM_DEBUG_WARNING, "oscar", - "Encoding was null, that's odd\n"); + gchar *ret = NULL; + char *begin, *end; + + /* Make sure encoding begings with charset= */ + if (strncmp(encoding, "text/aolrtf; charset=", 21)) + return NULL; + + begin = strchr(encoding, '"'); + end = strrchr(encoding, '"'); + + if ((begin == NULL) || (end == NULL) || (begin >= end)) + return NULL; + + ret = g_strndup(begin+1, (end-1) - begin); + + return ret; +} + +/* + * Return the flag specifying the given encoding. + */ +static fu32_t oscar_encoding_parse(const char *encoding) +{ + if ((encoding == NULL) || encoding[0] == '\0') { + gaim_debug(GAIM_DEBUG_WARNING, "oscar", "Empty encoding, assuming ASCII\n"); return 0; } - charset = strstr(enc, "charset="); - if (charset == NULL) { - gaim_debug(GAIM_DEBUG_WARNING, "oscar", - "No charset specified for info, assuming ASCII\n"); + + if (!strcmp(encoding, "us-ascii") || !strcmp(encoding, "utf-8")) { + /* UTF-8 is our native encoding, ASCII is a proper subset */ return 0; - } - charset += 8; - if (!strcmp(charset, "\"us-ascii\"") || !strcmp(charset, "\"utf-8\"")) { - /* UTF-8 is our native charset, ASCII is a proper subset */ - return 0; - } else if (!strcmp(charset, "\"iso-8859-1\"")) { + } else if (!strcmp(encoding, "iso-8859-1")) { return AIM_IMFLAGS_ISO_8859_1; - } else if (!strcmp(charset, "\"unicode-2-0\"")) { + } else if (!strcmp(encoding, "unicode-2-0")) { return AIM_IMFLAGS_UNICODE; } else { gaim_debug(GAIM_DEBUG_WARNING, "oscar", - "Unrecognized character set '%s', using ASCII\n", charset); + "Unrecognized character encoding '%s', falling back to ASCII\n", encoding); return 0; } } @@ -1825,14 +1843,7 @@ /* Available message stuff */ free(bi->availmsg); if (info->avail != NULL) - if (info->avail_encoding) { - gchar *enc = g_strdup_printf("charset=\"%s\"", info->avail_encoding); - bi->availmsg = oscar_encoding_to_utf8(enc, info->avail, info->avail_len); - g_free(enc); - } else { - /* No explicit encoding means utf8. Yay. */ - bi->availmsg = g_strdup(info->avail); - } + bi->availmsg = oscar_encoding_to_utf8(info->avail_encoding, info->avail, info->avail_len); else bi->availmsg = NULL; @@ -3208,7 +3219,9 @@ g_string_append_printf(text, _("Idle: <b>Active</b>")); if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { - away_utf8 = oscar_encoding_to_utf8(userinfo->away_encoding, userinfo->away, userinfo->away_len); + gchar *charset = oscar_encoding_extract(userinfo->away_encoding); + away_utf8 = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); + g_free(charset); if (away_utf8 != NULL) { g_string_append_printf(text, "<hr>%s", away_utf8); g_free(away_utf8); @@ -3216,7 +3229,9 @@ } if ((userinfo->info_len > 0) && (userinfo->info != NULL) && (userinfo->info_encoding != NULL)) { - info_utf8 = oscar_encoding_to_utf8(userinfo->info_encoding, userinfo->info, userinfo->info_len); + gchar *charset = oscar_encoding_extract(userinfo->info_encoding); + info_utf8 = oscar_encoding_to_utf8(charset, userinfo->info, userinfo->info_len); + g_free(charset); if (info_utf8 != NULL) { g_string_append_printf(text, "<hr>%s", info_utf8); g_free(info_utf8); @@ -3412,15 +3427,13 @@ static int gaim_conv_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { GaimConnection *gc = sess->aux_data; + struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); + gchar *utf8; va_list ap; aim_userinfo_t *info; - GError *err = NULL; + int len; char *msg; - char *tmp; - int len; char *charset; - int convlen; - struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); va_start(ap, fr); info = va_arg(ap, aim_userinfo_t *); @@ -3429,24 +3442,9 @@ charset = va_arg(ap, char *); va_end(ap); - if (charset) { - if (strcmp(charset, "unicode-2-0") == 0) - charset = "UCS-2BE"; - } else { - charset = "iso-8859-1"; - } - - tmp = g_convert(msg, len, "UTF-8", charset, NULL, &convlen, &err); - - if (err) { - gaim_debug(GAIM_DEBUG_INFO, "oscar", - "Unicode Chat conversion: %s\n", err->message); - tmp = g_strdup(_("(There was an error receiving this message)")); - g_error_free(err); - } - - serv_got_chat_in(gc, ccon->id, info->sn, 0, tmp, time((time_t)NULL)); - g_free(tmp); + utf8 = oscar_encoding_to_utf8(charset, msg, len); + serv_got_chat_in(gc, ccon->id, info->sn, 0, utf8, time((time_t)NULL)); + g_free(utf8); return 1; } @@ -5334,7 +5332,7 @@ if (!ccon) return; - aim_chat_invite(od->sess, od->conn, name, message ? message : "", + aim_im_sendch2_chatinvite(od->sess, name, message ? message : "", ccon->exchange, ccon->name, 0x0); } @@ -5590,7 +5588,9 @@ } if ((userinfo != NULL) && (userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { - gchar *away_utf8 = oscar_encoding_to_utf8(userinfo->away_encoding, userinfo->away, userinfo->away_len); + gchar *charset = oscar_encoding_extract(userinfo->away_encoding); + gchar *away_utf8 = away_utf8 = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); + g_free(charset); if (away_utf8 != NULL) { gchar *tmp1, *tmp2; const char *tmp3;