#ifndef __UTF8_HELPERS_H__ # define __UTF8_HELPERS_H__ #include #include #include class TcharToUtf8 { public: TcharToUtf8(const char *str) : utf8(NULL) { int size = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); if (size <= 0) throw _T("Could not convert string to WCHAR"); WCHAR *tmp = (WCHAR *) mir_alloc(size * sizeof(WCHAR)); if (tmp == NULL) throw _T("mir_alloc returned NULL"); MultiByteToWideChar(CP_ACP, 0, str, -1, tmp, size); init(tmp); mir_free(tmp); } TcharToUtf8(const WCHAR *str) : utf8(NULL) { init(str); } ~TcharToUtf8() { if (utf8 != NULL) mir_free(utf8); } operator char *() { return utf8; } private: char *utf8; void init(const WCHAR *str) { int size = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL); if (size <= 0) throw _T("Could not convert string to UTF8"); utf8 = (char *) mir_alloc(size); if (utf8 == NULL) throw _T("mir_alloc returned NULL"); WideCharToMultiByte(CP_UTF8, 0, str, -1, utf8, size, NULL, NULL); } }; class Utf8ToTchar { public: Utf8ToTchar(const char *str) : tchar(NULL) { if (str == NULL) return; int size = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); if (size <= 0) throw _T("Could not convert string to WCHAR"); WCHAR *tmp = (WCHAR *) mir_alloc(size * sizeof(WCHAR)); if (tmp == NULL) throw _T("mir_alloc returned NULL"); MultiByteToWideChar(CP_UTF8, 0, str, -1, tmp, size); #ifdef UNICODE tchar = tmp; #else size = WideCharToMultiByte(CP_ACP, 0, tmp, -1, NULL, 0, NULL, NULL); if (size <= 0) { mir_free(tmp); throw _T("Could not convert string to ACP"); } tchar = (TCHAR *) mir_alloc(size * sizeof(char)); if (tchar == NULL) { mir_free(tmp); throw _T("mir_alloc returned NULL"); } WideCharToMultiByte(CP_ACP, 0, tmp, -1, tchar, size, NULL, NULL); mir_free(tmp); #endif } ~Utf8ToTchar() { if (tchar != NULL) mir_free(tchar); } TCHAR *detach() { TCHAR *ret = tchar; tchar = NULL; return ret; } operator TCHAR *() { return tchar; } private: TCHAR *tchar; }; class CharToTchar { public: CharToTchar(const char *str) : tchar(NULL) { if (str == NULL) return; #ifdef UNICODE int size = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); if (size <= 0) throw _T("Could not convert string to WCHAR"); WCHAR *tmp = (WCHAR *) mir_alloc(size * sizeof(WCHAR)); if (tmp == NULL) throw _T("mir_alloc returned NULL"); MultiByteToWideChar(CP_ACP, 0, str, -1, tmp, size); tchar = tmp; #else tchar = str; #endif } ~CharToTchar() { #ifdef UNICODE if (tchar != NULL) mir_free(tchar); #endif } TCHAR *detach() { #ifdef UNICODE TCHAR *ret = tchar; #else TCHAR *ret = (tchar == NULL ? NULL : mir_strdup(tchar)); #endif tchar = NULL; return ret; } operator const TCHAR *() { return tchar; } private: #ifdef UNICODE TCHAR *tchar; #else const TCHAR *tchar; #endif }; class WcharToTchar { public: WcharToTchar(const WCHAR *str) : tchar(NULL) { if (str == NULL) return; #ifdef UNICODE tchar = str; #else int size = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL); if (size <= 0) throw _T("Could not convert string to ACP"); tchar = (TCHAR *) mir_alloc(size); if (tchar == NULL) throw _T("mir_alloc returned NULL"); WideCharToMultiByte(CP_ACP, 0, str, -1, tchar, size, NULL, NULL); #endif } ~WcharToTchar() { #ifndef UNICODE if (tchar != NULL) mir_free(tchar); #endif } TCHAR *detach() { #ifdef UNICODE TCHAR *ret = (tchar == NULL ? NULL : mir_wstrdup(tchar)); #else TCHAR *ret = tchar; #endif tchar = NULL; return ret; } operator const TCHAR *() { return tchar; } private: #ifdef UNICODE const TCHAR *tchar; #else TCHAR *tchar; #endif }; class TcharToChar { public: TcharToChar(const TCHAR *str) : val(NULL) { if (str == NULL) return; #ifdef UNICODE int size = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL); if (size <= 0) throw _T("Could not convert string to ACP"); val = (char *) mir_alloc(size); if (val == NULL) throw _T("mir_alloc returned NULL"); WideCharToMultiByte(CP_ACP, 0, str, -1, val, size, NULL, NULL); #else val = str; #endif } ~TcharToChar() { #ifdef UNICODE if (val != NULL) mir_free(val); #endif } char *detach() { #ifdef UNICODE char *ret = val; #else char *ret = (val == NULL ? NULL : mir_strdup(val)); #endif val = NULL; return ret; } operator const char *() { return val; } private: #ifdef UNICODE char *val; #else const char *val; #endif }; class TcharToWchar { public: TcharToWchar(const TCHAR *str) : val(NULL) { if (str == NULL) return; #ifdef UNICODE val = str; #else int size = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); if (size <= 0) throw _T("Could not convert string to WCHAR"); val = (WCHAR *) mir_alloc(size * sizeof(WCHAR)); if (val == NULL) throw _T("mir_alloc returned NULL"); MultiByteToWideChar(CP_UTF8, 0, str, -1, val, size); #endif } ~TcharToWchar() { #ifndef UNICODE if (val != NULL) mir_free(val); #endif } WCHAR *detach() { #ifdef UNICODE WCHAR *ret = (val == NULL ? NULL : mir_wstrdup(val)); #else WCHAR *ret = val; #endif val = NULL; return ret; } operator const WCHAR *() { return val; } private: #ifdef UNICODE const WCHAR *val; #else WCHAR *val; #endif }; #endif // __UTF8_HELPERS_H__