X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/489468feaa08b8f504735eecca522fb8d0f825d2..aa926768a9329b4eb4804c89de8da2061549708d:/src/osx/core/cfstring.cpp diff --git a/src/osx/core/cfstring.cpp b/src/osx/core/cfstring.cpp index 5b1f8ce7e1..46a9c0c8af 100644 --- a/src/osx/core/cfstring.cpp +++ b/src/osx/core/cfstring.cpp @@ -1,9 +1,9 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/mac/corefoundation/cfstring.cpp +// Name: src/osx/corefoundation/cfstring.cpp // Purpose: wxCFStringHolder and other string functions // Author: Stefan Csomor // Modified by: -// Created: 2004-10-29 (from code in src/mac/carbon/utils.cpp) +// Created: 2004-10-29 (from code in src/osx/carbon/utils.cpp) // RCS-ID: $Id$ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence @@ -20,10 +20,11 @@ #endif #endif -#include "wx/mac/corefoundation/cfstring.h" +#include "wx/osx/core/cfstring.h" #include + void wxMacConvertNewlines13To10( char * data ) { char * buf = data ; @@ -608,29 +609,22 @@ wxCFStringRef::wxCFStringRef( const wxString &st , wxFontEncoding WXUNUSED_IN_UN wxString str = st ; wxMacConvertNewlines13To10( &str ) ; #if wxUSE_UNICODE -#if SIZEOF_WCHAR_T == 2 - reset( CFStringCreateWithCharacters( kCFAllocatorDefault, - (UniChar*)str.wc_str() , str.Len() ) ); +#if wxUSE_UNICODE_WCHAR + // native = wchar_t 4 bytes for us + const wchar_t * const data = str.wc_str(); + const size_t size = str.length()*sizeof(wchar_t); + CFStringBuiltInEncodings cfencoding = kCFStringEncodingUTF32Native; +#elif wxUSE_UNICODE_UTF8 + // native = utf8 + const char * const data = str.utf8_str(); + const size_t size = str.utf8_length(); + CFStringBuiltInEncodings cfencoding = kCFStringEncodingUTF8; #else - wxMBConvUTF16 converter ; - 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 ; - } + #error "unsupported Unicode representation" #endif + + reset( CFStringCreateWithBytes( kCFAllocatorDefault, + (const UInt8*)data, size, cfencoding, false /* no BOM */ ) ); #else // not wxUSE_UNICODE reset( CFStringCreateWithCString( kCFAllocatorSystemDefault , str.c_str() , wxMacGetSystemEncFromFontEnc( encoding ) ) ); @@ -638,49 +632,65 @@ wxCFStringRef::wxCFStringRef( const wxString &st , wxFontEncoding WXUNUSED_IN_UN } } -wxString wxCFStringRef::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encoding)) +wxString wxCFStringRef::AsString( CFStringRef ref, wxFontEncoding WXUNUSED_IN_UNICODE(encoding) ) { - if ( !get() ) + if ( !ref ) return wxEmptyString ; - Size cflen = CFStringGetLength( get() ) ; - size_t noChars ; - wxChar* buf = NULL ; + Size cflen = CFStringGetLength( ref ) ; + char* buf = NULL ; + CFStringEncoding cfencoding = 0; + wxString result; #if wxUSE_UNICODE -#if SIZEOF_WCHAR_T == 2 - buf = new wxChar[ cflen + 1 ] ; - CFStringGetCharacters( get() , CFRangeMake( 0 , cflen ) , (UniChar*) buf ) ; - noChars = cflen ; + #if wxUSE_UNICODE_WCHAR + cfencoding = kCFStringEncodingUTF32Native; + #elif wxUSE_UNICODE_UTF8 + cfencoding = kCFStringEncodingUTF8; + #else + #error "unsupported unicode representation" + #endif #else - UniChar* unibuf = new UniChar[ cflen + 1 ] ; - CFStringGetCharacters( get() , CFRangeMake( 0 , cflen ) , (UniChar*) unibuf ) ; - unibuf[cflen] = 0 ; - 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 ] ; - noChars = converter.MB2WC( buf , (const char*)unibuf , noChars + 1 ) ; - wxASSERT_MSG( noChars != wxCONV_FAILED, _T("Conversion of string failed!") ); - delete[] unibuf ; + cfencoding = wxMacGetSystemEncFromFontEnc( encoding ); #endif -#else + CFIndex cStrLen ; - CFStringGetBytes( get() , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) , + CFStringGetBytes( ref , CFRangeMake(0, cflen) , cfencoding , '?' , false , NULL , 0 , &cStrLen ) ; - buf = new wxChar[ cStrLen + 1 ] ; - CFStringGetBytes( get() , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) , + buf = new char[ cStrLen ] ; + CFStringGetBytes( ref , CFRangeMake(0, cflen) , cfencoding, '?' , false , (unsigned char*) buf , cStrLen , &cStrLen) ; - noChars = cStrLen ; + +#if wxUSE_UNICODE + #if wxUSE_UNICODE_WCHAR + result = wxString( (const wchar_t*) buf , cStrLen/4); + #elif wxUSE_UNICODE_UTF8 + result = wxString::FromUTF8( buf, cStrLen ); + #else + #error "unsupported unicode representation" + #endif +#else + result = wxString(buf, cStrLen) ; #endif - buf[noChars] = 0 ; - wxString result(buf) ; delete[] buf ; wxMacConvertNewlines10To13( &result); return result ; } +wxString wxCFStringRef::AsString(wxFontEncoding encoding) const +{ + return AsString( get(), encoding ); +} + +#if wxOSX_USE_COCOA_OR_IPHONE +wxString wxCFStringRef::AsString( NSString* ref, wxFontEncoding encoding ) +{ + return AsString( (CFStringRef) ref, encoding ); +} +#endif + + // // wxMacUniCharBuffer // @@ -721,11 +731,11 @@ wxMacUniCharBuffer::~wxMacUniCharBuffer() free( m_ubuf ) ; } -UniCharPtr wxMacUniCharBuffer::GetBuffer() +UniCharPtr wxMacUniCharBuffer::GetBuffer() { return m_ubuf ; } - + UniCharCount wxMacUniCharBuffer::GetChars() { return m_chars ;