imgtools/imglib/uniconv/source/uniconv.cpp
changeset 640 ac0bbc1e5d79
parent 626 ac03b93ca9c4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/uniconv/source/uniconv.cpp	Mon Sep 13 13:11:19 2010 +0800
@@ -0,0 +1,260 @@
+/*
+* Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <string>
+#include <new>
+
+#ifdef WIN32
+#include <windows.h>
+#else
+#include <strings.h>
+#include <iconv.h>
+#endif
+
+#include "uniconv.hpp"
+
+
+int UniConv::DefaultCodePage2UTF8(const char* DCPStringRef, unsigned int DCPLength, char** UTF8StringRef, unsigned int* UTFLength) throw ()
+{
+	int reslen = -1;
+
+	if(!UTF8StringRef || !UTFLength || !DCPStringRef)
+		return (int)-1;
+
+#ifdef WIN32
+	//make Unicode string from its default code page
+	reslen = MultiByteToWideChar(CP_ACP, 0, DCPStringRef, DCPLength, NULL, 0);
+	if(0 == reslen)
+		return (int)-1;
+	WCHAR* unistr = new (std::nothrow) WCHAR[reslen+1];
+	if(!unistr)
+		return (int)-1;
+
+	reslen = MultiByteToWideChar(CP_ACP, 0, DCPStringRef, DCPLength, unistr, reslen);
+	if(0 == reslen)
+	{
+		delete[] unistr;
+		return (int)-1;
+	}
+
+	//make UTF-8 string from its Unicode encoding
+	unsigned int realutflen = 0;
+	realutflen = WideCharToMultiByte(CP_UTF8, 0, unistr, reslen, NULL, 0, NULL, NULL);
+	if(0 == realutflen)
+	{
+		delete[] unistr;
+		return (int)-1;
+	}
+	if(realutflen+1 > *UTFLength)
+	{
+		if(*UTF8StringRef)
+			delete[] *UTF8StringRef;
+		*UTF8StringRef = new (std::nothrow) char[realutflen+1];
+		if(!*UTF8StringRef)
+		{
+			delete[] unistr;
+			*UTFLength = 0;
+			return (int)-1;
+		}
+	}
+	*UTFLength = realutflen;
+	reslen = WideCharToMultiByte(CP_UTF8, 0, unistr, reslen, *UTF8StringRef, *UTFLength, NULL, NULL);
+	(*UTF8StringRef)[realutflen] = 0;
+
+	if(0 == reslen)
+		reslen = (int)-1;
+
+	//clean up temporarily allocated resources
+	delete[] unistr;
+#else
+	//character set format: language[_territory][.codeset][@modifier]
+	char* dcp = getenv("LANG");
+	if(!dcp)
+		return (int)-1;
+	char* dot = strstr(dcp, ".");
+	if(dot)
+		dcp += ((dot-dcp) + 1);
+	char* atmark = strstr(dcp, "@");
+	if(atmark)
+		*(atmark) = 0;
+	if(strcasecmp(dcp, "UTF-8") == 0)
+	{
+		strcpy(*UTF8StringRef, DCPStringRef);
+		*UTFLength = DCPLength;
+		return DCPLength;
+	}
+	iconv_t convhan = iconv_open("UTF-8", dcp);
+	if((iconv_t)(-1) == convhan)
+		return (int)-1;
+	char* utf8str = new (std::nothrow) char[DCPLength*4];
+	if(!utf8str)
+	{
+		iconv_close(convhan);
+		return (int)-1;
+	}
+	int realutflen = DCPLength*4;
+	int origLen = realutflen;
+	char* pout = utf8str;
+	if(iconv(convhan, const_cast<char**>(&DCPStringRef), (size_t*)&DCPLength, &pout, (size_t*)&realutflen) < 0)
+	{
+		iconv_close(convhan);
+		delete[] utf8str;
+		return (int)-1;
+	}
+	realutflen = origLen - realutflen;
+	if((unsigned int)(realutflen+1) > *UTFLength)
+	{
+		if(*UTF8StringRef)
+			delete[] *UTF8StringRef;
+		*UTF8StringRef = new (std::nothrow) char[realutflen+1];
+		if(!*UTF8StringRef)
+		{
+			delete[] utf8str;
+			iconv_close(convhan);
+			return (int)-1;
+		}
+	}
+	strncpy(*UTF8StringRef, utf8str, realutflen);
+	(*UTF8StringRef)[realutflen] = 0;
+	*UTFLength = realutflen;
+	reslen = realutflen;
+	delete[] utf8str;
+	iconv_close(convhan);
+#endif
+
+	return reslen;
+}
+
+int UniConv::UTF82DefaultCodePage(const char* UTF8StringRef, unsigned int UTFLength, char** DCPStringRef, unsigned int* DCPLength) throw ()
+{
+	int reslen = -1;
+
+	if(!DCPStringRef || !DCPLength || !UTF8StringRef)
+		return (int)-1;
+
+#ifdef WIN32
+	//make Unicode string from its UTF-8 encoding
+	reslen = MultiByteToWideChar(CP_UTF8, 0, UTF8StringRef, UTFLength, NULL, 0);
+	if(0 == reslen)
+		return (int)-1;
+	WCHAR* unistr = new (std::nothrow) WCHAR[reslen+1];
+	if(!unistr)
+		return (int)-1;
+
+	reslen = MultiByteToWideChar(CP_UTF8, 0, UTF8StringRef, UTFLength, unistr, reslen);
+	if(0 == reslen)
+	{
+		delete[] unistr;
+		return (int)-1;
+	}
+
+	//make default code paged string from its Unicode encoding
+	unsigned int realdcplen = 0;
+	realdcplen = WideCharToMultiByte(CP_ACP, 0, unistr, reslen, NULL, 0, NULL, NULL);
+	if(0 == realdcplen)
+	{
+		delete[] unistr;
+		return (int)-1;
+	}
+	if(realdcplen+1 > *DCPLength)
+	{
+		if(*DCPStringRef)
+			delete[] *DCPStringRef;
+		*DCPStringRef = new (std::nothrow) char[realdcplen+1];
+		if(!*DCPStringRef)
+		{
+			delete[] unistr;
+			*DCPLength = 0;
+			return (int)-1;
+		}
+	}
+	*DCPLength = realdcplen;
+	reslen = WideCharToMultiByte(CP_ACP, 0, unistr, reslen, *DCPStringRef, *DCPLength, NULL, NULL);
+	(*DCPStringRef)[realdcplen] = 0;
+
+	if(0 == reslen)
+		reslen = (int)-1;
+
+	//clean up temporarily allocated resources
+	delete[] unistr;
+#else
+	//character set format: language[_territory][.codeset][@modifier]
+	char* dcp = getenv("LANG");
+	if(!dcp)
+		return (int)-1;
+
+	char* dot = strstr(dcp, ".");
+	if(dot)
+		dcp += ((dot-dcp) + 1);
+	char* atmark = strstr(dcp, "@");
+	if(atmark)
+		*(atmark) = 0;
+	iconv_t convhan = iconv_open(dcp, "UTF-8");
+	if((iconv_t)(-1) == convhan)
+		return (int)-1;
+	char* dcpstr = new (std::nothrow) char[UTFLength*4];
+	if(!dcpstr)
+	{
+		iconv_close(convhan);
+		return (int)-1;
+	}
+	int realdcplen = UTFLength*4;
+	int origLen = realdcplen;
+	char* pout = dcpstr;
+	if(iconv(convhan, const_cast<char**>(&UTF8StringRef), (size_t*)&UTFLength, &pout, (size_t*)&realdcplen) < 0)
+	{
+		iconv_close(convhan);
+		delete[] dcpstr;
+		return (int)-1;
+	}
+	realdcplen = origLen - realdcplen;
+	if((unsigned int)(realdcplen+1) > *DCPLength)
+	{
+		if(*DCPStringRef)
+			delete[] *DCPStringRef;
+		*DCPStringRef = new (std::nothrow) char[realdcplen+1];
+		if(!*DCPStringRef)
+		{
+			delete[] dcpstr;
+			iconv_close(convhan);
+			return (int)-1;
+		}
+	}
+	strncpy(*DCPStringRef, dcpstr, realdcplen);
+	(*DCPStringRef)[realdcplen] = 0;
+	*DCPLength = realdcplen;
+	reslen = realdcplen;
+	delete[] dcpstr;
+	iconv_close(convhan);
+#endif
+
+	return reslen;
+}
+
+
+bool UniConv::IsPureASCIITextStream(const char* StringRef) throw ()
+{
+	while (*StringRef && !(*StringRef++ & 0x80))
+		;
+	if (*StringRef)
+		return false;
+	else
+		return true;
+}