Start on OXZ manager.
Doesn't work at all...
This commit is contained in:
parent
012af4837c
commit
36178204f3
@ -272,6 +272,7 @@ OOLITE_RSRC_MGMT_FILES = \
|
||||
OOCache.m \
|
||||
OOCacheManager.m \
|
||||
OOConvertSystemDescriptions.m \
|
||||
OOOXZManager.m \
|
||||
OOPListParsing.m \
|
||||
ResourceManager.m \
|
||||
TextureStore.m
|
||||
|
@ -41,6 +41,7 @@ MA 02110-1301, USA.
|
||||
#import "OOOpenALController.h"
|
||||
#import "OODebugSupport.h"
|
||||
#import "legacy_random.h"
|
||||
#import "OOOXZManager.h"
|
||||
|
||||
#if OOLITE_MAC_OS_X
|
||||
#import "JAPersistentFileReference.h"
|
||||
@ -239,6 +240,9 @@ static GameController *sSharedController = nil;
|
||||
}
|
||||
}
|
||||
|
||||
// initialise OXZ manager
|
||||
[OOOXZManager sharedManager];
|
||||
|
||||
// moved here to try to avoid initialising this before having an Open GL context
|
||||
//[self logProgress:DESC(@"Initialising universe")]; // DESC expansions only possible after Universe init
|
||||
[[Universe alloc] initWithGameView:gameView];
|
||||
@ -319,6 +323,9 @@ static GameController *sSharedController = nil;
|
||||
[gameView pollControls];
|
||||
[self doPerformGameTick];
|
||||
|
||||
// TEMP: just for testing! Should only do this on user request
|
||||
[[OOOXZManager sharedManager] updateManifests];
|
||||
|
||||
[pool release];
|
||||
}
|
||||
|
||||
@ -374,6 +381,7 @@ static GameController *sSharedController = nil;
|
||||
#if OOLITE_MAC_OS_X
|
||||
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSEventTrackingRunLoopMode];
|
||||
#endif
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
66
src/Core/OOOXZManager.h
Normal file
66
src/Core/OOOXZManager.h
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
|
||||
OOOXZManager.h
|
||||
|
||||
Responsible for installing and uninstalling OXZs
|
||||
|
||||
Oolite
|
||||
Copyright (C) 2004-2013 Giles C Williams and contributors
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
|
||||
#import "OOCocoa.h"
|
||||
#import "OOOpenGL.h"
|
||||
#import "NSFileManagerOOExtensions.h"
|
||||
|
||||
typedef enum {
|
||||
OXZ_DOWNLOAD_NONE = 0,
|
||||
OXZ_DOWNLOAD_STARTED = 1,
|
||||
OXZ_DOWNLOAD_RECEIVING = 2,
|
||||
OXZ_DOWNLOAD_COMPLETE = 10,
|
||||
OXZ_DOWNLOAD_ERROR = 99
|
||||
} OXZDownloadStatus;
|
||||
|
||||
#if 0
|
||||
// TODO: this should check for Mac OS 10.7 or higher, and possibly later GNUStep
|
||||
@interface OOOXZManager : NSObject <NSURLDownloadDelegate>
|
||||
#else
|
||||
@interface OOOXZManager : NSObject
|
||||
#endif
|
||||
{
|
||||
@private
|
||||
NSArray *_oxzList;
|
||||
BOOL _updatingManifests;
|
||||
|
||||
NSURLDownload *_currentDownload;
|
||||
OXZDownloadStatus _downloadStatus;
|
||||
NSUInteger _downloadProgress;
|
||||
NSUInteger _downloadExpected;
|
||||
|
||||
|
||||
}
|
||||
|
||||
+ (OOOXZManager *) sharedManager;
|
||||
|
||||
- (BOOL) updateManifests;
|
||||
- (BOOL) cancelUpdateManifests;
|
||||
|
||||
|
||||
|
||||
|
||||
@end
|
229
src/Core/OOOXZManager.m
Normal file
229
src/Core/OOOXZManager.m
Normal file
@ -0,0 +1,229 @@
|
||||
/*
|
||||
|
||||
OOOXZManager.m
|
||||
|
||||
Responsible for installing and uninstalling OXZs
|
||||
|
||||
Oolite
|
||||
Copyright (C) 2004-2013 Giles C Williams and contributors
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
|
||||
#import "OOOXZManager.h"
|
||||
#import "OOPListParsing.h"
|
||||
#import "ResourceManager.h"
|
||||
|
||||
/* The URL for the manifest.plist array. This one is extremely
|
||||
* temporary, of course */
|
||||
static NSString * const kOOOXZDataURL = @"http://compsoc.dur.ac.uk/~cim/oolite/dev/manifests.plist";
|
||||
/* The filename to store the downloaded manifest.plist array */
|
||||
static NSString * const kOOOXZManifestCache = @"manifests.plist";
|
||||
/* The filename to temporarily store the downloaded manifest.plist array */
|
||||
static NSString * const kOOOXZManifestTmp = @"manifests.plist.new";
|
||||
|
||||
|
||||
static NSString * const kOOOXZErrorLog = @"oxz.manager.error";
|
||||
static NSString * const kOOOXZDebugLog = @"oxz.manager.debug";
|
||||
|
||||
|
||||
static OOOXZManager *sSingleton = nil;
|
||||
|
||||
@interface OOOXZManager (OOPrivate)
|
||||
- (NSString *) installPath;
|
||||
- (NSString *) manifestPath;
|
||||
- (NSString *) manifestDownloadPath;
|
||||
|
||||
|
||||
- (void) setCurrentDownload:(NSURLDownload *)download;
|
||||
|
||||
/* Delegates for URL downloader */
|
||||
- (void) downloadDidBegin:(NSURLDownload *)download;
|
||||
- (void) download:(NSURLDownload *)download didReceiveResponse:(NSURLResponse *)response;
|
||||
- (void) download:(NSURLDownload *)download didReceiveDataOfLength:(NSUInteger)length;
|
||||
- (void) downloadDidFinish:(NSURLDownload *)download;
|
||||
- (void) download:(NSURLDownload *)download didFailWithError:(NSError *)error;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@implementation OOOXZManager
|
||||
|
||||
+ (OOOXZManager *)sharedManager
|
||||
{
|
||||
// NOTE: assumes single-threaded first access.
|
||||
if (sSingleton == nil) sSingleton = [[self alloc] init];
|
||||
return sSingleton;
|
||||
}
|
||||
|
||||
|
||||
- (id) init
|
||||
{
|
||||
self = [super init];
|
||||
if (self != nil)
|
||||
{
|
||||
_updatingManifests = NO;
|
||||
_downloadStatus = OXZ_DOWNLOAD_NONE;
|
||||
// if the file has not been downloaded, this will be nil
|
||||
_oxzList = OOArrayFromFile([self manifestPath]);
|
||||
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
if (sSingleton == self) sSingleton = nil;
|
||||
|
||||
[self setCurrentDownload:nil];
|
||||
DESTROY(_oxzList);
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
|
||||
/* As currently implemented in ResourceManager the lowest-priority
|
||||
* root path is supposed to be in the user's home directory
|
||||
* (Mac/Linux) or next to the Oolite install (Windows). This is the
|
||||
* safest place to write to. */
|
||||
- (NSString *) installPath
|
||||
{
|
||||
return [[ResourceManager rootPaths] lastObject];
|
||||
}
|
||||
|
||||
|
||||
- (NSString *) manifestPath
|
||||
{
|
||||
return [[self installPath] stringByAppendingPathComponent:kOOOXZManifestCache];
|
||||
}
|
||||
|
||||
|
||||
/* Download mechanism could destroy a correct file if it failed
|
||||
* half-way and was downloaded on top of the old one. So this loads it
|
||||
* off to the side a bit */
|
||||
- (NSString *) manifestDownloadPath
|
||||
{
|
||||
return [[self installPath] stringByAppendingPathComponent:kOOOXZManifestTmp];
|
||||
}
|
||||
|
||||
|
||||
- (void) setCurrentDownload:(NSURLDownload *)download
|
||||
{
|
||||
if (_currentDownload != nil)
|
||||
{
|
||||
[_currentDownload cancel]; // releases via delegate
|
||||
}
|
||||
_currentDownload = [download retain];
|
||||
}
|
||||
|
||||
|
||||
- (BOOL) updateManifests
|
||||
{
|
||||
if (_downloadStatus != OXZ_DOWNLOAD_NONE || _updatingManifests)
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:kOOOXZDataURL]];
|
||||
NSURLDownload *download = [[NSURLDownload alloc] initWithRequest:request delegate:self];
|
||||
if (download)
|
||||
{
|
||||
[download setDestination:[self manifestDownloadPath] allowOverwrite:YES];
|
||||
|
||||
/* Delegates don't yet work. Suspect a problem with the run loop. */
|
||||
|
||||
_updatingManifests = YES;
|
||||
_downloadProgress = 0;
|
||||
_downloadExpected = 0;
|
||||
[self setCurrentDownload:download]; // retains it
|
||||
[download release];
|
||||
OOLog(kOOOXZDebugLog,@"Manifest update request received, using %@ and downloading to %@",[request URL],[self manifestDownloadPath]);
|
||||
return YES;
|
||||
}
|
||||
else
|
||||
{
|
||||
OOLog(kOOOXZErrorLog,@"Unable to start downloading manifests file at %@",[request URL]);
|
||||
return NO;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (BOOL) cancelUpdateManifests
|
||||
{
|
||||
if (!_updatingManifests || _downloadStatus == OXZ_DOWNLOAD_NONE)
|
||||
{
|
||||
return NO;
|
||||
}
|
||||
OOLog(kOOOXZDebugLog,@"Trying to cancel manifests file update");
|
||||
if (_currentDownload != nil)
|
||||
{
|
||||
[_currentDownload cancel];
|
||||
}
|
||||
else if (_downloadStatus == OXZ_DOWNLOAD_COMPLETE)
|
||||
{
|
||||
// then we should clean up the temp file - TODO!
|
||||
}
|
||||
_updatingManifests = NO;
|
||||
_downloadStatus = OXZ_DOWNLOAD_NONE;
|
||||
return YES;
|
||||
}
|
||||
|
||||
|
||||
|
||||
- (void) downloadDidBegin:(NSURLDownload *)download
|
||||
{
|
||||
_downloadStatus = OXZ_DOWNLOAD_STARTED;
|
||||
OOLog(kOOOXZDebugLog,@"Download started");
|
||||
}
|
||||
|
||||
|
||||
- (void) download:(NSURLDownload *)download didReceiveResponse:(NSURLResponse *)response
|
||||
{
|
||||
_downloadStatus = OXZ_DOWNLOAD_RECEIVING;
|
||||
OOLog(kOOOXZDebugLog,@"Download receiving");
|
||||
_downloadExpected = [response expectedContentLength];
|
||||
_downloadProgress = 0;
|
||||
}
|
||||
|
||||
|
||||
- (void) download:(NSURLDownload *)download didReceiveDataOfLength:(NSUInteger)length
|
||||
{
|
||||
OOLog(kOOOXZDebugLog,@"Downloaded %d bytes",length);
|
||||
_downloadProgress += length;
|
||||
}
|
||||
|
||||
|
||||
- (void) downloadDidFinish:(NSURLDownload *)download
|
||||
{
|
||||
_downloadStatus = OXZ_DOWNLOAD_COMPLETE;
|
||||
OOLog(kOOOXZDebugLog,@"Download complete");
|
||||
DESTROY(_currentDownload);
|
||||
}
|
||||
|
||||
|
||||
- (void) download:(NSURLDownload *)download didFailWithError:(NSError *)error
|
||||
{
|
||||
_downloadStatus = OXZ_DOWNLOAD_ERROR;
|
||||
OOLog(kOOOXZErrorLog,@"Error downloading '%@': %@",[[download request] URL],[error localizedDescription]);
|
||||
DESTROY(_currentDownload);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@end
|
||||
|
Loading…
x
Reference in New Issue
Block a user