Ticket #53: bitlbee-recode-0.6.diff

File bitlbee-recode-0.6.diff, 9.1 KB (added by waker, 3 years ago)

added recoding of user info for 1.0.3

  • irc.c

    diff -ru /var/tmp/portage/net-im/bitlbee-1.0.3/work/bitlbee-1.0.3/irc.c ./irc.c
    old new  
    116116        set_add( irc, "buddy_sendbuffer", "false", set_eval_bool ); 
    117117        set_add( irc, "buddy_sendbuffer_delay", "200", set_eval_int ); 
    118118        set_add( irc, "charset", "iso8859-1", set_eval_charset ); 
     119        set_add( irc, "oscar_recode_charset", "iso8859-1", set_eval_oscar_recode_charset ); 
    119120        set_add( irc, "debug", "false", set_eval_bool ); 
    120121        set_add( irc, "default_target", "root", NULL ); 
    121122        set_add( irc, "display_namechanges", "false", set_eval_bool ); 
  • protocols/oscar/oscar.c

    diff -ru /var/tmp/portage/net-im/bitlbee-1.0.3/work/bitlbee-1.0.3/protocols/oscar/oscar.c ./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 gaim_connection *gc = sess->aux_data; 
    10351038        int flags = 0; 
     
    10381041                flags |= IM_FLAG_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                        irc_t *irc = (irc_t*)irc_connection_list->data; 
     1051                        if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     1052                                src = cs; 
     1053                        else 
     1054                                src = "iso88590-1"; 
     1055                } 
    10471056                 
    10481057                /* Try to use iconv first to convert the message to UTF8 - which is what BitlBee expects */ 
    10491058                if (do_iconv(src, "UTF-8", args->msg, tmp, args->msglen, BUF_LONG) >= 0) { 
     1059                        //fprintf (stderr, "bitlbee: converted from %s to utf8!\n", src); 
    10501060                        // Successfully converted! 
    10511061                } else if (args->icbmflags & AIM_IMFLAGS_UNICODE) { 
    10521062                        int i; 
     
    10621072                                        g_snprintf(tmp+strlen(tmp), BUF_LONG-strlen(tmp), "&#%04x;", uni); 
    10631073                                } 
    10641074                        } 
     1075                        //fprintf (stderr, "bitlbee: AIM_IMFLAGS_UNICODE, got %s!\n", tmp); 
    10651076                } else { 
    1066                         g_snprintf(tmp, BUF_LONG, "%s", args->msg); 
     1077                        char *cs; 
     1078                        irc_t *irc = (irc_t*)irc_connection_list->data; 
     1079                        if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     1080                                src = cs; 
     1081                        else 
     1082                                src = "iso88590-1"; 
     1083                        if (do_iconv(src, "UTF-8", args->msg, tmp, args->msglen, BUF_LONG) < 0) { 
     1084                                g_snprintf(tmp, BUF_LONG, "[1%s]%s", src, args->msg); 
     1085                        } 
     1086                        //fprintf (stderr, "bitlbee: not utf8, nor unicode, got %s!\n", tmp); 
    10671087                } 
    1068         } else 
    1069                 g_snprintf(tmp, BUF_LONG, "%s", args->msg); 
    1070          
     1088        } else { 
     1089                char *cs; 
     1090                irc_t *irc = (irc_t*)irc_connection_list->data; 
     1091                if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     1092                        src = cs; 
     1093                else 
     1094                        src = "iso88590-1"; 
     1095                if (do_iconv(src, "UTF-8", args->msg, tmp, args->msglen, BUF_LONG) < 0) { 
     1096                        g_snprintf(tmp, BUF_LONG, "[2%s]%s", src, args->msg); 
     1097                } 
     1098                //fprintf (stderr, "bitlbee: unknown charset, got %s!\n", tmp); 
     1099        } 
     1100 
    10711101        strip_linefeed(tmp); 
    10721102        serv_got_im(gc, userinfo->sn, tmp, flags, time(NULL), -1); 
    10731103        g_free(tmp); 
     
    11631193        switch (args->type) { 
    11641194                case 0x0001: { /* An almost-normal instant message.  Mac ICQ sends this.  It's peculiar. */ 
    11651195                        char *uin, *message; 
     1196                        char *src = ""; 
     1197                        char *cs; 
     1198                        char *tmp = g_malloc(BUF_LONG + 1); 
     1199                        irc_t *irc = (irc_t*)irc_connection_list->data; 
     1200                        if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     1201                                src = cs; 
     1202                        else 
     1203                                src = "iso88590-1"; 
    11661204                        uin = g_strdup_printf("%u", args->uin); 
    11671205                        message = g_strdup(args->msg); 
    11681206                        strip_linefeed(message); 
    1169                         serv_got_im(gc, uin, message, 0, time(NULL), -1); 
     1207                        if (do_iconv(src, "UTF-8", message, tmp, strlen (message), BUF_LONG) < 0) 
     1208                                tmp = message; 
     1209                        serv_got_im(gc, uin, tmp, 0, time(NULL), -1); 
    11701210                        g_free(uin); 
    11711211                        g_free(message); 
     1212                        g_free (tmp); 
    11721213                } break; 
    11731214 
    11741215                case 0x0004: { /* Someone sent you a URL */ 
     
    17681809                        char sender[32]; 
    17691810                        char *dialog_msg = g_strdup(msg->msg); 
    17701811                        time_t t = get_time(msg->year, msg->month, msg->day, msg->hour, msg->minute, 0); 
     1812                        char *tmp = g_malloc(BUF_LONG + 1); 
     1813                        char *src = ""; 
     1814                        char *cs; 
     1815                        irc_t *irc = (irc_t*)irc_connection_list->data; 
     1816                        if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     1817                                src = cs; 
     1818                        else 
     1819                                src = "iso88590-1"; 
    17711820                        g_snprintf(sender, sizeof(sender), "%u", msg->sender); 
    17721821                        strip_linefeed(dialog_msg); 
    1773                         serv_got_im(gc, sender, dialog_msg, 0, t, -1); 
     1822                        if (do_iconv(src, "UTF-8", dialog_msg, tmp, strlen (msg->msg), BUF_LONG) < 0) 
     1823                                tmp = dialog_msg; 
     1824                        fprintf (stderr, "bitlbee: offlinemsg, got %s\n", tmp); 
     1825                        serv_got_im(gc, sender, tmp, 0, t, -1); 
     1826                        if (dialog_msg != tmp) 
     1827                                g_free (tmp); 
    17741828                        g_free(dialog_msg); 
    17751829                } break; 
    17761830 
     
    18381892        } else { 
    18391893                struct aim_sendimext_args args; 
    18401894                char *s; 
     1895                char *cs; 
     1896                char *src=""; 
     1897                irc_t *irc = (irc_t*)irc_connection_list->data; 
     1898                if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     1899                        src = cs; 
     1900                else 
     1901                        src = "iso88590-1"; 
     1902 
    18411903                 
    18421904                args.flags = AIM_IMFLAGS_ACK; 
    18431905                if (odata->icq) 
     
    18511913                        s = g_malloc(BUF_LONG); 
    18521914                        /* Try if we can put it in an ISO8859-1 string first. 
    18531915                           If we can't, fall back to UTF16. */ 
    1854                         if ((ret = do_iconv("UTF-8", "ISO8859-1", message, s, len, BUF_LONG)) >= 0) { 
     1916                        if ((ret = do_iconv("UTF-8", src, message, s, len, BUF_LONG)) >= 0) { 
    18551917                                args.flags |= AIM_IMFLAGS_ISO_8859_1; 
    18561918                                len = ret; 
    18571919                        } else if ((ret = do_iconv("UTF-8", "UNICODEBIG", message, s, len, BUF_LONG)) >= 0) { 
     
    22482310        return m; 
    22492311} 
    22502312 
     2313char *translatestr (char *x, char *tmp) 
     2314{ 
     2315        char *src, *cs; 
     2316        irc_t *irc; 
     2317        irc = (irc_t*)irc_connection_list->data; 
     2318        if( ( cs = set_getstr( irc, "oscar_recode_charset" ) ) && ( g_strcasecmp( cs, "utf-8" ) != 0 ) ) 
     2319                src = cs; 
     2320        else 
     2321                src = "iso88590-1"; 
     2322 
     2323        return (do_iconv(src, "UTF-8", x, tmp, strlen (x), BUF_LONG) >= 0) ? tmp : x; 
     2324} 
     2325 
    22512326static int gaim_icqinfo(aim_session_t *sess, aim_frame_t *fr, ...) 
    22522327{ 
    22532328        struct gaim_connection *gc = sess->aux_data; 
     
    22552330        GString *str; 
    22562331        va_list ap; 
    22572332        struct aim_icq_info *info; 
    2258  
     2333                char tmp[BUF_LONG]; 
    22592334        va_start(ap, fr); 
    22602335        info = va_arg(ap, struct aim_icq_info *); 
    22612336        va_end(ap); 
     
    22632338        if (!info->uin) 
    22642339                return 0; 
    22652340 
     2341                // recode into oscar_recode_charset 
     2342 
     2343#define translate(x) translatestr(x,tmp) 
     2344                 
    22662345        str = g_string_sized_new(100); 
    22672346        g_snprintf(who, sizeof(who), "%u", info->uin); 
    22682347 
    22692348        g_string_sprintfa(str, "%s: %s - %s: %s", _("UIN"), who, _("Nick"),  
    2270                                 info->nick ? info->nick : "-"); 
    2271         info_string_append(str, "\n", _("First Name"), info->first); 
    2272         info_string_append(str, "\n", _("Last Name"), info->last); 
     2349                                info->nick ? translate (info->nick) : "-"); 
     2350 
     2351 
     2352        info_string_append(str, "\n", _("First Name"), translate (info->first)); 
     2353        info_string_append(str, "\n", _("Last Name"), translate (info->last)); 
    22732354                info_string_append(str, "\n", _("Email Address"), info->email); 
    22742355        if (info->numaddresses && info->email2) { 
    22752356                int i; 
     
    22962377                info_string_append(str, "\n", _("Personal Web Page"), info->personalwebpage); 
    22972378        if (info->info && info->info[0]) { 
    22982379                g_string_sprintfa(str, "\n%s:\n%s\n%s", _("Additional Information"),  
    2299                                                 info->info, _("End of Additional Information")); 
     2380                                                translate (info->info), _("End of Additional Information")); 
    23002381        } 
    23012382        g_string_sprintfa(str, "\n"); 
    23022383        if ((info->homeaddr && (info->homeaddr[0])) || (info->homecity && info->homecity[0]) || (info->homestate && info->homestate[0]) || (info->homezip && info->homezip[0])) { 
  • util.c

    diff -ru /var/tmp/portage/net-im/bitlbee-1.0.3/work/bitlbee-1.0.3/util.c ./util.c
    old new  
    453453        iconv_close( cd ); 
    454454        return( value ); 
    455455} 
     456 
     457char *set_eval_oscar_recode_charset( irc_t *irc, set_t *set, char *value ) 
     458{ 
     459        iconv_t cd; 
     460 
     461        if ( g_strncasecmp( value, "none", 4 ) == 0 ) 
     462                return( value ); 
     463 
     464        cd = iconv_open( "UTF-8", value ); 
     465        if( cd == (iconv_t) -1 ) 
     466                return( NULL ); 
     467 
     468        iconv_close( cd ); 
     469        return( value ); 
     470} 
  • util.h

    diff -ru /var/tmp/portage/net-im/bitlbee-1.0.3/work/bitlbee-1.0.3/util.h ./util.h
    old new  
    4646 
    4747G_MODULE_EXPORT signed int do_iconv( char *from_cs, char *to_cs, char *src, char *dst, size_t size, size_t maxbuf ); 
    4848char *set_eval_charset( irc_t *irc, set_t *set, char *value ); 
     49char *set_eval_oscar_recode_charset( irc_t *irc, set_t *set, char *value ); 
    4950 
    5051#endif