wxMacUniCharBuffer::wxMacUniCharBuffer( const wxString &str ) { m_chars = str.length() ; m_ubuf = NULL ; #if SIZEOF_WCHAR_T == 4 wxMBConvUTF16 converter ; #if wxUSE_UNICODE size_t unicharlen = converter.WC2MB( NULL , str.wc_str() , 0 ) ; m_ubuf = (UniChar*) malloc( unicharlen + 2 ) ; converter.WC2MB( (char*) m_ubuf , str.wc_str(), unicharlen + 2 ) ; #else const wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ; size_t unicharlen = converter.WC2MB( NULL , wchar.data() , 0 ) ; m_ubuf = (UniChar*) malloc( unicharlen + 2 ) ; converter.WC2MB( (char*) m_ubuf , wchar.data() , unicharlen + 2 ) ; #endif m_chars = unicharlen / 2 ; #else // SIZEOF_WCHAR_T is then 2 #if wxUSE_UNICODE m_ubuf = malloc( m_chars * 2 + 2 ) ; memcpy( m_ubuf , (UniChar*) str.wc_str() , m_chars * 2 + 2 ) ; #else wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ; m_chars = wxWcslen( wchar.data() ) ; m_ubuf = malloc( m_chars * 2 + 2 ) ; memcpy( m_ubuf , (UniChar*) wchar.data() , m_chars * 2 + 2 ) ; #endif #endif }
wxMacUniCharBuffer::wxMacUniCharBuffer( const wxString &str ) { wxMBConvUTF16 converter ; #if wxUSE_UNICODE size_t unicharlen = converter.WC2MB( NULL , str.wc_str() , 0 ) ; m_ubuf = (UniChar*) malloc( unicharlen + 2 ) ; converter.WC2MB( (char*) m_ubuf , str.wc_str(), unicharlen + 2 ) ; #else const wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ; size_t unicharlen = converter.WC2MB( NULL , wchar.data() , 0 ) ; m_ubuf = (UniChar*) malloc( unicharlen + 2 ) ; converter.WC2MB( (char*) m_ubuf , wchar.data() , unicharlen + 2 ) ; #endif m_chars = unicharlen / 2 ; }
size_t ConvertFromUTF8(const wxCharBuffer& utf8_buff, const wxMBConv& conv, wxWCharBuffer& wchar_buff, size_t& wchar_buff_len, wxCharBuffer& dest_buff, size_t& dest_buff_len, size_t char_len) { // static // Calculate length of conversion to widechar size_t wchar_len = wxConvUTF8.MB2WC(NULL, utf8_buff, 0); if (wchar_len == (size_t)-1) return (size_t)-1; // invalid conversion // Extend widechar buffer if needed if (wchar_buff_len < wchar_len + sizeof(wxChar)) { wchar_buff_len = wchar_len + sizeof(wxChar); wchar_buff = wxWCharBuffer(wchar_buff_len); } // Convert to widechar wchar_len = wxConvUTF8.MB2WC(wchar_buff.data(), utf8_buff, wchar_buff_len); if (wchar_len == (size_t)-1) return (size_t)-1; // invalid conversion // Calculate length of conversion to dest encoding size_t dest_len = conv.WC2MB(NULL, wchar_buff, 0); if (dest_len == (size_t)-1) return (size_t)-1; // invalid conversion // Extend dest buffer if needed if (dest_buff_len < dest_len + char_len) { dest_buff_len = dest_len + char_len; dest_buff = wxCharBuffer(dest_buff_len); } // Convert to dest encoding dest_len = conv.WC2MB(dest_buff.data(), wchar_buff, dest_buff_len); if (dest_len == (size_t)-1) return (size_t)-1; // invalid conversion return dest_len; }
static BOOL CALLBACK wxEnumSymbolsCallback(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext) { wxEnumSymbolsCallbackBridge& bridge = *static_cast<wxEnumSymbolsCallbackBridge*>(UserContext); const wxWCharBuffer buf = wxConvLocal.cMB2WC(pSymInfo->Name); const size_t len = buf.length(); // Allocate enough space for the wide char version of the struct. // // Note that there is no +1 here because sizeof(SYMBOL_INFOW) already // includes 1 byte of the name. wxScopedArray<BYTE> symbolBuffer(sizeof(SYMBOL_INFOW) + len*sizeof(WCHAR)); SYMBOL_INFOW* const infoW = (SYMBOL_INFOW*)symbolBuffer.get(); // Copy the original struct contents except for the last byte, which is the // first byte of its (narrow) name that we don't need. CopyMemory(infoW, pSymInfo, sizeof(SYMBOL_INFO) - sizeof(CHAR)); // Size is different for narrow and wide variants of the struct, so fix it // up now. infoW->SizeOfStruct = sizeof(SYMBOL_INFOW); // Finally copy the converted name, which is the reason for doing all this. wxStrncpy(infoW->Name, buf.data(), len); return (*bridge.m_callback)(infoW, SymbolSize, bridge.m_data); }
wxString CControlSocket::ConvertDomainName(wxString domain) { const wxWCharBuffer buffer = wxConvCurrent->cWX2WC(domain); int len = 0; while (buffer.data()[len]) len++; char *utf8 = new char[len * 2 + 2]; wxMBConvUTF8 conv; conv.WC2MB(utf8, buffer, len * 2 + 2); char *output; if (idna_to_ascii_8z(utf8, &output, IDNA_ALLOW_UNASSIGNED)) { delete [] utf8; LogMessage(::Debug_Warning, _T("Could not convert domain name")); return domain; } delete [] utf8; wxString result = wxConvCurrent->cMB2WX(output); free(output); return result; }
WXDLLIMPEXP_BASE wchar_t* wxCRT_GetenvW(const wchar_t *name) { // NB: buffer returned by getenv() is allowed to be overwritten next // time getenv() is called, so it is OK to use static string // buffer to hold the data. static wxWCharBuffer value; value = wxConvLibc.cMB2WC(getenv(wxConvLibc.cWC2MB(name))); return value.data(); }
size_t ConvertToUTF8(const char* source, const size_t source_len, const wxMBConv& conv, wxCharBuffer& temp_buff, size_t& temp_buff_len, wxWCharBuffer& wchar_buff, size_t& wchar_buff_len, wxCharBuffer& utf8_buff, size_t& utf8_buff_len, size_t char_len) { // static // We have to copy the source string to a temporary buffer so that we can // make it null terminated. if (temp_buff_len < source_len+char_len) { temp_buff_len = source_len+char_len; temp_buff = wxCharBuffer(temp_buff_len); } memcpy(temp_buff.data(), source, source_len); for (unsigned int i = 0; i < char_len; ++i) temp_buff.data()[source_len+i] = '\0'; // Calculate length of conversion to widechar size_t wchar_len = conv.MB2WC(NULL, temp_buff, 0); if (wchar_len == (size_t)-1) return (size_t)-1; // invalid conversion // Extend widechar buffer if needed if (wchar_buff_len < wchar_len + sizeof(wxChar)) { wchar_buff_len = wchar_len + sizeof(wxChar); wchar_buff = wxWCharBuffer(wchar_buff_len); } // Convert to widechar wchar_len = conv.MB2WC(wchar_buff.data(), temp_buff, wchar_buff_len); if (wchar_len == (size_t)-1) return (size_t)-1; // invalid conversion // Calculate length of conversion to UTF-8 size_t utf8_len = wxConvUTF8.WC2MB(NULL, wchar_buff, 0); if (utf8_len == (size_t)-1) return (size_t)-1; // invalid conversion // Extend UTF-8 buffer if needed if (utf8_buff_len < utf8_len) { utf8_buff_len = utf8_len + 1; utf8_buff = wxCharBuffer(utf8_buff_len); } // Convert to UTF-8 utf8_len = wxConvUTF8.WC2MB(utf8_buff.data(), wchar_buff, utf8_buff_len); if (utf8_len == (size_t)-1) return (size_t)-1; // invalid conversion return utf8_len; }