aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorijliao <ijliao@FreeBSD.org>2002-10-30 19:02:33 +0800
committerijliao <ijliao@FreeBSD.org>2002-10-30 19:02:33 +0800
commitf01bbfe405fc00f7280388559a83bc1d8697fa17 (patch)
treebd366003510c0586a3de85d7a2392f06b1d9e811 /net
parentc8af2d6d5f5e05e550af3d2aaae8b0055216f1f2 (diff)
downloadfreebsd-ports-gnome-f01bbfe405fc00f7280388559a83bc1d8697fa17.tar.gz
freebsd-ports-gnome-f01bbfe405fc00f7280388559a83bc1d8697fa17.tar.zst
freebsd-ports-gnome-f01bbfe405fc00f7280388559a83bc1d8697fa17.zip
support utf-8 encoding with msn
PR: 44740 Submitted by: Cheng-Lung Sung <AlanSung@alansung.dragon2.net> Tested with: yinjieh@csie.nctu.edu.tw
Diffstat (limited to 'net')
-rw-r--r--net/centericq/Makefile2
-rw-r--r--net/centericq/files/patch-msn_commands.cc199
2 files changed, 200 insertions, 1 deletions
diff --git a/net/centericq/Makefile b/net/centericq/Makefile
index 4ce84dac1b1b..68062b309f25 100644
--- a/net/centericq/Makefile
+++ b/net/centericq/Makefile
@@ -8,7 +8,7 @@
PORTNAME= centericq
PORTVERSION= 4.8.6
-PORTREVISION= 0
+PORTREVISION= 1
CATEGORIES= net
MASTER_SITES= http://konst.org.ua/download/
diff --git a/net/centericq/files/patch-msn_commands.cc b/net/centericq/files/patch-msn_commands.cc
new file mode 100644
index 000000000000..00838c3e63cb
--- /dev/null
+++ b/net/centericq/files/patch-msn_commands.cc
@@ -0,0 +1,199 @@
+--- 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);