b56eb2dc8edd3b50dbe802604c9e4d4dbef4502e
[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                 return false;\r
43         }\r
44 }\r
45 \r
46 const bool CharsetConverter::Convert(const std::string &input, std::string &output)\r
47 {\r
48         if(m_iconv!=(iconv_t)-1)\r
49         {\r
50                 std::vector<char> invec(input.begin(),input.end());\r
51                 std::vector<char> outvec(invec.size()*4,0);\r
52 #if defined(_WIN32) //|| defined(__APPLE__) || defined(__DARWIN__)\r
53                 const char *inptr=&invec[0];\r
54 #else\r
55                 char *inptr=&invec[0];\r
56 #endif\r
57                 char *outptr=&outvec[0];\r
58                 size_t insize=invec.size();\r
59                 size_t outsize=outvec.size();\r
60                 size_t rval=0;\r
61                 \r
62                 rval=iconv(m_iconv,&inptr,&insize,&outptr,&outsize);\r
63                 \r
64                 if(outsize>=0)\r
65                 {\r
66                         outvec.resize(outptr-&outvec[0]);\r
67                         output="";\r
68                         output.append(outvec.begin(),outvec.end());\r
69                         return true;\r
70                 }\r
71                 else\r
72                 {\r
73                         return false;\r
74                 }\r
75                 \r
76         }\r
77         else\r
78         {\r
79                 return false;   \r
80         }\r
81 }\r