зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
0dab1505de
Коммит
db53a3cbed
|
@ -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;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче