X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8d462eb74a32a522427e658441d1bc5e67b2d8a5..60372b0d54379701d62edf5595a7dc25c48330e1:/src/osx/core/strconv_cf.cpp diff --git a/src/osx/core/strconv_cf.cpp b/src/osx/core/strconv_cf.cpp index 78f6429c2c..f4bd30f334 100644 --- a/src/osx/core/strconv_cf.cpp +++ b/src/osx/core/strconv_cf.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/osx/corefoundation/strconv.cpp +// Name: src/osx/core/strconv_cf.cpp // Purpose: Unicode conversion classes // Author: David Elliott // Modified by: @@ -33,6 +33,7 @@ * assume ABI compatibility even within a given wxWidgets release. */ +#if wxUSE_FONTMAP WXDLLIMPEXP_BASE wxMBConv* new_wxMBConv_cf( const char* name) { wxMBConv_cf *result = new wxMBConv_cf(name); @@ -44,6 +45,7 @@ WXDLLIMPEXP_BASE wxMBConv* new_wxMBConv_cf( const char* name) else return result; } +#endif // wxUSE_FONTMAP WXDLLIMPEXP_BASE wxMBConv* new_wxMBConv_cf(wxFontEncoding encoding) { @@ -88,6 +90,14 @@ WXDLLIMPEXP_BASE wxMBConv* new_wxMBConv_cf(wxFontEncoding encoding) if ( theString == NULL ) return wxCONV_FAILED; + // Ensure that the string is in canonical composed form (NFC): this is + // important because Darwin uses decomposed form (NFD) for e.g. file + // names but we want to use NFC internally. + wxCFRef + cfMutableString(CFStringCreateMutableCopy(NULL, 0, theString)); + CFStringNormalize(cfMutableString, kCFStringNormalizationFormC); + theString = cfMutableString; + /* NOTE: The string content includes the NULL element if the source string did * That means we have to do nothing special because the destination will have * the NULL element iff the source did and the NULL element will be included @@ -130,11 +140,11 @@ WXDLLIMPEXP_BASE wxMBConv* new_wxMBConv_cf(wxFontEncoding encoding) else { // NOTE: Includes NULL iff source did - /* NOTE: This is an approximation. The eventual UTF-32 will + /* NOTE: This is an approximation. The eventual UTF-32 will * possibly have less elements but certainly not more. */ size_t returnSize = CFStringGetLength(theString); - + if (dstSize == 0 || dst == NULL) { return returnSize; @@ -144,13 +154,13 @@ WXDLLIMPEXP_BASE wxMBConv* new_wxMBConv_cf(wxFontEncoding encoding) // for an undersized UTF-32 destination buffer. CFRange fullStringRange = CFRangeMake(0, CFStringGetLength(theString)); UniChar *szUniCharBuffer = new UniChar[fullStringRange.length]; - + CFStringGetCharacters(theString, fullStringRange, szUniCharBuffer); - + wxMBConvUTF16 converter; returnSize = converter.ToWChar( dst, dstSize, (const char*)szUniCharBuffer, fullStringRange.length ); delete [] szUniCharBuffer; - + return returnSize; } // NOTREACHED @@ -205,18 +215,20 @@ WXDLLIMPEXP_BASE wxMBConv* new_wxMBConv_cf(wxFontEncoding encoding) CFIndex usedBufLen; CFIndex charsConverted = CFStringGetBytes( - theString, + theString, CFRangeMake(0, CFStringGetLength(theString)), m_encoding, 0, // FAIL on unconvertible characters false, // not an external representation - // if dstSize is 0 then pass NULL to get required length in usedBufLen - (dstSize != 0)?(UInt8*)dst:NULL, + (UInt8*)dst, dstSize, &usedBufLen ); - if(charsConverted < CFStringGetLength(theString) ) + // when dst is non-NULL, we check usedBufLen against dstSize as + // CFStringGetBytes sometimes treats dst as being NULL when dstSize==0 + if( (charsConverted < CFStringGetLength(theString)) || + (dst && (size_t) usedBufLen > dstSize) ) return wxCONV_FAILED; return usedBufLen;