diff --git a/SUBasicUpdateDriver.h b/SUBasicUpdateDriver.h index ecf64279c..213174968 100644 --- a/SUBasicUpdateDriver.h +++ b/SUBasicUpdateDriver.h @@ -18,6 +18,7 @@ NSURLDownload *download; NSString *downloadPath; + NSString *tempDir; NSString *relaunchPath; } diff --git a/SUBasicUpdateDriver.m b/SUBasicUpdateDriver.m index 86b623fc7..678583f2d 100644 --- a/SUBasicUpdateDriver.m +++ b/SUBasicUpdateDriver.m @@ -143,11 +143,13 @@ - (void)download:(NSURLDownload *)d decideDestinationWithSuggestedFilename:(NSSt // Not using a GUID here because hdiutil (for DMGs) for some reason chokes on GUIDs. Too long? I really have no idea. NSString *prefix = [NSString stringWithFormat:@"%@ %@ Update", [host name], [host version]]; NSString *desktopFolder = [@"~/Desktop" stringByExpandingTildeInPath]; - NSString *tempDir = [desktopFolder stringByAppendingPathComponent:prefix]; + [tempDir release]; + tempDir = [[desktopFolder stringByAppendingPathComponent:prefix] retain]; int cnt=1; while ([[NSFileManager defaultManager] fileExistsAtPath:tempDir] && cnt <= 999) { - tempDir = [desktopFolder stringByAppendingPathComponent:[NSString stringWithFormat:@"%@ %d", prefix, cnt++]]; + [tempDir release]; + tempDir = [[desktopFolder stringByAppendingPathComponent:[NSString stringWithFormat:@"%@ %d", prefix, cnt++]] retain]; } #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 @@ -188,8 +190,8 @@ - (void)downloadDidFinish:(NSURLDownload *)d - (void)download:(NSURLDownload *)download didFailWithError:(NSError *)error { // Get rid of what we've downloaded so far, if anything. - if (downloadPath != nil) - [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation source:[downloadPath stringByDeletingLastPathComponent] destination:@"" files:[NSArray arrayWithObject:[downloadPath lastPathComponent]] tag:NULL]; + if (tempDir != nil) // tempDir contains downloadPath, so we implicitly delete both here. + [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation source:[tempDir stringByDeletingLastPathComponent] destination:@"" files:[NSArray arrayWithObject:[tempDir lastPathComponent]] tag:NULL]; [self abortUpdateWithError:[NSError errorWithDomain:SUSparkleErrorDomain code:SURelaunchError userInfo:[NSDictionary dictionaryWithObjectsAndKeys:SULocalizedString(@"An error occurred while downloading the update. Please try again later.", nil), NSLocalizedDescriptionKey, [error localizedDescription], NSLocalizedFailureReasonErrorKey, nil]]]; } @@ -292,7 +294,7 @@ - (void)installAndRelaunchWithTool if ([[updater delegate] respondsToSelector:@selector(pathToRelaunchForUpdater:)]) pathToRelaunch = [[updater delegate] pathToRelaunchForUpdater:updater]; NSString *relaunchToolPath = [relaunchPath stringByAppendingPathComponent: @"/Contents/MacOS/finish_installation"]; - [NSTask launchedTaskWithLaunchPath: relaunchToolPath arguments:[NSArray arrayWithObjects:pathToRelaunch, [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]], [downloadPath stringByDeletingLastPathComponent], nil]]; + [NSTask launchedTaskWithLaunchPath: relaunchToolPath arguments:[NSArray arrayWithObjects:pathToRelaunch, [NSString stringWithFormat:@"%d", [[NSProcessInfo processInfo] processIdentifier]], tempDir, nil]]; [NSApp terminate:self]; } @@ -303,9 +305,9 @@ - (void)installAndRelaunchWithTool - (void)cleanUp { #if MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 - [[NSFileManager defaultManager] removeFileAtPath:[downloadPath stringByDeletingLastPathComponent] handler:nil]; + [[NSFileManager defaultManager] removeFileAtPath: tempDir handler:nil]; #else - [[NSFileManager defaultManager] removeItemAtPath:[downloadPath stringByDeletingLastPathComponent] error:NULL]; + [[NSFileManager defaultManager] removeItemAtPath: tempDir error:NULL]; #endif } @@ -339,6 +341,7 @@ - (void)dealloc [updateItem release]; [download release]; [downloadPath release]; + [tempDir release]; [relaunchPath release]; [super dealloc]; } diff --git a/SUUIBasedUpdateDriver.m b/SUUIBasedUpdateDriver.m index b5552546b..f85cb371e 100644 --- a/SUUIBasedUpdateDriver.m +++ b/SUUIBasedUpdateDriver.m @@ -118,11 +118,16 @@ - (void)download:(NSURLDownload *)download didReceiveDataOfLength:(NSUInteger)le [statusController setStatusText:[NSString stringWithFormat:SULocalizedString(@"%@ downloaded", nil), [self _humanReadableSizeFromDouble:[statusController progressValue]]]]; } -- (IBAction)cancelDownload:sender +- (IBAction)cancelDownload: (id)sender { if (download) [download cancel]; [self abortUpdate]; + if (tempDir != nil) // tempDir contains downloadPath, so we implicitly delete both here. + { + if( ![[NSFileManager defaultManager] removeFileAtPath: tempDir handler: nil] ) + [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation source:[tempDir stringByDeletingLastPathComponent] destination:@"" files:[NSArray arrayWithObject:[tempDir lastPathComponent]] tag:NULL]; + } } - (void)extractUpdate