summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/iconv.h90
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_