Remove workaround for pre-10.2 systems in nsLocalFileOSX, no need to look for CFStringNormalize. b=490959 r=mstange sr=roc

This commit is contained in:
Josh Aas 2009-05-01 09:59:33 -07:00
Родитель 0dab1505de
Коммит db53a3cbed
1 изменённых файлов: 30 добавлений и 50 удалений

Просмотреть файл

@ -2423,62 +2423,42 @@ static nsresult MacErrorMapper(OSErr inErr)
// Normalization Form C (composed Unicode). We need this because
// Mac OS X file system uses NFD (Normalization Form D : decomposed Unicode)
// while most other OS', server-side programs usually expect NFC.
typedef void (*UnicodeNormalizer) (CFMutableStringRef, CFStringNormalizationForm);
static void CopyUTF8toUTF16NFC(const nsACString& aSrc, nsAString& aResult)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
static PRBool sChecked = PR_FALSE;
static UnicodeNormalizer sUnicodeNormalizer = NULL;
const nsAFlatCString &inFlatSrc = PromiseFlatCString(aSrc);
// CFStringNormalize was not introduced until Mac OS 10.2
if (!sChecked) {
CFBundleRef carbonBundle =
CFBundleGetBundleWithIdentifier(CFSTR("com.apple.Carbon"));
if (carbonBundle)
sUnicodeNormalizer = (UnicodeNormalizer)
::CFBundleGetFunctionPointerForName(carbonBundle,
CFSTR("CFStringNormalize"));
sChecked = PR_TRUE;
// The number of 16bit code units in a UTF-16 string will never be
// larger than the number of bytes in the corresponding UTF-8 string.
CFMutableStringRef inStr = ::CFStringCreateMutable(NULL, inFlatSrc.Length());
if (!inStr) {
CopyUTF8toUTF16(aSrc, aResult);
return;
}
::CFStringAppendCString(inStr, inFlatSrc.get(), kCFStringEncodingUTF8);
::CFStringNormalize(inStr, kCFStringNormalizationFormC);
CFIndex length = ::CFStringGetLength(inStr);
const UniChar* chars = ::CFStringGetCharactersPtr(inStr);
if (chars) {
aResult.Assign(chars, length);
}
else {
nsAutoTArray<UniChar, FILENAME_BUFFER_SIZE> buffer;
if (!buffer.SetLength(length)) {
CopyUTF8toUTF16(aSrc, aResult);
}
if (!sUnicodeNormalizer) { // OS X 10.2 or earlier
CopyUTF8toUTF16(aSrc, aResult);
return;
}
const nsAFlatCString &inFlatSrc = PromiseFlatCString(aSrc);
// The number of 16bit code units in a UTF-16 string will never be
// larger than the number of bytes in the corresponding UTF-8 string.
CFMutableStringRef inStr =
::CFStringCreateMutable(NULL, inFlatSrc.Length());
if (!inStr) {
CopyUTF8toUTF16(aSrc, aResult);
return;
}
::CFStringAppendCString(inStr, inFlatSrc.get(), kCFStringEncodingUTF8);
sUnicodeNormalizer(inStr, kCFStringNormalizationFormC);
CFIndex length = CFStringGetLength(inStr);
const UniChar* chars = CFStringGetCharactersPtr(inStr);
if (chars)
aResult.Assign(chars, length);
else {
nsAutoTArray<UniChar, FILENAME_BUFFER_SIZE> buffer;
if (!buffer.SetLength(length))
CopyUTF8toUTF16(aSrc, aResult);
else {
CFStringGetCharacters(inStr, CFRangeMake(0, length), buffer.Elements());
aResult.Assign(buffer.Elements(), length);
}
::CFStringGetCharacters(inStr, ::CFRangeMake(0, length), buffer.Elements());
aResult.Assign(buffer.Elements(), length);
}
CFRelease(inStr);
}
::CFRelease(inStr);
NS_OBJC_END_TRY_ABORT_BLOCK;
NS_OBJC_END_TRY_ABORT_BLOCK;
}