--- bitlbee-1.1.1dev/protocols/oscar/oscar.c	2007-11-20 00:15:11.000000000 +0100
+++ bitlbee-1.1.1dev-new/protocols/oscar/oscar.c	2008-01-16 15:15:42.000000000 +0100
@@ -1029,7 +1029,10 @@ static int gaim_parse_offgoing(aim_sessi
 	return 1;
 }
 
+extern GSList *irc_connection_list;
+
 static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) {
+	char *src="";
 	char *tmp = g_malloc(BUF_LONG + 1);
 	struct im_connection *ic = sess->aux_data;
 	int flags = 0;
@@ -1038,15 +1041,23 @@ static int incomingim_chan1(aim_session_
 		flags |= OPT_AWAY;
 	
 	if ((args->icbmflags & AIM_IMFLAGS_UNICODE) || (args->icbmflags & AIM_IMFLAGS_ISO_8859_1)) {
-		char *src;
 		
 		if (args->icbmflags & AIM_IMFLAGS_UNICODE)
 			src = "UNICODEBIG";
 		else
-			src = "ISO8859-1";
+		{
+			char *cs;
+			set_t **irc = (set_t**)irc_connection_list->data;
+//			G_MODULE_EXPORT char *set_getstr( set_t **head, char *key );
+			if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
+				src = cs;
+			else
+				src = "cp1250";
+		}
 		
 		/* Try to use iconv first to convert the message to UTF8 - which is what BitlBee expects */
 		if (do_iconv(src, "UTF-8", args->msg, tmp, args->msglen, BUF_LONG) >= 0) {
+			//fprintf (stderr, "bitlbee: converted from %s to utf8!\n", src);
 			// Successfully converted!
 		} else if (args->icbmflags & AIM_IMFLAGS_UNICODE) {
 			int i;
@@ -1062,19 +1073,30 @@ static int incomingim_chan1(aim_session_
 					g_snprintf(tmp+strlen(tmp), BUF_LONG-strlen(tmp), "&#%04x;", uni);
 				}
 			}
+			//fprintf (stderr, "bitlbee: AIM_IMFLAGS_UNICODE, got %s!\n", tmp);
 		} else {
-			g_snprintf(tmp, BUF_LONG, "%s", args->msg);
+			char *cs;
+			set_t **irc = (set_t**)irc_connection_list->data;
+			if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
+				src = cs;
+			else
+				src = "cp1250";
+			if (do_iconv(src, "UTF-8", args->msg, tmp, args->msglen, BUF_LONG) < 0) {
+				g_snprintf(tmp, BUF_LONG, "[1%s]%s", src, args->msg);
+			}
+			//fprintf (stderr, "bitlbee: not utf8, nor unicode, got %s!\n", tmp);
 		}
-	} else if (args->mpmsg.numparts == 0) {
-		g_snprintf(tmp, BUF_LONG, "%s", args->msg);
 	} else {
-		int i;
-		
-		*tmp = 0;
-		for (i = 0; i < args->mpmsg.numparts; i ++) {
-			g_strlcat(tmp, (char*) args->mpmsg.parts[i].data, BUF_LONG);
-			g_strlcat(tmp, "\n", BUF_LONG);
+		char *cs;
+		set_t **irc = (set_t**)irc_connection_list->data;
+		if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
+			src = cs;
+		else
+			src = "cp1250";
+		if (do_iconv(src, "UTF-8", args->msg, tmp, args->msglen, BUF_LONG) < 0) {
+			g_snprintf(tmp, BUF_LONG, "[2%s]%s", src, args->msg);
 		}
+		//fprintf (stderr, "bitlbee: unknown charset, got %s!\n", tmp);
 	}
 	
 	strip_linefeed(tmp);
@@ -1172,12 +1194,24 @@ static int incomingim_chan4(aim_session_
 	switch (args->type) {
 		case 0x0001: { /* An almost-normal instant message.  Mac ICQ sends this.  It's peculiar. */
 			char *uin, *message;
+			char *src = "";
+			char *cs;
+			char *tmp = g_malloc(BUF_LONG + 1);
+			set_t **irc = (set_t**)irc_connection_list->data;
+			if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
+				src = cs;
+			else
+				src = "cp1250";
 			uin = g_strdup_printf("%u", args->uin);
 			message = g_strdup(args->msg);
 			strip_linefeed(message);
-			imcb_buddy_msg(ic, uin, message, 0, 0);
+			if (do_iconv(src, "UTF-8", message, tmp, strlen (message), BUF_LONG) < 0)
+				tmp = message;
+//			imcb_buddy_msg(ic, uin, message, 0, 0);
+			imcb_buddy_msg(ic, uin, tmp, 0, 0);
 			g_free(uin);
 			g_free(message);
+			g_free (tmp);
 		} break;
 
 		case 0x0004: { /* Someone sent you a URL */
@@ -1824,6 +1858,14 @@ static int oscar_buddy_msg(struct im_con
 	} else {
 		struct aim_sendimext_args args;
 		char *s;
+		char *cs;
+		char *src="";
+		set_t **irc = (set_t**)irc_connection_list->data;
+		if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
+			src = cs;
+		else
+			src = "cp1250";
+
 		
 		args.flags = AIM_IMFLAGS_ACK;
 		if (odata->icq)
@@ -1837,7 +1879,7 @@ static int oscar_buddy_msg(struct im_con
 			s = g_malloc(BUF_LONG);
 			/* Try if we can put it in an ISO8859-1 string first.
 			   If we can't, fall back to UTF16. */
-			if ((ret = do_iconv("UTF-8", "ISO8859-1", message, s, len, BUF_LONG)) >= 0) {
+			if ((ret = do_iconv("UTF-8", src, message, s, len, BUF_LONG)) >= 0) {
 				args.flags |= AIM_IMFLAGS_ISO_8859_1;
 				len = ret;
 			} else if ((ret = do_iconv("UTF-8", "UNICODEBIG", message, s, len, BUF_LONG)) >= 0) {
@@ -2234,6 +2276,18 @@ static GList *oscar_away_states(struct i
 	return m;
 }
 
+char *translatestr (char *x, char *tmp)
+{
+	char *src, *cs;
+	set_t **irc = (set_t**)irc_connection_list->data;
+	if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) )
+		src = cs;
+	else
+		src = "cp1250";
+
+	return (do_iconv(src, "UTF-8", x, tmp, strlen (x), BUF_LONG) >= 0) ? tmp : x;
+}
+
 static int gaim_icqinfo(aim_session_t *sess, aim_frame_t *fr, ...)
 {
         struct im_connection *ic = sess->aux_data;
@@ -2241,7 +2295,7 @@ static int gaim_icqinfo(aim_session_t *s
         GString *str;
         va_list ap;
         struct aim_icq_info *info;
-
+		char tmp[BUF_LONG];
         va_start(ap, fr);
         info = va_arg(ap, struct aim_icq_info *);
         va_end(ap);
@@ -2249,13 +2303,19 @@ static int gaim_icqinfo(aim_session_t *s
         if (!info->uin)
                 return 0;
 
+		// recode into oscar_recode_charset
+
+#define translate(x) translatestr(x,tmp)
+		
         str = g_string_sized_new(100);
         g_snprintf(who, sizeof(who), "%u", info->uin);
 
         g_string_sprintfa(str, "%s: %s - %s: %s", _("UIN"), who, _("Nick"), 
-				info->nick ? info->nick : "-");
-        info_string_append(str, "\n", _("First Name"), info->first);
-        info_string_append(str, "\n", _("Last Name"), info->last);
+				info->nick ? translate (info->nick) : "-");
+
+
+        info_string_append(str, "\n", _("First Name"), translate (info->first));
+        info_string_append(str, "\n", _("Last Name"), translate (info->last));
 		info_string_append(str, "\n", _("Email Address"), info->email);
         if (info->numaddresses && info->email2) {
                 int i;
@@ -2283,7 +2343,7 @@ static int gaim_icqinfo(aim_session_t *s
 		info_string_append(str, "\n", _("Personal Web Page"), info->personalwebpage);
         if (info->info && info->info[0]) {
                 g_string_sprintfa(str, "\n%s:\n%s\n%s", _("Additional Information"), 
-						info->info, _("End of Additional Information"));
+						translate (info->info), _("End of Additional Information"));
         }
         g_string_sprintfa(str, "\n");
         if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) {
--- bitlbee-1.1.1dev/irc.c	2007-11-20 00:41:03.000000000 +0100
+++ bitlbee-1.1.1dev-new/irc.c	2008-01-16 15:15:33.000000000 +0100
@@ -109,6 +109,7 @@ irc_t *irc_new( int fd )
 	set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc );
 	set_add( &irc->set, "buddy_sendbuffer_delay", "200", set_eval_int, irc );
 	set_add( &irc->set, "charset", "utf-8", set_eval_charset, irc );
+	set_add( &irc->set, "oscar_recode_charset", "cp1250", set_eval_oscar_recode_charset, irc );
 	set_add( &irc->set, "debug", "false", set_eval_bool, irc );
 	set_add( &irc->set, "default_target", "root", NULL, irc );
 	set_add( &irc->set, "display_namechanges", "false", set_eval_bool, irc );
--- bitlbee-1.1.1dev/set.c	2007-11-17 11:52:54.000000000 +0100
+++ bitlbee-1.1.1dev-new/set.c	2008-01-16 15:14:08.000000000 +0100
@@ -24,6 +24,7 @@
 */
 #define BITLBEE_CORE
 #include "bitlbee.h"
+#include <iconv.h>
 
 set_t *set_add( set_t **head, char *key, char *def, set_eval eval, void *data )
 {
@@ -244,3 +245,18 @@ char *set_eval_charset( set_t *set, char
 	g_iconv_close( cd );
 	return value;
 }
+
+char *set_eval_oscar_recode_charset( set_t *irc, set_t *set, char *value )
+{
+	iconv_t cd;
+
+	if ( g_strncasecmp( value, "none", 4 ) == 0 )
+		return( value );
+
+	cd = iconv_open( "UTF-8", value );
+	if( cd == (iconv_t) -1 )
+		return( NULL );
+
+	iconv_close( cd );
+	return( value );
+}
--- bitlbee-1.1.1dev/set.h	2007-11-15 23:44:12.000000000 +0100
+++ bitlbee-1.1.1dev-new/set.h	2008-01-16 15:13:46.000000000 +0100
@@ -97,5 +97,6 @@ char *set_eval_bool( set_t *set, char *v
 char *set_eval_to_char( set_t *set, char *value );
 char *set_eval_ops( set_t *set, char *value );
 char *set_eval_charset( set_t *set, char *value );
+char *set_eval_oscar_recode_charset( set_t *irc, set_t *set, char *value );
 
 #endif /* __SET_H__ */
