// RCS-ID: $Id$
// Copyright: (c) Stefan Csomor
// Licence: wxWindows licence
+// Usage: Darwin (base library)
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
#include "wx/mac/corefoundation/cfstring.h"
-#ifdef __DARWIN__
- #include <CoreServices/CoreServices.h>
-#else
- #include <TextCommon.h>
-#endif
+#include <CoreServices/CoreServices.h>
void wxMacConvertNewlines13To10( char * data )
{
//
-// 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
{
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 ) ;
#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
return result ;
}
+//
+// wxMacUniCharBuffer
+//
wxMacUniCharBuffer::wxMacUniCharBuffer( const wxString &str )
{