version 0.2.8
[fms.git] / src / charsetconverter.cpp
1 #include "../include/charsetconverter.h"\r
2 \r
3 #include <vector>\r
4 \r
5 CharsetConverter::CharsetConverter()\r
6 {\r
7         m_iconv=(iconv_t)-1;\r
8         m_fromcharset="";\r
9         m_tocharset=""; \r
10 }\r
11 \r
12 CharsetConverter::CharsetConverter(const std::string &fromcharset, const std::string &tocharset)\r
13 {\r
14         SetConversion(fromcharset,tocharset);\r
15 }\r
16 \r
17 CharsetConverter::~CharsetConverter()\r
18 {\r
19         if(m_iconv!=(iconv_t)-1)\r
20         {\r
21                 iconv_close(m_iconv);\r
22         }\r
23 }\r
24 \r
25 const bool CharsetConverter::SetConversion(const std::string &fromcharset, const std::string &tocharset)\r
26 {\r
27         if(m_iconv!=(iconv_t)-1)\r
28         {\r
29                 iconv_close(m_iconv);\r
30                 m_iconv=(iconv_t)-1;\r
31         }\r
32         if((m_iconv=iconv_open(tocharset.c_str(),fromcharset.c_str()))!=(iconv_t)-1)\r
33         {\r
34                 m_fromcharset=fromcharset;\r
35                 m_tocharset=tocharset;\r
36                 return true;    \r
37         }\r
38         else\r
39         {\r
40                 m_fromcharset="";\r
41                 m_tocharset="";\r
42         }\r
43 }\r
44 \r
45 const bool CharsetConverter::Convert(const std::string &input, std::string &output)\r
46 {\r
47         if(m_iconv!=(iconv_t)-1)\r
48         {\r
49                 std::vector<char> invec(input.begin(),input.end());\r
50                 std::vector<char> outvec(invec.size()*4,0);\r
51 #ifdef _WIN32\r
52                 const char *inptr=&invec[0];\r
53 #else\r
54                 char *inptr=&invec[0];\r
55 #endif\r
56                 char *outptr=&outvec[0];\r
57                 size_t insize=invec.size();\r
58                 size_t outsize=outvec.size();\r
59                 size_t rval=0;\r
60                 \r
61                 rval=iconv(m_iconv,&inptr,&insize,&outptr,&outsize);\r
62                 \r
63                 if(outsize>=0)\r
64                 {\r
65                         outvec.resize(outptr-&outvec[0]);\r
66                         output="";\r
67                         output.append(outvec.begin(),outvec.end());\r
68                 }\r
69                 else\r
70                 {\r
71                         return false;\r
72                 }\r
73                 \r
74         }\r
75         else\r
76         {\r
77                 return false;   \r
78         }\r
79 }\r