From 29009902b0125f5508669cceb3a31f8b5d648c3e Mon Sep 17 00:00:00 2001 From: "techdragon.nguyen@gmail.com" Date: Thu, 5 Jan 2012 09:29:53 +0000 Subject: [PATCH] finishing up some file system handling functions for iOS. This should make updates and file management easier for iOS users. --- JGE/src/iOS/wagicAppDelegate.h | 2 + JGE/src/iOS/wagicAppDelegate.m | 134 ++++++++++++++++-- .../UI/WagicDownloadProgressViewController.h | 2 + .../UI/WagicDownloadProgressViewController.m | 56 ++------ 4 files changed, 138 insertions(+), 56 deletions(-) diff --git a/JGE/src/iOS/wagicAppDelegate.h b/JGE/src/iOS/wagicAppDelegate.h index deb64f090..1d08212f1 100755 --- a/JGE/src/iOS/wagicAppDelegate.h +++ b/JGE/src/iOS/wagicAppDelegate.h @@ -16,6 +16,8 @@ - (void) handleWEngineCommand:(NSString *) command withParameter: (NSString *) parameter; - (void) handleWEngineCommand:(NSString *) command withUIParameters: (CGFloat) x yCoordinate: (CGFloat) y width: (CGFloat) width height: (CGFloat) height; +- (void) unpackageResources: (NSString *) folderName pathPrefixName: (NSString *) pathPrefixName; + @property (nonatomic, retain) IBOutlet UIWindow *window; @property (nonatomic, retain) EAGLViewController *glViewController; @property (nonatomic, retain) WagicDownloadProgressViewController *wagicDownloadController; diff --git a/JGE/src/iOS/wagicAppDelegate.m b/JGE/src/iOS/wagicAppDelegate.m index 39a9a024b..e4197c948 100755 --- a/JGE/src/iOS/wagicAppDelegate.m +++ b/JGE/src/iOS/wagicAppDelegate.m @@ -11,16 +11,60 @@ @synthesize wagicDownloadController; @synthesize hostReach, wifiReach, internetReach; - - (void) downloadResources { wagicDownloadController = [[WagicDownloadProgressViewController alloc] init]; - + [wagicDownloadController startDownload: @"core"]; + [self.window addSubview: wagicDownloadController.view]; [self.window makeKeyWindow]; } +/* unpackage the zip file and delete it afterwards */ +- (void) unpackageResources: (NSString *) folderName pathPrefixName: (NSString *) pathNamePrefix +{ + NSString *pathPrefix = nil; + if ( pathNamePrefix == nil ) // default to User + pathPrefix = @"User"; + else + pathPrefix = pathNamePrefix; + + NSError *error = nil; + + NSFileManager *fm = [NSFileManager defaultManager]; + NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); + NSString *userDocumentsDirectory = [paths objectAtIndex:0]; + NSString *downloadFilePath = [userDocumentsDirectory stringByAppendingString: [NSString stringWithFormat: @"/%@/%@.zip", pathPrefix, folderName]]; + + ZipArchive *za = [[ZipArchive alloc] init]; + if ([za UnzipOpenFile: downloadFilePath]) + { + NSString *destinationFilePath = [NSString stringWithFormat: @"%@/%@/",userDocumentsDirectory, pathPrefix]; + NSLog(@"Unzipping %@ to %@", downloadFilePath, destinationFilePath); + BOOL ret = [za UnzipFileTo: destinationFilePath overWrite: YES]; + if (ret == NO) + { + // some error occurred + NSLog(@"An Error occurred while unpacking zip file."); + } + [za UnzipCloseFile]; + + if (ret == YES) + { + // delete the archive + [fm removeItemAtPath: downloadFilePath error: &error]; + if (error != nil) + { + NSLog(@"error occurred while trying to delete zip file! %@\n%@", downloadFilePath, [error localizedDescription] ); + } + } + } + [za release], za = nil; + +} + + - (NSString *) getDirContents: (NSString *) path { NSFileManager *fileManager = [NSFileManager defaultManager]; @@ -50,12 +94,12 @@ } /** - check for any zip files dropped into the documents directory. If so move them into the "User" directory. - check for a "core" zip file in the Res directory. If it exists, then return YES. Otherwise, return NO. + check for any zip files dropped into the documents directory before loading the game. + If so, move the "core" files into the "Res" directory and move all other zip files into the "User" directory. + Check for a "core" zip file in the Res directory. If it exists, then return YES. Otherwise, return NO. */ - -- (BOOL) hasResourceFiles +- (void) initializeResources { NSFileManager *fileManager = [NSFileManager defaultManager]; @@ -64,6 +108,8 @@ NSArray *docsPathContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath: docsPath error:nil]; NSCompoundPredicate *compoundPredicate = [[NSCompoundPredicate alloc] initWithType:NSAndPredicateType subpredicates: [NSArray arrayWithObjects: [NSPredicate predicateWithFormat:@"self ENDSWITH '.zip'"], [NSPredicate predicateWithFormat:@"NOT (self BEGINSWITH 'core_')"], nil]]; + NSArray *coreFiles = [docsPathContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self BEGINSWITH 'core_'"]]; + NSArray *resourceZipFiles = [docsPathContents filteredArrayUsingPredicate: compoundPredicate]; NSString *userPath = [NSString stringWithFormat: @"%@/User", docsPath]; NSString *resPath = [NSString stringWithFormat: @"%@/Res", docsPath]; @@ -78,17 +124,38 @@ NSString *newPath = [NSString stringWithFormat: @"%@/%@", userPath, zipFile]; [fileManager moveItemAtPath: oldPath toPath:newPath error: &error]; + NSLog(@"Moving %@ to %@", oldPath, newPath); if ( error != nil ) { NSLog(@"Error happened while trying to move %@ to %@: \n%@", oldPath, newPath, [error localizedDescription]); error = nil; } } + + for (NSString *zipFile in coreFiles) + { + NSString *oldPath = [NSString stringWithFormat: @"%@/%@", docsPath, zipFile]; + NSString *newPath = [NSString stringWithFormat: @"%@/%@", resPath, zipFile]; + + [fileManager moveItemAtPath: oldPath toPath:newPath error: &error]; + NSLog(@"Moving %@ to %@", oldPath, newPath); + if ( error != nil ) + { + NSLog(@"Error happened while trying to move %@ to %@: \n%@", oldPath, newPath, [error localizedDescription]); + error = nil; + } + } +} + +- (BOOL) hasResourceFiles +{ + NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); + NSString *docsPath = [paths objectAtIndex: 0]; + NSString *resPath = [NSString stringWithFormat: @"%@/Res", docsPath]; NSArray *resDirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath: resPath error:nil]; NSArray *coreFiles = [resDirContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self BEGINSWITH 'core_'"]]; - [self createManifest: docsPath]; if ([coreFiles count] > 0) { return YES; @@ -98,6 +165,53 @@ } +- (void)preGameInitialization +{ + NSString *docsPath = [NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0]; + NSFileManager *fm = [NSFileManager defaultManager]; + NSString *userPath = [docsPath stringByAppendingString: @"/User"]; + + NSArray *userDirectories = [fm contentsOfDirectoryAtPath: userPath error: nil]; + + for (NSString *userFilename in userDirectories) + { + NSString *userPathname = [userPath stringByAppendingFormat: @"/%@", userFilename]; + NSString *zipFileName = [userPathname stringByAppendingString: @".zip"]; + + if ([[fm attributesOfItemAtPath: userPathname error: nil] objectForKey: NSFileType] == NSFileTypeDirectory && ([fm fileExistsAtPath:zipFileName])) + { + [self unpackageResources: userFilename pathPrefixName: @"User"]; + [fm removeItemAtPath: zipFileName error: nil]; + } + + else if ( [userFilename hasPrefix: @"ai_decks"] ) // special case to allow manual override of AI decks in User directory + { + [self unpackageResources: @"ai_decks" pathPrefixName: @"User/ai/baka"]; + } + } + // scan for deck*.txt and collection.dat as well as options.txt in the Documents directory and copy them into the player directory + NSArray *playerDataFilePredicates = [NSArray arrayWithObjects: + [NSPredicate predicateWithFormat: @"SELF BEGINSWITH[cd] 'deck' AND SELF ENDSWITH '.txt'"], + [NSPredicate predicateWithFormat: @"SELF BEGINSWITH[cd] 'options' AND SELF ENDSWITH '.txt'"], + [NSPredicate predicateWithFormat: @"SELF BEGINSWITH[cd] 'tasks' AND SELF ENDSWITH '.dat'"], + [NSPredicate predicateWithFormat: @"SELF BEGINSWITH[cd] 'collection' AND SELF ENDSWITH '.dat'"], nil]; + + NSCompoundPredicate *playerDataPredicate = [[NSCompoundPredicate alloc] initWithType:NSOrPredicateType subpredicates: playerDataFilePredicates]; + NSArray *playerDataFiles = [[fm contentsOfDirectoryAtPath: docsPath error: nil] filteredArrayUsingPredicate: playerDataPredicate]; + + for (NSString *file in playerDataFiles) + { + NSString *fromPath = [docsPath stringByAppendingFormat: @"/%@", file]; + NSString *toPath = [docsPath stringByAppendingFormat: @"/User/player/%@", [file lowercaseString]]; + [fm moveItemAtPath: fromPath toPath: toPath error: nil]; + } + + [self createManifest: docsPath]; + + [[NSNotificationCenter defaultCenter] postNotificationName: @"readyToStartGame" object: nil]; +} + + - (void) startGame { if (glViewController != nil) @@ -110,6 +224,7 @@ [self.window addSubview:self.glViewController.view]; NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter]; + [dnc removeObserver: self name: @"intializeGame" object: nil]; [dnc removeObserver: self name: @"readyToStartGame" object: nil]; } @@ -145,8 +260,10 @@ [self setupNetworkListeners]; NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter]; + [dnc addObserver:self selector:@selector(preGameInitialization) name:@"initializeGame" object: nil]; [dnc addObserver:self selector:@selector(startGame) name:@"readyToStartGame" object: nil]; + [self initializeResources]; // check to see if the Res folder exists. If it does continue // otherwise bring up the download dialog and download the core files // once downloaded, extract the files and kick off the game. @@ -157,7 +274,7 @@ } else { - [self startGame]; + [self preGameInitialization]; } [self.window setBackgroundColor: [UIColor blackColor]]; @@ -233,7 +350,6 @@ } else if ([command isEqualToString: @"combatGuiEndDamage"]) { - [glViewController removeOkButtonListener]; } } diff --git a/projects/mtg/iOS/UI/WagicDownloadProgressViewController.h b/projects/mtg/iOS/UI/WagicDownloadProgressViewController.h index d830a50fb..5ff6a63f8 100644 --- a/projects/mtg/iOS/UI/WagicDownloadProgressViewController.h +++ b/projects/mtg/iOS/UI/WagicDownloadProgressViewController.h @@ -13,6 +13,8 @@ } +- (void) startDownload: (NSString *) downloadType; + @property (nonatomic, retain) UITextView *downloadMessageStatus; @property (nonatomic, retain) UIProgressView *downloadProgressView; diff --git a/projects/mtg/iOS/UI/WagicDownloadProgressViewController.m b/projects/mtg/iOS/UI/WagicDownloadProgressViewController.m index 111ac501e..33f6d1e2d 100644 --- a/projects/mtg/iOS/UI/WagicDownloadProgressViewController.m +++ b/projects/mtg/iOS/UI/WagicDownloadProgressViewController.m @@ -8,7 +8,6 @@ #import "WagicDownloadProgressViewController.h" #import "wagicAppDelegate.h" -#import "ZipArchive.h" #import "ASIHTTPRequest.h" #import "QuartzCore/QuartzCore.h" @@ -39,43 +38,6 @@ static NSString *kDownloadFileName = @"core_017_iOS.zip"; } -// No longer needed. -- (void) unpackageResources: (NSString *) folderName -{ - [self.downloadMessageStatus setText: [NSString stringWithFormat: @"Updating User Game Resource Files: %@", folderName]]; - NSError *error = nil; - - NSFileManager *fm = [NSFileManager defaultManager]; - NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); - NSString *userDocumentsDirectory = [paths objectAtIndex:0]; - NSString *downloadFilePath = [userDocumentsDirectory stringByAppendingString: [NSString stringWithFormat: @"/%@.zip", folderName]]; - - ZipArchive *za = [[ZipArchive alloc] init]; - if ([za UnzipOpenFile: downloadFilePath]) - { - BOOL ret = [za UnzipFileTo: [NSString stringWithFormat: @"%@/User/",userDocumentsDirectory] overWrite: YES]; - if (ret == NO) - { - // some error occurred - NSLog(@"An Error occurred while unpacking zip file."); - } - [za UnzipCloseFile]; - - if (ret == YES) - { - // delete the archive - [fm removeItemAtPath: downloadFilePath error: &error]; - if (error != nil) - { - NSLog(@"error occurred while trying to delete zip file! %@\n%@", downloadFilePath, [error localizedDescription] ); - } - } - } - [za release], za = nil; - -} - - - (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { // the user clicked one of the OK/Cancel buttons if (buttonIndex == 0 && [[actionSheet buttonTitleAtIndex: 0] isEqualToString: @"Retry Download"]) @@ -90,6 +52,14 @@ static NSString *kDownloadFileName = @"core_017_iOS.zip"; - (void) startDownload: (NSString *) downloadType { + [self.downloadMessageStatus setText: [NSString stringWithFormat: @"Please wait while the %@ files are being downloaded.", downloadType]]; + + downloadProgressView = [[UIProgressView alloc] initWithProgressViewStyle: UIProgressViewStyleDefault]; + [self.downloadProgressView setFrame: CGRectMake(0, 0, 250, 50)]; + [self.downloadProgressView setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ]; + + [self.view addSubview: downloadProgressView]; + NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString *systemResourceDirectory = [[paths objectAtIndex:0] stringByAppendingString: @"/Res"]; @@ -128,7 +98,7 @@ static NSString *kDownloadFileName = @"core_017_iOS.zip"; [request setCompletionBlock:^{ wagicAppDelegate *appDelegate = (wagicAppDelegate *)[[UIApplication sharedApplication] delegate]; NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter]; - [dnc postNotificationName:@"readyToStartGame" object: appDelegate]; + [dnc postNotificationName:@"initializeGame" object: appDelegate]; }]; [request setFailedBlock:^{ @@ -177,15 +147,7 @@ static NSString *kDownloadFileName = @"core_017_iOS.zip"; else [self.downloadMessageStatus setFont: [UIFont systemFontOfSize: 35]]; - [self.downloadMessageStatus setText: @"Please wait while the core files are being downloaded."]; - - downloadProgressView = [[UIProgressView alloc] initWithProgressViewStyle: UIProgressViewStyleDefault]; - [self.downloadProgressView setFrame: CGRectMake(0, 0, 250, 50)]; - [self.downloadProgressView setAutoresizingMask: UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight ]; - - [self startDownload: @"core"]; [self.view addSubview: downloadMessageStatus]; - [self.view addSubview: downloadProgressView]; } return self;