Ticket #53: bitlbee-recode-0.6.1.diff

File bitlbee-recode-0.6.1.diff, 8.7 KB (added by newman, 2 years ago)

patch against 1.1.1dev, not fully functional (regression)

  • protocols/oscar/oscar.c

    old new  
    10291029        return 1; 
    10301030} 
    10311031 
     1032extern GSList *irc_connection_list; 
     1033 
    10321034static int incomingim_chan1(aim_session_t *sess, aim_conn_t *conn, aim_userinfo_t *userinfo, struct aim_incomingim_ch1_args *args) { 
     1035        char *src=""; 
    10331036        char *tmp = g_malloc(BUF_LONG + 1); 
    10341037        struct im_connection *ic = sess->aux_data; 
    10351038        int flags = 0; 
     
    10381041                flags |= OPT_AWAY; 
    10391042         
    10401043        if ((args->icbmflags & AIM_IMFLAGS_UNICODE) || (args->icbmflags & AIM_IMFLAGS_ISO_8859_1)) { 
    1041                 char *src; 
    10421044                 
    10431045                if (args->icbmflags & AIM_IMFLAGS_UNICODE) 
    10441046                        src = "UNICODEBIG"; 
    10451047                else 
    1046                         src = "ISO8859-1"; 
     1048                { 
     1049                        char *cs; 
     1050                        set_t **irc = (set_t**)irc_connection_list->data; 
     1051//                      G_MODULE_EXPORT char *set_getstr( set_t **head, char *key ); 
     1052                        if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     1053                                src = cs; 
     1054                        else 
     1055                                src = "cp1250"; 
     1056                } 
    10471057                 
    10481058                /* Try to use iconv first to convert the message to UTF8 - which is what BitlBee expects */ 
    10491059                if (do_iconv(src, "UTF-8", args->msg, tmp, args->msglen, BUF_LONG) >= 0) { 
     1060                        //fprintf (stderr, "bitlbee: converted from %s to utf8!\n", src); 
    10501061                        // Successfully converted! 
    10511062                } else if (args->icbmflags & AIM_IMFLAGS_UNICODE) { 
    10521063                        int i; 
     
    10621073                                        g_snprintf(tmp+strlen(tmp), BUF_LONG-strlen(tmp), "&#%04x;", uni); 
    10631074                                } 
    10641075                        } 
     1076                        //fprintf (stderr, "bitlbee: AIM_IMFLAGS_UNICODE, got %s!\n", tmp); 
    10651077                } else { 
    1066                         g_snprintf(tmp, BUF_LONG, "%s", args->msg); 
     1078                        char *cs; 
     1079                        set_t **irc = (set_t**)irc_connection_list->data; 
     1080                        if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     1081                                src = cs; 
     1082                        else 
     1083                                src = "cp1250"; 
     1084                        if (do_iconv(src, "UTF-8", args->msg, tmp, args->msglen, BUF_LONG) < 0) { 
     1085                                g_snprintf(tmp, BUF_LONG, "[1%s]%s", src, args->msg); 
     1086                        } 
     1087                        //fprintf (stderr, "bitlbee: not utf8, nor unicode, got %s!\n", tmp); 
    10671088                } 
    1068         } else if (args->mpmsg.numparts == 0) { 
    1069                 g_snprintf(tmp, BUF_LONG, "%s", args->msg); 
    10701089        } else { 
    1071                 int i; 
    1072                  
    1073                 *tmp = 0; 
    1074                 for (i = 0; i < args->mpmsg.numparts; i ++) { 
    1075                         g_strlcat(tmp, (char*) args->mpmsg.parts[i].data, BUF_LONG); 
    1076                         g_strlcat(tmp, "\n", BUF_LONG); 
     1090                char *cs; 
     1091                set_t **irc = (set_t**)irc_connection_list->data; 
     1092                if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     1093                        src = cs; 
     1094                else 
     1095                        src = "cp1250"; 
     1096                if (do_iconv(src, "UTF-8", args->msg, tmp, args->msglen, BUF_LONG) < 0) { 
     1097                        g_snprintf(tmp, BUF_LONG, "[2%s]%s", src, args->msg); 
    10771098                } 
     1099                //fprintf (stderr, "bitlbee: unknown charset, got %s!\n", tmp); 
    10781100        } 
    10791101         
    10801102        strip_linefeed(tmp); 
     
    11721194        switch (args->type) { 
    11731195                case 0x0001: { /* An almost-normal instant message.  Mac ICQ sends this.  It's peculiar. */ 
    11741196                        char *uin, *message; 
     1197                        char *src = ""; 
     1198                        char *cs; 
     1199                        char *tmp = g_malloc(BUF_LONG + 1); 
     1200                        set_t **irc = (set_t**)irc_connection_list->data; 
     1201                        if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     1202                                src = cs; 
     1203                        else 
     1204                                src = "cp1250"; 
    11751205                        uin = g_strdup_printf("%u", args->uin); 
    11761206                        message = g_strdup(args->msg); 
    11771207                        strip_linefeed(message); 
    1178                         imcb_buddy_msg(ic, uin, message, 0, 0); 
     1208                        if (do_iconv(src, "UTF-8", message, tmp, strlen (message), BUF_LONG) < 0) 
     1209                                tmp = message; 
     1210//                      imcb_buddy_msg(ic, uin, message, 0, 0); 
     1211                        imcb_buddy_msg(ic, uin, tmp, 0, 0); 
    11791212                        g_free(uin); 
    11801213                        g_free(message); 
     1214                        g_free (tmp); 
    11811215                } break; 
    11821216 
    11831217                case 0x0004: { /* Someone sent you a URL */ 
     
    18241858        } else { 
    18251859                struct aim_sendimext_args args; 
    18261860                char *s; 
     1861                char *cs; 
     1862                char *src=""; 
     1863                set_t **irc = (set_t**)irc_connection_list->data; 
     1864                if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     1865                        src = cs; 
     1866                else 
     1867                        src = "cp1250"; 
     1868 
    18271869                 
    18281870                args.flags = AIM_IMFLAGS_ACK; 
    18291871                if (odata->icq) 
     
    18371879                        s = g_malloc(BUF_LONG); 
    18381880                        /* Try if we can put it in an ISO8859-1 string first. 
    18391881                           If we can't, fall back to UTF16. */ 
    1840                         if ((ret = do_iconv("UTF-8", "ISO8859-1", message, s, len, BUF_LONG)) >= 0) { 
     1882                        if ((ret = do_iconv("UTF-8", src, message, s, len, BUF_LONG)) >= 0) { 
    18411883                                args.flags |= AIM_IMFLAGS_ISO_8859_1; 
    18421884                                len = ret; 
    18431885                        } else if ((ret = do_iconv("UTF-8", "UNICODEBIG", message, s, len, BUF_LONG)) >= 0) { 
     
    22342276        return m; 
    22352277} 
    22362278 
     2279char *translatestr (char *x, char *tmp) 
     2280{ 
     2281        char *src, *cs; 
     2282        set_t **irc = (set_t**)irc_connection_list->data; 
     2283        if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     2284                src = cs; 
     2285        else 
     2286                src = "cp1250"; 
     2287 
     2288        return (do_iconv(src, "UTF-8", x, tmp, strlen (x), BUF_LONG) >= 0) ? tmp : x; 
     2289} 
     2290 
    22372291static int gaim_icqinfo(aim_session_t *sess, aim_frame_t *fr, ...) 
    22382292{ 
    22392293        struct im_connection *ic = sess->aux_data; 
     
    22412295        GString *str; 
    22422296        va_list ap; 
    22432297        struct aim_icq_info *info; 
    2244  
     2298                char tmp[BUF_LONG]; 
    22452299        va_start(ap, fr); 
    22462300        info = va_arg(ap, struct aim_icq_info *); 
    22472301        va_end(ap); 
     
    22492303        if (!info->uin) 
    22502304                return 0; 
    22512305 
     2306                // recode into oscar_recode_charset 
     2307 
     2308#define translate(x) translatestr(x,tmp) 
     2309                 
    22522310        str = g_string_sized_new(100); 
    22532311        g_snprintf(who, sizeof(who), "%u", info->uin); 
    22542312 
    22552313        g_string_sprintfa(str, "%s: %s - %s: %s", _("UIN"), who, _("Nick"),  
    2256                                 info->nick ? info->nick : "-"); 
    2257         info_string_append(str, "\n", _("First Name"), info->first); 
    2258         info_string_append(str, "\n", _("Last Name"), info->last); 
     2314                                info->nick ? translate (info->nick) : "-"); 
     2315 
     2316 
     2317        info_string_append(str, "\n", _("First Name"), translate (info->first)); 
     2318        info_string_append(str, "\n", _("Last Name"), translate (info->last)); 
    22592319                info_string_append(str, "\n", _("Email Address"), info->email); 
    22602320        if (info->numaddresses && info->email2) { 
    22612321                int i; 
     
    22832343                info_string_append(str, "\n", _("Personal Web Page"), info->personalwebpage); 
    22842344        if (info->info && info->info[0]) { 
    22852345                g_string_sprintfa(str, "\n%s:\n%s\n%s", _("Additional Information"),  
    2286                                                 info->info, _("End of Additional Information")); 
     2346                                                translate (info->info), _("End of Additional Information")); 
    22872347        } 
    22882348        g_string_sprintfa(str, "\n"); 
    22892349        if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) { 
  • bitlbee-1.1.

    old new  
    109109        set_add( &irc->set, "buddy_sendbuffer", "false", set_eval_bool, irc ); 
    110110        set_add( &irc->set, "buddy_sendbuffer_delay", "200", set_eval_int, irc ); 
    111111        set_add( &irc->set, "charset", "utf-8", set_eval_charset, irc ); 
     112        set_add( &irc->set, "oscar_recode_charset", "cp1250", set_eval_oscar_recode_charset, irc ); 
    112113        set_add( &irc->set, "debug", "false", set_eval_bool, irc ); 
    113114        set_add( &irc->set, "default_target", "root", NULL, irc ); 
    114115        set_add( &irc->set, "display_namechanges", "false", set_eval_bool, irc ); 
  • bitlbee-1.1.

    old new  
    2424*/ 
    2525#define BITLBEE_CORE 
    2626#include "bitlbee.h" 
     27#include <iconv.h> 
    2728 
    2829set_t *set_add( set_t **head, char *key, char *def, set_eval eval, void *data ) 
    2930{ 
     
    244245        g_iconv_close( cd ); 
    245246        return value; 
    246247} 
     248 
     249char *set_eval_oscar_recode_charset( set_t *irc, set_t *set, char *value ) 
     250{ 
     251        iconv_t cd; 
     252 
     253        if ( g_strncasecmp( value, "none", 4 ) == 0 ) 
     254                return( value ); 
     255 
     256        cd = iconv_open( "UTF-8", value ); 
     257        if( cd == (iconv_t) -1 ) 
     258                return( NULL ); 
     259 
     260        iconv_close( cd ); 
     261        return( value ); 
     262} 
  • bitlbee-1.1.

    old new  
    9797char *set_eval_to_char( set_t *set, char *value ); 
    9898char *set_eval_ops( set_t *set, char *value ); 
    9999char *set_eval_charset( set_t *set, char *value ); 
     100char *set_eval_oscar_recode_charset( set_t *irc, set_t *set, char *value ); 
    100101 
    101102#endif /* __SET_H__ */