Mercurial > pidgin.yaz
comparison 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 |
comparison
equal
deleted
inserted
replaced
8224:ad524b8c9c71 | 8225:9790cda80d52 |
---|---|
327 } | 327 } |
328 | 328 |
329 return encodingflag; | 329 return encodingflag; |
330 } | 330 } |
331 | 331 |
332 static fu32_t oscar_encoding_parse(const char *enc) | 332 /* |
333 * Take a string of the form charset="bleh" where bleh is | |
334 * one of us-ascii, utf-8, iso-8859-1, or unicode-2-0, and | |
335 * return a newly allocated string containing bleh. | |
336 */ | |
337 static gchar *oscar_encoding_extract(const char *encoding) | |
333 { | 338 { |
334 char *charset; | 339 gchar *ret = NULL; |
335 | 340 char *begin, *end; |
336 /* If anything goes wrong, fall back on ASCII and print a message */ | 341 |
337 if (enc == NULL) { | 342 /* Make sure encoding begings with charset= */ |
338 gaim_debug(GAIM_DEBUG_WARNING, "oscar", | 343 if (strncmp(encoding, "text/aolrtf; charset=", 21)) |
339 "Encoding was null, that's odd\n"); | 344 return NULL; |
345 | |
346 begin = strchr(encoding, '"'); | |
347 end = strrchr(encoding, '"'); | |
348 | |
349 if ((begin == NULL) || (end == NULL) || (begin >= end)) | |
350 return NULL; | |
351 | |
352 ret = g_strndup(begin+1, (end-1) - begin); | |
353 | |
354 return ret; | |
355 } | |
356 | |
357 /* | |
358 * Return the flag specifying the given encoding. | |
359 */ | |
360 static fu32_t oscar_encoding_parse(const char *encoding) | |
361 { | |
362 if ((encoding == NULL) || encoding[0] == '\0') { | |
363 gaim_debug(GAIM_DEBUG_WARNING, "oscar", "Empty encoding, assuming ASCII\n"); | |
340 return 0; | 364 return 0; |
341 } | 365 } |
342 charset = strstr(enc, "charset="); | 366 |
343 if (charset == NULL) { | 367 if (!strcmp(encoding, "us-ascii") || !strcmp(encoding, "utf-8")) { |
344 gaim_debug(GAIM_DEBUG_WARNING, "oscar", | 368 /* UTF-8 is our native encoding, ASCII is a proper subset */ |
345 "No charset specified for info, assuming ASCII\n"); | |
346 return 0; | 369 return 0; |
347 } | 370 } else if (!strcmp(encoding, "iso-8859-1")) { |
348 charset += 8; | |
349 if (!strcmp(charset, "\"us-ascii\"") || !strcmp(charset, "\"utf-8\"")) { | |
350 /* UTF-8 is our native charset, ASCII is a proper subset */ | |
351 return 0; | |
352 } else if (!strcmp(charset, "\"iso-8859-1\"")) { | |
353 return AIM_IMFLAGS_ISO_8859_1; | 371 return AIM_IMFLAGS_ISO_8859_1; |
354 } else if (!strcmp(charset, "\"unicode-2-0\"")) { | 372 } else if (!strcmp(encoding, "unicode-2-0")) { |
355 return AIM_IMFLAGS_UNICODE; | 373 return AIM_IMFLAGS_UNICODE; |
356 } else { | 374 } else { |
357 gaim_debug(GAIM_DEBUG_WARNING, "oscar", | 375 gaim_debug(GAIM_DEBUG_WARNING, "oscar", |
358 "Unrecognized character set '%s', using ASCII\n", charset); | 376 "Unrecognized character encoding '%s', falling back to ASCII\n", encoding); |
359 return 0; | 377 return 0; |
360 } | 378 } |
361 } | 379 } |
362 | 380 |
363 gchar *oscar_encoding_to_utf8(const char *encoding, char *text, int textlen) | 381 gchar *oscar_encoding_to_utf8(const char *encoding, char *text, int textlen) |
1823 bi->ipaddr = info->icqinfo.ipaddr; | 1841 bi->ipaddr = info->icqinfo.ipaddr; |
1824 | 1842 |
1825 /* Available message stuff */ | 1843 /* Available message stuff */ |
1826 free(bi->availmsg); | 1844 free(bi->availmsg); |
1827 if (info->avail != NULL) | 1845 if (info->avail != NULL) |
1828 if (info->avail_encoding) { | 1846 bi->availmsg = oscar_encoding_to_utf8(info->avail_encoding, info->avail, info->avail_len); |
1829 gchar *enc = g_strdup_printf("charset=\"%s\"", info->avail_encoding); | |
1830 bi->availmsg = oscar_encoding_to_utf8(enc, info->avail, info->avail_len); | |
1831 g_free(enc); | |
1832 } else { | |
1833 /* No explicit encoding means utf8. Yay. */ | |
1834 bi->availmsg = g_strdup(info->avail); | |
1835 } | |
1836 else | 1847 else |
1837 bi->availmsg = NULL; | 1848 bi->availmsg = NULL; |
1838 | 1849 |
1839 /* Server stored icon stuff */ | 1850 /* Server stored icon stuff */ |
1840 if (info->iconcsumlen) { | 1851 if (info->iconcsumlen) { |
3206 g_free(itime); | 3217 g_free(itime); |
3207 } else | 3218 } else |
3208 g_string_append_printf(text, _("Idle: <b>Active</b>")); | 3219 g_string_append_printf(text, _("Idle: <b>Active</b>")); |
3209 | 3220 |
3210 if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | 3221 if ((userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { |
3211 away_utf8 = oscar_encoding_to_utf8(userinfo->away_encoding, userinfo->away, userinfo->away_len); | 3222 gchar *charset = oscar_encoding_extract(userinfo->away_encoding); |
3223 away_utf8 = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); | |
3224 g_free(charset); | |
3212 if (away_utf8 != NULL) { | 3225 if (away_utf8 != NULL) { |
3213 g_string_append_printf(text, "<hr>%s", away_utf8); | 3226 g_string_append_printf(text, "<hr>%s", away_utf8); |
3214 g_free(away_utf8); | 3227 g_free(away_utf8); |
3215 } | 3228 } |
3216 } | 3229 } |
3217 | 3230 |
3218 if ((userinfo->info_len > 0) && (userinfo->info != NULL) && (userinfo->info_encoding != NULL)) { | 3231 if ((userinfo->info_len > 0) && (userinfo->info != NULL) && (userinfo->info_encoding != NULL)) { |
3219 info_utf8 = oscar_encoding_to_utf8(userinfo->info_encoding, userinfo->info, userinfo->info_len); | 3232 gchar *charset = oscar_encoding_extract(userinfo->info_encoding); |
3233 info_utf8 = oscar_encoding_to_utf8(charset, userinfo->info, userinfo->info_len); | |
3234 g_free(charset); | |
3220 if (info_utf8 != NULL) { | 3235 if (info_utf8 != NULL) { |
3221 g_string_append_printf(text, "<hr>%s", info_utf8); | 3236 g_string_append_printf(text, "<hr>%s", info_utf8); |
3222 g_free(info_utf8); | 3237 g_free(info_utf8); |
3223 } | 3238 } |
3224 } | 3239 } |
3410 return 1; | 3425 return 1; |
3411 } | 3426 } |
3412 | 3427 |
3413 static int gaim_conv_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { | 3428 static int gaim_conv_chat_incoming_msg(aim_session_t *sess, aim_frame_t *fr, ...) { |
3414 GaimConnection *gc = sess->aux_data; | 3429 GaimConnection *gc = sess->aux_data; |
3430 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); | |
3431 gchar *utf8; | |
3415 va_list ap; | 3432 va_list ap; |
3416 aim_userinfo_t *info; | 3433 aim_userinfo_t *info; |
3417 GError *err = NULL; | 3434 int len; |
3418 char *msg; | 3435 char *msg; |
3419 char *tmp; | |
3420 int len; | |
3421 char *charset; | 3436 char *charset; |
3422 int convlen; | |
3423 struct chat_connection *ccon = find_oscar_chat_by_conn(gc, fr->conn); | |
3424 | 3437 |
3425 va_start(ap, fr); | 3438 va_start(ap, fr); |
3426 info = va_arg(ap, aim_userinfo_t *); | 3439 info = va_arg(ap, aim_userinfo_t *); |
3427 len = va_arg(ap, int); | 3440 len = va_arg(ap, int); |
3428 msg = va_arg(ap, char *); | 3441 msg = va_arg(ap, char *); |
3429 charset = va_arg(ap, char *); | 3442 charset = va_arg(ap, char *); |
3430 va_end(ap); | 3443 va_end(ap); |
3431 | 3444 |
3432 if (charset) { | 3445 utf8 = oscar_encoding_to_utf8(charset, msg, len); |
3433 if (strcmp(charset, "unicode-2-0") == 0) | 3446 serv_got_chat_in(gc, ccon->id, info->sn, 0, utf8, time((time_t)NULL)); |
3434 charset = "UCS-2BE"; | 3447 g_free(utf8); |
3435 } else { | |
3436 charset = "iso-8859-1"; | |
3437 } | |
3438 | |
3439 tmp = g_convert(msg, len, "UTF-8", charset, NULL, &convlen, &err); | |
3440 | |
3441 if (err) { | |
3442 gaim_debug(GAIM_DEBUG_INFO, "oscar", | |
3443 "Unicode Chat conversion: %s\n", err->message); | |
3444 tmp = g_strdup(_("(There was an error receiving this message)")); | |
3445 g_error_free(err); | |
3446 } | |
3447 | |
3448 serv_got_chat_in(gc, ccon->id, info->sn, 0, tmp, time((time_t)NULL)); | |
3449 g_free(tmp); | |
3450 | 3448 |
3451 return 1; | 3449 return 1; |
3452 } | 3450 } |
3453 | 3451 |
3454 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { | 3452 static int gaim_email_parseupdate(aim_session_t *sess, aim_frame_t *fr, ...) { |
5332 struct chat_connection *ccon = find_oscar_chat(g, id); | 5330 struct chat_connection *ccon = find_oscar_chat(g, id); |
5333 | 5331 |
5334 if (!ccon) | 5332 if (!ccon) |
5335 return; | 5333 return; |
5336 | 5334 |
5337 aim_chat_invite(od->sess, od->conn, name, message ? message : "", | 5335 aim_im_sendch2_chatinvite(od->sess, name, message ? message : "", |
5338 ccon->exchange, ccon->name, 0x0); | 5336 ccon->exchange, ccon->name, 0x0); |
5339 } | 5337 } |
5340 | 5338 |
5341 static void oscar_chat_leave(GaimConnection *g, int id) { | 5339 static void oscar_chat_leave(GaimConnection *g, int id) { |
5342 OscarData *od = g ? (OscarData *)g->proto_data : NULL; | 5340 OscarData *od = g ? (OscarData *)g->proto_data : NULL; |
5588 g_free(tmp); | 5586 g_free(tmp); |
5589 g_free(escaped); | 5587 g_free(escaped); |
5590 } | 5588 } |
5591 | 5589 |
5592 if ((userinfo != NULL) && (userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { | 5590 if ((userinfo != NULL) && (userinfo->flags & AIM_FLAG_AWAY) && (userinfo->away_len > 0) && (userinfo->away != NULL) && (userinfo->away_encoding != NULL)) { |
5593 gchar *away_utf8 = oscar_encoding_to_utf8(userinfo->away_encoding, userinfo->away, userinfo->away_len); | 5591 gchar *charset = oscar_encoding_extract(userinfo->away_encoding); |
5592 gchar *away_utf8 = away_utf8 = oscar_encoding_to_utf8(charset, userinfo->away, userinfo->away_len); | |
5593 g_free(charset); | |
5594 if (away_utf8 != NULL) { | 5594 if (away_utf8 != NULL) { |
5595 gchar *tmp1, *tmp2; | 5595 gchar *tmp1, *tmp2; |
5596 const char *tmp3; | 5596 const char *tmp3; |
5597 tmp1 = gaim_strreplace(away_utf8, "<BR>", "\n"); | 5597 tmp1 = gaim_strreplace(away_utf8, "<BR>", "\n"); |
5598 tmp2 = gaim_markup_strip_html(tmp1); | 5598 tmp2 = gaim_markup_strip_html(tmp1); |