| | 99 | SEPromise *promise = [SEPromise promise]; |
|---|
| | 100 | double requiredSpace = 0; |
|---|
| | 101 | |
|---|
| | 102 | // other preferences |
|---|
| | 103 | SEDuplicateHandlingType duplicateType = [[NSUserDefaults standardUserDefaults] integerForKey:SEDuplicateFileHandlingPreferenceKey]; |
|---|
| | 104 | BOOL organize = [[NSUserDefaults standardUserDefaults] boolForKey:SEOrganizeCopiedTracksPreferenceKey]; |
|---|
| | 105 | |
|---|
| | 106 | // defaults for when adding a track from an iPod |
|---|
| | 107 | id defaultAddToLibrary = [[NSUserDefaults standardUserDefaults] boolForKey:SEAddToITunesPreferenceKey] ? |
|---|
| | 108 | [[senuti libraryController] iTunesLibrary] : |
|---|
| | 109 | nil; |
|---|
| | 110 | id defaultAddToPlaylist = [[NSUserDefaults standardUserDefaults] boolForKey:SEAddToPlaylistPreferenceKey] ? |
|---|
| | 111 | [[[[[senuti libraryController] iTunesLibrary] playlists] filter:@selector(name) |
|---|
| | 112 | where:[[NSUserDefaults standardUserDefaults] objectForKey:SEAddToPlaylistNamedPreferenceKey]] firstObject] : |
|---|
| | 113 | nil; |
|---|
| | 114 | |
|---|
| | 115 | // set information on each track |
|---|
| | 116 | tracksEnumerator = [copyTracks objectEnumerator]; |
|---|
| | 117 | while (track = [tracksEnumerator nextObject]) { |
|---|
| | 118 | |
|---|
| | 119 | // check for similar tracks |
|---|
| | 120 | id <SETrackProtocol> similarTrack; |
|---|
| | 121 | NSEnumerator *similarTracksEnumerator = [[track similarTracks] objectEnumerator]; |
|---|
| | 122 | while (similarTrack = [similarTracksEnumerator nextObject]) { |
|---|
| | 123 | if (library == [similarTrack library]) { |
|---|
| | 124 | [track setReference:similarTrack]; |
|---|
| | 125 | [existingTracks addObject:track]; |
|---|
| | 126 | break; |
|---|
| | 127 | } |
|---|
| | 128 | } |
|---|
| | 129 | |
|---|
| | 130 | [track setDestinationPath:promise]; |
|---|
| | 131 | [track setDestinationLibrary:library]; |
|---|
| | 132 | [track setDestinationPlaylist:playlist]; |
|---|
| | 133 | [track setDuplicateHandling:duplicateType]; |
|---|
| | 134 | [track setOrganize:organize]; |
|---|
| | 135 | |
|---|
| | 136 | if ([(NSObject *)[track library] isKindOfClass:[SEIPodLibrary class]]) { |
|---|
| | 137 | if (!library) { [track setDestinationLibrary:defaultAddToLibrary]; } |
|---|
| | 138 | if (!playlist) { [track setDestinationPlaylist:defaultAddToPlaylist]; } |
|---|
| | 139 | } |
|---|
| | 140 | |
|---|
| | 141 | } |
|---|
| | 142 | |
|---|
| | 143 | // if there were similar tracks, alert about it |
|---|
| | 144 | if ([existingTracks count] > 0) { |
|---|
| | 145 | int code = [SEReferenceHandlingWindowController runWithTracks:existingTracks |
|---|
| | 146 | playlist:playlist |
|---|
| | 147 | modalForWindow:[[senuti interfaceController] mainWindow]]; |
|---|
| | 148 | // bail out if they cancel |
|---|
| | 149 | if (code != NSRunContinuesResponse) { return; } |
|---|
| | 150 | } |
|---|
| 105 | | |
|---|
| | 160 | |
|---|
| | 161 | // calculate required disk space |
|---|
| | 162 | tracksEnumerator = [copyTracks objectEnumerator]; |
|---|
| | 163 | while (track = [tracksEnumerator nextObject]) { |
|---|
| | 164 | if (![track makeReference]) { |
|---|
| | 165 | requiredSpace += [track size] / 1024.0 / 1024.0; |
|---|
| | 166 | } |
|---|
| | 167 | } |
|---|
| | 168 | |
|---|
| | 169 | // check that there's enough disk space |
|---|
| | 170 | while (requiredSpace > [[NSFileManager defaultManager] freeSpaceOnDeviceContainingPath:destination]) { |
|---|
| | 171 | FSDLog(@"Not enough space at \"%@\"", destination); |
|---|
| | 172 | int alertResult; |
|---|
| | 173 | alertResult = NSRunAlertPanel(FSLocalizedString(@"Not enough free disk space", @"Disk full - title"), |
|---|
| | 174 | [NSString stringWithFormat:FSLocalizedString(@"To copy the tracks you requested, %0.2f MB of free disk space is required. Please free more space or try copying to a different disk.", @"Disk full - message"), requiredSpace], |
|---|
| | 175 | FSLocalizedString(@"Try Again", nil), |
|---|
| | 176 | FSLocalizedString(@"Cancel", nil), |
|---|
| | 177 | nil); |
|---|
| | 178 | // stop trying to copy |
|---|
| | 179 | if (alertResult == NSAlertAlternateReturn) { return; } |
|---|
| | 180 | } |
|---|
| | 181 | |
|---|
| 119 | | |
|---|
| 120 | | // other preferences |
|---|
| 121 | | SEDuplicateHandlingType duplicateType = [[NSUserDefaults standardUserDefaults] integerForKey:SEDuplicateFileHandlingPreferenceKey]; |
|---|
| 122 | | BOOL organize = [[NSUserDefaults standardUserDefaults] boolForKey:SEOrganizeCopiedTracksPreferenceKey]; |
|---|
| 123 | | |
|---|
| 124 | | |
|---|
| 125 | | // defaults for when adding a track from an iPod |
|---|
| 126 | | id defaultAddToLibrary = [[NSUserDefaults standardUserDefaults] boolForKey:SEAddToITunesPreferenceKey] ? |
|---|
| 127 | | [[senuti libraryController] iTunesLibrary] : |
|---|
| 128 | | nil; |
|---|
| 129 | | id defaultAddToPlaylist = [[NSUserDefaults standardUserDefaults] boolForKey:SEAddToPlaylistPreferenceKey] ? |
|---|
| 130 | | [[[[[senuti libraryController] iTunesLibrary] playlists] filter:@selector(name) |
|---|
| 131 | | where:[[NSUserDefaults standardUserDefaults] objectForKey:SEAddToPlaylistNamedPreferenceKey]] firstObject] : |
|---|
| 132 | | nil; |
|---|
| 133 | | |
|---|
| 134 | | // check for similar tracks |
|---|
| 135 | | SECopyTrack *track; |
|---|
| 136 | | id <SETrackProtocol> similarTrack; |
|---|
| 137 | | NSEnumerator *tracksEnumerator = [copyTracks objectEnumerator]; |
|---|
| 138 | | while (track = [tracksEnumerator nextObject]) { |
|---|
| 139 | | NSEnumerator *similarTracksEnumerator = [[track similarTracks] objectEnumerator]; |
|---|
| 140 | | while (similarTrack = [similarTracksEnumerator nextObject]) { |
|---|
| 141 | | if (library == [similarTrack library]) { |
|---|
| 142 | | [track setReference:similarTrack]; |
|---|
| 143 | | [existingTracks addObject:track]; |
|---|
| 144 | | break; |
|---|
| 145 | | } |
|---|
| 146 | | } |
|---|
| 147 | | |
|---|
| 148 | | [track setDestinationPath:destination]; |
|---|
| 149 | | [track setDestinationLibrary:library]; |
|---|
| 150 | | [track setDestinationPlaylist:playlist]; |
|---|
| 151 | | [track setDuplicateHandling:duplicateType]; |
|---|
| 152 | | [track setOrganize:organize]; |
|---|
| 153 | | |
|---|
| 154 | | if ([(NSObject *)[track library] isKindOfClass:[SEIPodLibrary class]]) { |
|---|
| 155 | | if (!library) { [track setDestinationLibrary:defaultAddToLibrary]; } |
|---|
| 156 | | if (!playlist) { [track setDestinationPlaylist:defaultAddToPlaylist]; } |
|---|
| 157 | | } |
|---|
| 158 | | } |
|---|
| 159 | | |
|---|
| 160 | | #warning move create destination folder to here |
|---|
| 161 | | |
|---|
| 162 | | #warning check available disk space |
|---|
| 163 | | // FSLog(@"free space on %@: %f", destination, [[NSFileManager defaultManager] freeSpaceOnDeviceContainingPath:destination] / 1024.0); |
|---|
| 164 | | |
|---|
| 165 | | |
|---|
| 166 | | // if there were similar tracks, alert about it |
|---|
| 167 | | if ([existingTracks count] > 0) { |
|---|
| 168 | | int code = [SEReferenceHandlingWindowController runWithTracks:existingTracks |
|---|
| 169 | | playlist:playlist |
|---|
| 170 | | modalForWindow:[[senuti interfaceController] mainWindow]]; |
|---|
| 171 | | // bail out if they cancel |
|---|
| 172 | | if (code != NSRunContinuesResponse) { return; } |
|---|
| 173 | | } |
|---|
| | 194 | |
|---|
| | 195 | // update the promise |
|---|
| | 196 | [promise setObject:destination]; |
|---|