wxChar* CControlSocket::ConvToLocalBuffer(const char* buffer) { if (m_useUTF8) { wxChar* res = ConvToLocalBuffer(buffer, wxConvUTF8); if (res && *res) return res; // Fall back to local charset on error if (m_pCurrentServer->GetEncodingType() != ENCODING_UTF8) { LogMessage(MessageType::Status, _("Invalid character sequence received, disabling UTF-8. Select UTF-8 option in site manager to force UTF-8.")); m_useUTF8 = false; } } if (m_pCSConv) { wxChar* res = ConvToLocalBuffer(buffer, *m_pCSConv); if (res && *res) return res; } // Fallback: Conversion using current locale wxChar* res = ConvToLocalBuffer(buffer, *wxConvCurrent); return res; }
wxString CControlSocket::ConvToLocal(const char* buffer, size_t len) { size_t outLen{}; if (m_useUTF8) { wxChar* out = ConvToLocalBuffer(buffer, wxConvUTF8, len, outLen); if (out) { wxString str(out, outLen - 1); delete [] out; return str; } // Fall back to local charset on error if (m_pCurrentServer->GetEncodingType() != ENCODING_UTF8) { LogMessage(MessageType::Status, _("Invalid character sequence received, disabling UTF-8. Select UTF-8 option in site manager to force UTF-8.")); m_useUTF8 = false; } } if (m_pCSConv) { wxChar* out = ConvToLocalBuffer(buffer, *m_pCSConv, len, outLen); if (out) { wxString str(out, outLen - 1); delete [] out; return str; } } wxCSConv conv(_T("ISO-8859-1")); wxString str = conv.cMB2WX(buffer); if (str.empty()) str = wxConvCurrent->cMB2WX(buffer); return str; }
wxChar* CControlSocket::ConvToLocalBuffer(const char* buffer) { if (m_useUTF8) { wxChar* res = ConvToLocalBuffer(buffer, wxConvUTF8); if (res && *res) return res; // Fall back to local charset on error if (m_pCurrentServer->GetEncodingType() != ENCODING_UTF8) { LogMessage(Status, _("Invalid character sequence received, disabling UTF-8. Select UTF-8 option in site manager to force UTF-8.")); m_useUTF8 = false; } } if (m_pCSConv) { wxChar* res = ConvToLocalBuffer(buffer, *m_pCSConv); if (res && *res) return res; } // Fallback: Conversion using current locale #if wxUSE_UNICODE wxChar* res = ConvToLocalBuffer(buffer, *wxConvCurrent); #else // No conversion needed, just copy wxChar* res = new wxChar[strlen(buffer) + 1]; strcpy(res, buffer); #endif return res; }
wxChar* CControlSocket::ConvToLocalBuffer(const char* buffer, size_t len, size_t& outlen) { if (m_useUTF8) { #ifdef __WXMSW__ // wxConvUTF8 is generic and slow. // Use the highly optimized MultiByteToWideChar on Windows // This helps when processing large directory listings. int outlen2 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, buffer, len, 0, 0); if (outlen2 > 0) { wxChar* out = new wxChar[outlen2]; MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, buffer, len, out, outlen2); outlen = static_cast<size_t>(outlen2); return out; } #else wxChar* res = ConvToLocalBuffer(buffer, wxConvUTF8, len, outlen); if (res && *res) return res; #endif // Fall back to local charset on error if (m_pCurrentServer->GetEncodingType() != ENCODING_UTF8) { LogMessage(MessageType::Status, _("Invalid character sequence received, disabling UTF-8. Select UTF-8 option in site manager to force UTF-8.")); m_useUTF8 = false; } } if (m_pCSConv) { wxChar* res = ConvToLocalBuffer(buffer, *m_pCSConv, len, outlen); if (res && *res) return res; } // Fallback: Conversion using current locale wxChar* res = ConvToLocalBuffer(buffer, *wxConvCurrent, len, outlen); return res; }