MSN UTF-8 support correctly
Submitted by: Cheng-Lung Sung <clsung@dragon2.net>
This commit is contained in:
parent
bee7e2deef
commit
8187f30632
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=70465
@ -8,7 +8,7 @@
|
||||
|
||||
PORTNAME= centericq
|
||||
PORTVERSION= 4.8.7
|
||||
PORTREVISION= 0
|
||||
PORTREVISION= 1
|
||||
CATEGORIES= net
|
||||
MASTER_SITES= http://konst.org.ua/download/
|
||||
|
||||
|
@ -1,199 +0,0 @@
|
||||
--- libmsn-0.1/msn_commands.cc.orig Wed Oct 16 18:20:59 2002
|
||||
+++ libmsn-0.1/msn_commands.cc Wed Oct 30 16:44:55 2002
|
||||
@@ -30,7 +30,10 @@
|
||||
#include <sys/socket.h>
|
||||
#include <errno.h>
|
||||
#include <netdb.h>
|
||||
-
|
||||
+#define HAVE_ICONV_H 1
|
||||
+#if HAVE_ICONV_H
|
||||
+#include <iconv.h>
|
||||
+#endif
|
||||
#include "libmsn.h"
|
||||
#include "msn_commands.h"
|
||||
#include "parse_utils.h"
|
||||
@@ -426,6 +429,128 @@
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#if HAVE_ICONV_H
|
||||
+/*
|
||||
+** Name: safe_iconv
|
||||
+** Purpose: 'Fault-tolerant' version if iconv. Replaces invalid seq with '?'
|
||||
+** Input: see iconv manpage
|
||||
+*/
|
||||
+static int safe_iconv( iconv_t handle,
|
||||
+ const char **inbuf, size_t *inbytesleft,
|
||||
+ char **outbuf, size_t *outbytesleft)
|
||||
+{
|
||||
+ int ret;
|
||||
+ while (*inbytesleft) {
|
||||
+ ret = iconv( handle, inbuf, inbytesleft,
|
||||
+ outbuf, outbytesleft);
|
||||
+ if (!*inbytesleft || !*outbytesleft)
|
||||
+ return ret;
|
||||
+ /*got invalid seq - so replace it with '?' */
|
||||
+ **outbuf = '?'; (*outbuf)++; (*outbytesleft)--;
|
||||
+ (*inbuf)++; (*inbytesleft)--;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/* charset name cache buffer */
|
||||
+char loc_charset[32];
|
||||
+
|
||||
+#define DEFAULT_CHARSET "ISO-8859-1"
|
||||
+
|
||||
+/*
|
||||
+** Name: guess_current_locale_charset
|
||||
+** Purpose: Try to guess default charset for the current locale
|
||||
+** Output: charset name
|
||||
+** FIXME: is there more right method for guessing charset
|
||||
+ than scanning $LANG ?
|
||||
+*/
|
||||
+static char* guess_current_locale_charset()
|
||||
+{
|
||||
+ char *lang, *ch;
|
||||
+ /* Return previously learned charset */
|
||||
+ return "big5";
|
||||
+ if (loc_charset[0])
|
||||
+ return loc_charset;
|
||||
+
|
||||
+ lang = getenv("LANG");
|
||||
+ ch = strrchr( lang, '.' ) + 1;
|
||||
+ if (!ch)
|
||||
+ strcpy( loc_charset, DEFAULT_CHARSET );
|
||||
+ else {
|
||||
+ iconv_t pt;
|
||||
+ strncpy( loc_charset, ch, sizeof(loc_charset) );
|
||||
+ /* try to open iconv handle using guessed charset */
|
||||
+ if ( (pt = iconv_open( loc_charset, loc_charset )) == (iconv_t)(-1) )
|
||||
+ {
|
||||
+ strcpy( loc_charset, DEFAULT_CHARSET );
|
||||
+ } else {
|
||||
+ iconv_close(pt);
|
||||
+ };
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+ return loc_charset;
|
||||
+}
|
||||
+#endif /* HAVE_ICONV_H */
|
||||
+
|
||||
+/*
|
||||
+** Name: Str2Utf8
|
||||
+** Purpose: convert a string in UTF-8 format
|
||||
+** Input: inbuf - the string to convert
|
||||
+** Output: a new string in UTF-8 format
|
||||
+*/
|
||||
+static char *StrToUtf8( const char *inbuf )
|
||||
+{
|
||||
+#if HAVE_ICONV_H
|
||||
+ size_t length = strlen( inbuf );
|
||||
+ size_t outmaxlength = length * 4; /* FIXME: Is x4 multiplier enoght? */
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( "utf-8", guess_current_locale_charset() );
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ return outbuf_save;
|
||||
+#else
|
||||
+ char *outbuf = strdup( inbuf );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ /* Clear eight bit */
|
||||
+ for (; *outbuf; ++outbuf)
|
||||
+ *outbuf &= 0x7F;
|
||||
+ return outbuf_save;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+** Name: Utf8ToStr
|
||||
+** Purpose: revert UTF-8 string conversion
|
||||
+** Input: inbuf - the string to decode
|
||||
+** Output: a new decoded string
|
||||
+*/
|
||||
+static char *Utf8ToStr( char *inbuf )
|
||||
+{
|
||||
+#if HAVE_ICONV_H
|
||||
+ size_t length = strlen( inbuf );
|
||||
+ size_t outmaxlength = length;
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( guess_current_locale_charset(), "utf-8" );
|
||||
+
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ return outbuf_save;
|
||||
+#else
|
||||
+ return strdup( inbuf );
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
/*
|
||||
** Name: HandleMessage
|
||||
** Purpose: This function handles an instant message from either the server
|
||||
@@ -440,6 +565,7 @@
|
||||
{
|
||||
MSN_InstantMessage newIm;
|
||||
char *message;
|
||||
+ char *decodedIm;
|
||||
char *mimeInfo, *im;
|
||||
int length, nread;
|
||||
struct timeval t;
|
||||
@@ -448,6 +574,8 @@
|
||||
message = NULL;
|
||||
mimeInfo = NULL;
|
||||
im = NULL;
|
||||
+ decodedIm = NULL;
|
||||
+
|
||||
|
||||
if (numOfArgs != 4)
|
||||
return -1;
|
||||
@@ -470,13 +598,15 @@
|
||||
|
||||
if (mimeInfo != NULL) {
|
||||
if (strstr(mimeInfo, "text/plain") != NULL) {
|
||||
+
|
||||
+ decodedIm = Utf8ToStr( im );
|
||||
newIm.year = 0;
|
||||
newIm.month = 0;
|
||||
newIm.day = 0;
|
||||
newIm.hour = 0;
|
||||
newIm.minute = 0;
|
||||
newIm.sec = 0;
|
||||
- newIm.msg = im;
|
||||
+ newIm.msg = decodedIm;
|
||||
RemoveHotmail(args[1], &newIm.sender);
|
||||
newIm.friendlyhandle = args[2];
|
||||
newIm.fd = conn->fd;
|
||||
@@ -571,15 +701,18 @@
|
||||
int SendMessage(MSN_Conn *conn, const char *message)
|
||||
{
|
||||
char *commandLine;
|
||||
+ char *UTFmessage;
|
||||
int length;
|
||||
|
||||
if (!message)
|
||||
return -1;
|
||||
+ UTFmessage = NULL;
|
||||
|
||||
- commandLine = (char *)malloc(strlen(MIME_HEADER)+strlen(message)+25);
|
||||
+ UTFmessage = StrToUtf8( message );
|
||||
+ commandLine = (char *)malloc(strlen(MIME_HEADER)+strlen(UTFmessage)+25);
|
||||
length = sprintf(commandLine, "%s %lu N %d\r\n%s%s", CommandString[MSG],
|
||||
- TrID++, strlen(message)+strlen(MIME_HEADER), MIME_HEADER,
|
||||
- message);
|
||||
+ TrID++, strlen(UTFmessage)+strlen(MIME_HEADER), MIME_HEADER,
|
||||
+ UTFmessage);
|
||||
|
||||
write(conn->fd, commandLine, length);
|
||||
free(commandLine);
|
159
net-im/centericq/files/patch-msnhook.cc
Normal file
159
net-im/centericq/files/patch-msnhook.cc
Normal file
@ -0,0 +1,159 @@
|
||||
--- src/hooks/msnhook.cc Tue Nov 19 10:18:22 2002
|
||||
+++ src/hooks/msnhook.cc Tue Nov 19 10:18:35 2002
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "eventmanager.h"
|
||||
#include "centericq.h"
|
||||
#include "imlogger.h"
|
||||
+#include "utf8conv.h"
|
||||
|
||||
msnhook mhook;
|
||||
|
||||
@@ -159,7 +160,8 @@
|
||||
}
|
||||
|
||||
icqcontact *c = clist.get(ev.getcontact());
|
||||
- text = siconv(text, conf.getrussian() ? "koi8-u" : DEFAULT_CHARSET, "utf8");
|
||||
+ text = StrToUtf8(text);
|
||||
+// text = siconv(text, conf.getrussian() ? "koi8-u" : DEFAULT_CHARSET, "utf8");
|
||||
// text = toutf8(rusconv("kw", text));
|
||||
|
||||
if(c)
|
||||
@@ -274,8 +276,8 @@
|
||||
m.homepage = "http://members.msn.com/" + b.email;
|
||||
|
||||
if(!friendlynicks[ic.nickname].empty()) {
|
||||
- c->setdispnick(friendlynicks[ic.nickname]);
|
||||
- b.fname = friendlynicks[ic.nickname];
|
||||
+ c->setdispnick(Utf8ToStr(friendlynicks[ic.nickname]));
|
||||
+ b.fname = Utf8ToStr(friendlynicks[ic.nickname]);
|
||||
}
|
||||
|
||||
c->setbasicinfo(b);
|
||||
@@ -371,7 +373,8 @@
|
||||
}
|
||||
|
||||
// text = rusconv("wk", fromutf8(d->msg));
|
||||
- text = siconv(d->msg, "utf8", conf.getrussian() ? "koi8-u" : DEFAULT_CHARSET);
|
||||
+// text = siconv(d->msg, "utf8", conf.getrussian() ? "koi8-u" : DEFAULT_CHARSET);
|
||||
+ text = Utf8ToStr(d->msg);
|
||||
em.store(immessage(ic, imevent::incoming, text));
|
||||
|
||||
if(c)
|
||||
@@ -453,3 +456,117 @@
|
||||
clist.get(contactroot)->playsound(imevent::email);
|
||||
}
|
||||
}
|
||||
+#if HAVE_ICONV_H
|
||||
+int safe_iconv( iconv_t handle, const char **inbuf, size_t *inbytesleft,
|
||||
+ char **outbuf, size_t *outbytesleft)
|
||||
+{
|
||||
+ int ret;
|
||||
+ while (*inbytesleft) {
|
||||
+ ret = iconv( handle, inbuf, inbytesleft,
|
||||
+ outbuf, outbytesleft);
|
||||
+ if (!*inbytesleft || !*outbytesleft)
|
||||
+ return ret;
|
||||
+ /*got invalid seq - so replace it with '?' */
|
||||
+ **outbuf = '?'; (*outbuf)++; (*outbytesleft)--;
|
||||
+ (*inbuf)++; (*inbytesleft)--;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+const char* guess_current_locale_charset()
|
||||
+{
|
||||
+ char *lang, *ch;
|
||||
+ /* Return previously learned charset */
|
||||
+ if (loc_charset[0])
|
||||
+ return loc_charset;
|
||||
+
|
||||
+ lang = getenv("LANG");
|
||||
+ ch = strrchr( lang, '.' ) + 1;
|
||||
+ if (!ch)
|
||||
+ strcpy( loc_charset, DEFAULT_CHARSET );
|
||||
+ else {
|
||||
+ iconv_t pt;
|
||||
+ strncpy( loc_charset, ch, sizeof(loc_charset) );
|
||||
+ /* try to open iconv handle using guessed charset */
|
||||
+ if ( (pt = iconv_open( loc_charset, loc_charset )) == (iconv_t)(-1) )
|
||||
+ {
|
||||
+ strcpy( loc_charset, DEFAULT_CHARSET );
|
||||
+ } else {
|
||||
+ iconv_close(pt);
|
||||
+ };
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+ return loc_charset;
|
||||
+}
|
||||
+
|
||||
+char *StrToUtf8( const char *inbuf )
|
||||
+{
|
||||
+ size_t length = strlen( inbuf );
|
||||
+ size_t outmaxlength = length * 4; /* FIXME: Is x4 multiplier enoght? */
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( "utf-8", guess_current_locale_charset() );
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ return outbuf_save;
|
||||
+}
|
||||
+
|
||||
+std::string StrToUtf8( const std::string &instr )
|
||||
+{
|
||||
+ size_t length = instr.length();
|
||||
+ size_t outmaxlength = length * 4; /* FIXME: Is x4 multiplier enoght? */
|
||||
+ const char *inbuf = instr.c_str();
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( "utf-8", guess_current_locale_charset() );
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ std::string return_me = outbuf_save;
|
||||
+ return return_me;
|
||||
+}
|
||||
+
|
||||
+char *Utf8ToStr( const char *inbuf )
|
||||
+{
|
||||
+ size_t length = strlen( inbuf );
|
||||
+ size_t outmaxlength = length;
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( guess_current_locale_charset(), "utf-8" );
|
||||
+
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ return outbuf_save;
|
||||
+}
|
||||
+
|
||||
+std::string Utf8ToStr( const std::string &instr )
|
||||
+{
|
||||
+ size_t length = instr.length();
|
||||
+ size_t outmaxlength = length;
|
||||
+ const char *inbuf = instr.c_str();
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( guess_current_locale_charset(), "utf-8" );
|
||||
+
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ std::string return_me = outbuf_save;
|
||||
+ return return_me;
|
||||
+}
|
||||
+#endif /* HAVE_ICONV_H */
|
59
net-im/centericq/files/patch-utf8conv.h
Normal file
59
net-im/centericq/files/patch-utf8conv.h
Normal file
@ -0,0 +1,59 @@
|
||||
--- src/hooks/utf8conv.h Thu Jan 1 08:00:00 1970
|
||||
+++ src/hooks/utf8conv.h Tue Nov 19 15:19:44 2002
|
||||
@@ -0,0 +1,56 @@
|
||||
+/*-------------------------------------------------------*/
|
||||
+/* utf8conv.h ( Utf8 Converter ) */
|
||||
+/*-------------------------------------------------------*/
|
||||
+/* target : Converting Utf8 from/to string/char */
|
||||
+/* modifier : clsung@dragon2.net */
|
||||
+/* create : unknown */
|
||||
+/* update : 02/11/19 */
|
||||
+/*-------------------------------------------------------*/
|
||||
+#ifndef _UTF8CONV_
|
||||
+#define _UTF8CONV_
|
||||
+
|
||||
+#ifndef HAVE_ICONV_H
|
||||
+#define HAVE_ICONV_H
|
||||
+#endif
|
||||
+
|
||||
+#ifdef HAVE_ICONV_H
|
||||
+#include <iconv.h>
|
||||
+#endif
|
||||
+#include <string>
|
||||
+#define DEFAULT_CHARSET "ISO-8859-1"
|
||||
+/* charset name cache buffer */
|
||||
+static char loc_charset[32];
|
||||
+/*
|
||||
+** Name: safe_iconv
|
||||
+** Purpose: 'Fault-tolerant' version if iconv. Replaces invalid seq with '?'
|
||||
+** Input: see iconv manpage
|
||||
+*/
|
||||
+int safe_iconv( iconv_t handle, const char **inbuf, size_t *inbytesleft,
|
||||
+ char **outbuf, size_t *outbytesleft);
|
||||
+
|
||||
+/*
|
||||
+** Name: guess_current_locale_charset
|
||||
+** Purpose: Try to guess default charset for the current locale
|
||||
+** Output: charset name
|
||||
+** FIXME: is there more right method for guessing charset
|
||||
+ than scanning $LANG ?
|
||||
+*/
|
||||
+const char* guess_current_locale_charset();
|
||||
+
|
||||
+/*
|
||||
+** Name: Str2Utf8
|
||||
+** Purpose: convert a string in UTF-8 format
|
||||
+** Input: inbuf - the string to convert
|
||||
+** Output: a new string in UTF-8 format
|
||||
+*/
|
||||
+char *StrToUtf8( const char *inbuf );
|
||||
+std::string StrToUtf8( const std::string &instr );
|
||||
+/*
|
||||
+** Name: Utf8ToStr
|
||||
+** Purpose: revert UTF-8 string conversion
|
||||
+** Input: inbuf - the string to decode
|
||||
+** Output: a new decoded string
|
||||
+*/
|
||||
+char *Utf8ToStr( const char *inbuf );
|
||||
+std::string Utf8ToStr( const std::string &instr );
|
||||
+#endif
|
@ -8,7 +8,7 @@
|
||||
|
||||
PORTNAME= centericq
|
||||
PORTVERSION= 4.8.7
|
||||
PORTREVISION= 0
|
||||
PORTREVISION= 1
|
||||
CATEGORIES= net
|
||||
MASTER_SITES= http://konst.org.ua/download/
|
||||
|
||||
|
@ -1,199 +0,0 @@
|
||||
--- libmsn-0.1/msn_commands.cc.orig Wed Oct 16 18:20:59 2002
|
||||
+++ libmsn-0.1/msn_commands.cc Wed Oct 30 16:44:55 2002
|
||||
@@ -30,7 +30,10 @@
|
||||
#include <sys/socket.h>
|
||||
#include <errno.h>
|
||||
#include <netdb.h>
|
||||
-
|
||||
+#define HAVE_ICONV_H 1
|
||||
+#if HAVE_ICONV_H
|
||||
+#include <iconv.h>
|
||||
+#endif
|
||||
#include "libmsn.h"
|
||||
#include "msn_commands.h"
|
||||
#include "parse_utils.h"
|
||||
@@ -426,6 +429,128 @@
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#if HAVE_ICONV_H
|
||||
+/*
|
||||
+** Name: safe_iconv
|
||||
+** Purpose: 'Fault-tolerant' version if iconv. Replaces invalid seq with '?'
|
||||
+** Input: see iconv manpage
|
||||
+*/
|
||||
+static int safe_iconv( iconv_t handle,
|
||||
+ const char **inbuf, size_t *inbytesleft,
|
||||
+ char **outbuf, size_t *outbytesleft)
|
||||
+{
|
||||
+ int ret;
|
||||
+ while (*inbytesleft) {
|
||||
+ ret = iconv( handle, inbuf, inbytesleft,
|
||||
+ outbuf, outbytesleft);
|
||||
+ if (!*inbytesleft || !*outbytesleft)
|
||||
+ return ret;
|
||||
+ /*got invalid seq - so replace it with '?' */
|
||||
+ **outbuf = '?'; (*outbuf)++; (*outbytesleft)--;
|
||||
+ (*inbuf)++; (*inbytesleft)--;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/* charset name cache buffer */
|
||||
+char loc_charset[32];
|
||||
+
|
||||
+#define DEFAULT_CHARSET "ISO-8859-1"
|
||||
+
|
||||
+/*
|
||||
+** Name: guess_current_locale_charset
|
||||
+** Purpose: Try to guess default charset for the current locale
|
||||
+** Output: charset name
|
||||
+** FIXME: is there more right method for guessing charset
|
||||
+ than scanning $LANG ?
|
||||
+*/
|
||||
+static char* guess_current_locale_charset()
|
||||
+{
|
||||
+ char *lang, *ch;
|
||||
+ /* Return previously learned charset */
|
||||
+ return "big5";
|
||||
+ if (loc_charset[0])
|
||||
+ return loc_charset;
|
||||
+
|
||||
+ lang = getenv("LANG");
|
||||
+ ch = strrchr( lang, '.' ) + 1;
|
||||
+ if (!ch)
|
||||
+ strcpy( loc_charset, DEFAULT_CHARSET );
|
||||
+ else {
|
||||
+ iconv_t pt;
|
||||
+ strncpy( loc_charset, ch, sizeof(loc_charset) );
|
||||
+ /* try to open iconv handle using guessed charset */
|
||||
+ if ( (pt = iconv_open( loc_charset, loc_charset )) == (iconv_t)(-1) )
|
||||
+ {
|
||||
+ strcpy( loc_charset, DEFAULT_CHARSET );
|
||||
+ } else {
|
||||
+ iconv_close(pt);
|
||||
+ };
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+ return loc_charset;
|
||||
+}
|
||||
+#endif /* HAVE_ICONV_H */
|
||||
+
|
||||
+/*
|
||||
+** Name: Str2Utf8
|
||||
+** Purpose: convert a string in UTF-8 format
|
||||
+** Input: inbuf - the string to convert
|
||||
+** Output: a new string in UTF-8 format
|
||||
+*/
|
||||
+static char *StrToUtf8( const char *inbuf )
|
||||
+{
|
||||
+#if HAVE_ICONV_H
|
||||
+ size_t length = strlen( inbuf );
|
||||
+ size_t outmaxlength = length * 4; /* FIXME: Is x4 multiplier enoght? */
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( "utf-8", guess_current_locale_charset() );
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ return outbuf_save;
|
||||
+#else
|
||||
+ char *outbuf = strdup( inbuf );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ /* Clear eight bit */
|
||||
+ for (; *outbuf; ++outbuf)
|
||||
+ *outbuf &= 0x7F;
|
||||
+ return outbuf_save;
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+** Name: Utf8ToStr
|
||||
+** Purpose: revert UTF-8 string conversion
|
||||
+** Input: inbuf - the string to decode
|
||||
+** Output: a new decoded string
|
||||
+*/
|
||||
+static char *Utf8ToStr( char *inbuf )
|
||||
+{
|
||||
+#if HAVE_ICONV_H
|
||||
+ size_t length = strlen( inbuf );
|
||||
+ size_t outmaxlength = length;
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( guess_current_locale_charset(), "utf-8" );
|
||||
+
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ return outbuf_save;
|
||||
+#else
|
||||
+ return strdup( inbuf );
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
/*
|
||||
** Name: HandleMessage
|
||||
** Purpose: This function handles an instant message from either the server
|
||||
@@ -440,6 +565,7 @@
|
||||
{
|
||||
MSN_InstantMessage newIm;
|
||||
char *message;
|
||||
+ char *decodedIm;
|
||||
char *mimeInfo, *im;
|
||||
int length, nread;
|
||||
struct timeval t;
|
||||
@@ -448,6 +574,8 @@
|
||||
message = NULL;
|
||||
mimeInfo = NULL;
|
||||
im = NULL;
|
||||
+ decodedIm = NULL;
|
||||
+
|
||||
|
||||
if (numOfArgs != 4)
|
||||
return -1;
|
||||
@@ -470,13 +598,15 @@
|
||||
|
||||
if (mimeInfo != NULL) {
|
||||
if (strstr(mimeInfo, "text/plain") != NULL) {
|
||||
+
|
||||
+ decodedIm = Utf8ToStr( im );
|
||||
newIm.year = 0;
|
||||
newIm.month = 0;
|
||||
newIm.day = 0;
|
||||
newIm.hour = 0;
|
||||
newIm.minute = 0;
|
||||
newIm.sec = 0;
|
||||
- newIm.msg = im;
|
||||
+ newIm.msg = decodedIm;
|
||||
RemoveHotmail(args[1], &newIm.sender);
|
||||
newIm.friendlyhandle = args[2];
|
||||
newIm.fd = conn->fd;
|
||||
@@ -571,15 +701,18 @@
|
||||
int SendMessage(MSN_Conn *conn, const char *message)
|
||||
{
|
||||
char *commandLine;
|
||||
+ char *UTFmessage;
|
||||
int length;
|
||||
|
||||
if (!message)
|
||||
return -1;
|
||||
+ UTFmessage = NULL;
|
||||
|
||||
- commandLine = (char *)malloc(strlen(MIME_HEADER)+strlen(message)+25);
|
||||
+ UTFmessage = StrToUtf8( message );
|
||||
+ commandLine = (char *)malloc(strlen(MIME_HEADER)+strlen(UTFmessage)+25);
|
||||
length = sprintf(commandLine, "%s %lu N %d\r\n%s%s", CommandString[MSG],
|
||||
- TrID++, strlen(message)+strlen(MIME_HEADER), MIME_HEADER,
|
||||
- message);
|
||||
+ TrID++, strlen(UTFmessage)+strlen(MIME_HEADER), MIME_HEADER,
|
||||
+ UTFmessage);
|
||||
|
||||
write(conn->fd, commandLine, length);
|
||||
free(commandLine);
|
159
net/centericq/files/patch-msnhook.cc
Normal file
159
net/centericq/files/patch-msnhook.cc
Normal file
@ -0,0 +1,159 @@
|
||||
--- src/hooks/msnhook.cc Tue Nov 19 10:18:22 2002
|
||||
+++ src/hooks/msnhook.cc Tue Nov 19 10:18:35 2002
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "eventmanager.h"
|
||||
#include "centericq.h"
|
||||
#include "imlogger.h"
|
||||
+#include "utf8conv.h"
|
||||
|
||||
msnhook mhook;
|
||||
|
||||
@@ -159,7 +160,8 @@
|
||||
}
|
||||
|
||||
icqcontact *c = clist.get(ev.getcontact());
|
||||
- text = siconv(text, conf.getrussian() ? "koi8-u" : DEFAULT_CHARSET, "utf8");
|
||||
+ text = StrToUtf8(text);
|
||||
+// text = siconv(text, conf.getrussian() ? "koi8-u" : DEFAULT_CHARSET, "utf8");
|
||||
// text = toutf8(rusconv("kw", text));
|
||||
|
||||
if(c)
|
||||
@@ -274,8 +276,8 @@
|
||||
m.homepage = "http://members.msn.com/" + b.email;
|
||||
|
||||
if(!friendlynicks[ic.nickname].empty()) {
|
||||
- c->setdispnick(friendlynicks[ic.nickname]);
|
||||
- b.fname = friendlynicks[ic.nickname];
|
||||
+ c->setdispnick(Utf8ToStr(friendlynicks[ic.nickname]));
|
||||
+ b.fname = Utf8ToStr(friendlynicks[ic.nickname]);
|
||||
}
|
||||
|
||||
c->setbasicinfo(b);
|
||||
@@ -371,7 +373,8 @@
|
||||
}
|
||||
|
||||
// text = rusconv("wk", fromutf8(d->msg));
|
||||
- text = siconv(d->msg, "utf8", conf.getrussian() ? "koi8-u" : DEFAULT_CHARSET);
|
||||
+// text = siconv(d->msg, "utf8", conf.getrussian() ? "koi8-u" : DEFAULT_CHARSET);
|
||||
+ text = Utf8ToStr(d->msg);
|
||||
em.store(immessage(ic, imevent::incoming, text));
|
||||
|
||||
if(c)
|
||||
@@ -453,3 +456,117 @@
|
||||
clist.get(contactroot)->playsound(imevent::email);
|
||||
}
|
||||
}
|
||||
+#if HAVE_ICONV_H
|
||||
+int safe_iconv( iconv_t handle, const char **inbuf, size_t *inbytesleft,
|
||||
+ char **outbuf, size_t *outbytesleft)
|
||||
+{
|
||||
+ int ret;
|
||||
+ while (*inbytesleft) {
|
||||
+ ret = iconv( handle, inbuf, inbytesleft,
|
||||
+ outbuf, outbytesleft);
|
||||
+ if (!*inbytesleft || !*outbytesleft)
|
||||
+ return ret;
|
||||
+ /*got invalid seq - so replace it with '?' */
|
||||
+ **outbuf = '?'; (*outbuf)++; (*outbytesleft)--;
|
||||
+ (*inbuf)++; (*inbytesleft)--;
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+const char* guess_current_locale_charset()
|
||||
+{
|
||||
+ char *lang, *ch;
|
||||
+ /* Return previously learned charset */
|
||||
+ if (loc_charset[0])
|
||||
+ return loc_charset;
|
||||
+
|
||||
+ lang = getenv("LANG");
|
||||
+ ch = strrchr( lang, '.' ) + 1;
|
||||
+ if (!ch)
|
||||
+ strcpy( loc_charset, DEFAULT_CHARSET );
|
||||
+ else {
|
||||
+ iconv_t pt;
|
||||
+ strncpy( loc_charset, ch, sizeof(loc_charset) );
|
||||
+ /* try to open iconv handle using guessed charset */
|
||||
+ if ( (pt = iconv_open( loc_charset, loc_charset )) == (iconv_t)(-1) )
|
||||
+ {
|
||||
+ strcpy( loc_charset, DEFAULT_CHARSET );
|
||||
+ } else {
|
||||
+ iconv_close(pt);
|
||||
+ };
|
||||
+
|
||||
+ }
|
||||
+
|
||||
+ return loc_charset;
|
||||
+}
|
||||
+
|
||||
+char *StrToUtf8( const char *inbuf )
|
||||
+{
|
||||
+ size_t length = strlen( inbuf );
|
||||
+ size_t outmaxlength = length * 4; /* FIXME: Is x4 multiplier enoght? */
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( "utf-8", guess_current_locale_charset() );
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ return outbuf_save;
|
||||
+}
|
||||
+
|
||||
+std::string StrToUtf8( const std::string &instr )
|
||||
+{
|
||||
+ size_t length = instr.length();
|
||||
+ size_t outmaxlength = length * 4; /* FIXME: Is x4 multiplier enoght? */
|
||||
+ const char *inbuf = instr.c_str();
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( "utf-8", guess_current_locale_charset() );
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ std::string return_me = outbuf_save;
|
||||
+ return return_me;
|
||||
+}
|
||||
+
|
||||
+char *Utf8ToStr( const char *inbuf )
|
||||
+{
|
||||
+ size_t length = strlen( inbuf );
|
||||
+ size_t outmaxlength = length;
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( guess_current_locale_charset(), "utf-8" );
|
||||
+
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ return outbuf_save;
|
||||
+}
|
||||
+
|
||||
+std::string Utf8ToStr( const std::string &instr )
|
||||
+{
|
||||
+ size_t length = instr.length();
|
||||
+ size_t outmaxlength = length;
|
||||
+ const char *inbuf = instr.c_str();
|
||||
+ char *outbuf = (char*) malloc( outmaxlength + 1 );
|
||||
+ char *outbuf_save = outbuf;
|
||||
+ int ret;
|
||||
+
|
||||
+ iconv_t handle = iconv_open( guess_current_locale_charset(), "utf-8" );
|
||||
+
|
||||
+ ret = safe_iconv( handle, (const char **) &inbuf, &length, &outbuf, &outmaxlength );
|
||||
+
|
||||
+ iconv_close( handle );
|
||||
+
|
||||
+ std::string return_me = outbuf_save;
|
||||
+ return return_me;
|
||||
+}
|
||||
+#endif /* HAVE_ICONV_H */
|
59
net/centericq/files/patch-utf8conv.h
Normal file
59
net/centericq/files/patch-utf8conv.h
Normal file
@ -0,0 +1,59 @@
|
||||
--- src/hooks/utf8conv.h Thu Jan 1 08:00:00 1970
|
||||
+++ src/hooks/utf8conv.h Tue Nov 19 15:19:44 2002
|
||||
@@ -0,0 +1,56 @@
|
||||
+/*-------------------------------------------------------*/
|
||||
+/* utf8conv.h ( Utf8 Converter ) */
|
||||
+/*-------------------------------------------------------*/
|
||||
+/* target : Converting Utf8 from/to string/char */
|
||||
+/* modifier : clsung@dragon2.net */
|
||||
+/* create : unknown */
|
||||
+/* update : 02/11/19 */
|
||||
+/*-------------------------------------------------------*/
|
||||
+#ifndef _UTF8CONV_
|
||||
+#define _UTF8CONV_
|
||||
+
|
||||
+#ifndef HAVE_ICONV_H
|
||||
+#define HAVE_ICONV_H
|
||||
+#endif
|
||||
+
|
||||
+#ifdef HAVE_ICONV_H
|
||||
+#include <iconv.h>
|
||||
+#endif
|
||||
+#include <string>
|
||||
+#define DEFAULT_CHARSET "ISO-8859-1"
|
||||
+/* charset name cache buffer */
|
||||
+static char loc_charset[32];
|
||||
+/*
|
||||
+** Name: safe_iconv
|
||||
+** Purpose: 'Fault-tolerant' version if iconv. Replaces invalid seq with '?'
|
||||
+** Input: see iconv manpage
|
||||
+*/
|
||||
+int safe_iconv( iconv_t handle, const char **inbuf, size_t *inbytesleft,
|
||||
+ char **outbuf, size_t *outbytesleft);
|
||||
+
|
||||
+/*
|
||||
+** Name: guess_current_locale_charset
|
||||
+** Purpose: Try to guess default charset for the current locale
|
||||
+** Output: charset name
|
||||
+** FIXME: is there more right method for guessing charset
|
||||
+ than scanning $LANG ?
|
||||
+*/
|
||||
+const char* guess_current_locale_charset();
|
||||
+
|
||||
+/*
|
||||
+** Name: Str2Utf8
|
||||
+** Purpose: convert a string in UTF-8 format
|
||||
+** Input: inbuf - the string to convert
|
||||
+** Output: a new string in UTF-8 format
|
||||
+*/
|
||||
+char *StrToUtf8( const char *inbuf );
|
||||
+std::string StrToUtf8( const std::string &instr );
|
||||
+/*
|
||||
+** Name: Utf8ToStr
|
||||
+** Purpose: revert UTF-8 string conversion
|
||||
+** Input: inbuf - the string to decode
|
||||
+** Output: a new decoded string
|
||||
+*/
|
||||
+char *Utf8ToStr( const char *inbuf );
|
||||
+std::string Utf8ToStr( const std::string &instr );
|
||||
+#endif
|
Loading…
Reference in New Issue
Block a user