• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/ap/gpl/amule/wxWidgets-2.8.12/src/mac/corefoundation/
1/////////////////////////////////////////////////////////////////////////////
2// Name:        src/mac/corefoundation/cfstring.cpp
3// Purpose:     wxCFStringHolder and other string functions
4// Author:      Stefan Csomor
5// Modified by:
6// Created:     2004-10-29 (from code in src/mac/carbon/utils.cpp)
7// RCS-ID:      $Id: cfstring.cpp 51658 2008-02-11 15:19:53Z SC $
8// Copyright:   (c) Stefan Csomor
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#include "wx/wxprec.h"
13
14#ifndef WX_PRECOMP
15    #include "wx/string.h"
16    #include "wx/intl.h"
17    #if wxUSE_GUI
18        #include "wx/font.h"
19    #endif
20#endif
21
22#include "wx/mac/corefoundation/cfstring.h"
23
24#ifdef __DARWIN__
25    #include <CoreServices/CoreServices.h>
26#else
27    #include <TextCommon.h>
28#endif
29
30void wxMacConvertNewlines13To10( char * data )
31{
32    char * buf = data ;
33    while( (buf=strchr(buf,0x0d)) != NULL )
34    {
35        *buf = 0x0a ;
36        buf++ ;
37    }
38}
39
40void wxMacConvertNewlines10To13( char * data )
41{
42    char * buf = data ;
43    while( (buf=strchr(buf,0x0a)) != NULL )
44    {
45        *buf = 0x0d ;
46        buf++ ;
47    }
48}
49
50void wxMacConvertNewlines13To10( wxString * data )
51{
52    size_t len = data->Length() ;
53
54    if ( len == 0 || wxStrchr(data->c_str(),0x0d)==NULL)
55        return ;
56
57    wxString temp(*data) ;
58    wxStringBuffer buf(*data,len ) ;
59    memcpy( buf , temp.c_str() , (len+1)*sizeof(wxChar) ) ;
60
61    wxMacConvertNewlines13To10( buf ) ;
62}
63
64void wxMacConvertNewlines10To13( wxString * data )
65{
66    size_t len = data->Length() ;
67
68    if ( data->Length() == 0 || wxStrchr(data->c_str(),0x0a)==NULL)
69        return ;
70
71    wxString temp(*data) ;
72    wxStringBuffer buf(*data,len ) ;
73    memcpy( buf , temp.c_str() , (len+1)*sizeof(wxChar) ) ;
74    wxMacConvertNewlines10To13( buf ) ;
75}
76
77
78#if wxUSE_UNICODE
79void wxMacConvertNewlines13To10( wxChar * data )
80{
81    wxChar * buf = data ;
82    while( (buf=wxStrchr(buf,0x0d)) != NULL )
83    {
84        *buf = 0x0a ;
85        buf++ ;
86    }
87}
88
89void wxMacConvertNewlines10To13( wxChar * data )
90{
91    wxChar * buf =  data ;
92    while( (buf=wxStrchr(buf,0x0a)) != NULL )
93    {
94        *buf = 0x0d ;
95        buf++ ;
96    }
97}
98#endif
99
100wxUint32 wxMacGetSystemEncFromFontEnc(wxFontEncoding encoding)
101{
102    TextEncodingBase enc = 0 ;
103    if ( encoding == wxFONTENCODING_DEFAULT )
104    {
105#if wxUSE_GUI
106        encoding = wxFont::GetDefaultEncoding() ;
107#else
108        encoding = wxFONTENCODING_SYSTEM; // to be set below
109#endif
110    }
111
112    if ( encoding == wxFONTENCODING_SYSTEM )
113    {
114        enc = CFStringGetSystemEncoding();
115    }
116
117    switch( encoding)
118    {
119    case wxFONTENCODING_ISO8859_1 :
120        enc = kTextEncodingISOLatin1 ;
121        break ;
122    case wxFONTENCODING_ISO8859_2 :
123        enc = kTextEncodingISOLatin2;
124        break ;
125    case wxFONTENCODING_ISO8859_3 :
126        enc = kTextEncodingISOLatin3 ;
127        break ;
128    case wxFONTENCODING_ISO8859_4 :
129        enc = kTextEncodingISOLatin4;
130        break ;
131    case wxFONTENCODING_ISO8859_5 :
132        enc = kTextEncodingISOLatinCyrillic;
133        break ;
134    case wxFONTENCODING_ISO8859_6 :
135        enc = kTextEncodingISOLatinArabic;
136        break ;
137    case wxFONTENCODING_ISO8859_7 :
138        enc = kTextEncodingISOLatinGreek;
139        break ;
140    case wxFONTENCODING_ISO8859_8 :
141        enc = kTextEncodingISOLatinHebrew;
142        break ;
143    case wxFONTENCODING_ISO8859_9 :
144        enc = kTextEncodingISOLatin5;
145        break ;
146    case wxFONTENCODING_ISO8859_10 :
147        enc = kTextEncodingISOLatin6;
148        break ;
149    case wxFONTENCODING_ISO8859_13 :
150        enc = kTextEncodingISOLatin7;
151        break ;
152    case wxFONTENCODING_ISO8859_14 :
153        enc = kTextEncodingISOLatin8;
154        break ;
155    case wxFONTENCODING_ISO8859_15 :
156        enc = kTextEncodingISOLatin9;
157        break ;
158
159    case wxFONTENCODING_KOI8 :
160        enc = kTextEncodingKOI8_R;
161        break ;
162    case wxFONTENCODING_ALTERNATIVE : // MS-DOS CP866
163        enc = kTextEncodingDOSRussian;
164        break ;
165/*
166    case wxFONTENCODING_BULGARIAN :
167        enc = ;
168        break ;
169*/
170    case wxFONTENCODING_CP437 :
171        enc =kTextEncodingDOSLatinUS ;
172        break ;
173    case wxFONTENCODING_CP850 :
174        enc = kTextEncodingDOSLatin1;
175        break ;
176    case wxFONTENCODING_CP852 :
177        enc = kTextEncodingDOSLatin2;
178        break ;
179    case wxFONTENCODING_CP855 :
180        enc = kTextEncodingDOSCyrillic;
181        break ;
182    case wxFONTENCODING_CP866 :
183        enc =kTextEncodingDOSRussian ;
184        break ;
185    case wxFONTENCODING_CP874 :
186        enc = kTextEncodingDOSThai;
187        break ;
188    case wxFONTENCODING_CP932 :
189        enc = kTextEncodingDOSJapanese;
190        break ;
191    case wxFONTENCODING_CP936 :
192        enc = kTextEncodingDOSChineseSimplif ;
193        break ;
194    case wxFONTENCODING_CP949 :
195        enc = kTextEncodingDOSKorean;
196        break ;
197    case wxFONTENCODING_CP950 :
198        enc = kTextEncodingDOSChineseTrad;
199        break ;
200
201    case wxFONTENCODING_CP1250 :
202        enc = kTextEncodingWindowsLatin2;
203        break ;
204    case wxFONTENCODING_CP1251 :
205        enc =kTextEncodingWindowsCyrillic ;
206        break ;
207    case wxFONTENCODING_CP1252 :
208        enc =kTextEncodingWindowsLatin1 ;
209        break ;
210    case wxFONTENCODING_CP1253 :
211        enc = kTextEncodingWindowsGreek;
212        break ;
213    case wxFONTENCODING_CP1254 :
214        enc = kTextEncodingWindowsLatin5;
215        break ;
216    case wxFONTENCODING_CP1255 :
217        enc =kTextEncodingWindowsHebrew ;
218        break ;
219    case wxFONTENCODING_CP1256 :
220        enc =kTextEncodingWindowsArabic ;
221        break ;
222    case wxFONTENCODING_CP1257 :
223        enc = kTextEncodingWindowsBalticRim;
224        break ;
225
226    case wxFONTENCODING_UTF7 :
227        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicodeUTF7Format) ;
228        break ;
229    case wxFONTENCODING_UTF8 :
230        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicodeUTF8Format) ;
231        break ;
232    case wxFONTENCODING_EUC_JP :
233        enc = kTextEncodingEUC_JP;
234        break ;
235    case wxFONTENCODING_UTF16BE :
236        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode16BitFormat) ;
237        break ;
238    case wxFONTENCODING_UTF16LE :
239        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode16BitFormat) ;
240        break ;
241    case wxFONTENCODING_UTF32BE :
242        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode32BitFormat) ;
243        break ;
244    case wxFONTENCODING_UTF32LE :
245        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode32BitFormat) ;
246        break ;
247
248    case wxFONTENCODING_MACROMAN :
249        enc = kTextEncodingMacRoman ;
250        break ;
251    case wxFONTENCODING_MACJAPANESE :
252        enc = kTextEncodingMacJapanese ;
253        break ;
254    case wxFONTENCODING_MACCHINESETRAD :
255        enc = kTextEncodingMacChineseTrad ;
256        break ;
257    case wxFONTENCODING_MACKOREAN :
258        enc = kTextEncodingMacKorean ;
259        break ;
260    case wxFONTENCODING_MACARABIC :
261        enc = kTextEncodingMacArabic ;
262        break ;
263    case wxFONTENCODING_MACHEBREW :
264        enc = kTextEncodingMacHebrew ;
265        break ;
266    case wxFONTENCODING_MACGREEK :
267        enc = kTextEncodingMacGreek ;
268        break ;
269    case wxFONTENCODING_MACCYRILLIC :
270        enc = kTextEncodingMacCyrillic ;
271        break ;
272    case wxFONTENCODING_MACDEVANAGARI :
273        enc = kTextEncodingMacDevanagari ;
274        break ;
275    case wxFONTENCODING_MACGURMUKHI :
276        enc = kTextEncodingMacGurmukhi ;
277        break ;
278    case wxFONTENCODING_MACGUJARATI :
279        enc = kTextEncodingMacGujarati ;
280        break ;
281    case wxFONTENCODING_MACORIYA :
282        enc = kTextEncodingMacOriya ;
283        break ;
284    case wxFONTENCODING_MACBENGALI :
285        enc = kTextEncodingMacBengali ;
286        break ;
287    case wxFONTENCODING_MACTAMIL :
288        enc = kTextEncodingMacTamil ;
289        break ;
290    case wxFONTENCODING_MACTELUGU :
291        enc = kTextEncodingMacTelugu ;
292        break ;
293    case wxFONTENCODING_MACKANNADA :
294        enc = kTextEncodingMacKannada ;
295        break ;
296    case wxFONTENCODING_MACMALAJALAM :
297        enc = kTextEncodingMacMalayalam ;
298        break ;
299    case wxFONTENCODING_MACSINHALESE :
300        enc = kTextEncodingMacSinhalese ;
301        break ;
302    case wxFONTENCODING_MACBURMESE :
303        enc = kTextEncodingMacBurmese ;
304        break ;
305    case wxFONTENCODING_MACKHMER :
306        enc = kTextEncodingMacKhmer ;
307        break ;
308    case wxFONTENCODING_MACTHAI :
309        enc = kTextEncodingMacThai ;
310        break ;
311    case wxFONTENCODING_MACLAOTIAN :
312        enc = kTextEncodingMacLaotian ;
313        break ;
314    case wxFONTENCODING_MACGEORGIAN :
315        enc = kTextEncodingMacGeorgian ;
316        break ;
317    case wxFONTENCODING_MACARMENIAN :
318        enc = kTextEncodingMacArmenian ;
319        break ;
320    case wxFONTENCODING_MACCHINESESIMP :
321        enc = kTextEncodingMacChineseSimp ;
322        break ;
323    case wxFONTENCODING_MACTIBETAN :
324        enc = kTextEncodingMacTibetan ;
325        break ;
326    case wxFONTENCODING_MACMONGOLIAN :
327        enc = kTextEncodingMacMongolian ;
328        break ;
329    case wxFONTENCODING_MACETHIOPIC :
330        enc = kTextEncodingMacEthiopic ;
331        break ;
332    case wxFONTENCODING_MACCENTRALEUR :
333        enc = kTextEncodingMacCentralEurRoman ;
334        break ;
335    case wxFONTENCODING_MACVIATNAMESE :
336        enc = kTextEncodingMacVietnamese ;
337        break ;
338    case wxFONTENCODING_MACARABICEXT :
339        enc = kTextEncodingMacExtArabic ;
340        break ;
341    case wxFONTENCODING_MACSYMBOL :
342        enc = kTextEncodingMacSymbol ;
343        break ;
344    case wxFONTENCODING_MACDINGBATS :
345        enc = kTextEncodingMacDingbats ;
346        break ;
347    case wxFONTENCODING_MACTURKISH :
348        enc = kTextEncodingMacTurkish ;
349        break ;
350    case wxFONTENCODING_MACCROATIAN :
351        enc = kTextEncodingMacCroatian ;
352        break ;
353    case wxFONTENCODING_MACICELANDIC :
354        enc = kTextEncodingMacIcelandic ;
355        break ;
356    case wxFONTENCODING_MACROMANIAN :
357        enc = kTextEncodingMacRomanian ;
358        break ;
359    case wxFONTENCODING_MACCELTIC :
360        enc = kTextEncodingMacCeltic ;
361        break ;
362    case wxFONTENCODING_MACGAELIC :
363        enc = kTextEncodingMacGaelic ;
364        break ;
365    case wxFONTENCODING_MACKEYBOARD :
366        enc = kTextEncodingMacKeyboardGlyphs ;
367        break ;
368    default : // to make gcc happy
369        break ;
370    };
371    return enc ;
372}
373
374wxFontEncoding wxMacGetFontEncFromSystemEnc(wxUint32 encoding)
375{
376    wxFontEncoding enc = wxFONTENCODING_DEFAULT ;
377
378    switch( encoding)
379    {
380    case kTextEncodingISOLatin1  :
381        enc = wxFONTENCODING_ISO8859_1 ;
382        break ;
383    case kTextEncodingISOLatin2 :
384        enc = wxFONTENCODING_ISO8859_2;
385        break ;
386    case kTextEncodingISOLatin3 :
387        enc = wxFONTENCODING_ISO8859_3 ;
388        break ;
389    case kTextEncodingISOLatin4 :
390        enc = wxFONTENCODING_ISO8859_4;
391        break ;
392    case kTextEncodingISOLatinCyrillic :
393        enc = wxFONTENCODING_ISO8859_5;
394        break ;
395    case kTextEncodingISOLatinArabic :
396        enc = wxFONTENCODING_ISO8859_6;
397        break ;
398    case kTextEncodingISOLatinGreek :
399        enc = wxFONTENCODING_ISO8859_7;
400        break ;
401    case kTextEncodingISOLatinHebrew :
402        enc = wxFONTENCODING_ISO8859_8;
403        break ;
404    case kTextEncodingISOLatin5 :
405        enc = wxFONTENCODING_ISO8859_9;
406        break ;
407    case kTextEncodingISOLatin6 :
408        enc = wxFONTENCODING_ISO8859_10;
409        break ;
410    case kTextEncodingISOLatin7 :
411        enc = wxFONTENCODING_ISO8859_13;
412        break ;
413    case kTextEncodingISOLatin8 :
414        enc = wxFONTENCODING_ISO8859_14;
415        break ;
416    case kTextEncodingISOLatin9 :
417        enc =wxFONTENCODING_ISO8859_15 ;
418        break ;
419
420    case kTextEncodingKOI8_R :
421        enc = wxFONTENCODING_KOI8;
422        break ;
423/*
424    case  :
425        enc = wxFONTENCODING_BULGARIAN;
426        break ;
427*/
428    case kTextEncodingDOSLatinUS :
429        enc = wxFONTENCODING_CP437;
430        break ;
431    case kTextEncodingDOSLatin1 :
432        enc = wxFONTENCODING_CP850;
433        break ;
434    case kTextEncodingDOSLatin2 :
435        enc =wxFONTENCODING_CP852 ;
436        break ;
437    case kTextEncodingDOSCyrillic :
438        enc = wxFONTENCODING_CP855;
439        break ;
440    case kTextEncodingDOSRussian :
441        enc = wxFONTENCODING_CP866;
442        break ;
443    case kTextEncodingDOSThai :
444        enc =wxFONTENCODING_CP874 ;
445        break ;
446    case kTextEncodingDOSJapanese :
447        enc = wxFONTENCODING_CP932;
448        break ;
449    case kTextEncodingDOSChineseSimplif :
450        enc = wxFONTENCODING_CP936;
451        break ;
452    case kTextEncodingDOSKorean :
453        enc = wxFONTENCODING_CP949;
454        break ;
455    case kTextEncodingDOSChineseTrad :
456        enc = wxFONTENCODING_CP950;
457        break ;
458
459    case kTextEncodingWindowsLatin2 :
460        enc = wxFONTENCODING_CP1250;
461        break ;
462    case kTextEncodingWindowsCyrillic :
463        enc = wxFONTENCODING_CP1251;
464        break ;
465    case kTextEncodingWindowsLatin1 :
466        enc = wxFONTENCODING_CP1252;
467        break ;
468    case kTextEncodingWindowsGreek :
469        enc = wxFONTENCODING_CP1253;
470        break ;
471    case kTextEncodingWindowsLatin5 :
472        enc = wxFONTENCODING_CP1254;
473        break ;
474    case kTextEncodingWindowsHebrew :
475        enc = wxFONTENCODING_CP1255;
476        break ;
477    case kTextEncodingWindowsArabic :
478        enc = wxFONTENCODING_CP1256;
479        break ;
480    case kTextEncodingWindowsBalticRim :
481        enc =wxFONTENCODING_CP1257 ;
482        break ;
483    case kTextEncodingEUC_JP :
484        enc = wxFONTENCODING_EUC_JP;
485        break ;
486#if 0
487    case wxFONTENCODING_UTF7 :
488        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicodeUTF7Format) ;
489        break ;
490    case wxFONTENCODING_UTF8 :
491        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicodeUTF8Format) ;
492        break ;
493    case wxFONTENCODING_UTF16BE :
494        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode16BitFormat) ;
495        break ;
496    case wxFONTENCODING_UTF16LE :
497        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode16BitFormat) ;
498        break ;
499    case wxFONTENCODING_UTF32BE :
500        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode32BitFormat) ;
501        break ;
502    case wxFONTENCODING_UTF32LE :
503        enc = CreateTextEncoding(kTextEncodingUnicodeDefault,0,kUnicode32BitFormat) ;
504        break ;
505#endif
506    case kTextEncodingMacRoman :
507        enc = wxFONTENCODING_MACROMAN ;
508        break ;
509    case kTextEncodingMacJapanese :
510        enc = wxFONTENCODING_MACJAPANESE ;
511        break ;
512    case kTextEncodingMacChineseTrad :
513        enc = wxFONTENCODING_MACCHINESETRAD ;
514        break ;
515    case kTextEncodingMacKorean :
516        enc = wxFONTENCODING_MACKOREAN ;
517        break ;
518    case kTextEncodingMacArabic :
519        enc =wxFONTENCODING_MACARABIC ;
520        break ;
521    case kTextEncodingMacHebrew :
522        enc = wxFONTENCODING_MACHEBREW ;
523        break ;
524    case kTextEncodingMacGreek :
525        enc = wxFONTENCODING_MACGREEK ;
526        break ;
527    case kTextEncodingMacCyrillic :
528        enc = wxFONTENCODING_MACCYRILLIC ;
529        break ;
530    case kTextEncodingMacDevanagari :
531        enc = wxFONTENCODING_MACDEVANAGARI ;
532        break ;
533    case kTextEncodingMacGurmukhi :
534        enc = wxFONTENCODING_MACGURMUKHI ;
535        break ;
536    case kTextEncodingMacGujarati :
537        enc = wxFONTENCODING_MACGUJARATI ;
538        break ;
539    case kTextEncodingMacOriya :
540        enc =wxFONTENCODING_MACORIYA ;
541        break ;
542    case kTextEncodingMacBengali :
543        enc =wxFONTENCODING_MACBENGALI ;
544        break ;
545    case kTextEncodingMacTamil :
546        enc = wxFONTENCODING_MACTAMIL ;
547        break ;
548    case kTextEncodingMacTelugu :
549        enc = wxFONTENCODING_MACTELUGU ;
550        break ;
551    case kTextEncodingMacKannada :
552        enc = wxFONTENCODING_MACKANNADA ;
553        break ;
554    case kTextEncodingMacMalayalam :
555        enc = wxFONTENCODING_MACMALAJALAM ;
556        break ;
557    case kTextEncodingMacSinhalese :
558        enc = wxFONTENCODING_MACSINHALESE ;
559        break ;
560    case kTextEncodingMacBurmese :
561        enc = wxFONTENCODING_MACBURMESE ;
562        break ;
563    case kTextEncodingMacKhmer :
564        enc = wxFONTENCODING_MACKHMER ;
565        break ;
566    case kTextEncodingMacThai :
567        enc = wxFONTENCODING_MACTHAI ;
568        break ;
569    case kTextEncodingMacLaotian :
570        enc = wxFONTENCODING_MACLAOTIAN ;
571        break ;
572    case kTextEncodingMacGeorgian :
573        enc = wxFONTENCODING_MACGEORGIAN ;
574        break ;
575    case kTextEncodingMacArmenian :
576        enc = wxFONTENCODING_MACARMENIAN ;
577        break ;
578    case kTextEncodingMacChineseSimp :
579        enc = wxFONTENCODING_MACCHINESESIMP ;
580        break ;
581    case kTextEncodingMacTibetan :
582        enc = wxFONTENCODING_MACTIBETAN ;
583        break ;
584    case kTextEncodingMacMongolian :
585        enc = wxFONTENCODING_MACMONGOLIAN ;
586        break ;
587    case kTextEncodingMacEthiopic :
588        enc = wxFONTENCODING_MACETHIOPIC ;
589        break ;
590    case kTextEncodingMacCentralEurRoman:
591        enc = wxFONTENCODING_MACCENTRALEUR  ;
592        break ;
593    case kTextEncodingMacVietnamese:
594        enc = wxFONTENCODING_MACVIATNAMESE  ;
595        break ;
596    case kTextEncodingMacExtArabic :
597        enc = wxFONTENCODING_MACARABICEXT ;
598        break ;
599    case kTextEncodingMacSymbol :
600        enc = wxFONTENCODING_MACSYMBOL ;
601        break ;
602    case kTextEncodingMacDingbats :
603        enc = wxFONTENCODING_MACDINGBATS ;
604        break ;
605    case kTextEncodingMacTurkish :
606        enc = wxFONTENCODING_MACTURKISH ;
607        break ;
608    case kTextEncodingMacCroatian :
609        enc = wxFONTENCODING_MACCROATIAN ;
610        break ;
611    case kTextEncodingMacIcelandic :
612        enc = wxFONTENCODING_MACICELANDIC ;
613        break ;
614    case kTextEncodingMacRomanian :
615        enc = wxFONTENCODING_MACROMANIAN ;
616        break ;
617    case kTextEncodingMacCeltic :
618        enc = wxFONTENCODING_MACCELTIC ;
619        break ;
620    case kTextEncodingMacGaelic :
621        enc = wxFONTENCODING_MACGAELIC ;
622        break ;
623    case kTextEncodingMacKeyboardGlyphs :
624        enc = wxFONTENCODING_MACKEYBOARD ;
625        break ;
626    } ;
627    return enc ;
628}
629
630
631//
632// CFStringRefs (Carbon only)
633//
634
635// converts this string into a carbon foundation string with optional pc 2 mac encoding
636void wxMacCFStringHolder::Assign( const wxString &st , wxFontEncoding encoding )
637{
638    Release() ;
639    if (st.IsEmpty())
640    {
641        m_cfs = CFSTR("") ;
642        CFRetain( m_cfs ) ;
643    }
644    else
645    {
646        wxString str = st ;
647        wxMacConvertNewlines13To10( &str ) ;
648#if wxUSE_UNICODE
649#if SIZEOF_WCHAR_T == 2
650        m_cfs = CFStringCreateWithCharacters( kCFAllocatorDefault,
651            (UniChar*)str.wc_str() , str.Len() );
652#else
653        wxMBConvUTF16 converter ;
654        size_t unicharbytes = converter.FromWChar( NULL , 0 , str.wc_str() , str.Length() ) ;
655        wxASSERT( unicharbytes != wxCONV_FAILED );
656        if ( unicharbytes == wxCONV_FAILED )
657        {
658            // create an empty string
659            m_cfs = CFSTR("") ;
660            CFRetain( m_cfs ) ;
661        }
662        else
663        {
664            // unicharbytes: number of bytes needed for UTF-16 encoded string (without terminating null)
665            // unichars: number of UTF-16 characters (without terminating null)
666            size_t unichars = unicharbytes /  sizeof(UniChar) ;
667            UniChar *unibuf = new UniChar[ unichars ] ;
668            converter.FromWChar( (char*)unibuf , unicharbytes , str.wc_str() , str.Length() ) ;
669            m_cfs = CFStringCreateWithCharacters( kCFAllocatorDefault , unibuf , unichars ) ;
670            delete[] unibuf ;
671        }
672#endif
673#else // not wxUSE_UNICODE
674        m_cfs = CFStringCreateWithCString( kCFAllocatorSystemDefault , str.c_str() ,
675            wxMacGetSystemEncFromFontEnc( encoding ) ) ;
676#endif
677    }
678    m_release = true ;
679}
680
681wxString wxMacCFStringHolder::AsString(wxFontEncoding encoding)
682{
683    if ( m_cfs == NULL )
684        return wxEmptyString ;
685
686    Size cflen = CFStringGetLength( m_cfs )  ;
687    size_t noChars ;
688    wxChar* buf = NULL ;
689
690#if wxUSE_UNICODE
691#if SIZEOF_WCHAR_T == 2
692    buf = new wxChar[ cflen + 1 ] ;
693    CFStringGetCharacters( m_cfs , CFRangeMake( 0 , cflen ) , (UniChar*) buf ) ;
694    noChars = cflen ;
695#else
696    UniChar* unibuf = new UniChar[ cflen + 1 ] ;
697    CFStringGetCharacters( m_cfs , CFRangeMake( 0 , cflen ) , (UniChar*) unibuf ) ;
698    unibuf[cflen] = 0 ;
699    wxMBConvUTF16 converter ;
700    noChars = converter.MB2WC( NULL , (const char*)unibuf , 0 ) ;
701    wxASSERT_MSG( noChars != wxCONV_FAILED, _T("Unable to count the number of characters in this string!") );
702    buf = new wxChar[ noChars + 1 ] ;
703    noChars = converter.MB2WC( buf , (const char*)unibuf , noChars + 1 ) ;
704    wxASSERT_MSG( noChars != wxCONV_FAILED, _T("Conversion of string failed!") );
705    delete[] unibuf ;
706#endif
707#else
708    CFIndex cStrLen ;
709    CFStringGetBytes( m_cfs , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) ,
710        '?' , false , NULL , 0 , &cStrLen ) ;
711    buf = new wxChar[ cStrLen + 1 ] ;
712    CFStringGetBytes( m_cfs , CFRangeMake(0, cflen) , wxMacGetSystemEncFromFontEnc( encoding ) ,
713        '?' , false , (unsigned char*) buf , cStrLen , &cStrLen) ;
714    noChars = cStrLen ;
715#endif
716
717    buf[noChars] = 0 ;
718    wxMacConvertNewlines10To13( buf ) ;
719    wxString result(buf) ;
720    delete[] buf ;
721    return result ;
722}
723
724
725wxMacUniCharBuffer::wxMacUniCharBuffer( const wxString &str )
726{
727    m_chars = str.length() ;
728    m_ubuf = NULL ;
729
730#if SIZEOF_WCHAR_T == 4
731    wxMBConvUTF16 converter ;
732#if wxUSE_UNICODE
733    size_t unicharlen = converter.WC2MB( NULL , str.wc_str() , 0 ) ;
734    m_ubuf = (UniChar*) malloc( unicharlen + 2 ) ;
735    converter.WC2MB( (char*) m_ubuf , str.wc_str(), unicharlen + 2 ) ;
736#else
737    const wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ;
738    size_t unicharlen = converter.WC2MB( NULL , wchar.data() , 0 ) ;
739    m_ubuf = (UniChar*) malloc( unicharlen + 2 ) ;
740    converter.WC2MB( (char*) m_ubuf , wchar.data() , unicharlen + 2 ) ;
741#endif
742    m_chars = unicharlen / 2 ;
743#else // SIZEOF_WCHAR_T is then 2
744#if wxUSE_UNICODE
745    m_ubuf = malloc( m_chars * 2 + 2 ) ;
746    memcpy( m_ubuf , (UniChar*) str.wc_str() , m_chars * 2 + 2 ) ;
747#else
748    wxWCharBuffer wchar = str.wc_str( wxConvLocal ) ;
749    m_chars = wxWcslen( wchar.data() ) ;
750    m_ubuf = malloc( m_chars * 2 + 2 ) ;
751    memcpy( m_ubuf , (UniChar*) wchar.data() , m_chars * 2 + 2 ) ;
752#endif
753#endif
754}
755
756wxMacUniCharBuffer::~wxMacUniCharBuffer()
757{
758    free( m_ubuf ) ;
759}
760
761UniCharArrayPtr wxMacUniCharBuffer::GetBuffer()
762{
763    return m_ubuf ;
764}
765
766UniCharCount wxMacUniCharBuffer::GetChars()
767{
768    return m_chars ;
769}
770