/////////////////////////////////////////////////////////////////////////////
-// Name: src/osx/corefoundation/strconv.cpp
+// Name: src/osx/core/strconv_cf.cpp
// Purpose: Unicode conversion classes
// Author: David Elliott
// Modified by:
* 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);
else
return result;
}
+#endif // wxUSE_FONTMAP
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<CFMutableStringRef>
+ 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
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;
// 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
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;