development : browse source

Changeset 126

Show
Ignore:
Timestamp:
07/25/2007 09:32:31 PM (1 month ago)
Author:
wbyoung
Message:

added check for available disk space

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Senuti.xcodeproj/project.pbxproj

    r121 r126  
    141141                8B52DA8C0B74E68B00B5DDAA /* SETrackListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B52DA8A0B74E68B00B5DDAA /* SETrackListViewController.m */; }; 
    142142                8B52DAA40B74E79100B5DDAA /* TrackList.nib in Resources */ = {isa = PBXBuildFile; fileRef = 8B52DAA30B74E79100B5DDAA /* TrackList.nib */; }; 
     143                8B5CF2600C5814C60087A369 /* SEPromise.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B5CF25E0C5814C60087A369 /* SEPromise.h */; }; 
     144                8B5CF2610C5814C60087A369 /* SEPromise.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B5CF25F0C5814C60087A369 /* SEPromise.m */; }; 
    143145                8B63DD1F066C331100C9C773 /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B63DD1E066C331100C9C773 /* QuickTime.framework */; }; 
    144146                8B767B220C45C48500AC48C5 /* another_device.png in Resources */ = {isa = PBXBuildFile; fileRef = 8B767B210C45C48500AC48C5 /* another_device.png */; }; 
     
    419421                8B52DA8A0B74E68B00B5DDAA /* SETrackListViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SETrackListViewController.m; path = Source/SETrackListViewController.m; sourceTree = "<group>"; }; 
    420422                8B52DAA30B74E79100B5DDAA /* TrackList.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = TrackList.nib; path = Resources/TrackList.nib; sourceTree = "<group>"; }; 
     423                8B5CF25E0C5814C60087A369 /* SEPromise.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SEPromise.h; path = Source/SEPromise.h; sourceTree = "<group>"; }; 
     424                8B5CF25F0C5814C60087A369 /* SEPromise.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SEPromise.m; path = Source/SEPromise.m; sourceTree = "<group>"; }; 
    421425                8B63DD1E066C331100C9C773 /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = "<absolute>"; }; 
    422426                8B767B210C45C48500AC48C5 /* another_device.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = another_device.png; path = Resources/another_device.png; sourceTree = "<group>"; }; 
     
    608612                                8B52CA6C0B72DBF600B5DDAA /* SEObject.h */, 
    609613                                8B52CA6D0B72DBF600B5DDAA /* SEObject.m */, 
     614                                8B5CF25D0C5814AF0087A369 /* General */, 
    610615                                8BE7972F0C4F7FAD00CC9357 /* Threading */, 
    611616                        ); 
     
    868873                        ); 
    869874                        name = "Track List"; 
     875                        sourceTree = "<group>"; 
     876                }; 
     877                8B5CF25D0C5814AF0087A369 /* General */ = { 
     878                        isa = PBXGroup; 
     879                        children = ( 
     880                                8B5CF25E0C5814C60087A369 /* SEPromise.h */, 
     881                                8B5CF25F0C5814C60087A369 /* SEPromise.m */, 
     882                        ); 
     883                        name = General; 
    870884                        sourceTree = "<group>"; 
    871885                }; 
     
    10201034                                8BE7972B0C4F7FA300CC9357 /* SEConsumer.h in Headers */, 
    10211035                                8BE799870C50E0C800CC9357 /* SEBoundMenu.h in Headers */, 
     1036                                8B5CF2600C5814C60087A369 /* SEPromise.h in Headers */, 
    10221037                        ); 
    10231038                        runOnlyForDeploymentPostprocessing = 0; 
     
    13131328                                8BE7972C0C4F7FA300CC9357 /* SEConsumer.m in Sources */, 
    13141329                                8BE799880C50E0C800CC9357 /* SEBoundMenu.m in Sources */, 
     1330                                8B5CF2610C5814C60087A369 /* SEPromise.m in Sources */, 
    13151331                        ); 
    13161332                        runOnlyForDeploymentPostprocessing = 0; 
  • trunk/Source/SECopyController.m

    r125 r126  
    2626 
    2727#import "SEConsumer.h" 
     28#import "SEPromise.h" 
    2829#import "SETrackProtocol.h" 
    2930#import "SEPlaylistProtocol.h" 
     
    9293        } 
    9394         
     95        SECopyTrack *track; 
     96        NSEnumerator *tracksEnumerator; 
    9497        NSArray *copyTracks = [SECopyTrack copyTracksFromArray:tracks]; 
    9598        NSMutableArray *existingTracks = [NSMutableArray array]; 
     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        } 
    96151         
    97152        // calculate destination 
     
    103158                destination = [[[NSUserDefaults standardUserDefaults] objectForKey:SECopyLocationPreferenceKey] stringByExpandingTildeInPath]; 
    104159        } 
    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         
    106182        // safely ensure destination exists 
    107183        while (![[NSFileManager defaultManager] safelyEnsurePath:destination]) { 
    108184                FSDLog(@"Failed to create copy path \"%@\"", destination); 
    109                  
    110185                int alertResult; 
    111186                alertResult = NSRunAlertPanel(FSLocalizedString(@"Unable to create folder", @"iTunes add timeout - title"), 
     
    117192                if (alertResult == NSAlertAlternateReturn) { return; } 
    118193        } 
    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]; 
    174197         
    175198        // actually copy 
  • trunk/Source/SECopyTrack.h

    r121 r126  
    5353- (void)setDuplicateHandling:(SEDuplicateHandlingType)type; 
    5454 
    55 - (NSString *)destinationPath; 
    56 - (void)setDestinationPath:(NSString *)path; 
     55- (NSString *)destinationPath; // Promise Compliant 
     56- (void)setDestinationPath:(id)path; 
    5757 
    5858- (id <SELibraryProtocol>)destinationLibrary; 
  • trunk/Source/SECopyTrack.m

    r121 r126  
    1818#import "SELibraryProtocol.h" 
    1919#import "SEPlaylistProtocol.h" 
     20#import "SEPromise.h" 
    2021 
    2122@implementation SECopyTrack 
     
    9798 
    9899- (NSString *)destinationPath { 
    99         return destinationPath; 
     100        if ([destinationPath isKindOfClass:[SEPromise class]]) { 
     101                [self setDestinationPath:[(SEPromise *)destinationPath object]]; 
     102                return [self destinationPath]; 
     103        } else { 
     104                return destinationPath; 
     105        } 
    100106} 
    101107