X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/afc605b2bebec2f890e84fcc6f6da5ca4e425806..427ad6e188603c328e9740c74c0531765ad7733a:/src/mac/corefoundation/cfstring.cpp diff --git a/src/mac/corefoundation/cfstring.cpp b/src/mac/corefoundation/cfstring.cpp index 95a2c7a042..dbe52f6e57 100644 --- a/src/mac/corefoundation/cfstring.cpp +++ b/src/mac/corefoundation/cfstring.cpp @@ -22,11 +22,7 @@ #include "wx/mac/corefoundation/cfstring.h" -#ifdef __DARWIN__ - #include -#else - #include -#endif +#include void wxMacConvertNewlines13To10( char * data ) { @@ -593,17 +589,16 @@ wxFontEncoding wxMacGetFontEncFromSystemEnc(wxUint32 encoding) // -// CFStringRefs (Carbon only) +// CFStringRefs // -// converts this string into a carbon foundation string with optional pc 2 mac encoding -void wxMacCFStringHolder::Assign( const wxString &st , wxFontEncoding WXUNUSED_IN_UNICODE(encoding) ) +// converts this string into a core foundation string with optional pc 2 mac encoding + +wxCFStringRef::wxCFStringRef( const wxString &st , wxFontEncoding WXUNUSED_IN_UNICODE(encoding) ) { - Release() ; if (st.IsEmpty()) { - m_cfs = CFSTR("") ; - CFRetain( m_cfs ) ; + reset( wxCFRetain( CFSTR("") ) ); } else { @@ -611,42 +606,52 @@ void wxMacCFStringHolder::Assign( const wxString &st , wxFontEncoding WXUNUSED_I wxMacConvertNewlines13To10( &str ) ; #if wxUSE_UNICODE #if SIZEOF_WCHAR_T == 2 - m_cfs = CFStringCreateWithCharacters( kCFAllocatorDefault, - (UniChar*)str.wc_str() , str.Len() ); + reset( CFStringCreateWithCharacters( kCFAllocatorDefault, + (UniChar*)str.wc_str() , str.Len() ) ); #else 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 ; + size_t unicharbytes = converter.FromWChar( NULL , 0 , str.wc_str() , str.Length() ) ; + wxASSERT( unicharbytes != wxCONV_FAILED ); + if ( unicharbytes == wxCONV_FAILED ) + { + // create an empty string + reset( wxCFRetain( CFSTR("") ) ); + } + else + { + // unicharbytes: number of bytes needed for UTF-16 encoded string (without terminating null) + // unichars: number of UTF-16 characters (without terminating null) + size_t unichars = unicharbytes / sizeof(UniChar) ; + UniChar *unibuf = new UniChar[ unichars ] ; + converter.FromWChar( (char*)unibuf , unicharbytes , str.wc_str() , str.Length() ) ; + reset( CFStringCreateWithCharacters( kCFAllocatorDefault , unibuf , unichars ) ) ; + delete[] unibuf ; + } #endif #else // not wxUSE_UNICODE - m_cfs = CFStringCreateWithCString( kCFAllocatorSystemDefault , str.c_str() , - wxMacGetSystemEncFromFontEnc( encoding ) ) ; + reset( CFStringCreateWithCString( kCFAllocatorSystemDefault , str.c_str() , + wxMacGetSystemEncFromFontEnc( encoding ) ) ); #endif } - m_release = true ; } -wxString wxMacCFStringHolder::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encoding)) +wxString wxCFStringRef::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encoding)) { - if ( m_cfs == NULL ) + if ( !get() ) return wxEmptyString ; - Size cflen = CFStringGetLength( m_cfs ) ; + Size cflen = CFStringGetLength( get() ) ; size_t noChars ; wxChar* buf = NULL ; #if wxUSE_UNICODE #if SIZEOF_WCHAR_T == 2 buf = new wxChar[ cflen + 1 ] ; - CFStringGetCharacters( m_cfs , CFRangeMake( 0 , cflen ) , (UniChar*) buf ) ; + CFStringGetCharacters( get() , CFRangeMake( 0 , cflen ) , (UniChar*) buf ) ; noChars = cflen ; #else UniChar* unibuf = new UniChar[ cflen + 1 ] ; - CFStringGetCharacters( m_cfs , CFRangeMake( 0 , cflen ) , (UniChar*) unibuf ) ; + CFStringGetCharacters( get() , CFRangeMake( 0 , cflen ) , (UniChar*) unibuf ) ; unibuf[cflen] = 0 ; wxMBConvUTF16 converter ; noChars = converter.MB2WC( NULL , (const char*)unibuf , 0 ) ; @@ -658,10 +663,10 @@ wxString wxMacCFStringHolder::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encodi #endif #else CFIndex cStrLen ; - CFStringGetBytes( m_cfs , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) , + CFStringGetBytes( get() , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) , '?' , false , NULL , 0 , &cStrLen ) ; buf = new wxChar[ cStrLen + 1 ] ; - CFStringGetBytes( m_cfs , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) , + CFStringGetBytes( get() , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) , '?' , false , (unsigned char*) buf , cStrLen , &cStrLen) ; noChars = cStrLen ; #endif @@ -673,6 +678,9 @@ wxString wxMacCFStringHolder::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encodi return result ; } +// +// wxMacUniCharBuffer +// wxMacUniCharBuffer::wxMacUniCharBuffer( const wxString &str ) {