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);