X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a4ea2d8dbbba4c352ccf56645fdd90c219664dcf..ce7208d49d5ce2ca1dc0b3b83f14f1d04f29c4bf:/src/mac/corefoundation/cfstring.cpp diff --git a/src/mac/corefoundation/cfstring.cpp b/src/mac/corefoundation/cfstring.cpp index 73430139db..8cfdec84b8 100644 --- a/src/mac/corefoundation/cfstring.cpp +++ b/src/mac/corefoundation/cfstring.cpp @@ -10,15 +10,16 @@ ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" + #ifndef WX_PRECOMP #include "wx/string.h" #include "wx/intl.h" + #if wxUSE_GUI + #include "wx/font.h" + #endif #endif -#include "wx/mac/corefoundation/cfstring.h" -#if wxUSE_GUI - #include "wx/font.h" -#endif +#include "wx/mac/corefoundation/cfstring.h" #ifdef __DARWIN__ #include @@ -104,9 +105,10 @@ wxUint32 wxMacGetSystemEncFromFontEnc(wxFontEncoding encoding) #if wxUSE_GUI encoding = wxFont::GetDefaultEncoding() ; #else - encoding = wxLocale::GetSystemEncoding() ; + encoding = wxFONTENCODING_SYSTEM; // to be set below #endif } + if ( encoding == wxFONTENCODING_SYSTEM ) { enc = CFStringGetSystemEncoding(); @@ -633,34 +635,42 @@ wxFontEncoding wxMacGetFontEncFromSystemEnc(wxUint32 encoding) // converts this string into a carbon foundation string with optional pc 2 mac encoding void wxMacCFStringHolder::Assign( const wxString &st , wxFontEncoding encoding ) { - Release() ; + Release() ; if (st.IsEmpty()) - return ; - - wxString str = st ; - wxMacConvertNewlines13To10( &str ) ; + { + m_cfs = CFSTR("") ; + CFRetain( m_cfs ) ; + } + else + { + wxString str = st ; + wxMacConvertNewlines13To10( &str ) ; #if wxUSE_UNICODE #if SIZEOF_WCHAR_T == 2 - m_cfs = CFStringCreateWithCharacters( kCFAllocatorDefault, - (UniChar*)str.wc_str() , str.Len() ); + m_cfs = CFStringCreateWithCharacters( kCFAllocatorDefault, + (UniChar*)str.wc_str() , str.Len() ); #else - wxMBConvUTF16BE converter ; - size_t unicharlen = converter.WC2MB( NULL , str.wc_str() , 0 ) ; - UniChar *unibuf = new UniChar[ unicharlen / sizeof(UniChar) + 1 ] ; - converter.WC2MB( (char*)unibuf , str.wc_str() , unicharlen ) ; - m_cfs = CFStringCreateWithCharacters( kCFAllocatorDefault , - unibuf , unicharlen / sizeof(UniChar) ) ; - delete[] unibuf ; + wxMBConvUTF16 converter ; + size_t unicharlen = converter.WC2MB( NULL , str.wc_str() , 0 ) ; + UniChar *unibuf = new UniChar[ unicharlen / sizeof(UniChar) + 1 ] ; + converter.WC2MB( (char*)unibuf , str.wc_str() , unicharlen ) ; + m_cfs = CFStringCreateWithCharacters( kCFAllocatorDefault , + unibuf , unicharlen / sizeof(UniChar) ) ; + delete[] unibuf ; #endif #else // not wxUSE_UNICODE - m_cfs = CFStringCreateWithCString( kCFAllocatorSystemDefault , str.c_str() , - wxMacGetSystemEncFromFontEnc( encoding ) ) ; + m_cfs = CFStringCreateWithCString( kCFAllocatorSystemDefault , str.c_str() , + wxMacGetSystemEncFromFontEnc( encoding ) ) ; #endif + } m_release = true ; } wxString wxMacCFStringHolder::AsString(wxFontEncoding encoding) { + if ( m_cfs == NULL ) + return wxEmptyString ; + Size cflen = CFStringGetLength( m_cfs ) ; size_t noChars ; wxChar* buf = NULL ; @@ -674,10 +684,12 @@ wxString wxMacCFStringHolder::AsString(wxFontEncoding encoding) UniChar* unibuf = new UniChar[ cflen + 1 ] ; CFStringGetCharacters( m_cfs , CFRangeMake( 0 , cflen ) , (UniChar*) unibuf ) ; unibuf[cflen] = 0 ; - wxMBConvUTF16BE converter ; + wxMBConvUTF16 converter ; noChars = converter.MB2WC( NULL , (const char*)unibuf , 0 ) ; + wxASSERT_MSG( noChars != wxCONV_FAILED, _T("Unable to count the number of characters in this string!") ); buf = new wxChar[ noChars + 1 ] ; - converter.MB2WC( buf , (const char*)unibuf , noChars ) ; + noChars = converter.MB2WC( buf , (const char*)unibuf , noChars + 1 ) ; + wxASSERT_MSG( noChars != wxCONV_FAILED, _T("Conversion of string failed!") ); delete[] unibuf ; #endif #else @@ -697,3 +709,49 @@ wxString wxMacCFStringHolder::AsString(wxFontEncoding encoding) return result ; } + +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() +{ + free( m_ubuf ) ; +} + +UniCharArrayPtr wxMacUniCharBuffer::GetBuffer() +{ + return m_ubuf ; +} + +UniCharCount wxMacUniCharBuffer::GetChars() +{ + return m_chars ; +}