Changeset 1201

Show
Ignore:
Timestamp:
11/18/09 23:36:02 (4 months ago)
Author:
astrange
Message:

Cleanup file path URLs in SubImport?.

- Use CFURL instead of char[PATH_MAX].
- Use -UTF8String to make language-code lookups shorter.
(-UTF8String is guaranteed to work; CFString functions aren't.)

Also avoid a copy of each line in MKV import.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Subtitles/SubImport.h

    r1086 r1201  
    4040 
    4141short GetFilenameLanguage(CFStringRef filename); 
    42 ComponentResult LoadExternalSubtitles(const FSRef *theFile, Movie theMovie); 
    4342ComponentResult LoadExternalSubtitlesFromFileDataRef(Handle dataRef, OSType dataRefType, Movie theMovie); 
    4443Track CreatePlaintextSubTrack(Movie theMovie, ImageDescriptionHandle imgDesc, TimeScale timescale, Handle dataRef, OSType dataRefType, FourCharCode subType, Handle imageExtension, Rect movieBox); 
  • trunk/Subtitles/SubImport.mm

    r1190 r1201  
    5555        findResult.location++; 
    5656        findResult.length = CFStringGetLength(baseName) - findResult.location; 
     57        langStr = CFStringCreateWithSubstring(NULL, baseName, findResult); 
    5758         
    5859        // check for 3 char language code 
    59         if (findResult.length == 3) { 
    60                 char langCStr[4] = ""; 
    61                  
    62                 langStr = CFStringCreateWithSubstring(NULL, baseName, findResult); 
    63                 CFStringGetCString(langStr, langCStr, 4, kCFStringEncodingASCII); 
    64                 lang = ISO639_2ToQTLangCode(langCStr); 
    65                  
    66                 CFRelease(langStr); 
    67                  
    68                 // and for a 2 char language code 
    69         } else if (findResult.length == 2) { 
    70                 char langCStr[3] = ""; 
    71                  
    72                 langStr = CFStringCreateWithSubstring(NULL, baseName, findResult); 
    73                 CFStringGetCString(langStr, langCStr, 3, kCFStringEncodingASCII); 
    74                 lang = ISO639_1ToQTLangCode(langCStr); 
    75                  
    76                 CFRelease(langStr); 
    77         } 
    78          
     60        if (findResult.length == 3) 
     61                lang = ISO639_2ToQTLangCode([(NSString*)langStr UTF8String]); 
     62        else if (findResult.length == 2) // and for a 2 char language code 
     63                lang = ISO639_1ToQTLangCode([(NSString*)langStr UTF8String]); 
     64 
     65        CFRelease(langStr); 
    7966        CFRelease(baseName); 
    8067        return lang; 
     
    542529} 
    543530 
    544 static ComponentResult LoadSingleTextSubtitle(const FSRef *theDirectory, CFStringRef filename, Movie theMovie, Track *firstSubTrack, int subtitleType, int whichTrack) 
    545 
    546         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    547         UInt8 path[PATH_MAX]; 
    548          
    549         FSRefMakePath(theDirectory, path, PATH_MAX); 
    550         NSString *nsPath = [[NSString stringWithUTF8String:(char*)path] stringByAppendingPathComponent:(NSString*)filename]; 
     531static ComponentResult LoadSingleTextSubtitle(CFURLRef theDirectory, CFStringRef filename, Movie theMovie, Track *firstSubTrack, int subtitleType, int whichTrack) 
     532
     533        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];      
     534        NSString *nsPath = [[(NSURL*)theDirectory path] stringByAppendingPathComponent:(NSString*)filename]; 
    551535         
    552536        SubSerializer *ss = [[SubSerializer alloc] init]; 
     
    890874        int lang = langUnspecified; 
    891875        if([langStr length] == 3) 
    892         { 
    893                 char langCStr[4] = ""; 
    894                  
    895                 CFStringGetCString((CFStringRef)langStr, langCStr, 4, kCFStringEncodingASCII); 
    896                 lang = ISO639_2ToQTLangCode(langCStr); 
    897         } 
     876                lang = ISO639_2ToQTLangCode([langStr UTF8String]); 
    898877        else if([langStr length] == 2) 
    899         { 
    900                 char langCStr[3] = ""; 
    901                  
    902                 CFStringGetCString((CFStringRef)langStr, langCStr, 3, kCFStringEncodingASCII); 
    903                 lang = ISO639_1ToQTLangCode(langCStr);                           
    904         } 
     878                lang = ISO639_1ToQTLangCode([langStr UTF8String]);               
    905879        SetMediaLanguage(trackMedia, lang); 
    906880         
     
    920894} VobSubState; 
    921895 
    922 static ComponentResult LoadVobSubSubtitles(const FSRef *theDirectory, CFStringRef filename, Movie theMovie, Track *firstSubTrack) 
     896static ComponentResult LoadVobSubSubtitles(CFURLRef theDirectory, CFStringRef filename, Movie theMovie, Track *firstSubTrack) 
    923897{ 
    924898        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    925         UInt8 path[PATH_MAX]; 
    926          
    927         FSRefMakePath(theDirectory, path, PATH_MAX); 
    928         NSString *nsPath = [[NSString stringWithUTF8String:(char *)path] stringByAppendingPathComponent:(NSString *)filename]; 
     899        NSString *nsPath = [[(NSURL*)theDirectory path] stringByAppendingPathComponent:(NSString *)filename]; 
    929900        NSString *idxContent = STLoadFileWithUnknownEncoding(nsPath); 
    930901        NSData *privateData = nil; 
     
    1018989                NSData *subFileData = [NSData dataWithContentsOfMappedFile:subFileName]; 
    1019990                FSRef subFile; 
    1020                 FSPathMakeRef((const UInt8 *)[subFileName fileSystemRepresentation], &subFile, NULL); 
    1021                 FSSpec theFile; 
    1022                 FSGetCatalogInfo(&subFile, kFSCatInfoNone, NULL, NULL, &theFile, NULL); 
    1023                  
    1024                 if((err = QTNewDataReferenceFromFSSpec(&theFile, 0, &dataRef, &dataRefType)) != noErr) 
     991                FSPathMakeRef((const UInt8*)[subFileName fileSystemRepresentation], &subFile, NULL); 
     992                 
     993                if((err = QTNewDataReferenceFromFSRef(&subFile, 0, &dataRef, &dataRefType)) != noErr) 
    1025994                        goto bail; 
    1026995                 
     
    10651034} 
    10661035 
    1067 ComponentResult LoadExternalSubtitles(const FSRef *theFile, Movie theMovie) 
     1036static ComponentResult LoadExternalSubtitles(CFURLRef theFileURL, Movie theMovie) 
    10681037{ 
    10691038        ComponentResult err = noErr; 
    10701039        Track firstSubTrack = NULL; 
    1071         HFSUniStr255 hfsFilename; 
    10721040        CFStringRef cfFilename = NULL; 
    10731041        FSRef parentDir; 
     
    10761044        ItemCount filesFound; 
    10771045        Boolean containerChanged; 
    1078          
    1079         if (!ShouldLoadExternalSubtitles()) return noErr; 
    1080          
    1081         err = FSGetCatalogInfo(theFile, kFSCatInfoNone, NULL, &hfsFilename, NULL, &parentDir); 
    1082         if (err) goto bail; 
    1083          
     1046        CFURLRef parentURL; 
     1047                 
    10841048        // find the location of the extension 
    1085         cfFilename = CFStringCreateWithCharacters(NULL, hfsFilename.unicode, hfsFilename.length); 
     1049        cfFilename = CFURLCopyLastPathComponent(theFileURL); 
    10861050        baseFilenameRange = CFStringFind(cfFilename, CFSTR("."), kCFCompareBackwards); 
    10871051         
     
    10951059        } 
    10961060         
     1061        parentURL = CFURLCreateCopyDeletingLastPathComponent(NULL, theFileURL); 
     1062        CFURLGetFSRef(parentURL, &parentDir); 
     1063         
    10971064        err = FSOpenIterator(&parentDir, kFSIterateFlat, &dirItr); 
    10981065        if (err) goto bail; 
     
    11081075                if (err) goto bail; 
    11091076                 
    1110                 cfFoundFilename = CFStringCreateWithCharacters(NULL, hfsFoundFilename.unicode, hfsFoundFilename.length); 
     1077                cfFoundFilename = CFStringCreateWithCharactersNoCopy(NULL, hfsFoundFilename.unicode, hfsFoundFilename.length, kCFAllocatorNull); 
    11111078                cmpRes = CFStringCompareWithOptions(cfFoundFilename, cfFilename, baseFilenameRange, kCFCompareCaseInsensitive); 
    11121079                 
     
    11341101                                                actRange = CFStringFind(cfFoundFilename, CFSTR(".idx"), kCFCompareCaseInsensitive | kCFCompareBackwards); 
    11351102                                                if (actRange.length && actRange.location == extRange.location) 
    1136                                                         err = LoadVobSubSubtitles(&parentDir, cfFoundFilename, theMovie, &firstSubTrack); 
     1103                                                        err = LoadVobSubSubtitles(parentURL, cfFoundFilename, theMovie, &firstSubTrack); 
    11371104                                                else { 
     1105                                                        // SAMI 
    11381106                                                        actRange = CFStringFind(cfFoundFilename, CFSTR(".smi"), kCFCompareCaseInsensitive | kCFCompareBackwards); 
    11391107                                                        if (actRange.length && actRange.location == extRange.location) 
     
    11451113                         
    11461114                        if (subType == kSubTypeSMI) { 
    1147                                 err = LoadSingleTextSubtitle(&parentDir, cfFoundFilename, theMovie, &firstSubTrack, kSubTypeSMI, 1); 
    1148                                 if (!err) err = LoadSingleTextSubtitle(&parentDir, cfFoundFilename, theMovie, &firstSubTrack, kSubTypeSMI, 2); 
     1115                                err = LoadSingleTextSubtitle(parentURL, cfFoundFilename, theMovie, &firstSubTrack, kSubTypeSMI, 1); 
     1116                                if (!err) err = LoadSingleTextSubtitle(parentURL, cfFoundFilename, theMovie, &firstSubTrack, kSubTypeSMI, 2); 
    11491117                        } 
    11501118                        else if (subType != -1) 
    1151                                 err = LoadSingleTextSubtitle(&parentDir, cfFoundFilename, theMovie, &firstSubTrack, subType, 0); 
     1119                                err = LoadSingleTextSubtitle(parentURL, cfFoundFilename, theMovie, &firstSubTrack, subType, 0); 
    11521120 
    11531121                        if (err) goto bail; 
     
    11671135                CFRelease(cfFilename); 
    11681136         
     1137        CFRelease(parentURL); 
     1138         
    11691139        return err; 
    11701140} 
     
    11731143{ 
    11741144        if (dataRefType != AliasDataHandlerSubType) return noErr; 
    1175          
     1145        if (!ShouldLoadExternalSubtitles()) return noErr; 
     1146 
    11761147        CFStringRef cfPath = NULL; 
    1177         FSRef ref; 
    1178         uint8_t path[PATH_MAX]; 
    11791148         
    11801149        OSErr err = QTGetDataReferenceFullPathCFString(dataRef, dataRefType, kQTPOSIXPathStyle, &cfPath); 
    11811150        if(err != noErr) return err; 
    1182          
    1183         CFStringGetCString(cfPath, (char*)path, PATH_MAX, kCFStringEncodingUTF8); 
    1184         err = FSPathMakeRef(path, &ref, NULL); 
     1151 
     1152        CFURLRef cfURL = CFURLCreateWithFileSystemPath(NULL, cfPath, kCFURLPOSIXPathStyle, FALSE); 
    11851153        CFRelease(cfPath); 
    11861154         
    1187         if(err != noErr) return err; 
    1188          
    1189         return LoadExternalSubtitles(&ref, theMovie); 
     1155        if (!cfURL) return noErr; 
     1156         
     1157        err = LoadExternalSubtitles(cfURL, theMovie); 
     1158         
     1159        CFRelease(cfURL); 
     1160         
     1161        return err; 
    11901162} 
    11911163 
     
    14461418void CXXSubSerializer::pushLine(const char *line, size_t size, unsigned start, unsigned end) 
    14471419{ 
    1448         NSString *str = [[NSString alloc] initWithBytes:line length:size encoding:NSUTF8StringEncoding]; 
    1449         NSString *strn = [str stringByAppendingString:@"\n"]; 
    1450         [str release]; 
    1451          
    1452         SubLine *sl = [[SubLine alloc] initWithLine:strn start:start end:end]; 
     1420        NSMutableString *str = [[NSMutableString alloc] initWithBytes:line length:size encoding:NSUTF8StringEncoding]; 
     1421        [str appendString:@"\n"]; 
     1422         
     1423        SubLine *sl = [[SubLine alloc] initWithLine:str start:start end:end]; 
    14531424         
    14541425        [sl autorelease];