/////////////////////////////////////////////////////////////////////////////
-// Name: src/osx/corefoundation/cfstring.cpp
+// Name: src/osx/core/cfstring.cpp
// Purpose: wxCFStringHolder and other string functions
// Author: Stefan Csomor
// Modified by:
#include <CoreFoundation/CoreFoundation.h>
+
void wxMacConvertNewlines13To10( char * data )
{
char * buf = data ;
#if 0
case wxFONTENCODING_UTF7 :
enc = CreateTextEncoding(kCFStringEncodingUnicodeDefault,0,kUnicodeUTF7Format) ;
-#endif
break ;
+#endif
case wxFONTENCODING_UTF8 :
enc = kCFStringEncodingUTF8;
break ;
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 ) ) );
}
}
-wxString wxCFStringRef::AsString(wxFontEncoding WXUNUSED_IN_UNICODE(encoding))
+wxString wxCFStringRef::AsStringWithNormalizationFormC( CFStringRef ref, wxFontEncoding encoding )
+{
+ if ( !ref )
+ return wxEmptyString ;
+
+ CFMutableStringRef cfMutableString = CFStringCreateMutableCopy(NULL, 0, ref);
+ CFStringNormalize(cfMutableString,kCFStringNormalizationFormC);
+ wxString str = wxCFStringRef::AsString(ref,encoding);
+ CFRelease(cfMutableString);
+ return str;
+}
+
+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 ) ;
+ CFStringEncoding cfencoding;
+ 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 ) ,
+ char* 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 );
+}
+
+wxString wxCFStringRef::AsStringWithNormalizationFormC( NSString* ref, wxFontEncoding encoding )
+{
+ return AsStringWithNormalizationFormC( (CFStringRef) ref, encoding );
+}
+#endif // wxOSX_USE_COCOA_OR_IPHONE
+
+
//
// wxMacUniCharBuffer
//
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 ) ;
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 ) ;
}
-UniCharPtr wxMacUniCharBuffer::GetBuffer()
+UniCharPtr wxMacUniCharBuffer::GetBuffer()
{
return m_ubuf ;
}
-
+
UniCharCount wxMacUniCharBuffer::GetChars()
{
return m_chars ;