Changeset 11765


Ignore:
Timestamp:
Jan 25, 2011, 1:43:11 AM (11 years ago)
Author:
livings124
Message:

#3928 Update blocklist download to handle archives (including ZIP)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/macosx/BlocklistDownloader.m

    r11617 r11765  
    2828#import "PrefsController.h"
    2929
    30 #define FILE_NAME @"blocklist.temp"
    31 
    3230@interface BlocklistDownloader (Private)
    3331
    3432- (void) startDownload;
     33- (void) decompressBlocklist;
    3534- (void) finishDownloadSuccess;
    3635
     
    9594}
    9695
     96//using the actual filename is the best bet
     97- (void) download: (NSURLDownload *) download decideDestinationWithSuggestedFilename: (NSString *) filename
     98{
     99    [fDownload setDestination: [NSTemporaryDirectory() stringByAppendingPathComponent: filename] allowOverwrite: NO];
     100}
     101
    97102- (void) download: (NSURLDownload *) download didCreateDestination: (NSString *) path
    98103{
     104    [fDestination release];
    99105    fDestination = [path retain];
    100106}
     
    131137    fState = BLOCKLIST_DL_PROCESSING;
    132138    [self performSelectorInBackground: @selector(finishDownloadSuccess) withObject: nil];
     139}
     140
     141- (BOOL) download: (NSURLDownload *) download shouldDecodeSourceDataOfMIMEType: (NSString *) encodingType
     142{
     143    return YES;
    133144}
    134145
     
    152163   
    153164    fDownload = [[NSURLDownload alloc] initWithRequest: request delegate: self];
    154     [fDownload setDestination: [NSTemporaryDirectory() stringByAppendingPathComponent: FILE_NAME] allowOverwrite: NO];
    155 }
     165}
     166
     167//.gz, .tar.gz, .tgz, and .bgz will be decompressed by NSURLDownload for us. However, we have to do .zip files manually.
     168- (void) decompressBlocklist
     169{
     170        if ([[[fDestination pathExtension] lowercaseString] isEqualToString: @"zip"]) {
     171                BOOL success = NO;
     172       
     173        NSString * workingDirectory = [fDestination stringByDeletingLastPathComponent];
     174               
     175                //First, perform the actual unzipping
     176                NSTask  * unzip = [[NSTask alloc] init];
     177                [unzip setLaunchPath: @"/usr/bin/unzip"];
     178                [unzip setCurrentDirectoryPath: workingDirectory];
     179                [unzip setArguments: [NSArray arrayWithObjects:
     180                                @"-o",  /* overwrite */
     181                                @"-q", /* quiet! */
     182                                fDestination, /* source zip file */
     183                                @"-d", workingDirectory, /*destination*/
     184                                nil]];
     185               
     186                @try
     187                {
     188                        [unzip launch];
     189                        [unzip waitUntilExit];
     190                       
     191                        if ([unzip terminationStatus] == 0)
     192                                success = YES;
     193                }
     194                @catch(id exc)
     195                {
     196                        success = NO;
     197                }
     198                [unzip release];
     199               
     200                if (success) {
     201                        //Now find out what file we actually extracted; don't just assume it matches the zipfile's name
     202                        NSTask *zipinfo;
     203                       
     204                        zipinfo = [[NSTask alloc] init];
     205                        [zipinfo setLaunchPath: @"/usr/bin/zipinfo"];
     206                        [zipinfo setArguments: [NSArray arrayWithObjects:
     207                                    @"-1",  /* just the filename */
     208                                    fDestination, /* source zip file */
     209                                    nil]];
     210                        [zipinfo setStandardOutput: [NSPipe pipe]];
     211                                               
     212                        @try
     213                        {
     214                                NSFileHandle * zipinfoOutput = [[zipinfo standardOutput] fileHandleForReading];
     215
     216                                [zipinfo launch];
     217                                [zipinfo waitUntilExit];
     218                               
     219                                NSString * actualFilename = [[[NSString alloc] initWithData: [zipinfoOutput readDataToEndOfFile]
     220                                                encoding: NSUTF8StringEncoding] autorelease];
     221                                actualFilename = [actualFilename stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
     222                                NSString * newBlocklistPath = [workingDirectory stringByAppendingPathComponent: actualFilename];
     223                               
     224                                //Finally, delete the ZIP file; we're done with it, and we'll return the unzipped blocklist
     225                                [[NSFileManager defaultManager] removeItemAtPath: fDestination error: NULL];
     226               
     227                [fDestination release];
     228                fDestination = [newBlocklistPath retain];
     229                        }
     230            @catch(id exc) {}
     231                        [zipinfo release];
     232                }               
     233        }
     234}
     235
    156236
    157237- (void) finishDownloadSuccess
     
    163243    //process data
    164244    NSAssert(fDestination != nil, @"the blocklist file destination has not been specified");
     245   
     246        [self decompressBlocklist];
     247       
    165248    const int count = tr_blocklistSetContent([PrefsController handle], [fDestination UTF8String]);
    166249   
Note: See TracChangeset for help on using the changeset viewer.