1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        wx/osx/core/private/strconv_cf.h 
   3 // Purpose:     Unicode conversion classes 
   4 // Author:      David Elliott, Ryan Norton 
   8 // Copyright:   (c) 2004 Ryan Norton 
   9 //              (c) 2007 David Elliott 
  10 // Licence:     wxWindows licence 
  11 ///////////////////////////////////////////////////////////////////////////// 
  13 #include "wx/strconv.h" 
  15 #include <CoreFoundation/CFString.h> 
  16 #include <CoreFoundation/CFStringEncodingExt.h> 
  18 // ============================================================================ 
  19 // CoreFoundation conversion classes 
  20 // ============================================================================ 
  22 inline CFStringEncoding 
wxCFStringEncFromFontEnc(wxFontEncoding encoding
) 
  24     CFStringEncoding enc 
= kCFStringEncodingInvalidId 
; 
  28         case wxFONTENCODING_DEFAULT 
: 
  29             enc 
= CFStringGetSystemEncoding(); 
  32         case wxFONTENCODING_ISO8859_1 
: 
  33             enc 
= kCFStringEncodingISOLatin1 
; 
  35         case wxFONTENCODING_ISO8859_2 
: 
  36             enc 
= kCFStringEncodingISOLatin2
; 
  38         case wxFONTENCODING_ISO8859_3 
: 
  39             enc 
= kCFStringEncodingISOLatin3 
; 
  41         case wxFONTENCODING_ISO8859_4 
: 
  42             enc 
= kCFStringEncodingISOLatin4
; 
  44         case wxFONTENCODING_ISO8859_5 
: 
  45             enc 
= kCFStringEncodingISOLatinCyrillic
; 
  47         case wxFONTENCODING_ISO8859_6 
: 
  48             enc 
= kCFStringEncodingISOLatinArabic
; 
  50         case wxFONTENCODING_ISO8859_7 
: 
  51             enc 
= kCFStringEncodingISOLatinGreek
; 
  53         case wxFONTENCODING_ISO8859_8 
: 
  54             enc 
= kCFStringEncodingISOLatinHebrew
; 
  56         case wxFONTENCODING_ISO8859_9 
: 
  57             enc 
= kCFStringEncodingISOLatin5
; 
  59         case wxFONTENCODING_ISO8859_10 
: 
  60             enc 
= kCFStringEncodingISOLatin6
; 
  62         case wxFONTENCODING_ISO8859_11 
: 
  63             enc 
= kCFStringEncodingISOLatinThai
; 
  65         case wxFONTENCODING_ISO8859_13 
: 
  66             enc 
= kCFStringEncodingISOLatin7
; 
  68         case wxFONTENCODING_ISO8859_14 
: 
  69             enc 
= kCFStringEncodingISOLatin8
; 
  71         case wxFONTENCODING_ISO8859_15 
: 
  72             enc 
= kCFStringEncodingISOLatin9
; 
  75         case wxFONTENCODING_KOI8 
: 
  76             enc 
= kCFStringEncodingKOI8_R
; 
  78         case wxFONTENCODING_ALTERNATIVE 
: // MS-DOS CP866 
  79             enc 
= kCFStringEncodingDOSRussian
; 
  82 //      case wxFONTENCODING_BULGARIAN : 
  86         case wxFONTENCODING_CP437 
: 
  87             enc 
= kCFStringEncodingDOSLatinUS 
; 
  89         case wxFONTENCODING_CP850 
: 
  90             enc 
= kCFStringEncodingDOSLatin1
; 
  92         case wxFONTENCODING_CP852 
: 
  93             enc 
= kCFStringEncodingDOSLatin2
; 
  95         case wxFONTENCODING_CP855 
: 
  96             enc 
= kCFStringEncodingDOSCyrillic
; 
  98         case wxFONTENCODING_CP866 
: 
  99             enc 
= kCFStringEncodingDOSRussian 
; 
 101         case wxFONTENCODING_CP874 
: 
 102             enc 
= kCFStringEncodingDOSThai
; 
 104         case wxFONTENCODING_CP932 
: 
 105             enc 
= kCFStringEncodingDOSJapanese
; 
 107         case wxFONTENCODING_CP936 
: 
 108             enc 
= kCFStringEncodingDOSChineseSimplif 
; 
 110         case wxFONTENCODING_CP949 
: 
 111             enc 
= kCFStringEncodingDOSKorean
; 
 113         case wxFONTENCODING_CP950 
: 
 114             enc 
= kCFStringEncodingDOSChineseTrad
; 
 116         case wxFONTENCODING_CP1250 
: 
 117             enc 
= kCFStringEncodingWindowsLatin2
; 
 119         case wxFONTENCODING_CP1251 
: 
 120             enc 
= kCFStringEncodingWindowsCyrillic 
; 
 122         case wxFONTENCODING_CP1252 
: 
 123             enc 
= kCFStringEncodingWindowsLatin1 
; 
 125         case wxFONTENCODING_CP1253 
: 
 126             enc 
= kCFStringEncodingWindowsGreek
; 
 128         case wxFONTENCODING_CP1254 
: 
 129             enc 
= kCFStringEncodingWindowsLatin5
; 
 131         case wxFONTENCODING_CP1255 
: 
 132             enc 
= kCFStringEncodingWindowsHebrew 
; 
 134         case wxFONTENCODING_CP1256 
: 
 135             enc 
= kCFStringEncodingWindowsArabic 
; 
 137         case wxFONTENCODING_CP1257 
: 
 138             enc 
= kCFStringEncodingWindowsBalticRim
; 
 140 //   This only really encodes to UTF7 (if that) evidently 
 141 //        case wxFONTENCODING_UTF7 : 
 142 //            enc = kCFStringEncodingNonLossyASCII ; 
 144         case wxFONTENCODING_UTF8 
: 
 145             enc 
= kCFStringEncodingUTF8 
; 
 147         case wxFONTENCODING_EUC_JP 
: 
 148             enc 
= kCFStringEncodingEUC_JP
; 
 150 /* Don't support conversion to/from UTF16 as wxWidgets can do this better. 
 151  * In particular, ToWChar would fail miserably using strlen on an input UTF16. 
 152         case wxFONTENCODING_UTF16 : 
 153             enc = kCFStringEncodingUnicode ; 
 156         case wxFONTENCODING_MACROMAN 
: 
 157             enc 
= kCFStringEncodingMacRoman 
; 
 159         case wxFONTENCODING_MACJAPANESE 
: 
 160             enc 
= kCFStringEncodingMacJapanese 
; 
 162         case wxFONTENCODING_MACCHINESETRAD 
: 
 163             enc 
= kCFStringEncodingMacChineseTrad 
; 
 165         case wxFONTENCODING_MACKOREAN 
: 
 166             enc 
= kCFStringEncodingMacKorean 
; 
 168         case wxFONTENCODING_MACARABIC 
: 
 169             enc 
= kCFStringEncodingMacArabic 
; 
 171         case wxFONTENCODING_MACHEBREW 
: 
 172             enc 
= kCFStringEncodingMacHebrew 
; 
 174         case wxFONTENCODING_MACGREEK 
: 
 175             enc 
= kCFStringEncodingMacGreek 
; 
 177         case wxFONTENCODING_MACCYRILLIC 
: 
 178             enc 
= kCFStringEncodingMacCyrillic 
; 
 180         case wxFONTENCODING_MACDEVANAGARI 
: 
 181             enc 
= kCFStringEncodingMacDevanagari 
; 
 183         case wxFONTENCODING_MACGURMUKHI 
: 
 184             enc 
= kCFStringEncodingMacGurmukhi 
; 
 186         case wxFONTENCODING_MACGUJARATI 
: 
 187             enc 
= kCFStringEncodingMacGujarati 
; 
 189         case wxFONTENCODING_MACORIYA 
: 
 190             enc 
= kCFStringEncodingMacOriya 
; 
 192         case wxFONTENCODING_MACBENGALI 
: 
 193             enc 
= kCFStringEncodingMacBengali 
; 
 195         case wxFONTENCODING_MACTAMIL 
: 
 196             enc 
= kCFStringEncodingMacTamil 
; 
 198         case wxFONTENCODING_MACTELUGU 
: 
 199             enc 
= kCFStringEncodingMacTelugu 
; 
 201         case wxFONTENCODING_MACKANNADA 
: 
 202             enc 
= kCFStringEncodingMacKannada 
; 
 204         case wxFONTENCODING_MACMALAJALAM 
: 
 205             enc 
= kCFStringEncodingMacMalayalam 
; 
 207         case wxFONTENCODING_MACSINHALESE 
: 
 208             enc 
= kCFStringEncodingMacSinhalese 
; 
 210         case wxFONTENCODING_MACBURMESE 
: 
 211             enc 
= kCFStringEncodingMacBurmese 
; 
 213         case wxFONTENCODING_MACKHMER 
: 
 214             enc 
= kCFStringEncodingMacKhmer 
; 
 216         case wxFONTENCODING_MACTHAI 
: 
 217             enc 
= kCFStringEncodingMacThai 
; 
 219         case wxFONTENCODING_MACLAOTIAN 
: 
 220             enc 
= kCFStringEncodingMacLaotian 
; 
 222         case wxFONTENCODING_MACGEORGIAN 
: 
 223             enc 
= kCFStringEncodingMacGeorgian 
; 
 225         case wxFONTENCODING_MACARMENIAN 
: 
 226             enc 
= kCFStringEncodingMacArmenian 
; 
 228         case wxFONTENCODING_MACCHINESESIMP 
: 
 229             enc 
= kCFStringEncodingMacChineseSimp 
; 
 231         case wxFONTENCODING_MACTIBETAN 
: 
 232             enc 
= kCFStringEncodingMacTibetan 
; 
 234         case wxFONTENCODING_MACMONGOLIAN 
: 
 235             enc 
= kCFStringEncodingMacMongolian 
; 
 237         case wxFONTENCODING_MACETHIOPIC 
: 
 238             enc 
= kCFStringEncodingMacEthiopic 
; 
 240         case wxFONTENCODING_MACCENTRALEUR 
: 
 241             enc 
= kCFStringEncodingMacCentralEurRoman 
; 
 243         case wxFONTENCODING_MACVIATNAMESE 
: 
 244             enc 
= kCFStringEncodingMacVietnamese 
; 
 246         case wxFONTENCODING_MACARABICEXT 
: 
 247             enc 
= kCFStringEncodingMacExtArabic 
; 
 249         case wxFONTENCODING_MACSYMBOL 
: 
 250             enc 
= kCFStringEncodingMacSymbol 
; 
 252         case wxFONTENCODING_MACDINGBATS 
: 
 253             enc 
= kCFStringEncodingMacDingbats 
; 
 255         case wxFONTENCODING_MACTURKISH 
: 
 256             enc 
= kCFStringEncodingMacTurkish 
; 
 258         case wxFONTENCODING_MACCROATIAN 
: 
 259             enc 
= kCFStringEncodingMacCroatian 
; 
 261         case wxFONTENCODING_MACICELANDIC 
: 
 262             enc 
= kCFStringEncodingMacIcelandic 
; 
 264         case wxFONTENCODING_MACROMANIAN 
: 
 265             enc 
= kCFStringEncodingMacRomanian 
; 
 267         case wxFONTENCODING_MACCELTIC 
: 
 268             enc 
= kCFStringEncodingMacCeltic 
; 
 270         case wxFONTENCODING_MACGAELIC 
: 
 271             enc 
= kCFStringEncodingMacGaelic 
; 
 273         /* CFString is known to support this back to the original CarbonLib */ 
 274         /* http://developer.apple.com/samplecode/CarbonMDEF/listing2.html */ 
 275         case wxFONTENCODING_MACKEYBOARD 
: 
 276             /* We don't wish to pollute the namespace too much, even though we're a private header. */ 
 277             /* The constant is well-defined as 41 and is not expected to change. */ 
 278             enc 
= 41 /*kTextEncodingMacKeyboardGlyphs*/ ; 
 282             // because gcc is picky 
 290 class wxMBConv_cf 
: public wxMBConv
 
 295         Init(CFStringGetSystemEncoding()) ; 
 298     wxMBConv_cf(const wxMBConv_cf
& conv
) 
 300         m_encoding 
= conv
.m_encoding
; 
 304     wxMBConv_cf(const char* name
) 
 306         Init( wxCFStringEncFromFontEnc(wxFontMapperBase::Get()->CharsetToEncoding(name
, false) ) ) ; 
 310     wxMBConv_cf(wxFontEncoding encoding
) 
 312         Init( wxCFStringEncFromFontEnc(encoding
) ); 
 315     virtual ~wxMBConv_cf() 
 319     void Init( CFStringEncoding encoding
) 
 321         m_encoding 
= encoding 
; 
 324     virtual size_t ToWChar(wchar_t * dst
, size_t dstSize
, const char * src
, size_t srcSize 
= wxNO_LEN
) const; 
 325     virtual size_t FromWChar(char *dst
, size_t dstSize
, const wchar_t *src
, size_t srcSize 
= wxNO_LEN
) const; 
 327     virtual wxMBConv 
*Clone() const { return new wxMBConv_cf(*this); } 
 331         return m_encoding 
!= kCFStringEncodingInvalidId 
&& 
 332               CFStringIsEncodingAvailable(m_encoding
); 
 336     CFStringEncoding m_encoding 
;