version 0.2.8
[fms.git] / src / charsetconverter.cpp
diff --git a/src/charsetconverter.cpp b/src/charsetconverter.cpp
new file mode 100644 (file)
index 0000000..f6f73d4
--- /dev/null
@@ -0,0 +1,79 @@
+#include "../include/charsetconverter.h"\r
+\r
+#include <vector>\r
+\r
+CharsetConverter::CharsetConverter()\r
+{\r
+       m_iconv=(iconv_t)-1;\r
+       m_fromcharset="";\r
+       m_tocharset=""; \r
+}\r
+\r
+CharsetConverter::CharsetConverter(const std::string &fromcharset, const std::string &tocharset)\r
+{\r
+       SetConversion(fromcharset,tocharset);\r
+}\r
+\r
+CharsetConverter::~CharsetConverter()\r
+{\r
+       if(m_iconv!=(iconv_t)-1)\r
+       {\r
+               iconv_close(m_iconv);\r
+       }\r
+}\r
+\r
+const bool CharsetConverter::SetConversion(const std::string &fromcharset, const std::string &tocharset)\r
+{\r
+       if(m_iconv!=(iconv_t)-1)\r
+       {\r
+               iconv_close(m_iconv);\r
+               m_iconv=(iconv_t)-1;\r
+       }\r
+       if((m_iconv=iconv_open(tocharset.c_str(),fromcharset.c_str()))!=(iconv_t)-1)\r
+       {\r
+               m_fromcharset=fromcharset;\r
+               m_tocharset=tocharset;\r
+               return true;    \r
+       }\r
+       else\r
+       {\r
+               m_fromcharset="";\r
+               m_tocharset="";\r
+       }\r
+}\r
+\r
+const bool CharsetConverter::Convert(const std::string &input, std::string &output)\r
+{\r
+       if(m_iconv!=(iconv_t)-1)\r
+       {\r
+               std::vector<char> invec(input.begin(),input.end());\r
+               std::vector<char> outvec(invec.size()*4,0);\r
+#ifdef _WIN32\r
+               const char *inptr=&invec[0];\r
+#else\r
+               char *inptr=&invec[0];\r
+#endif\r
+               char *outptr=&outvec[0];\r
+               size_t insize=invec.size();\r
+               size_t outsize=outvec.size();\r
+               size_t rval=0;\r
+               \r
+               rval=iconv(m_iconv,&inptr,&insize,&outptr,&outsize);\r
+               \r
+               if(outsize>=0)\r
+               {\r
+                       outvec.resize(outptr-&outvec[0]);\r
+                       output="";\r
+                       output.append(outvec.begin(),outvec.end());\r
+               }\r
+               else\r
+               {\r
+                       return false;\r
+               }\r
+               \r
+       }\r
+       else\r
+       {\r
+               return false;   \r
+       }\r
+}\r