diff --git a/macosx/Defaults.plist b/macosx/Defaults.plist index d7d3e11d9..b24ea7233 100644 --- a/macosx/Defaults.plist +++ b/macosx/Defaults.plist @@ -44,6 +44,8 @@ History + IncompleteDownloadFolder + ~/Desktop InfoTab Info InfoVisible @@ -104,5 +106,7 @@ 20 UseAdvancedBar + UseIncompleteDownloadFolder + diff --git a/macosx/English.lproj/PrefsWindow.nib/classes.nib b/macosx/English.lproj/PrefsWindow.nib/classes.nib index 943615f29..3448a766a 100644 --- a/macosx/English.lproj/PrefsWindow.nib/classes.nib +++ b/macosx/English.lproj/PrefsWindow.nib/classes.nib @@ -9,6 +9,7 @@ folderSheetShow = id; helpForNetwork = id; importFolderSheetShow = id; + incompleteFolderSheetShow = id; setAutoImport = id; setAutoSize = id; setAutoSpeedLimit = id; @@ -31,6 +32,7 @@ fFolderPopUp = NSPopUpButton; fGeneralView = NSView; fImportFolderPopUp = NSPopUpButton; + fIncompleteFolderPopUp = NSPopUpButton; fNatCheck = NSButton; fNatStatusField = NSTextField; fNatStatusImage = NSImageView; diff --git a/macosx/English.lproj/PrefsWindow.nib/info.nib b/macosx/English.lproj/PrefsWindow.nib/info.nib index e6d4c2d74..ec7c4587f 100644 --- a/macosx/English.lproj/PrefsWindow.nib/info.nib +++ b/macosx/English.lproj/PrefsWindow.nib/info.nib @@ -3,15 +3,15 @@ IBDocumentLocation - 18 87 356 240 0 0 1152 842 + 19 87 356 240 0 0 1152 842 IBEditorPositions 153 - 123 483 563 267 0 0 1152 842 + 294 445 563 267 0 0 1152 842 28 294 434 563 290 0 0 1152 842 41 - 294 420 563 317 0 0 1152 842 + 108 420 563 342 0 0 1152 842 66 294 507 563 144 0 0 1152 842 @@ -23,7 +23,7 @@ IBOpenObjects - 153 + 41 IBSystem Version 8L127 diff --git a/macosx/English.lproj/PrefsWindow.nib/keyedobjects.nib b/macosx/English.lproj/PrefsWindow.nib/keyedobjects.nib index 2a542f12f..16114bf1d 100644 Binary files a/macosx/English.lproj/PrefsWindow.nib/keyedobjects.nib and b/macosx/English.lproj/PrefsWindow.nib/keyedobjects.nib differ diff --git a/macosx/PrefsController.h b/macosx/PrefsController.h index 8e07c0641..a38cb12fd 100644 --- a/macosx/PrefsController.h +++ b/macosx/PrefsController.h @@ -36,7 +36,7 @@ NSToolbar * fToolbar; IBOutlet NSView * fGeneralView, * fTransfersView, * fBandwidthView, * fNetworkView; - IBOutlet NSPopUpButton * fFolderPopUp, * fImportFolderPopUp, + IBOutlet NSPopUpButton * fFolderPopUp, * fIncompleteFolderPopUp, * fImportFolderPopUp, * fDownloadSoundPopUp, * fSeedingSoundPopUp; NSArray * fSounds; @@ -68,8 +68,9 @@ - (void) setCopyTorrents: (id) sender; -- (void) setDownloadLocation: (id) sender; -- (void) folderSheetShow: (id) sender; +- (void) setDownloadLocation: (id) sender; +- (void) folderSheetShow: (id) sender; +- (void) incompleteFolderSheetShow: (id) sender; - (void) setPort: (id) sender; - (void) updatePortStatus; diff --git a/macosx/PrefsController.m b/macosx/PrefsController.m index 420348fe8..341442449 100644 --- a/macosx/PrefsController.m +++ b/macosx/PrefsController.m @@ -44,6 +44,7 @@ - (void) setPrefView: (id) sender; - (void) folderSheetClosed: (NSOpenPanel *) openPanel returnCode: (int) code contextInfo: (void *) info; +- (void) incompleteFolderSheetClosed: (NSOpenPanel *) openPanel returnCode: (int) code contextInfo: (void *) info; - (void) importFolderSheetClosed: (NSOpenPanel *) openPanel returnCode: (int) code contextInfo: (void *) info; @end @@ -396,6 +397,21 @@ @selector(folderSheetClosed:returnCode:contextInfo:) contextInfo: nil]; } +- (void) incompleteFolderSheetShow: (id) sender +{ + NSOpenPanel * panel = [NSOpenPanel openPanel]; + + [panel setPrompt: @"Select"]; + [panel setAllowsMultipleSelection: NO]; + [panel setCanChooseFiles: NO]; + [panel setCanChooseDirectories: YES]; + [panel setCanCreateDirectories: YES]; + + [panel beginSheetForDirectory: nil file: nil types: nil + modalForWindow: [self window] modalDelegate: self didEndSelector: + @selector(incompleteFolderSheetClosed:returnCode:contextInfo:) contextInfo: nil]; +} + - (void) setAutoImport: (id) sender { if ([fDefaults boolForKey: @"AutoImport"]) @@ -508,6 +524,13 @@ } } +- (void) incompleteFolderSheetClosed: (NSOpenPanel *) openPanel returnCode: (int) code contextInfo: (void *) info +{ + if (code == NSOKButton) + [fDefaults setObject: [[openPanel filenames] objectAtIndex: 0] forKey: @"IncompleteDownloadFolder"]; + [fIncompleteFolderPopUp selectItemAtIndex: 0]; +} + - (void) importFolderSheetClosed: (NSOpenPanel *) openPanel returnCode: (int) code contextInfo: (void *) info { if (code == NSOKButton) diff --git a/macosx/Torrent.h b/macosx/Torrent.h index e5e28e960..aa91e429f 100644 --- a/macosx/Torrent.h +++ b/macosx/Torrent.h @@ -39,6 +39,9 @@ BOOL fResumeOnWake; NSDate * fDate; + BOOL fUseIncompleteFolder; + NSString * fDownloadFolder, * fIncompleteFolder; + BOOL fPrivateTorrent, fPublicTorrent; NSString * fPublicTorrentLocation; diff --git a/macosx/Torrent.m b/macosx/Torrent.m index 790afa140..2e046147b 100644 --- a/macosx/Torrent.m +++ b/macosx/Torrent.m @@ -65,6 +65,9 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 if (self) { + fUseIncompleteFolder = [fDefaults boolForKey: @"UseIncompleteDownloadFolder"]; + fIncompleteFolder = [[fDefaults stringForKey: @"IncompleteDownloadFolder"] copy]; + if (!fPublicTorrent) [self trashFile: path]; } @@ -85,9 +88,27 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 if (self) { + //download folders NSString * downloadFolder; if (!(downloadFolder = [history objectForKey: @"DownloadFolder"])) downloadFolder = [[fDefaults stringForKey: @"DownloadFolder"] stringByExpandingTildeInPath]; + + NSNumber * useIncompleteFolder; + if ((useIncompleteFolder = [history objectForKey: @"UseIncompleteFolder"])) + { + if ((fUseIncompleteFolder = [useIncompleteFolder boolValue])) + { + NSString * incompleteFolder; + if (incompleteFolder = [history objectForKey: @"IncompleteFolder"]) + fIncompleteFolder = [incompleteFolder copy]; + else + fIncompleteFolder = [[[fDefaults stringForKey: @"IncompleteDownloadFolder"] + stringByExpandingTildeInPath] copy]; + } + } + else + fUseIncompleteFolder = NO; + [self setDownloadFolder: downloadFolder]; NSString * paused; @@ -105,14 +126,18 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 NSMutableDictionary * history = [NSMutableDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool: fPrivateTorrent], @"PrivateCopy", [NSNumber numberWithBool: fPublicTorrent], @"PublicCopy", - [self downloadFolder], @"DownloadFolder", + fDownloadFolder, @"DownloadFolder", + [NSNumber numberWithBool: fUseIncompleteFolder], @"UseIncompleteFolder", [self isActive] ? @"NO" : @"YES", @"Paused", [self date], @"Date", [NSNumber numberWithInt: fStopRatioSetting], @"StopRatioSetting", [NSNumber numberWithFloat: fRatioLimit], @"RatioLimit", [NSNumber numberWithBool: fWaitToStart], @"WaitToStart", [self orderValue], @"OrderValue", nil]; - + + if (fUseIncompleteFolder) + [history setObject: fIncompleteFolder forKey: @"IncompleteFolder"]; + if (fPrivateTorrent) [history setObject: [self hashString] forKey: @"TorrentHash"]; @@ -128,6 +153,11 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 { tr_torrentClose(fLib, fHandle); + if (fDownloadFolder) + [fDownloadFolder release]; + if (fIncompleteFolder) + [fIncompleteFolder release]; + if (fPublicTorrentLocation) [fPublicTorrentLocation release]; @@ -151,7 +181,13 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 - (void) setDownloadFolder: (NSString *) path { - tr_torrentSetFolder(fHandle, [path UTF8String]); + fDownloadFolder = [path copy]; + + if (!fUseIncompleteFolder || [[NSFileManager defaultManager] fileExistsAtPath: + [path stringByAppendingPathComponent: [self name]]]) + tr_torrentSetFolder(fHandle, [path UTF8String]); + else + tr_torrentSetFolder(fHandle, [fIncompleteFolder UTF8String]); } - (NSString *) downloadFolder @@ -175,7 +211,19 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 //notification when downloading finished if ([self justFinished]) + { + //move file from incomplete folder to download folder + if (fUseIncompleteFolder && ![[self downloadFolder] isEqualToString: fDownloadFolder]) + { + tr_torrentStop(fHandle); + if ([[NSFileManager defaultManager] movePath: [[self downloadFolder] stringByAppendingPathComponent: [self name]] + toPath: [fDownloadFolder stringByAppendingPathComponent: [self name]] handler: nil]) + tr_torrentSetFolder(fHandle, [fDownloadFolder UTF8String]); + tr_torrentStart(fHandle); + } + [[NSNotificationCenter defaultCenter] postNotificationName: @"TorrentFinishedDownloading" object: self]; + } //check to stop for ratio if ([self isSeeding] && ((fStopRatioSetting == RATIO_CHECK && [self ratio] >= fRatioLimit)