Changeset 2 for trunk/SapphireApplianceController.m
- Timestamp:
- 06/22/07 16:29:28 (5 years ago)
- Files:
-
- 1 modified
-
trunk/SapphireApplianceController.m (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/SapphireApplianceController.m
r1 r2 10 10 #import <BackRow/BackRow.h> 11 11 12 #define FILES_KEY @"Files" 13 #define DIRS_KEY @"Dirs" 14 15 #define MODIFIED_KEY @"Modified" 16 12 17 @implementation NSString (episodeSorting) 13 18 … … 20 25 @end 21 26 27 @interface SapphireApplianceController (private) 28 - (BOOL)pruneMetaDataWithFiles:(NSArray *)files andDirectories:(NSArray *)dirs; 29 - (BOOL)updateMetaDataWithFiles:(NSArray *)files andDirectories:(NSArray *)dirs; 30 @end 31 22 32 @implementation SapphireApplianceController 23 33 24 34 // Static set of file extensions to filter 25 35 static NSArray *extensions = nil; 36 static NSString *metaPath = nil; 37 static NSMutableDictionary *mainMetaDictionary = nil; 26 38 27 39 +(void)load 28 40 { 29 41 extensions = [[NSArray alloc] initWithObjects:@"avi", @"mov", @"mpg", @"wmv", nil]; 42 metaPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Application Support/Sapphire/metaData.plist"] retain]; 43 mainMetaDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:metaPath]; 44 if(mainMetaDictionary == nil) 45 { 46 mainMetaDictionary = [[NSMutableDictionary alloc] init]; 47 } 30 48 } 31 49 … … 33 51 { 34 52 return (@"net.pmerrill.recursivemenu.root" ); 53 } 54 55 static void makeParentDir(NSFileManager *manager, NSString *dir) 56 { 57 NSString *parent = [dir stringByDeletingLastPathComponent]; 58 59 BOOL isDir; 60 if(![manager fileExistsAtPath:parent isDirectory:&isDir]) 61 makeParentDir(manager, parent); 62 else if(!isDir) 63 //Can't work with this 64 return; 65 66 [manager createDirectoryAtPath:dir attributes:nil]; 67 } 68 69 + (void)writeMetaData 70 { 71 makeParentDir([NSFileManager defaultManager], [metaPath stringByDeletingLastPathComponent]); 72 [mainMetaDictionary writeToFile:metaPath atomically:YES]; 35 73 } 36 74 … … 46 84 return ( self ); 47 85 */ 48 return ( [self initWithScene: scene directory:[NSHomeDirectory() stringByAppendingPathComponent:@"Movies"] ] );49 [[NSFileManager defaultManager] subpathsAtPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Movies"]]; 50 } 51 52 - (id) initWithScene: (BRRenderScene *) scene directory:(NSString *)dir 53 { 86 return ( [self initWithScene: scene directory:[NSHomeDirectory() stringByAppendingPathComponent:@"Movies"] metaData:mainMetaDictionary] ); 87 } 88 89 - (id) initWithScene: (BRRenderScene *) scene directory: (NSString *) dir metaData: (NSMutableDictionary *)meta; 90 { 91 BOOL modifiedMeta = NO; 54 92 if ( [super initWithScene: scene] == nil ) return ( nil ); 55 93 _dir = [dir retain]; 56 94 57 95 _names = [NSMutableArray new]; 96 _metaData = [meta retain]; 97 _metaFiles = [meta objectForKey:FILES_KEY]; 98 if(_metaFiles == nil) 99 { 100 _metaFiles = [NSMutableDictionary dictionary]; 101 [meta setObject:_metaFiles forKey:FILES_KEY]; 102 modifiedMeta = YES; 103 } 104 _metaDirs = [meta objectForKey:DIRS_KEY]; 105 if(_metaDirs == nil) 106 { 107 _metaDirs = [NSMutableDictionary dictionary]; 108 [meta setObject:_metaDirs forKey:DIRS_KEY]; 109 modifiedMeta = YES; 110 } 58 111 59 112 NSMutableArray *files = [NSMutableArray array]; … … 75 128 [_names addObject:name]; 76 129 } 130 modifiedMeta |= [self pruneMetaDataWithFiles:files andDirectories:_names]; 131 modifiedMeta |= [self updateMetaDataWithFiles:files andDirectories:_names]; 77 132 [_names sortUsingSelector:@selector(episodeCompare:)]; 78 133 [files sortUsingSelector:@selector(episodeCompare:)]; 79 134 [_names addObjectsFromArray:files]; 135 136 if(modifiedMeta) 137 [SapphireApplianceController writeMetaData]; 80 138 81 139 // set the datasource *after* you've setup your array … … 89 147 // always remember to deallocate your resources 90 148 [_dir release]; 91 [_names release] ; 149 [_names release]; 150 [_metaData release]; 92 151 [super dealloc]; 93 152 } … … 98 157 BOOL isDir = NO; 99 158 return [[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir] && isDir; 159 } 160 161 - (BOOL)pruneMetaDataWithFiles:(NSArray *)files andDirectories:(NSArray *)dirs 162 { 163 BOOL ret = NO; 164 NSSet *existingSet = [NSSet setWithArray:files]; 165 NSArray *metaArray = [_metaFiles allKeys]; 166 NSMutableSet *pruneSet = [NSMutableSet setWithArray:metaArray]; 167 168 [pruneSet minusSet:existingSet]; 169 if([pruneSet anyObject] != nil) 170 { 171 NSEnumerator *pruneEnum = [pruneSet objectEnumerator]; 172 NSString *pruneKey = nil; 173 while((pruneKey = [pruneEnum nextObject]) != nil) 174 [_metaFiles removeObjectForKey:pruneKey]; 175 ret = YES; 176 } 177 178 existingSet = [NSSet setWithArray:dirs]; 179 metaArray = [_metaDirs allKeys]; 180 pruneSet = [NSMutableSet setWithArray:metaArray]; 181 182 [pruneSet minusSet:existingSet]; 183 if([pruneSet anyObject] != nil) 184 { 185 NSEnumerator *pruneEnum = [pruneSet objectEnumerator]; 186 NSString *pruneKey = nil; 187 while((pruneKey = [pruneEnum nextObject]) != nil) 188 [_metaDirs removeObjectForKey:pruneKey]; 189 ret = YES; 190 } 191 192 return ret; 193 } 194 195 - (BOOL)updateMetaDataWithFiles:(NSArray *)files andDirectories:(NSArray *)dirs 196 { 197 BOOL ret = NO; 198 NSArray *metaArray = [_metaDirs allKeys]; 199 NSSet *metaSet = [NSSet setWithArray:metaArray]; 200 NSMutableSet *newSet = [NSMutableSet setWithArray:dirs]; 201 202 [newSet minusSet:metaSet]; 203 if([newSet anyObject] != nil) 204 { 205 NSEnumerator *newEnum = [newSet objectEnumerator]; 206 NSString *newKey = nil; 207 while((newKey = [newEnum nextObject]) != nil) 208 [_metaDirs setObject:[NSMutableDictionary dictionary] forKey:newKey]; 209 ret = YES; 210 } 211 212 NSEnumerator *fileEnum = [files objectEnumerator]; 213 NSString *fileName = nil; 214 NSMutableArray *newFiles = [NSMutableArray array]; 215 while((fileName = [fileEnum nextObject]) != nil) 216 { 217 NSDictionary *fileMeta = [_metaFiles objectForKey:fileName]; 218 if(fileMeta == nil) 219 [newFiles addObject:fileName]; 220 else 221 { 222 NSString *path = [_dir stringByAppendingPathComponent:fileName]; 223 NSDictionary *props = [[NSFileManager defaultManager] fileAttributesAtPath:path traverseLink:YES]; 224 NSDate *modDate = [props objectForKey:NSFileModificationDate]; 225 if([[fileMeta objectForKey:MODIFIED_KEY] intValue] != [modDate timeIntervalSince1970]) 226 [newFiles addObject:fileName]; 227 } 228 } 229 //Do something in a thread to process newFiles 230 231 return ret; 100 232 } 101 233 … … 229 361 if([self isDirectory:[_dir stringByAppendingPathComponent:name]]) 230 362 { 231 id controller = [[SapphireApplianceController alloc] initWithScene:[self scene] directory:[_dir stringByAppendingPathComponent:name] ];363 id controller = [[SapphireApplianceController alloc] initWithScene:[self scene] directory:[_dir stringByAppendingPathComponent:name] metaData:[_metaDirs objectForKey:name]]; 232 364 [[self stack] pushController:controller]; 233 365 [controller release];
