Revision: 7327 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/7327 Author: zmatsuo Date: 2018-12-15 00:41:26 +0900 (Sat, 15 Dec 2018) Log Message: ----------- ttproxy unicode化 Modified Paths: -------------- branches/cmake/TTProxy/CMakeLists.txt branches/cmake/TTProxy/Logger.h branches/cmake/TTProxy/ProxyWSockHook.h branches/cmake/TTProxy/SSLLIB.h branches/cmake/TTProxy/SSLSocket.h branches/cmake/TTProxy/TTProxy.cpp branches/cmake/TTProxy/TTProxy.h branches/cmake/TTProxy/YCL/include/YCL/ComboBoxCtrl.h branches/cmake/TTProxy/YCL/include/YCL/Dialog.h branches/cmake/TTProxy/YCL/include/YCL/EditBoxCtrl.h branches/cmake/TTProxy/YCL/include/YCL/FileVersion.h branches/cmake/TTProxy/YCL/include/YCL/IniFile.h branches/cmake/TTProxy/YCL/include/YCL/Integer.h branches/cmake/TTProxy/YCL/include/YCL/Resource.h branches/cmake/TTProxy/YCL/include/YCL/String.h branches/cmake/TTProxy/YCL/include/YCL/StringBuffer.h branches/cmake/TTProxy/YCL/include/YCL/StringUtil.h branches/cmake/TTProxy/YCL/include/YCL/Window.h branches/cmake/TTProxy/YCL/include/YCL/common.h branches/cmake/teraterm/common/codeconv.cpp branches/cmake/teraterm/common/codeconv.h -------------- next part -------------- Modified: branches/cmake/TTProxy/CMakeLists.txt =================================================================== --- branches/cmake/TTProxy/CMakeLists.txt 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/CMakeLists.txt 2018-12-14 15:41:26 UTC (rev 7327) @@ -1,18 +1,33 @@ project(ttproxy) +if(USE_UNICODE_API) + add_definitions(-DUNICODE -D_UNICODE) +endif() + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/") +if(MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4") +endif() + include(${CMAKE_CURRENT_SOURCE_DIR}/../libs/lib_openssl.cmake) set(COMMON_SRC ../teraterm/common/ttlib.h ../teraterm/common/i18n.h + ../teraterm/common/ttplugin.h + ../teraterm/common/tttypes.h + ../teraterm/common/tt-version.h + ../teraterm/common/codeconv.h + ../teraterm/common/codeconv.cpp + ../teraterm/common/dlglib.h + ../teraterm/common/dlglib.c + ../teraterm/common/dlglib_cpp.cpp + ../teraterm/common/dlglib_tmpl.cpp ../teraterm/teraterm/ttdialog.h ../teraterm/teraterm/ttfileio.h - ../teraterm/common/ttplugin.h ../teraterm/teraterm/ttsetup.h - ../teraterm/common/tttypes.h - ../teraterm/common/tt-version.h ../teraterm/teraterm/ttwsk.h ) source_group( Modified: branches/cmake/TTProxy/Logger.h =================================================================== --- branches/cmake/TTProxy/Logger.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/Logger.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -70,7 +70,7 @@ WriteFile(logfile, label, strlen(label), &written, NULL); WriteFile(logfile, ": [", 3, &written, NULL); while (size-- > 0) { - len = wsprintf(buf, " %02x", *data++); + len = wsprintfA(buf, " %02x", *data++); WriteFile(logfile, buf, 3, &written, NULL); } WriteFile(logfile, " ]\r\n", 4, &written, NULL); Modified: branches/cmake/TTProxy/ProxyWSockHook.h =================================================================== --- branches/cmake/TTProxy/ProxyWSockHook.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/ProxyWSockHook.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -17,16 +17,23 @@ #include "ttlib.h" #include "i18n.h" +#include "codeconv.h" +#include "dlglib.h" extern char UILanguageFile[MAX_PATH]; -void UTIL_get_lang_msg(const char *key, PCHAR buf, int buf_len, const char *def) +void UTIL_get_lang_msg(const char *key, TCHAR *buf, int buf_len, const TCHAR *def) { - GetI18nStr("TTProxy", key, buf, buf_len, def, UILanguageFile); + GetI18nStrT("TTProxy", key, buf, buf_len, def, UILanguageFile); } -int UTIL_get_lang_font(const char *key, HWND dlg, PLOGFONT logfont, HFONT *font) +void UTIL_get_lang_msgU8(const char *key, char *buf, int buf_len, const char *def) { + GetI18nStrU8("TTProxy", key, buf, buf_len, def, UILanguageFile); +} + +int UTIL_get_lang_font(const char *key, HWND dlg, PLOGFONTA logfont, HFONT *font) +{ if (GetI18nLogfont("TTProxy", key, logfont, GetDeviceCaps(GetDC(dlg),LOGPIXELSY), UILanguageFile) == FALSE) { @@ -33,7 +40,7 @@ return FALSE; } - if ((*font = CreateFontIndirect(logfont)) == NULL) { + if ((*font = CreateFontIndirectA(logfont)) == NULL) { return FALSE; } @@ -44,7 +51,7 @@ public: class MessageShower { public: - virtual void showMessage(const char* message)const = 0; + virtual void showMessage(const TCHAR* message)const = 0; }; private: struct DUMMYHOSTENT { @@ -136,57 +143,57 @@ private: struct PROXY_TYPE_TABLE { Type type; - const char* name; + const TCHAR* name; }; static const PROXY_TYPE_TABLE* proxy_type_table() { static PROXY_TYPE_TABLE table[] = { - {TYPE_HTTP, "http"}, - {TYPE_SOCKS5, "socks"}, - {TYPE_SOCKS4, "socks4"}, - {TYPE_TELNET, "telnet"}, - {TYPE_SOCKS5, "socks5"}, - {TYPE_NONE_FORCE, "none"}, - {TYPE_HTTP_SSL, "http+ssl"}, - {TYPE_SOCKS5_SSL, "socks+ssl"}, - {TYPE_SOCKS4_SSL, "socks4+ssl"}, - {TYPE_TELNET_SSL, "telnet+ssl"}, - {TYPE_SOCKS5_SSL, "socks5+ssl"}, - {TYPE_SSL, "ssl"}, - {TYPE_SSL, "none+ssl"}, + {TYPE_HTTP, _T("http")}, + {TYPE_SOCKS5, _T("socks")}, + {TYPE_SOCKS4, _T("socks4")}, + {TYPE_TELNET, _T("telnet")}, + {TYPE_SOCKS5, _T("socks5")}, + {TYPE_NONE_FORCE, _T("none")}, + {TYPE_HTTP_SSL, _T("http+ssl")}, + {TYPE_SOCKS5_SSL, _T("socks+ssl")}, + {TYPE_SOCKS4_SSL, _T("socks4+ssl")}, + {TYPE_TELNET_SSL, _T("telnet+ssl")}, + {TYPE_SOCKS5_SSL, _T("socks5+ssl")}, + {TYPE_SSL, _T("ssl")}, + {TYPE_SSL, _T("none+ssl")}, {TYPE_NONE, NULL}, }; return table; } public: - static Type parseType(const char* string) { - return parseType(string, string + strlen(string)); + static Type parseType(const TCHAR* string) { + return parseType(string, string + _tcslen(string)); } - static Type parseType(const char* string, const char* end) { + static Type parseType(const TCHAR* string, const TCHAR* end) { int length = end - string; - char* buffer = (char*) alloca(length + 1); - char* dst = buffer; + TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * (length + 1)); + TCHAR* dst = buffer; while (length-- > 0 && *string != '\0') { - int ch = *string++; - if ('A' <= ch && ch <= 'Z') { - ch += 'a' - 'A'; + TCHAR ch = *string++; + if (_T('A') <= ch && ch <= _T('Z')) { + ch += _T('a') - _T('A'); } *dst++ = ch; } - *dst = '\0'; + *dst = _T('\0'); const PROXY_TYPE_TABLE* table = proxy_type_table(); bool ssl_enabled = SSLSocket::isEnabled(); while (table->name != NULL) { - if (!ssl_enabled && strstr(table->name, "ssl") != NULL) { + if (!ssl_enabled && _tcsstr(table->name, _T("ssl")) != NULL) { table++; continue; } - if (strcmp(buffer, table->name) == 0) + if (_tcscmp(buffer, table->name) == 0) return table->type; table++; } return TYPE_NONE; } - static const char* getTypeName(Type type) { + static const TCHAR* getTypeName(Type type) { if (type != TYPE_NONE && type != TYPE_NONE_FORCE) { const PROXY_TYPE_TABLE* table = proxy_type_table(); while (table->name != NULL) { @@ -198,10 +205,10 @@ return NULL; } - static int parsePort(const char* string) { - return parsePort(string, string + strlen(string)); + static int parsePort(const TCHAR* string) { + return parsePort(string, string + _tcslen(string)); } - static int parsePort(const char* string, const char* end) { + static int parsePort(const TCHAR* string, const TCHAR* end) { if (string > end || *string < '1' || '9' < *string) return -1; int digit = 0; @@ -276,8 +283,8 @@ return url; } #else - static String parse(const char* url, ProxyInfo& proxy) { - char* p = strstr((char*) url, "://"); + static String parse(const TCHAR* url, ProxyInfo& proxy) { + TCHAR* p = _tcsstr((TCHAR*) url, _T("://")); if (p == NULL) { proxy.type = TYPE_NONE; return NULL; @@ -286,7 +293,7 @@ if (proxy.type == TYPE_NONE) return NULL; p += 3; - const char* start = p; + const TCHAR* start = p; // user:pass \x82\xAA\x82\xA0\x82\xEA\x82Ίi\x94[\x82\xB7\x82\xE9 String tmp = String(start); @@ -352,7 +359,7 @@ return NULL; StringBuffer buffer; buffer.append(getTypeName(type)); - buffer.append("://"); + buffer.append(_T("://")); if (type != TYPE_SSL) { if (user != NULL) { urlencode(user, buffer); @@ -366,9 +373,9 @@ buffer.append(host); } else { - buffer.append("["); + buffer.append(_T("[")); buffer.append(host); - buffer.append("]"); + buffer.append(_T("]")); } if (port != 0) { buffer.append(':'); @@ -398,9 +405,9 @@ } } - static String urldecode(const char* start, const char* end) { - char* buffer = (char*) alloca((end - start) * 3 + 1); - char* dst = buffer; + static String urldecode(const TCHAR* start, const TCHAR* end) { + TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * ((end - start) * 3 + 1)); + TCHAR* dst = buffer; int c1, c2; while (start < end) { if (*start == '%' && start + 2 < end && (c1 = hexdigit(start[1])) != -1 && (c2 = hexdigit(start[2])) != -1) { @@ -407,9 +414,11 @@ *dst++ = (char) (c1 << 4 | c2); start += 3; }else{ - if (IsDBCSLeadByte(*start)) { +#if !defined(UNICODE) + if (::IsDBCSLeadByte(*start)) { *dst++ = *start++; } +#endif *dst++ = *start++; } } @@ -416,16 +425,18 @@ *dst = '\0'; return buffer; } - static String urlencode(const char* string, StringBuffer& buffer) { - static const char table[] = "0123456789ABCDEF"; - const char* start = string; + static String urlencode(const TCHAR* string, StringBuffer& buffer) { + static const TCHAR table[] = _T("0123456789ABCDEF"); + const TCHAR* start = string; while (*string != '\0') { if ('0' <= *string && *string <= '9' || 'A' <= *string && *string <= 'Z' || 'a' <= *string && *string <= 'z' || *string == '-' || *string == '.' || *string == '_') { +#if !defined(UNICODE) }else if (::IsDBCSLeadByte(*string)) { string++; +#endif }else{ if (start < string) { buffer.append(start, string - start); @@ -485,26 +496,26 @@ ~ConnectionInfo() { delete[] buffer; } - void fillBuffer(char* buffer, int bufferLength) { - fillBuffer(buffer, bufferLength, "ssh"); + void fillBuffer(char* _buffer, int bufferLength) { + fillBuffer(_buffer, bufferLength, "ssh"); } - void fillBuffer(char* buffer, int bufferLength, const char *portname) { - fillBuffer(buffer, bufferLength, "ssh", AF_UNSPEC); + void fillBuffer(char* _buffer, int bufferLength, const char *portname) { + fillBuffer(_buffer, bufferLength, "ssh", AF_UNSPEC); } - void fillBuffer(char* buffer, int bufferLength, const char *portname, int addr_family) { - struct servent* sv; + void fillBuffer(char* _buffer, int bufferLength, const char *portname, int addr_family) { + struct servent* sv = getservbyname(portname, "tcp"); struct addrinfo* res; struct addrinfo* res0; struct addrinfo hints; int portnum = 0; - if (sv = getservbyname(portname, "tcp")) { + if (sv) { portnum = sv->s_port; } else { portnum = atoi(portname); } - memset(buffer, 0, bufferLength); - DUMMYHOSTENT* dst = (DUMMYHOSTENT*) buffer; + memset(_buffer, 0, bufferLength); + DUMMYHOSTENT* dst = (DUMMYHOSTENT*) _buffer; dst->addr = addr; dst->addr6 = addr6; dst->addrlist[0] = (char*) &dst->addr; @@ -554,7 +565,7 @@ case AF_UNSPEC: default: memset(&hints, 0, sizeof hints); - getaddrinfo(proxy.host, NULL, &hints, &res0); + getaddrinfo((u8)proxy.host, NULL, &hints, &res0); if (res0) { int flag = 0; for (res = res0; res; res = res->ai_next) { @@ -591,7 +602,7 @@ break; } - strcpy_s(dst->hostname, bufferLength - sizeof (DUMMYHOSTENT), realhost); + strcpy_s(dst->hostname, bufferLength - sizeof (DUMMYHOSTENT), (u8)realhost); } }; class ConnectionInfoHolder { @@ -665,7 +676,7 @@ ::LeaveCriticalSection(§ion); return info; } - ConnectionInfo* find(const char* url) { + ConnectionInfo* find(const TCHAR* url) { ::EnterCriticalSection(§ion); ConnectionInfo* info = table.get(url); ::LeaveCriticalSection(§ion); @@ -734,20 +745,18 @@ protected: virtual bool dispatch(int message, int wParam, long lParam) { if (message == WM_COMMAND && wParam == MAKEWPARAM(IDC_REFER, BN_CLICKED)) { - char buffer[1024]; - char uimsg[MAX_UIMSG]; - OPENFILENAME ofn = { - sizeof ofn, - *this, - }; + TCHAR buffer[1024]; + TCHAR uimsg[MAX_UIMSG]; + OPENFILENAME ofn; + ofn.lStructSize = sizeof(ofn); ofn.lpstrFile = buffer; ofn.nMaxFile = countof(buffer); ofn.Flags = OFN_LONGNAMES | OFN_NONETWORKBUTTON | OFN_PATHMUSTEXIST | OFN_NOREADONLYRETURN | OFN_HIDEREADONLY; - UTIL_get_lang_msg("MSG_LOGFILE_SELECT", uimsg, sizeof(uimsg), - "Select Logfile"); + UTIL_get_lang_msg("MSG_LOGFILE_SELECT", uimsg, _countof(uimsg), + _T("Select Logfile")); ofn.lpstrTitle = uimsg; if (logfile != NULL) { - strcpy_s(buffer, sizeof buffer, logfile); + _tcscpy_s(buffer, _countof(buffer), (tc)logfile); }else{ buffer[0] = '\0'; } @@ -764,14 +773,33 @@ return Dialog::dispatch(message, wParam, lParam); } virtual bool onInitDialog() { - char uimsg[MAX_UIMSG], uitmp[MAX_UIMSG]; - LOGFONT logfont; + const static DlgTextInfo text_info[] = { + { 0, "DLG_OTHER_TITLE" }, + { IDC_GRP_COMMON, "DLG_OTHER_COMMON" }, + { IDC_TIMEOUT_LABEL, "DLG_OTHER_TIMEOUT" }, + { IDC_TIMEOUT_SECONDS, "DLG_OTHER_SECOND" }, + { IDC_LOGFILE_LABEL, "DLG_OTHER_LOG" }, + { IDC_REFER, "DLG_OTHER_REFER" }, + { IDC_GRP_SOCKS, "DLG_OTHER_SOCKS" }, + { IDC_RESOLVE_LABEL, "DLG_OTHER_RESOLV" }, + { IDC_GRP_TELNET, "DLG_OTHER_TELNET" }, + { IDC_HOSTNAME_LABEL, "DLG_OTHER_HOST" }, + { IDC_USERNAME_LABEL, "DLG_OTHER_USER" }, + { IDC_PASSWORD_LABEL, "DLG_OTHER_PASS" }, + { IDC_CONNECTED_LABEL, "DLG_OTHER_CONNECT" }, + { IDC_ERROR_LABEL, "DLG_OTHER_ERROR" }, +// { IDOK, "BTN_OK" }, +// { IDCANCEL, "BTN_CANCEL" }, + }; + TCHAR uimsg[MAX_UIMSG]; +// TCHAR uitmp[MAX_UIMSG]; + LOGFONTA logfont; HFONT font; Dialog::onInitDialog(); font = (HFONT)SendMessage(WM_GETFONT, 0, 0); - GetObject(font, sizeof(LOGFONT), &logfont); + GetObject(font, sizeof(logfont), &logfont); if (UTIL_get_lang_font("DLG_TAHOMA_FONT", HWND(), &logfont, &DlgFont)) { SendDlgItemMessage(IDC_GRP_COMMON, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0)); SendDlgItemMessage(IDC_TIMEOUT_LABEL, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0)); @@ -801,6 +829,9 @@ DlgFont = NULL; } + HWND hWnd = (HWND)this; + SetDlgTexts(hWnd, text_info, _countof(text_info), UILanguageFile); +#if 0 GetWindowText(uitmp, sizeof(uitmp)); UTIL_get_lang_msg("DLG_OTHER_TITLE", uimsg, sizeof(uimsg), uitmp); SetWindowText(uimsg); @@ -849,6 +880,7 @@ GetDlgItemText(IDCANCEL, uitmp, sizeof(uitmp)); UTIL_get_lang_msg("BTN_CANCEL", uimsg, sizeof(uimsg), uitmp); SetDlgItemText(IDCANCEL, uimsg); +#endif host = GetDlgItem(IDC_HOSTNAME); user = GetDlgItem(IDC_USERNAME); @@ -860,22 +892,22 @@ SetDlgItemInt(IDC_TIMEOUT, timeout, false); resolveCombo <<= GetDlgItem(IDC_RESOLVE); - UTIL_get_lang_msg("DLG_OTHER_RESOLV_AUTO", uimsg, sizeof(uimsg), "auto resolve"); + UTIL_get_lang_msg("DLG_OTHER_RESOLV_AUTO", uimsg, _countof(uimsg), _T("auto resolve")); resolveCombo.addString(uimsg); - UTIL_get_lang_msg("DLG_OTHER_RESOLV_REMOTE", uimsg, sizeof(uimsg), "resolve remote"); + UTIL_get_lang_msg("DLG_OTHER_RESOLV_REMOTE", uimsg, _countof(uimsg), _T("resolve remote")); resolveCombo.addString(uimsg); - UTIL_get_lang_msg("DLG_OTHER_RESOLV_LOCAL", uimsg, sizeof(uimsg), "resolve local"); + UTIL_get_lang_msg("DLG_OTHER_RESOLV_LOCAL", uimsg, _countof(uimsg), _T("resolve local")); resolveCombo.addString(uimsg); resolveCombo.setCurSel(resolve); - host.SetWindowText(HostnamePrompt); - user.SetWindowText(UsernamePrompt); - pass.SetWindowText(PasswordPrompt); - conn.SetWindowText(ConnectedMessage); - erro.SetWindowText(ErrorMessage); + host.SetWindowText((tc)HostnamePrompt); + user.SetWindowText((tc)UsernamePrompt); + pass.SetWindowText((tc)PasswordPrompt); + conn.SetWindowText((tc)ConnectedMessage); + erro.SetWindowText((tc)ErrorMessage); if (logfile != NULL) - log.SetWindowText(logfile); + log.SetWindowText((tc)logfile); return true; } @@ -885,9 +917,9 @@ || pass.GetWindowTextLength() == 0 || conn.GetWindowTextLength() == 0 || erro.GetWindowTextLength() == 0) { - char uimsg[MAX_UIMSG]; - UTIL_get_lang_msg("MSG_EMPTY_PARAMETER", uimsg, sizeof(uimsg), - "Some parameters are empty!"); + TCHAR uimsg[MAX_UIMSG]; + UTIL_get_lang_msg("MSG_EMPTY_PARAMETER", uimsg, _countof(uimsg), + _T("Some parameters are empty!")); MessageBox(uimsg, FileVersion::getOwnVersion().getProductName(), MB_OK | MB_ICONERROR); return; } @@ -962,14 +994,15 @@ return Dialog::dispatch(message, wParam, lParam); } virtual bool onInitDialog() { - char uimsg[MAX_UIMSG], uitmp[MAX_UIMSG]; - LOGFONT logfont; + TCHAR uimsg[MAX_UIMSG]; +// TCHAR uitmp[MAX_UIMSG]; + LOGFONTA logfont; HFONT font; Dialog::onInitDialog(); font = (HFONT)SendMessage(WM_GETFONT, 0, 0); - GetObject(font, sizeof(LOGFONT), &logfont); + GetObject(font, sizeof(logfont), &logfont); if (UTIL_get_lang_font("DLG_TAHOMA_FONT", HWND(), &logfont, &DlgFont)) { SendDlgItemMessage(IDC_URL_LABEL, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0)); SendDlgItemMessage(IDC_URL, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0)); @@ -991,8 +1024,23 @@ DlgFont = NULL; } + const static DlgTextInfo text_info[] = { + { 0, "DLG_SETUP_TITLE" }, + { IDC_URL_LABEL, "DLG_SETUP_URL" }, + { IDC_TYPE_LEBEL, "DLG_SETUP_TYPE" }, + { IDC_HOSTNAME_LABEL, "DLG_SETUP_HOST" }, + { IDC_PORT_LABEL, "DLG_SETUP_PORT" }, + { IDC_USERNAME_LABEL, "DLG_SETUP_USER" }, + { IDC_PASSWORD_LABEL, "DLG_SETUP_PASS" }, + { IDC_OPTIONS, "DLG_SETUP_OTHER" }, +// { IDOK, "BTN_OK" }, +// { IDCANCEL, "BTN_CANCEL" }, + }; + HWND hWnd = (HWND)this; + SetDlgTexts(hWnd, text_info, _countof(text_info), UILanguageFile); +#if 0 GetWindowText(uitmp, sizeof(uitmp)); - UTIL_get_lang_msg("DLG_SETUP_TITLE", uimsg, sizeof(uimsg), uitmp); + UTIL_get_lang_msgT("DLG_SETUP_TITLE", uimsg, sizeof(uimsg), uitmp); SetWindowText(uimsg); GetDlgItemText(IDC_URL_LABEL, uitmp, sizeof(uitmp)); UTIL_get_lang_msg("DLG_SETUP_URL", uimsg, sizeof(uimsg), uitmp); @@ -1021,7 +1069,7 @@ GetDlgItemText(IDCANCEL, uitmp, sizeof(uitmp)); UTIL_get_lang_msg("BTN_CANCEL", uimsg, sizeof(uimsg), uitmp); SetDlgItemText(IDCANCEL, uimsg); - +#endif url <<= GetDlgItem(IDC_URL); type <<= GetDlgItem(IDC_TYPE); host <<= GetDlgItem(IDC_HOSTNAME); @@ -1030,18 +1078,18 @@ pass <<= GetDlgItem(IDC_PASSWORD); lock = true; - UTIL_get_lang_msg("MSG_TYPE_NONE", uimsg, sizeof(uimsg), "Without Proxy"); + UTIL_get_lang_msg("MSG_TYPE_NONE", uimsg, _countof(uimsg), __T("Without Proxy")); type.addString(uimsg); - type.addString("HTTP"); - type.addString("TELNET"); - type.addString("SOCKS4"); - type.addString("SOCKS5"); + type.addString(_T("HTTP")); + type.addString(_T("TELNET")); + type.addString(_T("SOCKS4")); + type.addString(_T("SOCKS5")); if (SSLSocket::isEnabled()) { - type.addString("SSL"); - type.addString("HTTP+SSL"); - type.addString("TELNET+SSL"); - type.addString("SOCKS4+SSL"); - type.addString("SOCKS5+SSL"); + type.addString(_T("SSL")); + type.addString(_T("HTTP+SSL")); + type.addString(_T("TELNET+SSL")); + type.addString(_T("SOCKS4+SSL")); + type.addString(_T("SOCKS5+SSL")); } type.setCurSel(proxy.type); @@ -1049,8 +1097,8 @@ if (proxy.host != NULL) { host.SetWindowText(proxy.host); if (proxy.port != 0) { - char buffer[16]; - _itoa_s(proxy.port, buffer, sizeof buffer, 10); + TCHAR buffer[16]; + _itot_s(proxy.port, buffer, _countof(buffer), 10); port.SetWindowText(buffer); } if (proxy.user != NULL) { @@ -1066,17 +1114,17 @@ return true; } virtual void onOK() { - char uimsg[MAX_UIMSG]; + TCHAR uimsg[MAX_UIMSG]; if (proxy.type != ProxyInfo::TYPE_NONE && proxy.type != ProxyInfo::TYPE_SSL) { if (proxy.host == NULL) { - UTIL_get_lang_msg("MSG_EMPTY_HOSTNAME", uimsg, sizeof(uimsg), - "Hostname is empty!"); + UTIL_get_lang_msg("MSG_EMPTY_HOSTNAME", uimsg, _countof(uimsg), + _T("Hostname is empty!")); MessageBox(uimsg, FileVersion::getOwnVersion().getProductName(), MB_OK | MB_ICONERROR); return; } if (port.GetWindowTextLength() != 0 && proxy.port <= 0) { - UTIL_get_lang_msg("MSG_ILLEGAL_PORT", uimsg, sizeof(uimsg), - "Illegal port number!"); + UTIL_get_lang_msg("MSG_ILLEGAL_PORT", uimsg, _countof(uimsg), + _T("Illegal port number!")); MessageBox(uimsg, FileVersion::getOwnVersion().getProductName(), MB_OK | MB_ICONERROR); return; } @@ -1177,9 +1225,9 @@ } String urlS = proxy.generateURL(); if (urlS == NULL) { - urlS = "none:///"; + urlS = _T("none:///"); } - url.SetWindowText(urlS); + url.SetWindowText((tc)urlS); } public: ProxyInfo proxy; @@ -1197,15 +1245,15 @@ HFONT DlgFont; virtual bool onInitDialog() { String buf; - char *buf2; - const char *ver; + TCHAR *buf2; + const TCHAR *ver; int n, a, b, c, d, len; - char uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG], uimsg3[MAX_UIMSG]; - LOGFONT logfont; + TCHAR uimsg[MAX_UIMSG], uimsg2[MAX_UIMSG], uimsg3[MAX_UIMSG]; + LOGFONTA logfont; HFONT font; font = (HFONT)SendMessage(WM_GETFONT, 0, 0); - GetObject(font, sizeof(LOGFONT), &logfont); + GetObject(font, sizeof(logfont), &logfont); if (UTIL_get_lang_font("DLG_TAHOMA_FONT", HWND(), &logfont, &DlgFont)) { SendDlgItemMessage(IDC_VERSION, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0)); SendDlgItemMessage(IDOK, WM_SETFONT, (WPARAM)DlgFont, MAKELPARAM(TRUE,0)); @@ -1214,31 +1262,31 @@ DlgFont = NULL; } - GetWindowText(uimsg2, sizeof(uimsg2)); - UTIL_get_lang_msg("DLG_ABOUT_TITLE", uimsg, sizeof(uimsg), uimsg2); + GetWindowText(uimsg2, _countof(uimsg2)); + UTIL_get_lang_msg("DLG_ABOUT_TITLE", uimsg, _countof(uimsg), uimsg2); SetWindowText(uimsg); - UTIL_get_lang_msg("DLG_ABOUT_EXTENSION", uimsg, sizeof(uimsg), - "Tera Term proxy extension"); - UTIL_get_lang_msg("DLG_ABOUT_YEBISUYA", uimsg2, sizeof(uimsg2), - "YebisuyaHompo"); - UTIL_get_lang_msg("DLG_ABOUT_HOMEPAGE", uimsg3, sizeof(uimsg3), - "TTProxy home page"); + UTIL_get_lang_msg("DLG_ABOUT_EXTENSION", uimsg, _countof(uimsg), + _T("Tera Term proxy extension")); + UTIL_get_lang_msg("DLG_ABOUT_YEBISUYA", uimsg2, _countof(uimsg2), + _T("YebisuyaHompo")); + UTIL_get_lang_msg("DLG_ABOUT_HOMEPAGE", uimsg3, _countof(uimsg3), + _T("TTProxy home page")); buf = GetDlgItemText(IDC_VERSION); len = buf.length() + 50; - buf2 = (char *)_alloca(len); + buf2 = (TCHAR *)_alloca(sizeof(TCHAR) * len); if (buf2 == NULL) { return true; } ver = FileVersion::getOwnVersion().getFileVersion(); - n = sscanf_s(ver, "%d, %d, %d, %d", &a, &b, &c, &d); + n = _stscanf_s(ver, _T("%d, %d, %d, %d"), &a, &b, &c, &d); if (n == 4) { - sprintf_s(buf2, len, buf, uimsg, a, b, c, d, uimsg2, uimsg3); + _stprintf_s(buf2, len, buf, uimsg, a, b, c, d, uimsg2, uimsg3); } SetDlgItemText(IDC_VERSION, (n == 4) ? buf2 : buf); - GetDlgItemText(IDOK, uimsg, sizeof(uimsg)); - UTIL_get_lang_msg("BTN_OK", uimsg, sizeof(uimsg),"OK"); + GetDlgItemText(IDOK, uimsg, _countof(uimsg)); + UTIL_get_lang_msg("BTN_OK", uimsg, _countof(uimsg), _T("OK")); SetDlgItemText(IDOK, uimsg); return true; @@ -1277,7 +1325,6 @@ } int sendToSocket(SOCKET s, const unsigned char* buffer, int size) { - int i = 0; Logger::log("send", buffer, size); return _sendToSocket(s, buffer, size); } @@ -1287,20 +1334,20 @@ int len; va_list arglist; va_start(arglist, format); - len = wvsprintf(buf, format, arglist); + len = wvsprintfA(buf, format, arglist); va_end(arglist); Logger::log("send", buf); return _sendToSocket(s, (const unsigned char*) buf, len); } - int recieveFromSocketTimeout(SOCKET s, unsigned char* buffer, int size, int timeout) { + int recieveFromSocketTimeout(SOCKET s, unsigned char* buffer, int size, int _timeout) { int ready = 0; while (!ready) { - struct timeval tv = {timeout, 0}; + struct timeval tv = {_timeout, 0}; fd_set fd; FD_ZERO(&fd); FD_SET(s, &fd); - switch (select((int) (s + 1), &fd, NULL, NULL, timeout > 0 ? &tv : NULL)) { + switch (select((int) (s + 1), &fd, NULL, NULL, _timeout > 0 ? &tv : NULL)) { case SOCKET_ERROR: return SOCKET_ERROR; case 0: @@ -1348,13 +1395,13 @@ return 0; } - int wait_for_prompt(SOCKET s, String prompts[], int count, int timeout /* sec */) { + int wait_for_prompt(SOCKET s, String prompts[], int count, int _timeout /* sec */) { char buf[1024]; while (1) { char *dst = buf; char *end = buf + sizeof buf - 1; while (dst < end) { - switch (recieveFromSocketTimeout(s, (unsigned char*) dst, 1, timeout)) { /* recv one-by-one */ + switch (recieveFromSocketTimeout(s, (unsigned char*) dst, 1, _timeout)) { /* recv one-by-one */ case SOCKET_ERROR: if (WSAGetLastError() != WSAEWOULDBLOCK) { return SOCKET_ERROR; @@ -1376,7 +1423,8 @@ *dst = '\0'; Logger::log("recv", buf); for (i = 0; i < count; i++) { - char* found = strstr(buf, prompts[i]); + u8 promptU8 = (const TCHAR *)prompts[i]; + char* found = strstr(buf, promptU8); if (found != NULL) { return i; } @@ -1389,13 +1437,16 @@ static const char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char buf[1024]; int status_code; - if (sendToSocketFormat(s, strchr(realhost,':')?"CONNECT [%s]:%d HTTP/1.1\r\n":"CONNECT %s:%d HTTP/1.1\r\n", (const char *)realhost, realport) == SOCKET_ERROR) + u8 realhostU8 = (const TCHAR *)realhost; + if (sendToSocketFormat(s, strchr((const char *)realhostU8,':')?"CONNECT [%s]:%d HTTP/1.1\r\n":"CONNECT %s:%d HTTP/1.1\r\n", (const char *)realhostU8, realport) == SOCKET_ERROR) return SOCKET_ERROR; - if (sendToSocketFormat(s, strchr(realhost,':')?"Host: [%s]:%d\r\n":"Host: %s:%d\r\n", (const char *)realhost, realport) == SOCKET_ERROR) + if (sendToSocketFormat(s, strchr((const char *)realhostU8,':')?"Host: [%s]:%d\r\n":"Host: %s:%d\r\n", (const char *)realhostU8, realport) == SOCKET_ERROR) return SOCKET_ERROR; if (proxy.user != NULL) { - int userlen = strlen(proxy.user); - int passlen = strlen(proxy.pass); + u8 proxy_user = (const TCHAR *)proxy.user; + u8 proxy_pass = (const TCHAR *)proxy.pass; + int userlen = strlen(proxy_user); + int passlen = strlen(proxy_pass); int authlen = userlen + 1 + passlen; int encodedlen = (authlen + 2) / 3 * 4; char* auth = (char*) alloca(authlen + 1); @@ -1404,10 +1455,10 @@ char *dst = encoded; int bits = 0; int data = 0; - strcpy_s(auth, authlen + 1, proxy.user); + strcpy_s(auth, authlen + 1, proxy_user); auth[userlen] = ':'; - strcpy_s(auth + userlen + 1, passlen + 1, proxy.pass); - + strcpy_s(auth + userlen + 1, passlen + 1, proxy_pass); + /* make base64 string */ while (*src != '\0') { data = (data << 8) | *src++; @@ -1422,7 +1473,7 @@ *dst++ = base64_table[0x3F & (data << (6 - bits))]; encodedlen--; } - while (encodedlen-- > 0) { + while (encodedlen-- > 0) { *dst++ = '='; } *dst = '\0'; @@ -1441,12 +1492,12 @@ } } while (strcmp(buf,"\r\n") != 0); if (status_code != 200) { - char uimsg[MAX_UIMSG]; + TCHAR uimsg[MAX_UIMSG]; switch (status_code) { case 401: case 407: UTIL_get_lang_msg("MSG_PROXY_UNAUTHORIZED", uimsg, sizeof(uimsg), - "Proxy authorization failed!"); + _T("Proxy authorization failed!")); break; case 400: case 405: @@ -1453,7 +1504,7 @@ case 406: case 403: UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg), - "Proxy prevent this connection!"); + _T("Proxy prevent this connection!")); break; } return setError(s, uimsg); @@ -1496,7 +1547,10 @@ int auth_result; unsigned char buf[256]; unsigned char* ptr = buf; - char uimsg[MAX_UIMSG]; + TCHAR uimsg[MAX_UIMSG]; + u8 proxy_user = (const TCHAR *)proxy.user; + u8 proxy_pass = (const TCHAR *)proxy.pass; + u8 realhostU8 = (const TCHAR *)realhost; *ptr++ = SOCKS5_VERSION; if (proxy.user != NULL && proxy.pass != NULL) { *ptr++ = 2; // support 2 auth methods : SOCKS5_AUTH_NOAUTH, SOCKS5_AUTH_USERPASS @@ -1512,9 +1566,8 @@ return SOCKET_ERROR; if (buf[0] != SOCKS5_VERSION || buf[1] == SOCKS5_REJECT) { - char uimsg[MAX_UIMSG]; UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg), - "Proxy prevent this connection!"); + _T("Proxy prevent this connection!")); return setError(s, uimsg); } auth_method = buf[1]; @@ -1529,19 +1582,19 @@ /* make authentication packet */ ptr = buf; *ptr++ = SOCKS5_AUTH_SUBNEGOVER; - len = proxy.user.length(); + len = strlen(proxy_user); *ptr++ = len; - strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy.user); + strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy_user); ptr += len; - len = proxy.pass.length(); + len = strlen(proxy_pass); *ptr++ = len; - strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy.pass); + strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy_pass); ptr += len; /* send it and get answer */ - if (sendToSocket(s, buf, ptr - buf) == SOCKET_ERROR) + if (sendToSocket(s, buf, ptr - buf) == SOCKET_ERROR) return SOCKET_ERROR; - if (recieveFromSocket(s, buf, 2) == SOCKET_ERROR) + if (recieveFromSocket(s, buf, 2) == SOCKET_ERROR) return SOCKET_ERROR; /* check status */ @@ -1549,7 +1602,7 @@ break; default: UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg), - "Proxy prevent this connection!"); + _T("Proxy prevent this connection!")); return setError(s, uimsg); } if (auth_result == SOCKET_ERROR) { @@ -1556,7 +1609,7 @@ return SOCKET_ERROR; }else if (auth_result != 0) { UTIL_get_lang_msg("MSG_PROXY_UNAUTHORIZED", uimsg, sizeof(uimsg), - "Proxy authorization failed!"); + _T("Proxy authorization failed!")); return setError(s, uimsg); } /* request to connect */ @@ -1567,7 +1620,7 @@ struct addrinfo hints, *res = NULL; if (resolve != RESOLVE_REMOTE) { memset(&hints, 0, sizeof(hints)); - getaddrinfo(realhost, NULL, &hints, &res); + getaddrinfo(realhostU8, NULL, &hints, &res); } if (res) { switch (res->ai_family) { @@ -1584,6 +1637,7 @@ default: freeaddrinfo(res); WSASetLastError(WSAECONNREFUSED); + return SOCKET_ERROR; break; } @@ -1595,9 +1649,9 @@ } else { *ptr++ = SOCKS5_ATYP_DOMAINNAME; - len = strlen(realhost); + len = strlen(realhostU8); *ptr++ = len; - memcpy(ptr, realhost, len); + memcpy(ptr, realhostU8, len); ptr += len; } *ptr++ = realport >> 8; /* DST.PORT */ @@ -1608,7 +1662,7 @@ return SOCKET_ERROR; if (buf[0] != SOCKS5_VERSION || buf[1] != SOCKS5_REP_SUCCEEDED) { /* check reply code */ UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg), - "Proxy prevent this connection!"); + _T("Proxy prevent this connection!")); return setError(s, uimsg); } // buf[2] is reserved @@ -1647,8 +1701,8 @@ int begin_relay_socks4(ProxyInfo& proxy, String realhost, unsigned short realport, SOCKET s) { unsigned char buf[256], *ptr; - - /* make connect request packet + u8 realhostU8 = (const TCHAR *)realhost; + /* make connect request packet protocol v4: VN:1, CD:1, PORT:2, ADDR:4, USER:n, NULL:1 protocol v4a: @@ -1661,15 +1715,15 @@ *ptr++ = realport & 0xFF; in_addr addr; addr.s_addr = INADDR_NONE; - char ch = realhost.charAt(0); + char ch = *(const char *)realhostU8; if ('0' <= ch && ch <= '9') { - addr.s_addr = inet_addr(realhost); + addr.s_addr = inet_addr(realhostU8); } if (addr.s_addr != INADDR_NONE) { memcpy(ptr, &addr, sizeof addr); ptr += sizeof addr; }else{ - struct hostent* entry = resolve != RESOLVE_REMOTE ? gethostbyname(realhost) : NULL; + struct hostent* entry = resolve != RESOLVE_REMOTE ? gethostbyname(realhostU8) : NULL; if (entry != NULL && entry->h_addrtype == AF_INET && entry->h_length == sizeof (in_addr)) { addr.s_addr = INADDR_LOOPBACK; memcpy(ptr, entry->h_addr_list[0], entry->h_length); @@ -1687,7 +1741,8 @@ } /* username */ if (proxy.user != NULL) { - strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy.user); + u8 proxy_user = (const TCHAR *)proxy.user; + strcpy_s((char*) ptr, sizeof buf - (ptr - buf), proxy_user); ptr += proxy.user.length() + 1; }else{ *ptr++ = '\0'; @@ -1694,8 +1749,8 @@ } if (addr.s_addr == INADDR_NONE) { /* destination host name (for protocol 4a) */ - strcpy_s((char*) ptr, sizeof buf - (ptr - buf), realhost); - ptr += strlen(realhost) + 1; + strcpy_s((char*) ptr, sizeof buf - (ptr - buf), realhostU8); + ptr += strlen(realhostU8) + 1; } /* send command and get response response is: VN:1, CD:1, PORT:2, ADDR:4 */ @@ -1705,22 +1760,22 @@ if (recieveFromSocket(s, buf, 8) == SOCKET_ERROR) { return SOCKET_ERROR; } - char uimsg[MAX_UIMSG]; - uimsg[0] = NULL; + TCHAR uimsg[MAX_UIMSG]; + uimsg[0] = 0; if (buf[0] != 0) { - UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg), - "Proxy prevent this connection!"); + UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, _countof(uimsg), + _T("Proxy prevent this connection!")); }else if (buf[1] == SOCKS4_REP_IDENT_FAIL || buf[1] == SOCKS4_REP_USERID) { - UTIL_get_lang_msg("MSG_PROXY_UNAUTHORIZED", uimsg, sizeof(uimsg), - "Proxy authorization failed!"); + UTIL_get_lang_msg("MSG_PROXY_UNAUTHORIZED", uimsg, _countof(uimsg), + _T("Proxy authorization failed!")); }else if (buf[1] != SOCKS4_REP_SUCCEEDED) { - UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg), - "Proxy prevent this connection!"); + UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, _countof(uimsg), + _T("Proxy prevent this connection!")); } - if (uimsg[0] != NULL) { + if (uimsg[0] != 0) { return setError(s, uimsg); } - + /* Conguraturation, connected via SOCKS4 server! */ return 0; } @@ -1727,20 +1782,23 @@ int begin_relay_telnet(ProxyInfo& proxy, String realhost, unsigned short realport, SOCKET s) { int err = 0; - char uimsg[MAX_UIMSG]; + TCHAR uimsg[MAX_UIMSG]; + u8 realhostU8 = (const TCHAR *)realhost; + u8 proxy_user = (const TCHAR *)proxy.user; + u8 proxy_pass = (const TCHAR *)proxy.pass; while (!err) { switch (wait_for_prompt(s, prompt_table, countof(prompt_table), 10)) { case 0: /* Hostname prompt */ - if (sendToSocketFormat(s, strchr(realhost,':')?"[%s]:%d\n":"%s:%d\n", (const char *)realhost, realport) == SOCKET_ERROR) + if (sendToSocketFormat(s, strchr(realhostU8,':')?"[%s]:%d\n":"%s:%d\n", (const char *)realhostU8, realport) == SOCKET_ERROR) return SOCKET_ERROR; break; case 1: /* Username prompt */ - if (sendToSocketFormat(s, "%s\n", (const char *)proxy.user) == SOCKET_ERROR) + if (sendToSocketFormat(s, "%s\n", (const char *)proxy_user) == SOCKET_ERROR) return SOCKET_ERROR; break; case 2: /* Password prompt */ - if (sendToSocketFormat(s, "%s\n", (const char *)proxy.pass) == SOCKET_ERROR) + if (sendToSocketFormat(s, "%s\n", (const char *)proxy_pass) == SOCKET_ERROR) return SOCKET_ERROR; break; case 3: /* Established message */ @@ -1752,11 +1810,11 @@ } } UTIL_get_lang_msg("MSG_PROXY_BAD_REQUEST", uimsg, sizeof(uimsg), - "Proxy prevent this connection!"); + _T("Proxy prevent this connection!")); return setError(s, uimsg); } - int setError(SOCKET s, char *p) { + int setError(SOCKET s, TCHAR *p) { if (*p != NULL) showMessage(p); HWND window; @@ -1771,7 +1829,7 @@ WSASetLastError(WSAECONNREFUSED); return SOCKET_ERROR; } - void showMessage(char *p) { + void showMessage(TCHAR *p) { if (shower != NULL) { shower->showMessage(p); } @@ -1814,7 +1872,7 @@ struct sockaddr_in* in = (struct sockaddr_in*) name; info = connectioninfolist.get(in->sin_addr); if (info == NULL && defaultProxy.type != ProxyInfo::TYPE_NONE) { - info = new ConnectionInfo(defaultProxy, inet_ntoa(in->sin_addr)); + info = new ConnectionInfo(defaultProxy, String((tc)inet_ntoa(in->sin_addr))); holder = info; } } @@ -1824,8 +1882,8 @@ if (info == NULL && defaultProxy.type != ProxyInfo::TYPE_NONE) { DWORD bufflen = 64; char* buff = new char[64]; - WSAAddressToString((struct sockaddr*)name, sizeof(struct sockaddr_in6), NULL, buff, &bufflen); - info = new ConnectionInfo(defaultProxy, buff); + WSAAddressToStringA((struct sockaddr*)name, sizeof(struct sockaddr_in6), NULL, buff, &bufflen); + info = new ConnectionInfo(defaultProxy, String((tc)buff)); holder = info; } } @@ -1833,7 +1891,7 @@ if (info->proxy.type == ProxyInfo::TYPE_NONE_FORCE) { info = NULL; }else{ - const char* hostname; + u8 hostname; if (info->proxy.type == ProxyInfo::TYPE_SSL) { hostname = info->realhost; }else{ @@ -1918,147 +1976,147 @@ return SOCKET_ERROR; } SSLSocket* ssl = new SSLSocket(); - if (!ssl->connect(s, info->realhost)) { + if (!ssl->connect(s, (u8)info->realhost)) { shutdown(s, SD_BOTH); int error_code = ssl->get_verify_result(); - char uimsg[MAX_UIMSG]; + TCHAR uimsg[MAX_UIMSG]; delete ssl; switch (error_code) { case IDS_UNABLE_TO_GET_ISSUER_CERT: UTIL_get_lang_msg("MSG_UNABLE_TO_GET_ISSUER_CERT", uimsg, sizeof(uimsg), - "Unable to get Issuer Certificate"); + _T("Unable to get Issuer Certificate")); break; case IDS_UNABLE_TO_GET_CRL: UTIL_get_lang_msg("MSG_UNABLE_TO_GET_CRL", uimsg, sizeof(uimsg), - "Unable to get Certificate CRL"); + _T("Unable to get Certificate CRL")); break; case IDS_UNABLE_TO_DECRYPT_CERT_SIGNATURE: UTIL_get_lang_msg("MSG_UNABLE_TO_DECRYPT_CERT_SIGNATURE", uimsg, sizeof(uimsg), - "Unable to decrypt Certificate's Signature"); + _T("Unable to decrypt Certificate's Signature")); break; case IDS_UNABLE_TO_DECRYPT_CRL_SIGNATURE: UTIL_get_lang_msg("MSG_UNABLE_TO_DECRYPT_CRL_SIGNATURE", uimsg, sizeof(uimsg), - "Unable to decrypt CRL's Signature"); + _T("Unable to decrypt CRL's Signature")); break; case IDS_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY: UTIL_get_lang_msg("MSG_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY", uimsg, sizeof(uimsg), - "Unable to decode Issuer Public Key"); + _T("Unable to decode Issuer Public Key")); break; case IDS_CERT_SIGNATURE_FAILURE: UTIL_get_lang_msg("MSG_CERT_SIGNATURE_FAILURE", uimsg, sizeof(uimsg), - "Certificate Signature failure"); + _T("Certificate Signature failure")); break; case IDS_CRL_SIGNATURE_FAILURE: UTIL_get_lang_msg("MSG_CRL_SIGNATURE_FAILURE", uimsg, sizeof(uimsg), - "CRL Signature failure"); + _T("CRL Signature failure")); break; case IDS_CERT_NOT_YET_VALID: UTIL_get_lang_msg("MSG_CERT_NOT_YET_VALID", uimsg, sizeof(uimsg), - "Certificate is not yet valid"); + _T("Certificate is not yet valid")); break; case IDS_CERT_HAS_EXPIRED: UTIL_get_lang_msg("MSG_CERT_HAS_EXPIRED", uimsg, sizeof(uimsg), - "Certificate has expired"); + _T("Certificate has expired")); break; case IDS_CRL_NOT_YET_VALID: UTIL_get_lang_msg("MSG_CRL_NOT_YET_VALID", uimsg, sizeof(uimsg), - "CRL is not yet valid"); + _T("CRL is not yet valid")); break; case IDS_CRL_HAS_EXPIRED: UTIL_get_lang_msg("MSG_CRL_HAS_EXPIRED", uimsg, sizeof(uimsg), - "CRL has expired"); + _T("CRL has expired")); break; case IDS_ERROR_IN_CERT_NOT_BEFORE_FIELD: UTIL_get_lang_msg("MSG_ERROR_IN_CERT_NOT_BEFORE_FIELD", uimsg, sizeof(uimsg), - "Format error in Certificate's notBefore field"); + _T("Format error in Certificate's notBefore field")); break; case IDS_ERROR_IN_CERT_NOT_AFTER_FIELD: UTIL_get_lang_msg("MSG_ERROR_IN_CERT_NOT_AFTER_FIELD", uimsg, sizeof(uimsg), - "Format error in Certificate's notAfter field"); + _T("Format error in Certificate's notAfter field")); break; case IDS_ERROR_IN_CRL_LAST_UPDATE_FIELD: UTIL_get_lang_msg("MSG_ERROR_IN_CRL_LAST_UPDATE_FIELD", uimsg, sizeof(uimsg), - "Format error in CRL's lastUpdate field"); + _T("Format error in CRL's lastUpdate field")); break; case IDS_ERROR_IN_CRL_NEXT_UPDATE_FIELD: UTIL_get_lang_msg("MSG_ERROR_IN_CRL_NEXT_UPDATE_FIELD", uimsg, sizeof(uimsg), - "Format error in CRL's nextUpdate field"); + _T("Format error in CRL's nextUpdate field")); break; case IDS_OUT_OF_MEM: UTIL_get_lang_msg("MSG_OUT_OF_MEM", uimsg, sizeof(uimsg), - "Out of memory"); + _T("Out of memory")); break; case IDS_DEPTH_ZERO_SELF_SIGNED_CERT: UTIL_get_lang_msg("MSG_DEPTH_ZERO_SELF_SIGNED_CERT", uimsg, sizeof(uimsg), - "Self-signed Certificate"); + _T("Self-signed Certificate")); break; case IDS_SELF_SIGNED_CERT_IN_CHAIN: UTIL_get_lang_msg("MSG_SELF_SIGNED_CERT_IN_CHAIN", uimsg, sizeof(uimsg), - "Self-signed Certificate found in Certificate chain"); + _T("Self-signed Certificate found in Certificate chain")); break; case IDS_UNABLE_TO_GET_ISSUER_CERT_LOCALLY: UTIL_get_lang_msg("MSG_UNABLE_TO_GET_ISSUER_CERT_LOCALLY", uimsg, sizeof(uimsg), - "Unable to get Local Issuer Certificate"); + _T("Unable to get Local Issuer Certificate")); break; case IDS_UNABLE_TO_VERIFY_LEAF_SIGNATURE: UTIL_get_lang_msg("MSG_UNABLE_TO_VERIFY_LEAF_SIGNATURE", uimsg, sizeof(uimsg), - "Unable to verify the first Certificate"); + _T("Unable to verify the first Certificate")); break; case IDS_CERT_CHAIN_TOO_LONG: UTIL_get_lang_msg("MSG_CERT_CHAIN_TOO_LONG", uimsg, sizeof(uimsg), - "Certificate chain too long"); + _T("Certificate chain too long")); break; case IDS_CERT_REVOKED: UTIL_get_lang_msg("MSG_CERT_REVOKED", uimsg, sizeof(uimsg), - "Certificate revoked"); + _T("Certificate revoked")); break; case IDS_INVALID_CA: UTIL_get_lang_msg("MSG_INVALID_CA", uimsg, sizeof(uimsg), - "Invalid CA Certificate"); + _T("Invalid CA Certificate")); break; case IDS_PATH_LENGTH_EXCEEDED: UTIL_get_lang_msg("MSG_PATH_LENGTH_EXCEEDED", uimsg, sizeof(uimsg), - "Path length constraint exceeded"); + _T("Path length constraint exceeded")); break; case IDS_INVALID_PURPOSE: UTIL_get_lang_msg("MSG_INVALID_PURPOSE", uimsg, sizeof(uimsg), - "Unsupported Certificate purpose"); + _T("Unsupported Certificate purpose")); break; case IDS_CERT_UNTRUSTED: UTIL_get_lang_msg("MSG_CERT_UNTRUSTED", uimsg, sizeof(uimsg), - "Certificate not trusted"); + _T("Certificate not trusted")); break; case IDS_CERT_REJECTED: UTIL_get_lang_msg("MSG_CERT_REJECTED", uimsg, sizeof(uimsg), - "Certificate rejected"); + _T("Certificate rejected")); break; case IDS_SUBJECT_ISSUER_MISMATCH: UTIL_get_lang_msg("MSG_SUBJECT_ISSUER_MISMATCH", uimsg, sizeof(uimsg), - "Subject Issuer mismatch"); + _T("Subject Issuer mismatch")); break; case IDS_AKID_SKID_MISMATCH: UTIL_get_lang_msg("MSG_AKID_SKID_MISMATCH", uimsg, sizeof(uimsg), - "Authority and Subject Key Identifier mismatch"); + _T("Authority and Subject Key Identifier mismatch")); break; case IDS_AKID_ISSUER_SERIAL_MISMATCH: UTIL_get_lang_msg("MSG_AKID_ISSUER_SERIAL_MISMATCH", uimsg, sizeof(uimsg), - "Authority and Issuer Serial Number mismatch"); + _T("Authority and Issuer Serial Number mismatch")); break; case IDS_KEYUSAGE_NO_CERTSIGN: UTIL_get_lang_msg("MSG_KEYUSAGE_NO_CERTSIGN", uimsg, sizeof(uimsg), - "Key usage does not include Certificate signing"); + _T("Key usage does not include Certificate signing")); break; case IDS_APPLICATION_VERIFICATION: UTIL_get_lang_msg("MSG_APPLICATION_VERIFICATION", uimsg, sizeof(uimsg), - "Application verification failure"); + _T("Application verification failure")); break; case IDS_UNMATCH_COMMON_NAME: UTIL_get_lang_msg("MSG_UNMATCH_COMMON_NAME", uimsg, sizeof(uimsg), - "Unmatch Common Name"); + _T("Unmatch Common Name")); break; case IDS_UNABLE_TO_GET_COMMON_NAME: UTIL_get_lang_msg("MSG_UNABLE_TO_GET_COMMON_NAME", uimsg, sizeof(uimsg), - "Unable to get Common Name"); + _T("Unable to get Common Name")); break; default: uimsg[0] = NULL; @@ -2073,10 +2131,10 @@ } DECLARE_HOOKAPI(struct hostent*, gethostbyname, (const char* hostname), (hostname)) { - ConnectionInfo* info = connectioninfolist.find(hostname); + ConnectionInfo* info = connectioninfolist.find((tc)hostname); if (info != NULL) { if (info->proxy.type == ProxyInfo::TYPE_NONE_FORCE) { - hostname = info->realhost; + hostname = (u8)info->realhost; }else{ if (info->proxy.type == ProxyInfo::TYPE_SSL || info->proxy.type == ProxyInfo::TYPE_HTTP_SSL @@ -2089,7 +2147,8 @@ } } if (info->buffer == NULL) { - int bufferLength = sizeof (DUMMYHOSTENT) + strlen(info->realhost); + u8 realhostU8 = (const TCHAR *)info->realhost; + int bufferLength = sizeof (DUMMYHOSTENT) + strlen(realhostU8); info->buffer = new char[bufferLength]; info->fillBuffer(info->buffer, bufferLength); } @@ -2100,7 +2159,7 @@ } DECLARE_HOOKAPI(HANDLE, WSAAsyncGetHostByName, (HWND window, UINT message, const char* hostname, char* buffer, int bufferLength), (window, message, hostname, buffer, bufferLength)) { - ConnectionInfo* info = connectioninfolist.find(hostname); + ConnectionInfo* info = connectioninfolist.find((tc)hostname); if (info == NULL || info->proxy.type == ProxyInfo::TYPE_NONE_FORCE) { return ORIG_WSAAsyncGetHostByName(window, message, hostname, buffer, bufferLength); } @@ -2115,7 +2174,8 @@ } } HANDLE handle = connectioninfolist.getTask(info); - int len = sizeof (DUMMYHOSTENT) + strlen(hostname); + u8 hostnameU8 = hostname; + int len = sizeof (DUMMYHOSTENT) + strlen(hostnameU8); if (bufferLength < len) { ::PostMessage(window, message, (WPARAM) handle, MAKELPARAM(len, WSAENOBUFS)); ::WSASetLastError(WSAENOBUFS); @@ -2127,7 +2187,7 @@ } DECLARE_HOOKAPI(HANDLE, WSAAsyncGetAddrInfo, (HWND window, UINT message, const char* hostname, const char* portname, struct addrinfo* hints, struct addrinfo** res), (window, message, hostname, portname, hints, res)) { - ConnectionInfo* info = connectioninfolist.find(hostname); + ConnectionInfo* info = connectioninfolist.find((tc)hostname); if (info == NULL || info->proxy.type == ProxyInfo::TYPE_NONE_FORCE) { return ORIG_WSAAsyncGetAddrInfo(window, message, hostname, portname, hints, res); } @@ -2142,7 +2202,8 @@ } } HANDLE handle = connectioninfolist.getTask(info); - int bufferLength = sizeof (DUMMYHOSTENT) + strlen(hostname) + 1; + u8 hostnameU8 = hostname; + int bufferLength = sizeof (DUMMYHOSTENT) + strlen(hostnameU8) + 1; info->buffer = new char[bufferLength]; info->fillBuffer(info->buffer, bufferLength, portname, hints->ai_family); DUMMYHOSTENT* d = (DUMMYHOSTENT*)info->buffer; @@ -2225,7 +2286,7 @@ int aicount; ProxyWSockHook():shower(NULL), owner(NULL), resource_module(GetInstanceHandle()), timeout(0), aicount(0) { - HMODULE ws2_32 = ::GetModuleHandle("ws2_32.dll"); + HMODULE ws2_32 = ::GetModuleHandle(_T("ws2_32.dll")); LOADAPI(connect) LOADAPI(gethostbyname) LOADAPI(WSAAsyncGetHostByName) @@ -2245,54 +2306,54 @@ } void _load(IniFile& ini) { String temp; - temp = ini.getString("ProxyType"); + temp = ini.getString(_T("ProxyType")); if (temp != NULL) { defaultProxy.type = ProxyInfo::parseType(temp); if (defaultProxy.type != ProxyInfo::TYPE_NONE) { - defaultProxy.host = ini.getString("ProxyHost"); + defaultProxy.host = ini.getString(_T("ProxyHost")); if (defaultProxy.host == NULL || defaultProxy.type == ProxyInfo::TYPE_NONE_FORCE) { defaultProxy.type = ProxyInfo::TYPE_NONE; }else{ - defaultProxy.port = (unsigned short) ini.getInteger("ProxyPort"); - defaultProxy.user = ini.getString("ProxyUser"); + defaultProxy.port = (unsigned short) ini.getInteger(_T("ProxyPort")); + defaultProxy.user = ini.getString(_T("ProxyUser")); if (defaultProxy.user != NULL) - defaultProxy.pass = ini.getString("ProxyPass"); + defaultProxy.pass = ini.getString(_T("ProxyPass")); } } } - timeout = ini.getInteger("ConnectionTimeout", 10); + timeout = ini.getInteger(_T("ConnectionTimeout"), 10); - temp = ini.getString("SocksResolve"); - if (temp.equalsIgnoreCase("remote")) { + temp = ini.getString(_T("SocksResolve")); + if (temp.equalsIgnoreCase(_T("remote"))) { resolve = RESOLVE_REMOTE; - }else if (temp.equalsIgnoreCase("local")) { + }else if (temp.equalsIgnoreCase(_T("local"))) { resolve = RESOLVE_LOCAL; }else{ resolve = RESOLVE_AUTO; } - prompt_table[0] = ini.getString("TelnetHostnamePrompt", ">> Host name: "); - prompt_table[1] = ini.getString("TelnetUsernamePrompt", "Username:"); - prompt_table[2] = ini.getString("TelnetPasswordPrompt", "Password:"); - prompt_table[3] = ini.getString("TelnetConnectedMessage", "-- Connected to "); - prompt_table[4] = ini.getString("TelnetErrorMessage", "!!!!!!!!"); + prompt_table[0] = ini.getString(_T("TelnetHostnamePrompt"), _T(">> Host name: ")); + prompt_table[1] = ini.getString(_T("TelnetUsernamePrompt"), _T("Username:")); + prompt_table[2] = ini.getString(_T("TelnetPasswordPrompt"), _T("Password:")); + prompt_table[3] = ini.getString(_T("TelnetConnectedMessage"), _T("-- Connected to ")); + prompt_table[4] = ini.getString(_T("TelnetErrorMessage"), _T("!!!!!!!!")); - logfile = ini.getString("DebugLog"); + logfile = ini.getString(_T("DebugLog")); Logger::open(logfile); } void _save(IniFile& ini) { - const char* type = NULL; - const char* host = NULL; - const char* port = NULL; - const char* user = NULL; - const char* pass = NULL; + const TCHAR* type = NULL; + const TCHAR* host = NULL; + const TCHAR* port = NULL; + const TCHAR* user = NULL; + const TCHAR* pass = NULL; if (defaultProxy.type != ProxyInfo::TYPE_NONE && defaultProxy.type != ProxyInfo::TYPE_NONE_FORCE && defaultProxy.host != NULL) { type = ProxyInfo::getTypeName(defaultProxy.type); host = defaultProxy.host; if (defaultProxy.port != 0) { - char* buffer = (char*) alloca(6); - _itoa_s(defaultProxy.port, buffer, 6, 10); + TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * 6); + _itot_s(defaultProxy.port, buffer, 6, 10); port = buffer; } if (defaultProxy.user != NULL) { @@ -2302,34 +2363,34 @@ } } } - ini.setString("ProxyType", type); - ini.setString("ProxyHost", host); - ini.setString("ProxyPort", port); - ini.setString("ProxyUser", user); - ini.setString("ProxyPass", pass); + ini.setString(_T("ProxyType"), type); + ini.setString(_T("ProxyHost"), host); + ini.setString(_T("ProxyPort"), port); + ini.setString(_T("ProxyUser"), user); + ini.setString(_T("ProxyPass"), pass); - ini.setInteger("ConnectionTimeout", timeout); + ini.setInteger(_T("ConnectionTimeout"), timeout); switch (resolve) { case RESOLVE_REMOTE: - type = "remote"; + type = _T("remote"); break; case RESOLVE_LOCAL: - type = "local"; + type = _T("local"); break; default: - type = "auto"; + type = _T("auto"); break; } - ini.setString("SocksResolve", type); + ini.setString(_T("SocksResolve"), type); - ini.setString("TelnetHostnamePrompt", prompt_table[0]); - ini.setString("TelnetUsernamePrompt", prompt_table[1]); - ini.setString("TelnetPasswordPrompt", prompt_table[2]); - ini.setString("TelnetConnectedMessage", prompt_table[3]); - ini.setString("TelnetErrorMessage", prompt_table[4]); + ini.setString(_T("TelnetHostnamePrompt"), prompt_table[0]); + ini.setString(_T("TelnetUsernamePrompt"), prompt_table[1]); + ini.setString(_T("TelnetPasswordPrompt"), prompt_table[2]); + ini.setString(_T("TelnetConnectedMessage"), prompt_table[3]); + ini.setString(_T("TelnetErrorMessage"), prompt_table[4]); - ini.setString("DebugLog", logfile); + ini.setString(_T("DebugLog"), logfile); } public: static void setOwner(HWND owner) { @@ -2408,11 +2469,11 @@ static String generateURL() { return instance().defaultProxy.generateURL(); } - static String parseURL(const char* url, BOOL prefix) { + static String parseURL(const char* url, BOOL prefix) { ProxyInfo proxy; - String realhost = ProxyInfo::parse(url, proxy); + String realhost = ProxyInfo::parse((tc)url, proxy); if (realhost != NULL) { - if (realhost.indexOf("://") != -1 && !prefix) { + if (realhost.indexOf(_T("://")) != -1 && !prefix) { proxy.type = proxy.TYPE_NONE; } if (realhost.length() == 0) { Modified: branches/cmake/TTProxy/SSLLIB.h =================================================================== --- branches/cmake/TTProxy/SSLLIB.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/SSLLIB.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -11,7 +11,7 @@ rettype apiname arglist { \ static rettype (*func) arglist = \ (rettype (*) arglist) \ - GetProcAddress(GetModuleHandle(#module), #apiname); \ + GetProcAddress(GetModuleHandleA(#module), #apiname); \ return (*func) args; \ } #define DECLARE_MODULE_API_v(module, apiname, arglist, args) \ @@ -18,7 +18,7 @@ void apiname arglist { \ static void (*func) arglist = \ (void (*) arglist) \ - GetProcAddress(GetModuleHandle(#module), #apiname); \ + GetProcAddress(GetModuleHandleA(#module), #apiname); \ (*func) args; \ } Modified: branches/cmake/TTProxy/SSLSocket.h =================================================================== --- branches/cmake/TTProxy/SSLSocket.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/SSLSocket.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -84,8 +84,8 @@ } public: static bool init() { - LIBEAY32() = ::LoadLibrary("LIBEAY32"); - SSLEAY32() = ::LoadLibrary("SSLEAY32"); + LIBEAY32() = ::LoadLibraryA("LIBEAY32"); + SSLEAY32() = ::LoadLibraryA("SSLEAY32"); if (LIBEAY32() == NULL || SSLEAY32() == NULL) { if (LIBEAY32() != NULL) { ::FreeLibrary(LIBEAY32()); @@ -140,12 +140,15 @@ if (*s2 != '.') return false; }else{ +#if !defined(UNICODE) if (::IsDBCSLeadByte(*s1)) { if (*s1 != *s2 || s1 + 1 >= s1_end || s2 + 1 >= s2_end || *(s1 + 1) != *(s2 + 1)) return false; s1++; s2++; - }else{ + } else +#endif + { if (toLowerCase(*s1) != toLowerCase(*s2)) return false; } @@ -156,13 +159,15 @@ return true; } +#if 0 static int print_debugw32(const char *str, size_t len, void *u) { char* buf = (char*) alloca(len + 1); memcpy(buf, str, len); buf[len] = '\0'; - OutputDebugString(buf); + OutputDebugStringA(buf); return len; } +#endif private: SSL* ssl; long verify_result; Modified: branches/cmake/TTProxy/TTProxy.cpp =================================================================== --- branches/cmake/TTProxy/TTProxy.cpp 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/TTProxy.cpp 2018-12-14 15:41:26 UTC (rev 7327) @@ -1,7 +1,7 @@ // ttx.cpp : DLL \x83A\x83v\x83\x8A\x83P\x81[\x83V\x83\x87\x83\x93\x97p\x82̃G\x83\x93\x83g\x83\x8A \x83|\x83C\x83\x93\x83g\x82\xF0\x92\xE8\x8B`\x82\xB5\x82܂\xB7\x81B // -#include "stdafx.h" +#include "StdAfx.h" #include "resource.h" @@ -18,6 +18,7 @@ } extern "C" __declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) { + (void)reserved; switch (reason) { case DLL_PROCESS_ATTACH: myInstance = instance; Modified: branches/cmake/TTProxy/TTProxy.h =================================================================== --- branches/cmake/TTProxy/TTProxy.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/TTProxy.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -1,6 +1,8 @@ #ifndef _YEBISOCKS_TTX_H_ #define _YEBISOCKS_TTX_H_ +#include "codeconv.h" + #include <YCL/DynamicLinkLibrary.h> using namespace yebisuya; @@ -31,7 +33,7 @@ private: class Shower : public ProxyWSockHook::MessageShower { public: - virtual void showMessage(const char* message)const { + virtual void showMessage(const TCHAR* message)const { add_error_message(message); } } shower; @@ -46,10 +48,10 @@ PWriteIniFile ORIG_WriteIniFile; PParseParam ORIG_ParseParam; - static void add_error_message(const char* message) { + static void add_error_message(const TCHAR* message) { if (getInstance().error_message != NULL) { - StringBuffer buffer = (const char *)getInstance().error_message; - buffer.append("\n\n"); + StringBuffer buffer = (const TCHAR *)getInstance().error_message; + buffer.append(_T("\n\n")); buffer.append(message); getInstance().error_message = buffer.toString(); }else{ @@ -58,22 +60,22 @@ ::PostMessage(getInstance().cv->HWin, WM_COMMAND, ID_ASYNCMESSAGEBOX, 0); } static void read_options(const char* filename) { - IniFile inifile(filename, "TTProxy"); + IniFile inifile(String((tc)filename), _T("TTProxy")); ProxyWSockHook::load(inifile); getInstance().initialized = true; } static void write_options(const char* filename) { - IniFile inifile(filename, "TTProxy"); + IniFile inifile(String((tc)filename), _T("TTProxy")); ProxyWSockHook::save(inifile); } - static String get_teraterm_dir_relative_name(char* basename) { + static String get_teraterm_dir_relative_name(TCHAR* basename) { if (basename[0] == '\\' || basename[0] == '/' || basename[0] != '\0' && basename[1] == ':') { return basename; } - char buf[1024]; + TCHAR buf[1024]; ::GetModuleFileName(NULL, buf, sizeof buf); - char* filename = NULL; - for (char* dst = buf; *dst != '\0'; dst++) { + TCHAR* filename = NULL; + for (TCHAR* dst = buf; *dst != '\0'; dst++) { if (*dst == '\\' || *dst == '/' || *dst == ':') { filename = dst + 1; } @@ -87,16 +89,16 @@ return buffer.toString(); } - static void PASCAL TTXReadINIFile(PCHAR fileName, PTTSet ts) { + static void WINAPI TTXReadINIFile(char *fileName, PTTSet ts) { getInstance().ORIG_ReadIniFile(fileName, ts); read_options(fileName); } - static void PASCAL TTXWriteINIFile(PCHAR fileName, PTTSet ts) { + static void WINAPI TTXWriteINIFile(char *fileName, PTTSet ts) { getInstance().ORIG_WriteIniFile(fileName, ts); write_options(fileName); } - static void PASCAL TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) { + static void WINAPI TTXParseParam(PCHAR param, PTTSet ts, PCHAR DDETopic) { //int param_len=strlen(param); char option[1024]; int opt_len = sizeof(option); @@ -115,7 +117,7 @@ if ((option[0] == '-' || option[0] == '/')) { if ((option[1] == 'F' || option[1] == 'f') && option[2] == '=') { - read_options(get_teraterm_dir_relative_name(option + 3)); + read_options((u8)get_teraterm_dir_relative_name((TCHAR *)(const TCHAR *)(tc)(option + 3))); } } @@ -156,7 +158,7 @@ String realhost = ProxyWSockHook::parseURL(option, FALSE); if (realhost != NULL) { getInstance().realhost = realhost; - if (realhost.indexOf("://") == -1) { + if (realhost.indexOf(_T("://")) == -1) { action = OPTION_CLEAR; } else { @@ -182,7 +184,7 @@ getInstance().ORIG_ParseParam(param, ts, DDETopic); if (getInstance().ts->HostName[0] == '\0' && getInstance().realhost != NULL) { - strcpy_s(getInstance().ts->HostName, sizeof getInstance().ts->HostName, getInstance().realhost); + strcpy_s(getInstance().ts->HostName, sizeof getInstance().ts->HostName, (u8)getInstance().realhost); } } @@ -195,7 +197,7 @@ *((WORD*) lParam) = langid; return FALSE; } - static void PASCAL TTXInit(PTTSet ts, PComVar cv) { + static void WINAPI TTXInit(PTTSet ts, PComVar cv) { getInstance().ts = ts; getInstance().cv = cv; @@ -202,7 +204,7 @@ ProxyWSockHook::setMessageShower(&getInstance().shower); } - static void PASCAL TTXGetSetupHooks(TTXSetupHooks* hooks) { + static void WINAPI TTXGetSetupHooks(TTXSetupHooks* hooks) { getInstance().ORIG_ReadIniFile = *hooks->ReadIniFile; getInstance().ORIG_WriteIniFile = *hooks->WriteIniFile; getInstance().ORIG_ParseParam = *hooks->ParseParam; @@ -212,7 +214,7 @@ copy_UILanguageFile(); } - static void PASCAL TTXOpenTCP(TTXSockHooks* hooks) { + static void WINAPI TTXOpenTCP(TTXSockHooks* hooks) { if (!getInstance().initialized) { read_options(getInstance().ts->SetupFName); } @@ -224,7 +226,7 @@ (FARPROC&) *hooks->PWSACancelAsyncRequest = ProxyWSockHook::hook_WSACancelAsyncRequest((FARPROC) *hooks->PWSACancelAsyncRequest); } - static void PASCAL TTXCloseTCP(TTXSockHooks* hooks) { + static void WINAPI TTXCloseTCP(TTXSockHooks* hooks) { // unhook functions ProxyWSockHook::unhook_connect((FARPROC) *hooks->Pconnect); ProxyWSockHook::unhook_WSAAsyncGetHostByName((FARPROC) *hooks->PWSAAsyncGetHostByName); @@ -234,18 +236,18 @@ ProxyWSockHook::unhook_WSACancelAsyncRequest((FARPROC) *hooks->PWSACancelAsyncRequest); } - static void PASCAL TTXModifyMenu(HMENU menu) { - char uimsg[MAX_UIMSG]; + static void WINAPI TTXModifyMenu(HMENU menu) { + TCHAR uimsg[MAX_UIMSG]; copy_UILanguageFile(); /* inserts before ID_HELP_ABOUT */ - UTIL_get_lang_msg("MENU_ABOUT", uimsg, sizeof(uimsg), "About TT&Proxy..."); + UTIL_get_lang_msg("MENU_ABOUT", uimsg, _countof(uimsg), _T("About TT&Proxy...")); InsertMenu(menu, 50990, MF_BYCOMMAND | MF_ENABLED, ID_ABOUTMENU, uimsg); /* inserts before ID_SETUP_TCPIP */ - UTIL_get_lang_msg("MENU_SETUP", uimsg, sizeof(uimsg), "&Proxy..."); + UTIL_get_lang_msg("MENU_SETUP", uimsg, _countof(uimsg), _T("&Proxy...")); InsertMenu(menu, 50360, MF_BYCOMMAND | MF_ENABLED, ID_PROXYSETUPMENU, uimsg); } - static int PASCAL TTXProcessCommand(HWND hWin, WORD cmd) { + static int WINAPI TTXProcessCommand(HWND hWin, WORD cmd) { switch (cmd) { case ID_ABOUTMENU: copy_UILanguageFile(); @@ -260,7 +262,7 @@ String msg = getInstance().error_message; getInstance().showing_error_message = true; getInstance().error_message = NULL; - ::MessageBox(hWin, msg, "TTProxy", MB_OK | MB_ICONERROR); + ::MessageBox(hWin, msg, _T("TTProxy"), MB_OK | MB_ICONERROR); getInstance().showing_error_message = false; if (getInstance().error_message != NULL) { ::PostMessage(hWin, WM_COMMAND, ID_ASYNCMESSAGEBOX, 0); @@ -272,19 +274,20 @@ } } - static void PASCAL TTXSetCommandLine(PCHAR cmd, int cmdlen, PGetHNRec rec) { + static void WINAPI TTXSetCommandLine(PCHAR cmd, int cmdlen, PGetHNRec rec) { String url = ProxyWSockHook::generateURL(); if (url != NULL) { - if (strlen(cmd) + 8 + url.length() >= (unsigned) cmdlen) + u8 urlU8 = (const TCHAR *)url; + if (strlen(cmd) + 8 + strlen(urlU8) >= (unsigned) cmdlen) return; strcat_s(cmd, cmdlen, " -proxy="); - strcat_s(cmd, cmdlen, url); + strcat_s(cmd, cmdlen, urlU8); } } - static void PASCAL TTXEnd() { + static void WINAPI TTXEnd() { if (getInstance().error_message != NULL) { - ::MessageBox(NULL, getInstance().error_message, "TTProxy", MB_OK | MB_ICONERROR); + ::MessageBox(NULL, getInstance().error_message, _T("TTProxy"), MB_OK | MB_ICONERROR); getInstance().error_message = NULL; } } Modified: branches/cmake/TTProxy/YCL/include/YCL/ComboBoxCtrl.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/ComboBoxCtrl.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/ComboBoxCtrl.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -30,7 +30,7 @@ int resetContent() { return SendMessage(CB_RESETCONTENT); } - int addString(const char* string) { + int addString(const TCHAR* string) { return SendMessage(CB_ADDSTRING, 0, (LPARAM) string); } int addItemData(long data) { @@ -48,12 +48,12 @@ int getTextLen(int index)const { return SendMessage(CB_GETLBTEXTLEN, index); } - int getText(int index, char* buffer)const { + int getText(int index, TCHAR* buffer)const { return SendMessage(CB_GETLBTEXT, index, (LPARAM) buffer); } String getText(int index) { int length = getTextLen(index); - char* buffer = (char*) alloca(length + 1); + TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * (length + 1)); getText(index, buffer); return buffer; } Modified: branches/cmake/TTProxy/YCL/include/YCL/Dialog.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/Dialog.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/Dialog.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -14,6 +14,10 @@ #include <YCL/Window.h> #include <YCL/Hashtable.h> +#include "dlglib.h" + +#define DIALOGBOX_REPLACE 1 + namespace yebisuya { class Dialog : virtual public Window { @@ -65,10 +69,10 @@ int value = ::GetDlgItemInt(*this, id, &succeeded, valueSigned); return succeeded ? value : defaultValue; } - bool SetDlgItemText(int id, const char* text) { + bool SetDlgItemText(int id, const TCHAR* text) { return ::SetDlgItemText(*this, id, text) != FALSE; } - int GetDlgItemText(int id, char* buffer, size_t length)const { + int GetDlgItemText(int id, TCHAR* buffer, size_t length)const { return ::GetDlgItemText(*this, id, buffer, length); } String GetDlgItemText(int id)const { @@ -78,7 +82,11 @@ return ::SendDlgItemMessage(*this, id, message, wparam, lparam); } bool EndDialog(int result) { +#if defined(DIALOGBOX_REPLACE) + return ::TTEndDialog(*this, result) != FALSE; +#else return ::EndDialog(*this, result) != FALSE; +#endif } bool MapDialogRect(RECT& rect)const { return ::MapDialogRect(*this, &rect) != FALSE; @@ -109,7 +117,11 @@ } int open(HINSTANCE instance, int resourceId, HWND owner = NULL) { YCLVERIFY(prepareOpen(this) == NULL, "Another dialog has been opening yet."); +#if defined(DIALOGBOX_REPLACE) + return ::TTDialogBoxParam(instance, MAKEINTRESOURCE(resourceId), owner, (DLGPROC)DialogProc, NULL); +#else return ::DialogBoxParam(instance, MAKEINTRESOURCE(resourceId), owner, (DLGPROC)DialogProc, NULL); +#endif } protected: virtual bool dispatch(int message, int wparam, long lparam) { Modified: branches/cmake/TTProxy/YCL/include/YCL/EditBoxCtrl.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/EditBoxCtrl.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/EditBoxCtrl.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -21,13 +21,13 @@ int getLineCount()const { return SendMessage(EM_GETLINECOUNT); } - int getLine(int line, char* buffer, int length)const { + int getLine(int line, TCHAR* buffer, int length)const { *((int*) buffer) = length; return SendMessage(EM_GETLINE, line, (LPARAM) buffer); } String getLine(int line)const { int length = lineLength(line); - char* buffer = (char*) alloca(length + 1); + TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * (length + 1)); getLine(line, buffer, length + 1); return buffer; } Modified: branches/cmake/TTProxy/YCL/include/YCL/FileVersion.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/FileVersion.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/FileVersion.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -19,84 +19,84 @@ class FileVersion { private: - static const char* ROOT() { - static const char string[] = "\\"; - return string; - } - static const char* TRANS() { - static const char string[] = "\\VarFileInfo\\Translation"; - return string; - } - static const char* STRINGBLOCK() { - static const char string[] = "\\StringFileInfo\\%08X\\%s"; - return string; - } + static const TCHAR* ROOT() { + static const TCHAR string[] = _T("\\"); + return string; + } + static const TCHAR* TRANS() { + static const TCHAR string[] = _T("\\VarFileInfo\\Translation"); + return string; + } + static const TCHAR* STRINGBLOCK() { + static const TCHAR string[] = _T("\\StringFileInfo\\%08X\\%s"); + return string; + } - static const char* COMMENTS() { - static const char string[] = "Comments"; - return string; + static const TCHAR* COMMENTS() { + static const TCHAR string[] = _T("Comments"); + return string; } - static const char* COMPANYNAME() { - static const char string[] = "CompanyName"; - return string; + static const TCHAR* COMPANYNAME() { + static const TCHAR string[] = _T("CompanyName"); + return string; } - static const char* FILEDESCRIPTION() { - static const char string[] = "FileDescription"; - return string; + static const TCHAR* FILEDESCRIPTION() { + static const TCHAR string[] = _T("FileDescription"); + return string; } - static const char* FILEVERSION() { - static const char string[] = "FileVersion"; - return string; + static const TCHAR* FILEVERSION() { + static const TCHAR string[] = _T("FileVersion"); + return string; } - static const char* INTERNALNAME() { - static const char string[] = "InternalName"; - return string; + static const TCHAR* INTERNALNAME() { + static const TCHAR string[] = _T("InternalName"); + return string; } - static const char* LEGALCOPYRIGHT() { - static const char string[] = "LegalCopyright"; - return string; + static const TCHAR* LEGALCOPYRIGHT() { + static const TCHAR string[] = _T("LegalCopyright"); + return string; } - static const char* LEGALTRADEMARKS() { - static const char string[] = "LegalTrademarks"; - return string; + static const TCHAR* LEGALTRADEMARKS() { + static const TCHAR string[] = _T("LegalTrademarks"); + return string; } - static const char* ORIGINALFILENAME() { - static const char string[] = "OriginalFilename"; - return string; + static const TCHAR* ORIGINALFILENAME() { + static const TCHAR string[] = _T("OriginalFilename"); + return string; } - static const char* PRIVATEBUILD() { - static const char string[] = "PrivateBuild"; - return string; + static const TCHAR* PRIVATEBUILD() { + static const TCHAR string[] = _T("PrivateBuild"); + return string; } - static const char* PRODUCTNAME() { - static const char string[] = "ProductName"; - return string; + static const TCHAR* PRODUCTNAME() { + static const TCHAR string[] = _T("ProductName"); + return string; } - static const char* PRODUCTVERSION() { - static const char string[] = "ProductVersion"; - return string; + static const TCHAR* PRODUCTVERSION() { + static const TCHAR string[] = _T("ProductVersion"); + return string; } - static const char* SPECIALBUILD() { - static const char string[] = "SpecialBuild"; - return string; + static const TCHAR* SPECIALBUILD() { + static const TCHAR string[] = _T("SpecialBuild"); + return string; } - char* info; + TCHAR* info; mutable LPWORD trans; mutable UINT transSize; mutable VS_FIXEDFILEINFO* fixedInfo; void init(HINSTANCE instance) { - char buffer[MAX_PATH]; + TCHAR buffer[MAX_PATH]; ::GetModuleFileName(instance, buffer, countof(buffer)); init(buffer); } - void init(const char* filename) { + void init(const TCHAR* filename) { DWORD handle; - DWORD size = ::GetFileVersionInfoSize((char*) filename, &handle); + DWORD size = ::GetFileVersionInfoSize(filename, &handle); if (size != 0){ - info = new char[size]; - if (!::GetFileVersionInfo((char*) filename, handle, size, info)) { + info = new TCHAR[size]; + if (!::GetFileVersionInfo(filename, handle, size, info)) { delete[] info; info = NULL; } @@ -105,7 +105,7 @@ bool validateFixedFileInfo()const { if (fixedInfo == NULL){ UINT size; - if (!::VerQueryValue((void*) (const void*) info, (char*) ROOT(), (LPVOID*) &fixedInfo, &size)) + if (!::VerQueryValue((void*) (const void*) info, ROOT(), (LPVOID*) &fixedInfo, &size)) return false; } return true; @@ -112,7 +112,7 @@ } bool validateTranslation()const { if (trans == NULL){ - if (!::VerQueryValue((void*) (const void*) info, (char*) TRANS(), (LPVOID*) &trans, &transSize)) + if (!::VerQueryValue((void*) (const void*) info, TRANS(), (LPVOID*) &trans, &transSize)) return false; } return true; @@ -124,7 +124,7 @@ FileVersion(HINSTANCE hInstance):info(NULL), fixedInfo(NULL), trans(NULL), transSize(0) { init(hInstance); } - FileVersion(const char* filename):info(NULL), fixedInfo(NULL), trans(NULL), transSize(0) { + FileVersion(const TCHAR* filename):info(NULL), fixedInfo(NULL), trans(NULL), transSize(0) { init(filename); } ~FileVersion() { @@ -152,51 +152,51 @@ int getCharset(int index = 0)const { return validateTranslation() ? MAKELONG(trans[index * 2 + 1], trans[index * 2]) : 0; } - const char* getString(int charset, const char* blockName)const { - char buffer[64]; + const TCHAR* getString(int charset, const TCHAR* blockName)const { + TCHAR buffer[64]; wsprintf(buffer, STRINGBLOCK(), charset, blockName); UINT size; - const char* string; + const TCHAR* string; return ::VerQueryValue((void*) (const void*) info, buffer, (LPVOID*) &string, &size) ? string : NULL; } - const char* getString(const char* blockName)const { + const TCHAR* getString(const TCHAR* blockName)const { return getString(getCharset(), blockName); } - const char* getComments()const { + const TCHAR* getComments()const { return getString(COMMENTS()); } - const char* getCompanyName()const { + const TCHAR* getCompanyName()const { return getString(COMPANYNAME()); } - const char* getFileDescription()const { + const TCHAR* getFileDescription()const { return getString(FILEDESCRIPTION()); } - const char* getFileVersion()const { + const TCHAR* getFileVersion()const { return getString(FILEVERSION()); } - const char* getInternalName()const { + const TCHAR* getInternalName()const { return getString(INTERNALNAME()); } - const char* getLegalCopyright()const { + const TCHAR* getLegalCopyright()const { return getString(LEGALCOPYRIGHT()); } - const char* getLegalTrademarks()const { + const TCHAR* getLegalTrademarks()const { return getString(LEGALTRADEMARKS()); } - const char* getOriginalFilename()const { + const TCHAR* getOriginalFilename()const { return getString(ORIGINALFILENAME()); } - const char* getPrivateBuild()const { + const TCHAR* getPrivateBuild()const { return getString(PRIVATEBUILD()); } - const char* getProductName()const { + const TCHAR* getProductName()const { return getString(PRODUCTNAME()); } - const char* getProductVersion()const { + const TCHAR* getProductVersion()const { return getString(PRODUCTVERSION()); } - const char* getSpecialBuild()const { + const TCHAR* getSpecialBuild()const { return getString(SPECIALBUILD()); } Modified: branches/cmake/TTProxy/YCL/include/YCL/IniFile.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/IniFile.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/IniFile.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -24,17 +24,17 @@ class IniFile { private: static String YES() { - static const char YES[] = "yes"; + static const TCHAR YES[] = _T("yes"); static String string = YES; return string; } static String NO() { - static const char NO[] = "no"; + static const TCHAR NO[] = _T("no"); static String string = NO; return string; } - static const char* INVALID() { - static const char string[] = "\n:"; + static const TCHAR* INVALID() { + static const TCHAR string[] = _T("\n:"); return string; } @@ -43,16 +43,16 @@ Vector<String> list; mutable int index; public: - EnumKeyNames(const char* filename, const char* section):index(0) { + EnumKeyNames(const TCHAR* filename, const TCHAR* section):index(0) { Hashtable<String, int> table; - int section_len = strlen(section); - char* buffer; + int section_len = _tcslen(section); + TCHAR* buffer; size_t size = 256; while ((buffer = getSectionNames(filename, size)) == NULL) size += 256; - const char* name = buffer; + const TCHAR* name = buffer; while (*name != '\0') { - if (strncmp(name, section, section_len) == 0) { + if (_tcsncmp(name, section, section_len) == 0) { if (name[section_len] == '\\') { int i; name += section_len + 1; @@ -59,8 +59,10 @@ for (i = 0; name[i] != '\0'; i++) { if (name[i] == '\\') break; +#if !defined(UNICODE) if (String::isLeadByte(name[i])) i++; +#endif } table.put(String(name, i), 1); } @@ -84,10 +86,10 @@ friend class EnumKeyNames; class EnumValueNames : public Enumeration<String> { private: - char* buffer; - mutable char* p; + TCHAR* buffer; + mutable TCHAR* p; public: - EnumValueNames(const char* filename, const char* section) { + EnumValueNames(const TCHAR* filename, const TCHAR* section) { size_t size = 256; while ((buffer = getValueNames(filename, section, size)) == NULL) size += 256; @@ -140,23 +142,23 @@ return ((IniFile*) ini)->deleteValue(name); } }; - static char* getSectionNames(const char* filename, size_t size) { - char* buffer = new char[size]; + static TCHAR* getSectionNames(const TCHAR* filename, size_t size) { + TCHAR* buffer = new TCHAR[size]; if (::GetPrivateProfileSectionNames(buffer, size, filename) < size - 2) return buffer; delete[] buffer; return NULL; } - static char* getValueNames(const char* filename, const char* section, size_t size) { - static const char null = '\0'; - char* buffer = new char[size]; + static TCHAR* getValueNames(const TCHAR* filename, const TCHAR* section, size_t size) { + static const TCHAR null = '\0'; + TCHAR* buffer = new TCHAR[size]; if (::GetPrivateProfileString(section, NULL, &null, buffer, size, filename) < size - 2) return buffer; delete[] buffer; return NULL; } - static String getString(const char* filename, const char* section, const char* name, bool& exists, size_t size) { - char* buffer = (char*) alloca(size); + static String getString(const TCHAR* filename, const TCHAR* section, const TCHAR* name, bool& exists, size_t size) { + TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * size); size_t len = ::GetPrivateProfileString(section, name, INVALID(), buffer, size, filename); if (len < size - 2) { // \x89\xFC\x8Ds\x82\xF0\x8A܂\xB6\x8E\x9A\x97\xF1\x82\xCDini\x83t\x83@\x83C\x83\x8B\x82\xA9\x82\xE7\x82͎擾\x82ł\xAB\x82Ȃ\xA2\x82̂Ŏ擾\x8E\xB8\x94s\x82\xB5\x82\xBD\x82\xB1\x82Ƃ\xAA\x95\xAA\x82\xA9\x82\xE9 @@ -170,24 +172,24 @@ exists = true; return NULL; } - static String generateSectionName(const char* parentSection, const char* subkeyName) { + static String generateSectionName(const TCHAR* parentSection, const TCHAR* subkeyName) { StringBuffer buffer = parentSection; buffer.append('\\'); buffer.append(subkeyName); return buffer.toString(); } - static bool deleteAllSubsection(const char* filename, const char* section, const char* subkey) { + static bool deleteAllSubsection(const TCHAR* filename, const TCHAR* section, const TCHAR* subkey) { String keyname = generateSectionName(section, subkey); int keyname_len = keyname.length(); - char* buffer; + TCHAR* buffer; size_t size = 256; while ((buffer = getSectionNames(filename, size)) == NULL) size += 256; - const char* name = buffer; + const TCHAR* name = buffer; bool succeeded = true; while (*name != '\0') { - if (strncmp(name, keyname, keyname_len) == 0) { + if (_tcsncmp(name, keyname, keyname_len) == 0) { if (name[keyname_len] == '\0' || name[keyname_len] == '\\') { if (!::WritePrivateProfileString(name, NULL, NULL, filename)) { succeeded = false; @@ -209,19 +211,19 @@ } IniFile(String filename, String section):filename(filename), section(section) { } - IniFile(const IniFile& parent, const char* subkeyName):filename(parent.filename), section(generateSectionName(parent.section, subkeyName)) { + IniFile(const IniFile& parent, const TCHAR* subkeyName):filename(parent.filename), section(generateSectionName(parent.section, subkeyName)) { } bool isOpened()const { return filename != NULL && section != NULL; } - long getInteger(const char* name, long defaultValue = 0)const { + long getInteger(const TCHAR* name, long defaultValue = 0)const { return filename != NULL && section != NULL ? ::GetPrivateProfileInt(section, name, defaultValue, filename) : defaultValue; } - String getString(const char* name)const { + String getString(const TCHAR* name)const { return getString(name, NULL); } - String getString(const char* name, String defaultValue)const { + String getString(const TCHAR* name, String defaultValue)const { if (filename != NULL && section != NULL && name != NULL) { size_t size = 256; String string; @@ -233,7 +235,7 @@ } return defaultValue; } - bool getBoolean(const char* name, bool defaultValue = false)const { + bool getBoolean(const TCHAR* name, bool defaultValue = false)const { String string = getString(name); if (string != NULL) { if (string == YES()) @@ -244,10 +246,10 @@ return defaultValue; } - bool setInteger(const char* name, long value) { + bool setInteger(const TCHAR* name, long value) { return setString(name, Integer::toString(value)); } - bool setString(const char* name, String value) { + bool setString(const TCHAR* name, String value) { if (filename != NULL && section != NULL && name != NULL) { // NULL\x82łȂ\xAF\x82\xEA\x82G\x83X\x83P\x81[\x83v\x82\xB5\x82Ă\xA9\x82\xE7""\x82Ŋ\x87\x82\xE9 if (value != NULL) { @@ -262,30 +264,30 @@ } return false; } - bool setBoolean(const char* name, bool value) { + bool setBoolean(const TCHAR* name, bool value) { return setString(name, value ? YES() : NO()); } - bool existsValue(const char* name) { - char buffer[3]; + bool existsValue(const TCHAR* name) { + TCHAR buffer[3]; ::GetPrivateProfileString(section, name, INVALID(), buffer, countof(buffer), filename); return buffer[0] != '\n'; } - bool deleteKey(const char* name) { + bool deleteKey(const TCHAR* name) { return filename != NULL && section != NULL && name != NULL && deleteAllSubsection(filename, section, name); } - bool deleteValue(const char* name) { + bool deleteValue(const TCHAR* name) { return filename != NULL && section != NULL && name != NULL && ::WritePrivateProfileString(section, name, NULL, filename) != FALSE; } - bool open(String filename, String section) { + bool open(String _filename, String _section) { close(); - this->filename = filename; - this->section = section; + filename = _filename; + section = _section; return isOpened(); } - bool open(const IniFile& parent, const char* subkeyName) { + bool open(const IniFile& parent, const TCHAR* subkeyName) { close(); filename = parent.filename; section = generateSectionName(parent.section, subkeyName); Modified: branches/cmake/TTProxy/YCL/include/YCL/Integer.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/Integer.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/Integer.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -46,8 +46,8 @@ static String toString(unsigned long value, int base, bool negative) { if (base < 2 || base > 36) return NULL; - char buffer[64]; - char* p = buffer + countof(buffer); + TCHAR buffer[64]; + TCHAR* p = buffer + countof(buffer); *--p = '\0'; if (value == 0) { *--p = '0'; Modified: branches/cmake/TTProxy/YCL/include/YCL/Resource.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/Resource.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/Resource.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -10,8 +10,8 @@ #endif // _MSC_VER >= 1000 #include <YCL/common.h> - #include <YCL/String.h> +#include "codeconv.h" namespace yebisuya { @@ -18,7 +18,7 @@ class Resource { public: static String loadString(HINSTANCE instance, UINT id, int bufsize) { - char* buffer = (char*) alloca(bufsize); + TCHAR* buffer = (TCHAR*) alloca(sizeof(TCHAR) * bufsize); int length = loadString(instance, id, buffer, bufsize); if (length >= bufsize - 1) return NULL; @@ -28,10 +28,10 @@ } public: - static int loadString(UINT id, char* buffer, int bufsize) { + static int loadString(UINT id, TCHAR* buffer, int bufsize) { return loadString(GetInstanceHandle(), id, buffer, bufsize); } - static int loadString(HINSTANCE instance, UINT id, char* buffer, int bufsize) { + static int loadString(HINSTANCE instance, UINT id, TCHAR* buffer, int bufsize) { return LoadString(instance, id, buffer, bufsize); } static String loadString(int id) { @@ -54,10 +54,10 @@ return loadIcon(GetInstanceHandle(), id); } static HICON loadIcon(HINSTANCE instance, int id) { - return loadIcon(instance, MAKEINTRESOURCE(id)); + return loadIcon(instance, MAKEINTRESOURCEA(id)); } static HICON loadIcon(HINSTANCE instance, const char* id) { - return ::LoadIcon(instance, id); + return ::LoadIcon(instance, (tc)id); } static HICON loadIcon(int id, int cx, int cy) { @@ -67,7 +67,7 @@ return loadIcon(GetInstanceHandle(), id, cx, cy); } static HICON loadIcon(HINSTANCE instance, int id, int cx, int cy) { - return loadIcon(instance, MAKEINTRESOURCE(id), cx, cy); + return loadIcon(instance, MAKEINTRESOURCEA(id), cx, cy); } static HICON loadIcon(HINSTANCE instance, const char* id, int cx, int cy) { return loadIcon(instance, id, cx, cy, LR_DEFAULTCOLOR | LR_SHARED); @@ -79,10 +79,10 @@ return loadIcon(GetInstanceHandle(), id, cx, cy, flags); } static HICON loadIcon(HINSTANCE instance, int id, int cx, int cy, int flags) { - return loadIcon(instance, MAKEINTRESOURCE(id), cx, cy, flags); + return loadIcon(instance, MAKEINTRESOURCEA(id), cx, cy, flags); } static HICON loadIcon(HINSTANCE instance, const char* id, int cx, int cy, int flags) { - return (HICON) ::LoadImage(instance, id, IMAGE_ICON, cx, cy, flags); + return (HICON) ::LoadImage(instance, (tc)id, IMAGE_ICON, cx, cy, flags); } static HCURSOR loadCursor(int id) { @@ -92,10 +92,10 @@ return loadCursor(GetInstanceHandle(), id); } static HCURSOR loadCursor(HINSTANCE instance, int id) { - return loadCursor(instance, MAKEINTRESOURCE(id)); + return loadCursor(instance, MAKEINTRESOURCEA(id)); } static HCURSOR loadCursor(HINSTANCE instance, const char* id) { - return ::LoadCursor(instance, id); + return ::LoadCursor(instance, (tc)id); } static HCURSOR loadCursor(int id, int cx, int cy) { @@ -105,7 +105,7 @@ return loadCursor(GetInstanceHandle(), id, cx, cy); } static HCURSOR loadCursor(HINSTANCE instance, int id, int cx, int cy) { - return loadCursor(instance, MAKEINTRESOURCE(id), cx, cy); + return loadCursor(instance, MAKEINTRESOURCEA(id), cx, cy); } static HCURSOR loadCursor(HINSTANCE instance, const char* id, int cx, int cy) { return loadCursor(instance, id, cx, cy, LR_DEFAULTCOLOR | LR_SHARED); @@ -117,10 +117,10 @@ return loadCursor(GetInstanceHandle(), id, cx, cy, flags); } static HCURSOR loadCursor(HINSTANCE instance, int id, int cx, int cy, int flags) { - return loadCursor(instance, MAKEINTRESOURCE(id), cx, cy, flags); + return loadCursor(instance, MAKEINTRESOURCEA(id), cx, cy, flags); } static HCURSOR loadCursor(HINSTANCE instance, const char* id, int cx, int cy, int flags) { - return (HCURSOR) ::LoadImage(instance, id, IMAGE_CURSOR, cx, cy, flags); + return (HCURSOR) ::LoadImage(instance, (tc)id, IMAGE_CURSOR, cx, cy, flags); } static HMENU loadMenu(int id) { @@ -130,10 +130,10 @@ return loadMenu(GetInstanceHandle(), id); } static HMENU loadMenu(HINSTANCE instance, int id) { - return loadMenu(instance, MAKEINTRESOURCE(id)); + return loadMenu(instance, MAKEINTRESOURCEA(id)); } static HMENU loadMenu(HINSTANCE instance, const char* id) { - return ::LoadMenu(instance, id); + return ::LoadMenu(instance, (tc)id); } }; Modified: branches/cmake/TTProxy/YCL/include/YCL/String.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/String.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/String.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -12,6 +12,7 @@ #include <YCL/common.h> #include <string.h> +#include <tchar.h> namespace yebisuya { @@ -21,7 +22,7 @@ // \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ai\x94[\x82\xB7\x82\xE9\x83o\x83b\x83t\x83@\x81B // \x95\xB6\x8E\x9A\x97\xF1\x82̑O\x82ɂ͎Q\x8FƃJ\x83E\x83\x93\x83^\x82\xF0\x8E\x9D\x82\xBF\x81A // \x91\xE3\x93\xFC\x82\xE2\x94j\x8A\xFC\x82̍ۂɂ͂\xBB\x82\xB1\x82\xF0\x95ύX\x82\xB7\x82\xE9\x81B - const char* string; + const TCHAR* string; // utilities // \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ai\x94[\x82\xB7\x82\xE9\x83o\x83b\x83t\x83@\x82\xF0\x8D쐬\x82\xB7\x82\xE9\x81B @@ -31,10 +32,10 @@ // length \x95\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B // \x95Ԓl: // \x8D쐬\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82̕\xB6\x8E\x9A\x97̃A\x83h\x83\x8C\x83X\x81B - static char* createBuffer(size_t length) { - size_t* count = (size_t*) new unsigned char[sizeof (size_t) + sizeof (char) * (length + 1)]; + static TCHAR* createBuffer(size_t length) { + size_t* count = (size_t*) new TCHAR[sizeof (size_t) + sizeof (TCHAR) * (length + 1)]; *count = 0; - return (char*) (count + 1); + return (TCHAR*) (count + 1); } // \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ai\x94[\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82\xF0\x8D쐬\x82\xB7\x82\xE9\x81B // \x88\xF8\x90\x94: @@ -41,8 +42,8 @@ // source \x8Ai\x94[\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x8D쐬\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82̕\xB6\x8E\x9A\x97̃A\x83h\x83\x8C\x83X\x81B - static const char* create(const char* source) { - return source != NULL ? create(source, strlen(source)) : NULL; + static const TCHAR* create(const TCHAR* source) { + return source != NULL ? create(source, _tcslen(source)) : NULL; } // \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ai\x94[\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82\xF0\x8D쐬\x82\xB7\x82\xE9\x81B // \x88\xF8\x90\x94: @@ -50,10 +51,10 @@ // length \x95\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B // \x95Ԓl: // \x8D쐬\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82̕\xB6\x8E\x9A\x97̃A\x83h\x83\x8C\x83X\x81B - static const char* create(const char* source, size_t length) { + static const TCHAR* create(const TCHAR* source, size_t length) { if (source != NULL) { - char* buffer = createBuffer(length); - memcpy(buffer, source, length); + TCHAR* buffer = createBuffer(length); + memcpy(buffer, source, sizeof(TCHAR) * length); buffer[length] = '\0'; return buffer; } @@ -65,12 +66,12 @@ // str2 \x98A\x8C\x8B\x82\xB7\x82镶\x8E\x9A\x97\xF1(\x8C\xE3)\x81B // \x95Ԓl: // \x8D쐬\x82\xB5\x82\xBD\x83o\x83b\x83t\x83@\x82̕\xB6\x8E\x9A\x97̃A\x83h\x83\x8C\x83X\x81B - static const char* concat(const char* str1, const char* str2) { - size_t len1 = strlen(str1); - size_t len2 = strlen(str2); - char* buffer = createBuffer(len1 + len2); - memcpy(buffer, str1, len1); - memcpy(buffer + len1, str2, len2); + static const TCHAR* concat(const TCHAR* str1, const TCHAR* str2) { + size_t len1 = _tcslen(str1); + size_t len2 = _tcslen(str2); + TCHAR* buffer = createBuffer(len1 + len2); + memcpy(buffer, str1, sizeof(TCHAR) * len1); + memcpy(buffer + len1, str2, sizeof(TCHAR) * len2); buffer[len1 + len2] = '\0'; return buffer; } @@ -80,7 +81,7 @@ if (string != NULL) { size_t* count = (size_t*) string - 1; if (--*count == 0) - delete[] (unsigned char*) count; + delete[] (TCHAR*) count; } } // \x8EQ\x8FƃJ\x83E\x83\x93\x83^\x82𑝂₷\x81B @@ -95,7 +96,7 @@ // \x90V\x82\xB5\x82\xA2\x83o\x83b\x83t\x83@\x82̎Q\x8FƃJ\x83E\x83\x93\x83^\x82𑝂₷\x81B // \x88\xF8\x90\x94: // source \x92u\x82\xAB\x8A\xB7\x82\xA6\x82\xE9\x90V\x82\xB5\x82\xA2\x83o\x83b\x83t\x83@\x81B - void set(const char* source) { + void set(const TCHAR* source) { if (string != source) { release(); string = source; @@ -111,7 +112,7 @@ // \x8C\xB3\x82̕\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ew\x92肷\x82\xE9\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B // \x88\xF8\x90\x94: // source \x8C\xB3\x82̕\xB6\x8E\x9A\x97\xF1\x81B - String(const char* source):string(NULL) { + String(const TCHAR* source):string(NULL) { set(create(source)); } // \x8C\xB3\x82̕\xB6\x8E\x9A\x97\xF1\x82\xB3\x95t\x82\xAB\x82Ŏw\x92肷\x82\xE9\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B @@ -118,7 +119,7 @@ // \x88\xF8\x90\x94: // source \x8C\xB3\x82̕\xB6\x8E\x9A\x97\xF1\x81B // length \x95\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B - String(const char* source, size_t length):string(NULL) { + String(const TCHAR* source, size_t length):string(NULL) { set(create(source, length)); } // \x83R\x83s\x81[\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B @@ -131,7 +132,7 @@ // \x88\xF8\x90\x94: // str1 \x91O\x82ɂȂ镶\x8E\x9A\x97\xF1\x81B // str2 \x8C\xE3\x82ɂȂ镶\x8E\x9A\x97\xF1\x81B - String(const char* str1, const char* str2):string(NULL) { + String(const TCHAR* str1, const TCHAR* str2):string(NULL) { set(concat(str1, str2)); } // \x93\xF1\x82̕\xB6\x8E\x9A\x97\xF1\x82\xF0\x98A\x8C\x8B\x82\xB7\x82\xE9\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B @@ -138,7 +139,7 @@ // \x88\xF8\x90\x94: // str1 \x91O\x82ɂȂ镶\x8E\x9A\x97\xF1\x81B // str2 \x8C\xE3\x82ɂȂ镶\x8E\x9A\x97\xF1\x81B - String(const String& str1, const char* str2):string(NULL) { + String(const String& str1, const TCHAR* str2):string(NULL) { set(*str2 != '\0' ? concat(str1.string, str2) : str1.string); } // destructor @@ -153,7 +154,7 @@ // source \x98A\x8C\x8B\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x98A\x8C\x8B\x82\xB3\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x81B - String concat(const char* source)const { + String concat(const TCHAR* source)const { return String(*this, source); } // \x95\xB6\x8E\x9A\x97\xF1\x82Ƃ̔\xE4\x8Ar\x82\xF0\x8Ds\x82\xA4\x81B @@ -162,12 +163,12 @@ // str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x93\x99\x82\xB5\x82\xAF\x82\xEA\x82\xCE0\x81Astr\x82̕\xFB\x82\xAA\x91傫\x82\xAF\x82\xEA\x82Ε\x89\x81A\x8F\xAC\x82\xB3\x82\xAF\x82\xEA\x82ΐ\xB3\x81B - int compareTo(const char* str)const { + int compareTo(const TCHAR* str)const { if (str == NULL) return string == NULL ? 0 : 1; else if (string == NULL) return -1; - return strcmp(string, str); + return _tcscmp(string, str); } // \x95\xB6\x8E\x9A\x97\xF1\x82Ƃ̔\xE4\x8Ar\x82\xF0\x91啶\x8E\x9A\x8F\xAC\x95\xB6\x8E\x9A\x82̋\xE6\x95ʂȂ\xB5\x82ōs\x82\xA4\x81B // NULL\x82Ƃ\xE0\x94\xE4\x8Ar\x82ł\xAB\x82\xE9\x81B @@ -175,12 +176,12 @@ // str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x93\x99\x82\xB5\x82\xAF\x82\xEA\x82\xCE0\x81Astr\x82̕\xFB\x82\xAA\x91傫\x82\xAF\x82\xEA\x82Ε\x89\x81A\x8F\xAC\x82\xB3\x82\xAF\x82\xEA\x82ΐ\xB3\x81B - int compareToIgnoreCase(const char* str)const { + int compareToIgnoreCase(const TCHAR* str)const { if (str == NULL) return string == NULL ? 0 : 1; else if (string == NULL) return -1; - return _stricmp(string, str); + return _tcsicmp(string, str); } // \x95\xB6\x8E\x9A\x97\xF1\x82Ƃ̔\xE4\x8Ar\x82\xF0\x8Ds\x82\xA4\x81B // NULL\x82Ƃ\xE0\x94\xE4\x8Ar\x82ł\xAB\x82\xE9\x81B @@ -188,7 +189,7 @@ // str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B - bool equals(const char* str)const { + bool equals(const TCHAR* str)const { return compareTo(str) == 0; } // \x95\xB6\x8E\x9A\x97\xF1\x82Ƃ̔\xE4\x8Ar\x82\xF0\x91啶\x8E\x9A\x8F\xAC\x95\xB6\x8E\x9A\x82̋\xE6\x95ʂȂ\xB5\x82ōs\x82\xA4\x81B @@ -197,7 +198,7 @@ // str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B - bool equalsIgnoreCase(const char* str)const { + bool equalsIgnoreCase(const TCHAR* str)const { return compareToIgnoreCase(str) == 0; } // \x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82Ŏn\x82܂\xC1\x82Ă\xA2\x82邩\x82ǂ\xA4\x82\xA9\x82肷\x82\xE9\x81B @@ -205,7 +206,7 @@ // str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82Ŏn\x82܂\xC1\x82Ă\xA2\x82\xEA\x82ΐ^\x81B - bool startsWith(const char* str)const { + bool startsWith(const TCHAR* str)const { return startsWith(str, 0); } // \x8Ew\x92\xE8\x82̈ʒu\x82\xA9\x82\xE7\x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82Ŏn\x82܂\xC1\x82Ă\xA2\x82邩\x82ǂ\xA4\x82\xA9\x82肷\x82\xE9\x81B @@ -213,8 +214,8 @@ // str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82Ŏn\x82܂\xC1\x82Ă\xA2\x82\xEA\x82ΐ^\x81B - bool startsWith(const char* str, int offset)const { - return strncmp(string, str, strlen(str)) == 0; + bool startsWith(const TCHAR* str, int offset)const { + return _tcsncmp(string, str, _tcslen(str)) == 0; } // \x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82ŏI\x82\xED\x82\xC1\x82Ă\xA2\x82邩\x82ǂ\xA4\x82\xA9\x82肷\x82\xE9\x81B // \x88\xF8\x90\x94: @@ -221,13 +222,13 @@ // str \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x8Ew\x92肳\x82ꂽ\x95\xB6\x8E\x9A\x97\xF1\x82ŏI\x82\xED\x82\xC1\x82Ă\xA2\x82\xEA\x82ΐ^\x81B - // - bool endsWith(const char* str)const { - size_t str_length = strlen(str); + // + bool endsWith(const TCHAR* str)const { + size_t str_length = _tcslen(str); size_t string_length = length(); if (string_length < str_length) return false; - return strcmp(string + string_length - str_length, str) == 0; + return _tcscmp(string + string_length - str_length, str) == 0; } // \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82\xAA\x82ǂ̈ʒu\x82ɂ\xA0\x82邩\x82\xF0\x92T\x82\xB7\x81B // \x88\xF8\x90\x94: @@ -234,7 +235,7 @@ // chr \x92T\x82\xB7\x95\xB6\x8E\x9A\x81B // \x95Ԓl: // \x95\xB6\x8E\x9A\x82̌\xA9\x82\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B - int indexOf(char chr)const { + int indexOf(TCHAR chr)const { return indexOf(chr, 0); } // \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82\xAA\x82ǂ̈ʒu\x82ɂ\xA0\x82邩\x82\xF0\x8Ew\x92\xE8\x82̈ʒu\x82\xA9\x82\xE7\x92T\x82\xB7\x81B @@ -243,12 +244,10 @@ // from \x92T\x82\xB5\x8En\x82߂\xE9\x88ʒu\x81B // \x95Ԓl: // \x95\xB6\x8E\x9A\x82̌\xA9\x82\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B - int indexOf(char chr, size_t from)const { - if (from < 0) - from = 0; - else if (from >= length()) + int indexOf(TCHAR chr, size_t from)const { + if (from >= length()) return -1; - const char* found = strchr(string + from, chr); + const TCHAR* found = _tcschr(string + from, chr); if (found == NULL) return -1; return found - string; @@ -258,7 +257,7 @@ // str \x92T\x82\xB7\x95\xB6\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x95\xB6\x8E\x9A\x97\xF1\x82̌\xA9\x82\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B - int indexOf(const char* str)const { + int indexOf(const TCHAR* str)const { return indexOf(str, 0); } // \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x97ǂ̈ʒu\x82ɂ\xA0\x82邩\x82\xF0\x8Ew\x92\xE8\x82̈ʒu\x82\xA9\x82\xE7\x92T\x82\xB7\x81B @@ -267,13 +266,11 @@ // from \x92T\x82\xB5\x8En\x82߂\xE9\x88ʒu\x81B // \x95Ԓl: // \x95\xB6\x8E\x9A\x97\xF1\x82̌\xA9\x82\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B - // - int indexOf(const char* str, size_t from)const { - if (from < 0) - from = 0; - else if (from >= length()) + // + int indexOf(const TCHAR* str, size_t from)const { + if (from >= length()) return -1; - const char* found = strstr(string + from, str); + const TCHAR* found = _tcsstr(string + from, str); if (found == NULL) return -1; return found - string; @@ -280,7 +277,7 @@ } // \x95\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x82\xF0\x95Ԃ\xB7\x81B size_t length()const { - return strlen(string); + return _tcslen(string); } // \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82\xAA\x8DŌ\xE3\x82Ɍ\xA9\x82\xA9\x82\xE9\x88ʒu\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B // \x88\xF8\x90\x94: @@ -287,7 +284,7 @@ // chr \x92T\x82\xB7\x95\xB6\x8E\x9A\x81B // \x95Ԓl: // \x95\xB6\x8E\x9A\x82̌\xA9\x82\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B - int lastIndexOf(char chr)const { + int lastIndexOf(TCHAR chr)const { return lastIndexOf(chr, (size_t) -1); } // \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82\xAA\x8Ew\x92\xE8\x82̈ʒu\x82\xE6\x82\xE8\x82\xE0\x91O\x82ōŌ\xE3\x82Ɍ\xA9\x82\xA9\x82\xE9\x88ʒu\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B @@ -296,18 +293,20 @@ // from \x92T\x82\xB5\x8En\x82߂\xE9\x88ʒu\x81B // \x95Ԓl: // \x95\xB6\x8E\x9A\x82̌\xA9\x82\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B - int lastIndexOf(char chr, size_t from)const { + int lastIndexOf(TCHAR chr, size_t from)const { size_t len = length(); if (from > len - 1) from = len - 1; - const char* s = string; - const char* end = string + from; - const char* found = NULL; + const TCHAR* s = string; + const TCHAR* end = string + from; + const TCHAR* found = NULL; while (*s != '0' && s <= end) { if (*s == chr) found = s; +#if !defined(UNICODE) if (isLeadByte(*s)) s++; +#endif s++; } return found != NULL ? found - string : -1; @@ -317,7 +316,7 @@ // str \x92T\x82\xB7\x95\xB6\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x95\xB6\x8E\x9A\x97\xF1\x82̌\xA9\x82\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B - int lastIndexOf(const char* str)const { + int lastIndexOf(const TCHAR* str)const { return lastIndexOf(str, (size_t) -1); } // \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x97w\x92\xE8\x82̈ʒu\x82\xE6\x82\xE8\x82\xE0\x91O\x82ōŌ\xE3\x82Ɍ\xA9\x82\xA9\x82\xE9\x88ʒu\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B @@ -326,14 +325,14 @@ // from \x92T\x82\xB5\x8En\x82߂\xE9\x88ʒu\x81B // \x95Ԓl: // \x95\xB6\x8E\x9A\x97\xF1\x82̌\xA9\x82\xA9\x82\xC1\x82\xBD\x83C\x83\x93\x83f\x83b\x83N\x83X\x81B\x8C\xA9\x82\xA9\x82\xE7\x82Ȃ\xAF\x82\xEA\x82\xCE-1\x81B - int lastIndexOf(const char* str, size_t from)const { + int lastIndexOf(const TCHAR* str, size_t from)const { size_t len = length(); - size_t str_len = strlen(str); + size_t str_len = _tcslen(str); if (from > len - str_len) from = len - str_len; - const char* s = string + from; + const TCHAR* s = string + from; while (s >= string) { - if (strncmp(s, str, str_len) == 0) + if (_tcsncmp(s, str, str_len) == 0) return s - string; s--; } @@ -361,8 +360,8 @@ // index \x8E\xE6\x82\xE8\x8Fo\x82\xB7\x95\xB6\x8E\x9A\x82̈ʒu\x81B // \x95Ԓl: // \x8Ew\x92\xE8\x82̈ʒu\x82ɂ\xA0\x82镶\x8E\x9A\x81B - char charAt(size_t index)const { - return index >= 0 && index < length() ? string[index] : '\0'; + TCHAR TCHARAt(size_t index)const { + return index < length() ? string[index] : '\0'; } // \x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82\xF0\x8Ew\x92\xE8\x82̕\xB6\x8E\x9A\x82ɒu\x82\xAB\x8A\xB7\x82\xA6\x82܂\xB7\x81B // \x88\xF8\x90\x94: @@ -370,13 +369,16 @@ // newChr \x92u\x82\xAB\x8A\xB7\x82\xA6\x82镶\x8E\x9A\x81B // \x95Ԓl: // \x92u\x8A\xB7\x8C\xE3\x82̕\xB6\x8E\x9A\x97\xF1\x81B - String replace(char oldChr, char newChr)const { + String replace(TCHAR oldChr, TCHAR newChr)const { String result(string); - char* s = (char*) result.string; + TCHAR* s = (TCHAR*) result.string; while (*s != '\0'){ +#if !defined(UNICODE) if (String::isLeadByte(*s)) s++; - else if (*s == oldChr) + else +#endif + if (*s == oldChr) *s = newChr; s++; } @@ -387,11 +389,14 @@ // \x95ϊ\xB7\x8C\xE3\x82̕\xB6\x8E\x9A\x97\xF1\x81B String toLowerCase()const { String result(string); - char* s = (char*) result.string; + TCHAR* s = (TCHAR*) result.string; while (*s != '\0'){ +#if !defined(UNICODE) if (String::isLeadByte(*s)) s++; - else if ('A' <= *s && *s <= 'Z') + else +#endif + if ('A' <= *s && *s <= 'Z') *s += 'a' - 'A'; s++; } @@ -402,12 +407,15 @@ // \x95ϊ\xB7\x8C\xE3\x82̕\xB6\x8E\x9A\x97\xF1\x81B String toUpperCase()const { String result(string); - char* s = (char*) result.string; + TCHAR* s = (TCHAR*) result.string; while (*s != '\0'){ +#if !defined(UNICODE) if (String::isLeadByte(*s)) s++; - else if ('a' <= *s && *s <= 'z') - *s += 'A' - 'a'; + else +#endif + if (_T('a') <= *s && *s <= _T('z')) + *s += _T('A') - _T('a'); s++; } return result; @@ -416,12 +424,12 @@ // \x95Ԓl: // \x8D폜\x8C\xE3\x82̕\xB6\x8E\x9A\x97\xF1\x81B String trim()const { - const char* s = string; - while (*s != '\0' && (unsigned char) *s <= ' ') + const TCHAR* s = string; + while (*s != '\0' && (TCHAR) *s <= _T(' ')) s++; - const char* start = s; + const TCHAR* start = s; s = string + length(); - while (s > start && (*s != '\0' && (unsigned char) *s <= ' ')) + while (s > start && (*s != '\0' && (TCHAR) *s <= _T(' '))) s--; return String(start, s - start); } @@ -428,19 +436,19 @@ // operators - // const char*\x82ւ̃L\x83\x83\x83X\x83g\x89\x89\x8EZ\x8Eq + // const TCHAR*\x82ւ̃L\x83\x83\x83X\x83g\x89\x89\x8EZ\x8Eq // \x95Ԓl: // \x95\xB6\x8E\x9A\x97\xF1\x82ւ̃A\x83h\x83\x8C\x83X\x81B - operator const char*()const { + operator const TCHAR*()const { return string; } - // char\x94z\x97\xF1\x82̂悤\x82Ɉ\xB5\x82\xA4\x82\xBD\x82߂\xCC[]\x89\x89\x8EZ\x8Eq\x81B + // TCHAR\x94z\x97\xF1\x82̂悤\x82Ɉ\xB5\x82\xA4\x82\xBD\x82߂\xCC[]\x89\x89\x8EZ\x8Eq\x81B // \x88\xF8\x90\x94: // index \x8E擾\x82\xB7\x82镶\x8E\x9A\x82̃C\x83\x93\x83f\x83b\x83N\x83X\x81B // \x95Ԓl: // \x8Ew\x92\xE8\x82̃C\x83\x93\x83f\x83b\x83N\x83X\x82ɂ\xA0\x82镶\x8E\x9A\x81B - char operator[](size_t index)const { - return charAt(index); + TCHAR operator[](size_t index)const { + return TCHARAt(index); } // \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x98A\x8C\x8B\x82\xB7\x82邽\x82߂\xCC+\x89\x89\x8EZ\x8Eq\x81B // \x88\xF8\x90\x94: @@ -447,7 +455,7 @@ // source \x98A\x8C\x8B\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x98A\x8C\x8B\x82\xB5\x82\xBD\x95\xB6\x8E\x9A\x97\xF1\x81B - String operator+(const char* source)const { + String operator+(const TCHAR* source)const { return String(string, source); } // \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x98A\x8C\x8B\x82\xB7\x82邽\x82߂\xCC+\x89\x89\x8EZ\x8Eq\x81B @@ -464,7 +472,7 @@ // str2 \x98A\x8C\x8B\x82\xB7\x82镶\x8E\x9A\x97\xF1(\x8C\xE3)\x81B // \x95Ԓl: // \x98A\x8C\x8B\x82\xB5\x82\xBD\x95\xB6\x8E\x9A\x97\xF1\x81B - friend String operator+(const char* str1, const String& str2) { + friend String operator+(const TCHAR* str1, const String& str2) { return *str1 != '\0' ? String(str1, str2.string) : str2; } // \x91\xE3\x93\xFC\x89\x89\x8EZ\x8Eq\x81B @@ -472,7 +480,7 @@ // source \x91\xE3\x93\xFC\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x91\xE3\x93\xFC\x8C\x8B\x89ʁB - String& operator=(const char* source) { + String& operator=(const TCHAR* source) { set(create(source)); return *this; } @@ -490,7 +498,7 @@ // source \x98A\x8C\x8B\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x98A\x8C\x8B\x8C\x8B\x89ʁB - String& operator+=(const char* source) { + String& operator+=(const TCHAR* source) { if (*source != '\0') set(concat(string, source)); return *this; @@ -508,7 +516,7 @@ // str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str\x82̕\x{30AA4D9}\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B - bool operator==(const char* str)const { + bool operator==(const TCHAR* str)const { return compareTo(str) == 0; } // \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B @@ -517,7 +525,7 @@ // str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str1\x82\xE6\x82\xE8str2\x82̕\x{30AA4D9}\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B - friend bool operator==(const char* str1, const String& str2) { + friend bool operator==(const TCHAR* str1, const String& str2) { return str2.compareTo(str1) == 0; } // \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B @@ -533,7 +541,7 @@ // str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str\x82̕\x{30AA4D9}\x82\xB5\x82\xAD\x82Ȃ\xAF\x82\xEA\x82ΐ^\x81B - bool operator!=(const char* str)const { + bool operator!=(const TCHAR* str)const { return compareTo(str) != 0; } // \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B @@ -542,7 +550,7 @@ // str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str1\x82\xE6\x82\xE8str2\x82̕\x{30AA4D9}\x82\xB5\x82\xAD\x82Ȃ\xAF\x82\xEA\x82ΐ^\x81B - friend bool operator!=(const char* str1, const String& str2) { + friend bool operator!=(const TCHAR* str1, const String& str2) { return str2.compareTo(str1) != 0; } // \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B @@ -558,7 +566,7 @@ // str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str\x82̕\xFB\x82\xAA\x91傫\x82\xAF\x82\xEA\x82ΐ^\x81B - bool operator<(const char* str)const { + bool operator<(const TCHAR* str)const { return compareTo(str) < 0; } // \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B @@ -567,7 +575,7 @@ // str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str1\x82\xE6\x82\xE8str2\x82̕\xFB\x82\xAA\x91傫\x82\xAF\x82\xEA\x82ΐ^\x81B - friend bool operator<(const char* str1, const String& str2) { + friend bool operator<(const TCHAR* str1, const String& str2) { return str2.compareTo(str1) > 0; } // \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B @@ -583,7 +591,7 @@ // str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str\x82̕\xFB\x82\xAA\x91傫\x82\xA2\x82\xA9\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B - bool operator<=(const char* str)const { + bool operator<=(const TCHAR* str)const { return compareTo(str) <= 0; } // \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B @@ -592,7 +600,7 @@ // str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str1\x82\xE6\x82\xE8str2\x82̕\xFB\x82\xAA\x91傫\x82\xA2\x82\xA9\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B - friend bool operator<=(const char* str1, const String& str2) { + friend bool operator<=(const TCHAR* str1, const String& str2) { return str2.compareTo(str1) >= 0; } // \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B @@ -608,7 +616,7 @@ // str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str\x82̕\x{30AA3EC}\x82\xB3\x82\xAF\x82\xEA\x82ΐ^\x81B - bool operator>(const char* str)const { + bool operator>(const TCHAR* str)const { return compareTo(str) > 0; } // \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B @@ -617,7 +625,7 @@ // str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str1\x82\xE6\x82\xE8str2\x82̕\x{30AA3EC}\x82\xB3\x82\xAF\x82\xEA\x82ΐ^\x81B - friend bool operator>(const char* str1, const String& str2) { + friend bool operator>(const TCHAR* str1, const String& str2) { return str2.compareTo(str1) < 0; } // \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B @@ -633,7 +641,7 @@ // str \x94\xE4\x8Ar\x91Ώۂ̕\xB6\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str\x82̕\x{30AA3EC}\x82\xB3\x82\xA2\x82\xA9\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B - bool operator>=(const char* str)const { + bool operator>=(const TCHAR* str)const { return compareTo(str) >= 0; } // \x94\xE4\x8Ar\x89\x89\x8EZ\x8Eq\x81B @@ -642,7 +650,7 @@ // str2 \x94\xE4\x8Ar\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // str1\x82\xE6\x82\xE8str2\x82̕\x{30AA3EC}\x82\xB3\x82\xA2\x82\xA9\x93\x99\x82\xB5\x82\xAF\x82\xEA\x82ΐ^\x81B - friend bool operator>=(const char* str1, const String& str2) { + friend bool operator>=(const TCHAR* str1, const String& str2) { return str2.compareTo(str1) <= 0; } @@ -653,7 +661,8 @@ // \x94\xBB\x92肷\x82\xE9\x83o\x83C\x83g\x81B // \x95Ԓl: // 2\x83o\x83C\x83g\x95\xB6\x8E\x9A\x82̍ŏ\x89\x82\xCC1\x83o\x83C\x83g\x82ł\xA0\x82\xEA\x82ΐ^\x81B - static bool isLeadByte(char ch) { +#if !defined(UNICODE) + static bool isLeadByte(TCHAR ch) { #ifdef _INC_WINDOWS return ::IsDBCSLeadByte(ch) != 0; #else @@ -660,6 +669,7 @@ return (ch & 0x80) != 0; #endif } +#endif }; } Modified: branches/cmake/TTProxy/YCL/include/YCL/StringBuffer.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/StringBuffer.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/StringBuffer.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -14,6 +14,7 @@ #include <YCL/String.h> #include <malloc.h> +#include <tchar.h> namespace yebisuya { @@ -21,7 +22,7 @@ class StringBuffer { private: // \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8Ai\x94[\x82\xB7\x82\xE9\x83o\x83b\x83t\x83@\x81B - char* buffer; + TCHAR* buffer; // \x8C\xBB\x8DݗL\x8C\xF8\x82ȕ\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B size_t validLength; // \x83o\x83b\x83t\x83@\x82̑傫\x82\xB3\x81B @@ -35,7 +36,7 @@ // source \x8F\x89\x8A\x{257639A}\x97\xF1\x81B // length \x8F\x89\x8A\x{257639A}\x97\xF1\x82̒\xB7\x82\xB3\x81B // capacity \x83o\x83b\x83t\x83@\x82̏\x89\x8A\xFA\x83T\x83C\x83Y\x81B - void init(const char* source, size_t length, size_t capacity) { + void init(const TCHAR* source, size_t length, size_t capacity) { if ((capacity != 0 || length != 0) && capacity < length + INIT_CAPACITY) capacity = length + INIT_CAPACITY; validLength = length; @@ -43,10 +44,10 @@ if (bufferSize == 0) { buffer = NULL; }else{ - buffer = new char[bufferSize]; + buffer = new TCHAR[bufferSize]; } - memcpy(buffer, source, validLength); - memset(buffer + validLength, '\0', bufferSize - validLength); + memcpy(buffer, source, sizeof(TCHAR) * validLength); + memset(buffer + validLength, '\0', sizeof(TCHAR) * (bufferSize - validLength)); } public: // \x83f\x83t\x83H\x83\x8B\x83g\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B @@ -62,8 +63,8 @@ // \x83o\x83b\x83t\x83@\x82̏\x89\x8A\x{257639A}\x97\xF1\x82\xF0\x8Ew\x92肷\x82\xE9\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B // \x88\xF8\x90\x94: // source \x8F\x89\x8A\x{257639A}\x97\xF1\x81B - StringBuffer(const char* source) { - init(source, strlen(source), 0); + StringBuffer(const TCHAR* source) { + init(source, _tcslen(source), 0); } // \x83R\x83s\x81[\x83R\x83\x93\x83X\x83g\x83\x89\x83N\x83^\x81B // \x88\xF8\x90\x94: @@ -93,7 +94,7 @@ // newLength \x92\xB2\x90߂\xB7\x82钷\x82\xB3\x81B void ensureCapacity(size_t newLength) { if (bufferSize < newLength) { - char* oldBuffer = buffer; + TCHAR* oldBuffer = buffer; init(oldBuffer, validLength, newLength + INIT_CAPACITY); delete[] oldBuffer; } @@ -111,8 +112,8 @@ // index \x95\xB6\x8E\x9A\x82̈ʒu\x81B // \x95Ԓl: // \x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x81B - char charAt(size_t index)const { - return index >= 0 && index < validLength ? buffer[index] : '\0'; + TCHAR charAt(size_t index)const { + return index < validLength ? buffer[index] : '\0'; } // \x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B // \x88\xF8\x90\x94: @@ -119,10 +120,8 @@ // index \x95\xB6\x8E\x9A\x82̈ʒu\x81B // \x95Ԓl: // \x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x82̎Q\x8FƁB - char& charAt(size_t index) { - if (index < 0) { - index = 0; - }else if (index >= validLength) { + TCHAR& charAt(size_t index) { + if (index >= validLength) { ensureCapacity(validLength + 1); index = validLength++; } @@ -132,7 +131,7 @@ // \x88\xF8\x90\x94: // index \x95ύX\x82\xB7\x82镶\x8E\x9A\x82̈ʒu\x81B // chr \x95ύX\x82\xB7\x82镶\x8E\x9A\x81B - void setCharAt(int index, char chr) { + void setCharAt(int index, TCHAR chr) { charAt(index) = chr; } // \x95\xB6\x8E\x9A\x82\xF0\x92lj\xC1\x82\xB7\x82\xE9\x81B @@ -140,7 +139,7 @@ // chr \x92lj\xC1\x82\xB7\x82镶\x8E\x9A\x81B // \x95Ԓl: // \x92lj\xC1\x8C\x8B\x89ʁB - StringBuffer& append(char chr) { + StringBuffer& append(TCHAR chr) { charAt(validLength) = chr; return *this; } @@ -149,8 +148,8 @@ // source \x92lj\xC1\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x92lj\xC1\x8C\x8B\x89ʁB - StringBuffer& append(const char* source) { - return append(source, strlen(source)); + StringBuffer& append(const TCHAR* source) { + return append(source, _tcslen(source)); } // \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x92lj\xC1\x82\xB7\x82\xE9\x81B // \x88\xF8\x90\x94: @@ -158,10 +157,10 @@ // length \x92lj\xC1\x82\xB7\x82镶\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B // \x95Ԓl: // \x92lj\xC1\x8C\x8B\x89ʁB - StringBuffer& append(const char* source, size_t length) { + StringBuffer& append(const TCHAR* source, size_t length) { size_t oldLength = validLength; ensureCapacity(validLength + length); - memcpy(buffer + oldLength, source, length); + memcpy(buffer + oldLength, source, sizeof(TCHAR) * length); validLength += length; return *this; } @@ -184,7 +183,7 @@ start = 0; if (start < end) { if (end < validLength){ - memcpy(buffer + start, buffer + end, validLength - end); + memcpy(buffer + start, buffer + end, sizeof(TCHAR) * (validLength - end)); validLength -= end - start; }else{ validLength = start; @@ -199,17 +198,15 @@ // source \x92u\x8A\xB7\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x92u\x8A\xB7\x8C\x8B\x89ʁB - StringBuffer& replace(size_t start, size_t end, const char* source) { - if (start < 0) - start = 0; + StringBuffer& replace(size_t start, size_t end, const TCHAR* source) { if (end > validLength) end = validLength; if (start < end) { - size_t length = strlen(source); + size_t length = _tcslen(source); size_t oldLength = validLength; ensureCapacity(validLength += length - (end - start)); - memcpy(buffer + start + length, buffer + end, oldLength - end); - memcpy(buffer + start, source, length); + memcpy(buffer + start + length, buffer + end, sizeof(TCHAR) * (oldLength - end)); + memcpy(buffer + start, source, sizeof(TCHAR) * length); } return *this; } @@ -219,8 +216,6 @@ // \x95Ԓl: // \x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x97\xF1\x81B String substring(size_t index)const { - if (index < 0) - index = 0; return String(buffer + index, validLength - index); } // \x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x97\xF1\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B @@ -230,8 +225,6 @@ // \x95Ԓl: // \x8Ew\x92\xE8\x82̈ʒu\x82̕\xB6\x8E\x9A\x97\xF1\x81B String substring(size_t start, size_t end)const { - if (start < 0) - start = 0; if (end > validLength) end = validLength; return String(buffer + start, end - start); @@ -242,7 +235,7 @@ // source \x91}\x93\xFC\x82\xB7\x82镶\x8E\x9A\x81B // \x95Ԓl: // \x91}\x93\xFC\x8C\x8B\x89ʁB - StringBuffer& insert(size_t index, char chr) { + StringBuffer& insert(size_t index, TCHAR chr) { return insert(index, &chr, 1); } // \x8Ew\x92\xE8\x82̈ʒu\x82ɕ\xB6\x8E\x9A\x97\xF1\x82\xF0\x91}\x93\xFC\x82\xB7\x82\xE9\x81B @@ -251,8 +244,8 @@ // source \x91}\x93\xFC\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x91}\x93\xFC\x8C\x8B\x89ʁB - StringBuffer& insert(size_t index, const char* source) { - return insert(index, source, strlen(source)); + StringBuffer& insert(size_t index, const TCHAR* source) { + return insert(index, source, _tcslen(source)); } // \x8Ew\x92\xE8\x82̈ʒu\x82ɕ\xB6\x8E\x9A\x97\xF1\x82\xF0\x91}\x93\xFC\x82\xB7\x82\xE9\x81B // \x88\xF8\x90\x94: @@ -261,17 +254,15 @@ // length \x95\xB6\x8E\x9A\x97\xF1\x82̒\xB7\x82\xB3\x81B // \x95Ԓl: // \x91}\x93\xFC\x8C\x8B\x89ʁB - StringBuffer& insert(size_t index, const char* source, size_t length) { - if (index < 0) - index = 0; - else if (index >= validLength) + StringBuffer& insert(size_t index, const TCHAR* source, size_t length) { + if (index >= validLength) index = validLength; size_t oldLength = validLength; ensureCapacity(validLength + length); - char* temp = (char*) alloca(oldLength - index); - memcpy(temp, buffer + index, oldLength - index); - memcpy(buffer + index, source, length); - memcpy(buffer + index + length, temp, oldLength - index); + TCHAR* temp = (TCHAR*) alloca(sizeof(TCHAR) * (oldLength - index)); + memcpy(temp, buffer + index, sizeof(TCHAR) * (oldLength - index)); + memcpy(buffer + index, source, sizeof(TCHAR) * length); + memcpy(buffer + index + length, temp, sizeof(TCHAR) * (oldLength - index)); validLength += length; return *this; } @@ -279,19 +270,22 @@ // \x95Ԓl: // \x94\xBD\x93]\x8C\x8B\x89ʁB StringBuffer& reverse() { - char* temporary = (char*) alloca(sizeof (char) * validLength); - char* dst = temporary + validLength; - char* src = buffer; + TCHAR* temporary = (TCHAR*) alloca(sizeof (TCHAR) * validLength); + TCHAR* dst = temporary + validLength; + TCHAR* src = buffer; while (temporary < dst) { +#if !defined(UNICODE) if (String::isLeadByte(*src)) { - char pre = *src++; + TCHAR pre = *src++; *--dst = *src++; *--dst = pre; - }else{ + }else +#endif + { *--dst = *src++; } } - memcpy(buffer, temporary, validLength); + memcpy(buffer, temporary, sizeof(TCHAR) * validLength); return *this; } // \x95\xB6\x8E\x9A\x97\xF1\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B @@ -306,7 +300,7 @@ // \x95ύX\x82\xB7\x82\xE9\x88ꕶ\x8E\x9A\x81B // \x95Ԓl: // \x95ύX\x8C\x8B\x89ʁB - StringBuffer& set(char chr) { + StringBuffer& set(TCHAR chr) { ensureCapacity(1); buffer[0] = chr; validLength = 1; @@ -317,18 +311,18 @@ // source \x95ύX\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x95ύX\x8C\x8B\x89ʁB - StringBuffer& set(const char* source) { - size_t length = strlen(source); + StringBuffer& set(const TCHAR* source) { + size_t length = _tcslen(source); ensureCapacity(validLength = length); - memcpy(buffer, source, length); + memcpy(buffer, source, sizeof(TCHAR) * length); return *this; } - // char*\x82ɕϊ\xB7\x82\xB7\x82\xE9\x83L\x83\x83\x83X\x83g\x89\x89\x8EZ\x8Eq\x81B + // TCHAR*\x82ɕϊ\xB7\x82\xB7\x82\xE9\x83L\x83\x83\x83X\x83g\x89\x89\x8EZ\x8Eq\x81B // \x83o\x83b\x83t\x83@\x82̃A\x83h\x83\x8C\x83X\x82\xF0\x8E擾\x82\xB7\x82\xE9\x81B // \x95Ԓl: // \x83o\x83b\x83t\x83@\x82̃A\x83h\x83\x8C\x83X\x81B - operator char*() { + operator TCHAR*() { return buffer; } // String\x82ɕϊ\xB7\x82\xB7\x82\xE9\x83L\x83\x83\x83X\x83g\x89\x89\x8EZ\x8Eq\x81B @@ -344,7 +338,7 @@ // ch \x95ύX\x82\xB7\x82\xE9\x88ꕶ\x8E\x9A\x81B // \x95Ԓl: // \x91\xE3\x93\xFC\x8C\x8B\x89ʁB - StringBuffer& operator=(char ch) { + StringBuffer& operator=(TCHAR ch) { return set(ch); } // \x91\xE3\x93\xFC\x89\x89\x8EZ\x8Eq\x81B @@ -353,7 +347,7 @@ // source \x95ύX\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x91\xE3\x93\xFC\x8C\x8B\x89ʁB - StringBuffer& operator=(const char* source) { + StringBuffer& operator=(const TCHAR* source) { return set(source); } // \x98A\x8C\x8B\x91\xE3\x93\xFC\x89\x89\x8EZ\x8Eq\x81B @@ -362,7 +356,7 @@ // ch \x92lj\xC1\x82\xB7\x82镶\x8E\x9A\x81B // \x95Ԓl: // \x91\xE3\x93\xFC\x8C\x8B\x89ʁB - StringBuffer& operator+=(char ch) { + StringBuffer& operator+=(TCHAR ch) { return append(ch); } // \x98A\x8C\x8B\x91\xE3\x93\xFC\x89\x89\x8EZ\x8Eq\x81B @@ -371,7 +365,7 @@ // source \x92lj\xC1\x82\xB7\x82镶\x8E\x9A\x97\xF1\x81B // \x95Ԓl: // \x91\xE3\x93\xFC\x8C\x8B\x89ʁB - StringBuffer& operator+=(const char* source) { + StringBuffer& operator+=(const TCHAR* source) { return append(source); } }; Modified: branches/cmake/TTProxy/YCL/include/YCL/StringUtil.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/StringUtil.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/StringUtil.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -18,7 +18,7 @@ class StringUtil { private: - static int hexadecimal(char c) { + static int hexadecimal(TCHAR c) { if ('0' <= c && c <= '9') { return c - '0'; }else if ('A' <= c && c <= 'F') { @@ -29,15 +29,15 @@ return -1; } } - static int octet(char c) { + static int octet(TCHAR c) { return '0' <= c && c <= '7' ? c - '0' : -1; } - static const char* ESCAPE_CHARS() { - static const char string[] = "abfnrtv"; + static const TCHAR* ESCAPE_CHARS() { + static const TCHAR string[] = _T("abfnrtv"); return string; } - static const char* CONTROL_CHARS() { - static const char string[] = "\a\b\f\n\r\t\v"; + static const TCHAR* CONTROL_CHARS() { + static const TCHAR string[] = _T("\a\b\f\n\r\t\v"); return string; } public: @@ -60,12 +60,12 @@ static bool escape(StringBuffer& buffer, String string, int offset, int length) { if (string == NULL) return false; - const char* start = string; + const TCHAR* start = string; start += offset; - const char* p = start; - const char* end = start + length; + const TCHAR* p = start; + const TCHAR* end = start + length; while (p < end && *p != '\0') { - char ch = *p; + TCHAR ch = *p; if ('\0' < ch && ch < ' ' || ch == '\'' || ch == '"' || ch == '?' || ch == '\\') { bool useOctet; if (ch < ' ') { @@ -95,12 +95,14 @@ } start = ++p; }else{ +#if !defined(UNICODE) if (String::isLeadByte(ch)) p++; +#endif p++; } } - if (start == (const char*) string) { + if (start == (const TCHAR*) string) { return false; } buffer.append(start); @@ -126,10 +128,10 @@ static bool unescape(StringBuffer& buffer, String string, int offset, int length) { if (string == NULL) return false; - const char* start = string; + const TCHAR* start = string; start += offset; - const char* p = start; - const char* end = start + length; + const TCHAR* p = start; + const TCHAR* end = start + length; while (p < end && *p != '\0') { if (*p == '\\') { if (p > start) { @@ -136,7 +138,7 @@ buffer.append(start, p - start); start = p; } - char ch = '\0'; + TCHAR ch = '\0'; switch (*++p) { case '\'': case '"': @@ -188,13 +190,15 @@ start = p; } }else{ +#if !defined(UNICODE) if (String::isLeadByte(*p)) { p++; } +#endif p++; } } - if (start == (const char*) string) { + if (start == (const TCHAR*) string) { return false; } buffer.append(start); Modified: branches/cmake/TTProxy/YCL/include/YCL/Window.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/Window.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/Window.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -10,8 +10,8 @@ #endif // _MSC_VER >= 1000 #include <YCL/common.h> - #include <YCL/String.h> +//#include "codeconv.h" namespace yebisuya { @@ -39,16 +39,16 @@ int GetWindowTextLength()const { return ::GetWindowTextLength(window); } - int GetWindowText(char* buffer, int size)const { + int GetWindowText(TCHAR* buffer, int size)const { return ::GetWindowText(window, buffer, size); } String GetWindowText()const { int length = GetWindowTextLength(); - char* buffer = (char*) alloca(length + 1); + TCHAR* buffer = (TCHAR*) alloca((length + 1) * sizeof(TCHAR)); GetWindowText(buffer, length + 1); - return buffer; + return String(buffer); } - bool SetWindowText(const char* text) { + bool SetWindowText(const TCHAR* text) { return ::SetWindowText(window, text) != FALSE; } long SendMessage(int message, int wparam = 0, long lparam = 0)const { @@ -208,7 +208,7 @@ static const char USER32[] = "user32.dll"; static const char APINAME[] = "SetLayeredWindowAttributes"; static DWORD (WINAPI* api)(HWND, DWORD, BYTE, DWORD) - = (DWORD (WINAPI*)(HWND, DWORD, BYTE, DWORD)) ::GetProcAddress(::GetModuleHandle(USER32), APINAME); + = (DWORD (WINAPI*)(HWND, DWORD, BYTE, DWORD)) ::GetProcAddress(::GetModuleHandleA(USER32), APINAME); return api != NULL ? (*api)(window, reserved, parameters, attribute) : 0; } long SetLayeredWindowAttributes(int parameters, long attribute) { @@ -226,10 +226,10 @@ bool UnregisterHotKey(int id) { return ::UnregisterHotKey(window, id) != FALSE; } - int MessageBox(const char* message, const char* caption, int type) { + int MessageBox(const TCHAR* message, const TCHAR* caption, int type) { return ::MessageBox(window, message, caption, type); } - int MessageBox(const char* message, int type) { + int MessageBox(const TCHAR* message, int type) { Window top(window); while ((top.getStyle() & WS_CHILD) != 0) { top <<= top.GetParent(); @@ -247,7 +247,7 @@ return create(exStyle, classname, title, style, rect, parent, menu, GetInstanceHandle(), param); } bool create(long exStyle, const char* classname, const char* title, long style, const RECT& rect, HWND parent, HMENU menu, HINSTANCE instance, void* param = NULL) { - return (window = ::CreateWindowEx(exStyle, classname, title, + return (window = ::CreateWindowExA(exStyle, classname, title, style, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, parent, menu, instance, param)) != NULL; } Modified: branches/cmake/TTProxy/YCL/include/YCL/common.h =================================================================== --- branches/cmake/TTProxy/YCL/include/YCL/common.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/TTProxy/YCL/include/YCL/common.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -38,9 +38,9 @@ char buffer[1025]; va_list arglist; va_start(arglist, format); - wvsprintf(buffer, format, arglist); + wvsprintfA(buffer, format, arglist); va_end(arglist); - OutputDebugString(buffer); + OutputDebugStringA(buffer); } #define YCLTRACE(s) OutputDebugString(s) @@ -53,12 +53,12 @@ inline bool YclAssert(bool condition, const char* message) { if (!condition) { char buffer[1025]; - wsprintf(buffer, "Assertion Failed!!\n\n" + wsprintfA(buffer, "Assertion Failed!!\n\n" " %s\n\n" "if ABORT button pushed then exit this program,\n" "if RETRY button pushed then enter debug mode,\n" "and if IGNORE button pushed then continue program.", message); - switch (MessageBox(NULL, buffer, "YEBISUYA Class Library", MB_ABORTRETRYIGNORE | MB_ICONWARNING)) { + switch (MessageBoxA(NULL, buffer, "YEBISUYA Class Library", MB_ABORTRETRYIGNORE | MB_ICONWARNING)) { case IDABORT: ExitProcess(-1); break; Modified: branches/cmake/teraterm/common/codeconv.cpp =================================================================== --- branches/cmake/teraterm/common/codeconv.cpp 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/teraterm/common/codeconv.cpp 2018-12-14 15:41:26 UTC (rev 7327) @@ -148,3 +148,271 @@ return strU8; } +////////////////////////////////////////////////////////////////////////////// + +u8::u8() +{ + u8str_ = NULL; +} + +u8::u8(const char *astr) +{ + u8str_ = NULL; + assign(astr, CP_ACP); +} + +u8::u8(const char *astr, int cpage) +{ + u8str_ = NULL; + assign(astr, cpage); +} + +u8::u8(const wchar_t *wstr) +{ + u8str_ = NULL; + assign(wstr); +} + +u8::u8(const u8 &obj) +{ + copy(obj); +} + +#if defined(MOVE_CONSTRUCTOR_ENABLE) +u8::u8(u8 &&obj) noexcept +{ + move(obj); +} +#endif + +u8::~u8() +{ + if (u8str_ != NULL) { + free(u8str_); + u8str_ = NULL; + } +} + +u8& u8::operator=(const char *astr) +{ + assign(astr, CP_ACP); + return *this; +} + +u8& u8::operator=(const wchar_t *wstr) +{ + assign(wstr); + return *this; +} + +u8& u8::operator=(const u8 &obj) +{ + copy(obj); + return *this; +} + +#if defined(MOVE_CONSTRUCTOR_ENABLE) +u8& u8::operator=(u8 &&obj) noexcept +{ + move(obj); + return *this; +} +#endif + +u8::operator const char *() const +{ + return cstr(); +} + +const char *u8::cstr() const +{ + if (u8str_ == NULL) { + return ""; + } + return u8str_; +} + +void u8::assign(const char *astr, int code_page) +{ + if (u8str_ != NULL) { + free(u8str_); + } + wchar_t *wstr = _MultiByteToWideChar(astr, 0, code_page, NULL); + if (wstr != NULL) { + assign(wstr); + free(wstr); + } else { + u8str_ = NULL; + } +} + +void u8::assign(const wchar_t *wstr) +{ + if (u8str_ != NULL) { + free(u8str_); + } + char *u8str = _WideCharToMultiByte(wstr, 0, CP_UTF8, NULL); + if (u8str != NULL) { + u8str_ = u8str; + } else { + u8str_ = NULL; + } +} + +void u8::copy(const u8 &obj) +{ + if (u8str_ != NULL) { + free(u8str_); + } + u8str_ = _strdup(obj.u8str_); +} + +void u8::move(u8 &obj) +{ + if (this != &obj) { + if (u8str_ != NULL) { + free(u8str_); + } + u8str_ = obj.u8str_; + obj.u8str_ = NULL; + } +} + +////////////////////////////////////////////////////////////////////////////// + +tc::tc() +{ + tstr_ = NULL; +} + +tc::tc(const char *astr) +{ + tstr_ = NULL; + assign(astr, CP_ACP); +} + +tc::tc(const char *astr, int code_page) +{ + tstr_ = NULL; + assign(astr, code_page); +} + +tc::tc(const wchar_t *wstr) +{ + tstr_ = NULL; + assign(wstr, CP_ACP); +} + +tc::tc(const wchar_t *wstr, int code_page) +{ + tstr_ = NULL; + assign(wstr, code_page); +} + +#if defined(MOVE_CONSTRUCTOR_ENABLE) +tc::tc(tc &&obj) noexcept +{ + move(obj); +} +#endif + +tc::~tc() +{ + if (tstr_ != NULL) { + free(tstr_); + } +} + +tc& tc::operator=(const char *astr) +{ + assign(astr, CP_ACP); + return *this; +} + +tc& tc::operator=(const wchar_t *wstr) +{ + assign(wstr, CP_ACP); + return *this; +} + +const TCHAR *tc::fromUtf8(const char *u8str) +{ + if (tstr_ != NULL) { + free(tstr_); + } + tstr_ = NULL; + wchar_t *wstr = _MultiByteToWideChar(u8str, 0, CP_UTF8, NULL); + if (wstr != NULL) { + assign(wstr, CP_ACP); + free(wstr); + } + return cstr(); +} + +tc::operator const TCHAR *() const +{ + return cstr(); +} + +const TCHAR *tc::cstr() const +{ + if (tstr_ == NULL) { + return _T(""); + } + return tstr_; +} + +void tc::assign(const char *astr, int code_page) +{ + if (tstr_ != NULL) { + free(tstr_); + } +#if !defined(UNICODE) + (void)code_page; + tstr_ = _strdup(astr); +#else + wchar_t *wstr = _MultiByteToWideChar(astr, 0, code_page, NULL); + if (wstr != NULL) { + tstr_ = wstr; + } else { + tstr_ = NULL; + } +#endif +} + +void tc::assign(const wchar_t *wstr, int code_page) +{ + if (tstr_ != NULL) { + free(tstr_); + } +#if defined(UNICODE) + (void)code_page; + tstr_ = _wcsdup(wstr); +#else + char *astr = _WideCharToMultiByte(wstr, 0, code_page, NULL); + if (astr != NULL) { + tstr_ = astr; + } else { + tstr_ = NULL; + } +#endif +} + +void tc::copy(const tc &obj) +{ + if (tstr_ != NULL) { + free(tstr_); + } + tstr_ = _tcsdup(obj.tstr_); +} + +void tc::move(tc &obj) +{ + if (this != &obj) { + if (tstr_ != NULL) { + free(tstr_); + } + tstr_ = obj.tstr_; + obj.tstr_ = NULL; + } +} Modified: branches/cmake/teraterm/common/codeconv.h =================================================================== --- branches/cmake/teraterm/common/codeconv.h 2018-12-14 15:41:11 UTC (rev 7326) +++ branches/cmake/teraterm/common/codeconv.h 2018-12-14 15:41:26 UTC (rev 7327) @@ -1,4 +1,6 @@ +#pragma once + #include <tchar.h> #ifdef __cplusplus @@ -33,3 +35,70 @@ TCHAR *ToTchar(const wchar_t *strW); #endif + +#ifdef __cplusplus + +#if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER > 1910)) +#define MOVE_CONSTRUCTOR_ENABLE +#endif + +class u8 +{ +public: + u8(); + u8(const char *astr); + u8(const char *astr, int code_page); + u8(const wchar_t *wstr); + u8(const u8 &obj); +#if defined(MOVE_CONSTRUCTOR_ENABLE) + u8(u8 &&obj) noexcept; +#endif + ~u8(); + u8& operator=(const char *astr); + u8& operator=(const wchar_t *wstr); + u8& operator=(const u8 &obj); +#if defined(MOVE_CONSTRUCTOR_ENABLE) + u8& operator=(u8 &&obj) noexcept; +#endif + operator const char *() const; + const char *cstr() const; +private: + char *u8str_; + void assign(const char *astr, int code_page); + void assign(const wchar_t *wstr); + void copy(const u8 &obj); + void move(u8 &obj); +}; + +class tc +{ +public: + tc(); + tc(const char *astr); + tc(const char *astr, int code_page); + tc(const wchar_t *wstr); + tc(const wchar_t *wstr, int code_page); + tc(const tc &obj); +#if defined(MOVE_CONSTRUCTOR_ENABLE) + tc(tc &&obj) noexcept; +#endif + ~tc(); + tc& operator=(const char *astr); + tc& operator=(const wchar_t *wstr); + tc& operator=(const tc &obj); +#if defined(MOVE_CONSTRUCTOR_ENABLE) + tc& operator=(tc &&obj) noexcept; +#endif + const TCHAR *fromUtf8(const char *u8str); + operator const TCHAR *() const; + const TCHAR *cstr() const; +private: + TCHAR *tstr_; + void assign(const char *astr, int code_page); + void assign(const wchar_t *astr, int code_page); + void copy(const tc &obj); + void move(tc &obj); +}; +#endif + +