diff options
Diffstat (limited to 'tools/iconv.h')
-rw-r--r-- | tools/iconv.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/tools/iconv.h b/tools/iconv.h new file mode 100644 index 00000000..872a7a8d --- /dev/null +++ b/tools/iconv.h @@ -0,0 +1,90 @@ +/* + * iconv.h: iconv library wrapper + * + * See the main source file 'xineliboutput.c' for copyright information and + * how to reach the author. + * + * $Id: iconv.h,v 1.1 2007-01-13 12:13:26 phintuka Exp $ + * + */ + +#ifndef _XINELIBOUTPUT_ICONV_H_ +#define _XINELIBOUTPUT_ICONV_H_ + +#if defined(USE_ICONV) && USE_ICONV == 0 +# undef USE_ICONV +# warning iconv disabled +#endif + +#ifdef USE_ICONV +# include <iconv.h> +#endif + +class cIConv +{ +#ifdef USE_ICONV + private: + iconv_t m_ic; +#endif + + public: + cIConv(const char *SrcCharset = NULL, const char * DstCharset = NULL); + virtual ~cIConv(); + + cString Translate(const char *Text) const; +}; + +cIConv::cIConv(const char *SrcCharset, const char * DstCharset) +{ +#ifdef USE_ICONV + if(!SrcCharset) + SrcCharset = "UTF-8"; + if(!DstCharset) + DstCharset = I18nCharSets()[Setup.OSDLanguage]; + + m_ic = iconv_open(DstCharset, SrcCharset); + + if(m_ic == (iconv_t)-1) + LOGERR("cIConv: iconv_open(\"%s\",\"%s\") failed", + SrcCharset, DstCharset); +# if 0 + else + LOGDBG("cIConv: initialized conversion from \'%s\' to \'%s\'", + SrcCharset, DstCharset); +# endif +#endif +} + +cIConv::~cIConv() +{ +#ifdef USE_ICONV + if(m_ic != (iconv_t)-1) + iconv_close(m_ic); +#endif +} + +cString cIConv::Translate(const char *Text) const +{ +#ifdef USE_ICONV + size_t inc = strlen(Text); + size_t outc = inc<2048 ? 2048 : inc+1; + char *in = (char*)Text; + char *buf = (char*)malloc(outc+1); + char *out = buf; + + size_t n = iconv(m_ic, &in, &inc, &out, &outc); + + if(n != (size_t)-1) { + *out = 0; + return cString(buf, true); + } + + LOGERR("cIConv: iconv(%s) failed", Text); + free(buf); +#endif + + return cString(Text); +} + + +#endif // _XINELIBOUTPUT_ICONV_H_ |