42#import "MyOpenGLView.h"
51static NSString *
const kOOOXZDataURL =
@"http://addons.oolite.space/api/1.0/overview";
118NSComparisonResult
oxzSort(
id m1,
id m2,
void *context);
123#if OOLITE_MAC_OS_X_10_7
124@interface OOOXZManager (OOPrivate) <NSURLConnectionDataDelegate>
126@interface OOOXZManager (NSURLConnectionDataDelegate)
131- (NSString *) extractionBasePathForIdentifier:(NSString *)identifier andVersion:(NSString *)version;
133- (NSString *) humanSize:(NSUInteger)bytes;
137- (BOOL) beginDownload:(NSMutableURLRequest *)request;
142- (
OOColor *) colorForManifest:(NSDictionary *)manifest;
143- (NSString *) installStatusForManifest:(NSDictionary *)manifest;
145- (BOOL) validateFilter:(NSString *)input;
147- (void) setOXZList:(NSArray *)list;
148- (void) setFilteredList:(NSArray *)list;
149- (NSArray *) applyCurrentFilter:(NSArray *)list;
151- (void) setCurrentDownload:(NSURLConnection *)download withLabel:(NSString *)label;
152- (void) setProgressStatus:(NSString *)newStatus;
154- (BOOL) installOXZ:(NSUInteger)item;
156- (BOOL) removeOXZ:(NSUInteger)item;
160- (NSString *) extractOXZ:(NSUInteger)item;
163- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
164- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
165- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
166- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
170@interface OOOXZManager (OOFilterRules)
171- (BOOL) applyFilterByNoFilter:(NSDictionary *)manifest;
172- (BOOL) applyFilterByUpdateRequired:(NSDictionary *)manifest;
173- (BOOL) applyFilterByInstallable:(NSDictionary *)manifest;
174- (BOOL) applyFilterByKeyword:(NSDictionary *)manifest keyword:(NSString *)keyword;
175- (BOOL) applyFilterByAuthor:(NSDictionary *)manifest author:(NSString *)author;
176- (BOOL) applyFilterByDays:(NSDictionary *)manifest days:(NSString *)days;
177- (BOOL) applyFilterByTag:(NSDictionary *)manifest tag:(NSString *)tag;
178- (BOOL) applyFilterByCategory:(NSDictionary *)manifest category:(NSString *)category;
234 const char *managedAddOnsEnv = SDL_getenv(
"OO_MANAGEDADDONSDIR");
236 if (managedAddOnsEnv)
238 return [
NSString stringWithUTF8String:managedAddOnsEnv];
242 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory,NSUserDomainMask,YES);
243 NSString *appPath = [
paths objectAtIndex:0];
246 appPath = [
appPath stringByAppendingPathComponent:@"Oolite"];
248 appPath = [
appPath stringByAppendingPathComponent:@"Managed AddOns"];
253 appPath = [
appPath stringByAppendingPathComponent:@"ManagedAddOns"];
264 const char *addOnsExtractEnv = SDL_getenv(
"OO_ADDONSEXTRACTDIR");
266 if (addOnsExtractEnv)
268 return [
NSString stringWithUTF8String:addOnsExtractEnv];
273 #if OO_GAME_DATA_TO_USER_FOLDER
274 return [
NSString stringWithFormat:@"%s\\Oolite\\AddOns", SDL_getenv("LOCALAPPDATA")];
279 return [[
NSHomeDirectory() stringByAppendingPathComponent:@".Oolite"] stringByAppendingPathComponent:@"AddOns"];
287 const char *additionalAddOnsEnv = SDL_getenv(
"OO_ADDITIONALADDONSDIRS");
289 if (additionalAddOnsEnv) {
290 NSString *envStr = [
NSString stringWithUTF8String:additionalAddOnsEnv];
291 return [
envStr componentsSeparatedByString:@","];
297- (NSString *) extractionBasePathForIdentifier:(NSString *)identifier andVersion:(NSString *)version
300 NSString *rawMainDir = [
NSString stringWithFormat:@"%@-%@.off",identifier,version];
302 NSCharacterSet *blacklist = [
NSCharacterSet characterSetWithCharactersInString:@"'#%^&{}[]/~|\\?<,:\" "];
303 return [[[
basePath stringByAppendingPathComponent:[[
rawMainDir componentsSeparatedByCharactersInSet:blacklist] componentsJoinedByString:@""]] retain] autorelease];
309 BOOL exists, directory;
313 exists = [
fmgr fileExistsAtPath:path isDirectory:&directory];
315 if (exists && !directory)
322 if (![fmgr oo_createDirectoryAtPath:path attributes:
nil])
358 NSString *url = [[
NSUserDefaults standardUserDefaults] stringForKey:kOOOXZDataConfig];
367- (NSString *) humanSize:(NSUInteger)bytes
371 return DESC(
@"oolite-oxzmanager-missing-field");
373 else if (bytes < 1024)
377 else if (bytes < 1024*1024)
379 return [
NSString stringWithFormat:@"%llu kB",bytes>>10];
383 return [
NSString stringWithFormat:@"%.2f MB",((float)(bytes>>10))/1024];
388- (void) setOXZList:(NSArray *)list
393 _oxzList = [[
list sortedArrayUsingFunction:oxzSort context:NULL] retain];
400- (void) setFilteredList:(NSArray *)list
403 _filteredList = [
list copy];
407- (void) setFilter:(NSString *)filter
414- (NSArray *) applyCurrentFilter:(NSArray *)list
416 SEL filterSelector =
@selector(applyFilterByNoFilter:);
417 NSString *parameter =
nil;
420 filterSelector =
@selector(applyFilterByUpdateRequired:);
424 filterSelector =
@selector(applyFilterByInstallable:);
428 filterSelector =
@selector(applyFilterByKeyword:keyword:);
429 parameter = [
_currentFilter substringFromIndex:[kOOOXZFilterKeyword length]];
433 filterSelector =
@selector(applyFilterByAuthor:author:);
434 parameter = [
_currentFilter substringFromIndex:[kOOOXZFilterAuthor length]];
438 filterSelector =
@selector(applyFilterByDays:days:);
439 parameter = [
_currentFilter substringFromIndex:[kOOOXZFilterDays length]];
443 filterSelector =
@selector(applyFilterByTag:tag:);
444 parameter = [
_currentFilter substringFromIndex:[kOOOXZFilterTag length]];
448 filterSelector =
@selector(applyFilterByCategory:category:);
449 parameter = [
_currentFilter substringFromIndex:[kOOOXZFilterCategory length]];
453 NSDictionary *manifest =
nil;
454 NSInvocation *invocation = [
NSInvocation invocationWithMethodSignature:[[
self class] instanceMethodSignatureForSelector:filterSelector]];
457 if (parameter !=
nil)
459 [
invocation setArgument:¶meter atIndex:3];
462 foreach(manifest, list)
466 BOOL filterAccepted = NO;
480- (BOOL) applyFilterByNoFilter:(NSDictionary *)manifest
486- (BOOL) applyFilterByUpdateRequired:(NSDictionary *)manifest
492- (BOOL) applyFilterByInstallable:(NSDictionary *)manifest
498- (BOOL) applyFilterByKeyword:(NSDictionary *)manifest keyword:(NSString *)keyword
500 NSString *parameter =
nil;
501 NSArray *parameters = [
NSArray arrayWithObjects:kOOManifestTitle,kOOManifestDescription,kOOManifestCategory,nil];
504 keyword = [
keyword stringByTrimmingLeadingWhitespaceAndNewlineCharacters];
506 foreach (parameter,parameters)
508 if ([[manifest oo_stringForKey:parameter] rangeOfString:keyword options:NSCaseInsensitiveSearch].location != NSNotFound)
514 parameters = [
manifest oo_arrayForKey:kOOManifestTags];
515 foreach (parameter,parameters)
517 if ([parameter rangeOfString:keyword options:NSCaseInsensitiveSearch].location != NSNotFound)
527- (BOOL) applyFilterByAuthor:(NSDictionary *)manifest author:(NSString *)author
530 author = [
author stringByTrimmingLeadingWhitespaceAndNewlineCharacters];
532 NSString *mAuth = [
manifest oo_stringForKey:kOOManifestAuthor];
533 return ([mAuth rangeOfString:author options:NSCaseInsensitiveSearch].location != NSNotFound);
537- (BOOL) applyFilterByDays:(NSDictionary *)manifest days:(NSString *)days
539 NSInteger i = [
days integerValue];
546 NSUInteger updated = [
manifest oo_unsignedIntegerForKey:kOOManifestUploadDate];
547 NSUInteger now = (NSUInteger)[[NSDate date] timeIntervalSince1970];
548 return (updated + (86400 * i) > now);
553- (BOOL) applyFilterByTag:(NSDictionary *)manifest tag:(NSString *)tag
555 NSString *parameter =
nil;
556 NSArray *parameters = [
manifest oo_arrayForKey:kOOManifestTags];
559 tag = [
tag stringByTrimmingLeadingWhitespaceAndNewlineCharacters];
561 foreach (parameter,parameters)
563 if ([parameter rangeOfString:tag options:NSCaseInsensitiveSearch].location != NSNotFound)
573- (BOOL) applyFilterByCategory:(NSDictionary *)manifest category:(NSString *)category
576 category = [
category stringByTrimmingLeadingWhitespaceAndNewlineCharacters];
578 NSString *mCategory = [
manifest oo_stringForKey:kOOManifestCategory];
579 return ([mCategory rangeOfString:category options:NSCaseInsensitiveSearch].location != NSNotFound);
585- (BOOL) validateFilter:(NSString *)input
587 NSString *filter = [
input lowercaseString];
588 if (([filter length] == 0)
606- (void) setCurrentDownload:(NSURLConnection *)download withLabel:(NSString *)label
608 if (_currentDownload !=
nil)
612 _currentDownload = [
download retain];
614 _currentDownloadName = [
label copy];
618- (void) setProgressStatus:(NSString *)new
621 _progressStatus = [
new copy];
627 [
request setHTTPShouldHandleCookies:NO];
640- (BOOL) beginDownload:(NSMutableURLRequest *)request
642 NSString *userAgent = [
NSString stringWithFormat:@"Oolite/%@", [[[
NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]];
643 [
request setValue:userAgent forHTTPHeaderField:@"User-Agent"];
644 NSURLConnection *download = [[
NSURLConnection alloc] initWithRequest:request delegate:
self];
647 _downloadProgress = 0;
648 _downloadExpected = 0;
649 NSString *label =
DESC(
@"oolite-oxzmanager-download-label-list");
652 NSDictionary *expectedManifest =
nil;
655 label = [
expectedManifest oo_stringForKey:kOOManifestTitle defaultValue:DESC(@"oolite-oxzmanager-download-label-oxz")];
681 [_currentDownload cancel];
717 NSString *fullpath =
nil;
718 NSDictionary *manifest =
nil;
721 fullpath = [[
self installPath] stringByAppendingPathComponent:filename];
725 NSMutableDictionary *adjManifest = [
NSMutableDictionary dictionaryWithDictionary:manifest];
726 [
adjManifest setObject:fullpath forKey:kOOManifestFilePath];
728 NSDictionary *stored =
nil;
733 BOOL foundInstallable = NO;
738 if (foundInstallable == NO)
740 [
adjManifest setObject:[
stored oo_stringForKey:kOOManifestVersion] forKey:kOOManifestAvailableVersion];
741 [
adjManifest setObject:[
stored oo_stringForKey:kOOManifestDownloadURL] forKey:kOOManifestDownloadURL];
744 foundInstallable = YES;
750 [manifests addObject:adjManifest];
753 [manifests sortUsingFunction:oxzSort context:NULL];
800 if (downloadedManifest ==
nil)
808 NSDictionary *expectedManifest =
nil;
811 if (expectedManifest ==
nil ||
817 OOLog(
kOOOXZErrorLog,
@"%@",
@"Downloaded OXZ does not have the same identifer and version as expected. This might be due to your manifests list being out of date - try updating it.");
836 NSString *destination = [[
self installPath] stringByAppendingPathComponent:filename];
837 [[
NSFileManager defaultManager] oo_removeItemAtPath:destination];
840 if (![[NSFileManager defaultManager] oo_moveItemAtPath:[
self downloadPath] toPath:destination])
865 NSArray *
requires = [
downloadedManifest oo_arrayForKey:kOOManifestRequiresOXPs defaultValue:nil];
869 requires = [
expectedManifest oo_arrayForKey:kOOManifestRequiresOXPs defaultValue:nil];
871 NSDictionary *requirement =
nil;
875 if ([_dependencyStack
count] > 0)
878 NSSet *tempStack = [
NSSet setWithSet:_dependencyStack];
879 foreach (requirement, tempStack)
882 if (![
ResourceManager manifest:downloadedManifest HasUnmetDependency:requirement logErrors:NO]
883 &&
requires !=
nil && [
requires containsObject:requirement])
886 [
progress appendFormat:DESC(@"oolite-oxzmanager-progress-now-has-@"),[
requirement oo_stringForKey:kOOManifestRelationDescription defaultValue:[
requirement oo_stringForKey:kOOManifestRelationIdentifier]]];
897 foreach (requirement,
requires)
899 if ([
ResourceManager manifest:downloadedManifest HasUnmetDependency:requirement logErrors:NO])
903 [
progress appendFormat:DESC(@"oolite-oxzmanager-progress-requires-@"),[
requirement oo_stringForKey:kOOManifestRelationDescription defaultValue:[
requirement oo_stringForKey:kOOManifestRelationIdentifier]]];
907 if ([_dependencyStack
count] > 0)
911 BOOL undownloadedRequirement = NO;
912 NSDictionary *availableDownload =
nil;
913 BOOL foundDownload = NO;
914 NSUInteger index = 0;
915 NSString *needsIdentifier =
nil;
919 undownloadedRequirement = YES;
923 if (!_downloadAllDependencies)
925 [
progress appendString:DESC(@"oolite-oxzmanager-progress-get-required")];
927 needsIdentifier = [
requirement oo_stringForKey:kOOManifestRelationIdentifier];
929 foreach (availableDownload, _oxzList)
937 index = [
_oxzList indexOfObject:availableDownload];
952 if ([_dependencyStack
count] > 0)
955 undownloadedRequirement = NO;
966 while (!undownloadedRequirement);
974 if (_downloadAllDependencies)
977 if (![
self installOXZ:index]) {
980 [
progress appendFormat:DESC(@"oolite-oxzmanager-progress-required-@-not-found"),[
requirement oo_stringForKey:kOOManifestRelationDescription defaultValue:[
requirement oo_stringForKey:kOOManifestRelationIdentifier]]];
982 OOLog(
kOOOXZErrorLog,
@"OXZ dependency %@ could not be found for automatic download.",needsIdentifier);
1000 else if ([_dependencyStack
count] > 0)
1002 [
progress appendFormat:DESC(@"oolite-oxzmanager-progress-required-@-not-found"),[
requirement oo_stringForKey:kOOManifestRelationDescription defaultValue:[
requirement oo_stringForKey:kOOManifestRelationIdentifier]]];
1004 OOLog(
kOOOXZErrorLog,
@"OXZ dependency %@ could not be found for automatic download.",needsIdentifier);
1016 _downloadAllDependencies = NO;
1022- (NSDictionary *) installedManifestForIdentifier:(NSString *)identifier
1025 NSDictionary *manifest =
nil;
1026 foreach (manifest,installed)
1039 NSString *title = [
manifest oo_stringForKey:kOOManifestTitle defaultValue:nil];
1040 NSString *identifier = [
manifest oo_stringForKey:kOOManifestIdentifier defaultValue:nil];
1042 if (![
ResourceManager checkVersionCompatibility:manifest forOXP:title])
1048 if (installed ==
nil)
1054 if (installed !=
nil)
1062 && [[NSFileManager defaultManager] fileExistsAtPath:[installed oo_stringForKey:
kOOManifestFilePath]])
1080 if (installed !=
nil)
1082 NSString *availableVersion = [
manifest oo_stringForKey:kOOManifestAvailableVersion];
1083 if (availableVersion ==
nil)
1085 availableVersion = [
manifest oo_stringForKey:kOOManifestVersion];
1087 NSString *installedVersion = [
installed oo_stringForKey:kOOManifestVersion];
1088 OOLog(
@"version.debug",
@"%@ mv:%@ mav:%@",identifier,installedVersion,availableVersion);
1096 if ([
ResourceManager manifestHasMissingDependencies:manifest logErrors:NO])
1104- (
OOColor *) colorForManifest:(NSDictionary *)manifest
1106 switch ([
self installableState:manifest])
1129- (NSString *) installStatusForManifest:(NSDictionary *)manifest
1131 switch ([
self installableState:manifest])
1134 return DESC(
@"oolite-oxzmanager-installable-okay");
1136 return DESC(
@"oolite-oxzmanager-installable-update");
1138 return DESC(
@"oolite-oxzmanager-installable-depend");
1140 return DESC(
@"oolite-oxzmanager-installable-conflicts");
1142 return DESC(
@"oolite-oxzmanager-installable-already");
1144 return DESC(
@"oolite-oxzmanager-installable-manual");
1146 return DESC(
@"oolite-oxzmanager-installable-version");
1148 return DESC(
@"oolite-oxzmanager-installable-noremote");
1164 [PLAYER destroySound];
1168 [gui
setTitle:DESC(@"oolite-oxzmanager-title")];
1175 [gui
setTitle:DESC(@"oolite-oxzmanager-title-setfilter")];
1176 [gui
setText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-currentfilter-is-@"),_currentFilter]
forRow:OXZ_GUI_ROW_FILTERCURRENT
align:GUI_ALIGN_LEFT];
1185 [gui
setText:DESC(@"oolite-oxzmanager-download-list")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1194 [gui
setText:DESC(@"oolite-oxzmanager-download-noupdate")
forRow:OXZ_GUI_ROW_PROCEED
align:GUI_ALIGN_CENTER];
1197 [gui
setText:DESC(@"oolite-oxzmanager-update-list")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1214 [gui
setText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-currentfilter-is-@-@"),OOExpand(@"[oolite_key_oxzmanager_setfilter]"),_currentFilter]
forRow:OXZ_GUI_ROW_LISTFILTER
align:GUI_ALIGN_LEFT];
1218 [gui
setText:DESC(@"oolite-oxzmanager-install")
forRow:OXZ_GUI_ROW_INSTALL
align:GUI_ALIGN_CENTER];
1220 [gui
setText:DESC(@"oolite-oxzmanager-installed")
forRow:OXZ_GUI_ROW_INSTALLED
align:GUI_ALIGN_CENTER];
1221 [gui
setKey:@"_INSTALLED"
forRow:OXZ_GUI_ROW_INSTALLED];
1222 [gui
setText:DESC(@"oolite-oxzmanager-remove")
forRow:OXZ_GUI_ROW_REMOVE
align:GUI_ALIGN_CENTER];
1224 [gui
setText:DESC(@"oolite-oxzmanager-update-list")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1226 [gui
setText:DESC(@"oolite-oxzmanager-update-all")
forRow:OXZ_GUI_ROW_UPDATE_ALL
align:GUI_ALIGN_CENTER];
1227 [gui
setKey:@"_UPDATE_ALL"
forRow:OXZ_GUI_ROW_UPDATE_ALL];
1233 [gui
setTitle:DESC(@"oolite-oxzmanager-title-downloading")];
1239 [gui
setText:DESC(@"oolite-oxzmanager-cancel")
forRow:OXZ_GUI_ROW_CANCEL
align:GUI_ALIGN_CENTER];
1244 [gui
setTitle:DESC(@"oolite-oxzmanager-title-dependencies")];
1246 [gui
setText:DESC(@"oolite-oxzmanager-dependencies-decision")
forRow:OXZ_GUI_ROW_PROGRESS
align:GUI_ALIGN_LEFT];
1251 [gui
setText:DESC(@"oolite-oxzmanager-dependencies-yes-all")
forRow:OXZ_GUI_ROW_INSTALLED
align:GUI_ALIGN_CENTER];
1252 [gui
setKey:@"_PROCEED_ALL"
forRow:OXZ_GUI_ROW_INSTALLED];
1254 [gui
setText:DESC(@"oolite-oxzmanager-dependencies-yes")
forRow:OXZ_GUI_ROW_PROCEED
align:GUI_ALIGN_CENTER];
1257 [gui
setText:DESC(@"oolite-oxzmanager-dependencies-no")
forRow:OXZ_GUI_ROW_CANCEL
align:GUI_ALIGN_CENTER];
1263 [gui
setText:DESC(@"oolite-oxzmanager-acknowledge")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1278 [gui
setText:DESC(@"oolite-oxzmanager-acknowledge")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1284 NSDictionary *manifest = [_filteredList oo_dictionaryAtIndex:_item];
1285 NSString *title = [
manifest oo_stringForKey:kOOManifestTitle];
1286 NSString *version = [
manifest oo_stringForKey:kOOManifestVersion];
1287 NSString *identifier = [
manifest oo_stringForKey:kOOManifestIdentifier];
1288 [gui
setTitle:DESC(@"oolite-oxzmanager-title-extract")];
1289 [gui
setText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-title-@-version-@"),
1300 if ([[NSFileManager defaultManager] fileExistsAtPath:path])
1302 [gui
addLongText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-extract-@-already-exists"), path]
1305 [gui
setText:DESC(@"oolite-oxzmanager-extract-unavailable")
forRow:OXZ_GUI_ROW_PROCEED
align:GUI_ALIGN_CENTER];
1310 [gui
addLongText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-extract-to-@"), path]
1313 [gui
setText:DESC(@"oolite-oxzmanager-extract-proceed")
forRow:OXZ_GUI_ROW_PROCEED
align:GUI_ALIGN_CENTER];
1317 [gui
setText:DESC(@"oolite-oxzmanager-extract-cancel")
forRow:OXZ_GUI_ROW_CANCEL
align:GUI_ALIGN_CENTER];
1324 [gui
setText:DESC(@"oolite-oxzmanager-acknowledge")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1333 [gui
setTitle:DESC(@"oolite-oxzmanager-title-install")];
1339 [gui
setTitle:DESC(@"oolite-oxzmanager-title-installed")];
1345 [gui
setTitle:DESC(@"oolite-oxzmanager-title-remove")];
1353 [gui
setText:DESC(@"oolite-oxzmanager-exit-restart")
forRow:OXZ_GUI_ROW_EXIT
align:GUI_ALIGN_CENTER];
1357 [gui
setText:DESC(@"oolite-oxzmanager-exit")
forRow:OXZ_GUI_ROW_EXIT
align:GUI_ALIGN_CENTER];
1384 [UNIVERSE reinitAndShowDemo:YES];
1405 [_dependencyStack removeAllObjects];
1414 [PLAYER setGuiToIntroFirstGo:YES];
1435 [_dependencyStack removeAllObjects];
1442 [_dependencyStack removeAllObjects];
1547- (void) processTextInput:(NSString *)input
1549 if ([
self validateFilter:input])
1551 if ([input length] > 0)
1562- (void) refreshTextInput:(NSString *)input
1565 [gui
setText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-text-prompt-@"), input]
forRow:OXZ_GUI_ROW_INPUT
align:GUI_ALIGN_LEFT];
1566 if ([
self validateFilter:input])
1586 [[UNIVERSE gameView] resetTypedString];
1621 NSDictionary *manifest = [_filteredList oo_dictionaryAtIndex:_item];
1625 [gui
setTitle:DESC(@"oolite-oxzmanager-title-infopage")];
1628 [gui
setText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-title-@-version-@"),
1629 [
manifest oo_stringForKey:kOOManifestTitle],
1630 [
manifest oo_stringForKey:kOOManifestVersion]]
1634 [gui
setText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-author-@"),
1635 [
manifest oo_stringForKey:kOOManifestAuthor]]
1639 [gui
addLongText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-license-@"),
1640 [
manifest oo_stringForKey:kOOManifestLicense]]
1644 [gui
addLongText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-tags-@"),[[
manifest oo_arrayForKey:kOOManifestTags] componentsJoinedByString: @", "]]
1647 [gui
addLongText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-description-@"),[
manifest oo_stringForKey:kOOManifestDescription]]
1651 NSString *infoURLString = [
manifest oo_stringForKey:kOOManifestInformationURL];
1652 [gui
setText:[
NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-infourl-@"),
1656 [[UNIVERSE gameView] stringToClipboard:infoURLString];
1659 [gui
setText:OOExpand(DESC(@"oolite-oxzmanager-infopage-return"))
forRow:27
align:GUI_ALIGN_CENTER];
1689- (BOOL) installOXZ:(NSUInteger)item
1691 NSArray *picklist = _filteredList;
1693 if ([picklist
count] <= item)
1697 NSDictionary *manifest = [
picklist objectAtIndex:item];
1706 NSString *url = [
manifest objectForKey:kOOManifestDownloadURL];
1713 [
request setHTTPShouldHandleCookies:NO];
1729 _downloadAllDependencies = YES;
1731 NSDictionary *manifest =
nil;
1733 foreach (manifest,_oxzList)
1742 NSString* identifier = [
first oo_stringForKey:kOOManifestRelationIdentifier];
1743 NSUInteger item = NSUIntegerMax;
1744 NSDictionary *availableDownload =
nil;
1745 foreach (availableDownload, _oxzList)
1749 item = [
_oxzList indexOfObject:availableDownload];
1759 NSUInteger start = _offset;
1760 if (start >= [_filteredList
count])
1766 if (end > [_filteredList
count])
1770 return [
_filteredList subarrayWithRange:NSMakeRange(start,end-start)];
1779 NSUInteger optCount = [_filteredList count];
1789 [gui
setArray:[
NSArray arrayWithObjects:DESC(@"oolite-oxzmanager-heading-category"),
1790 DESC(@"oolite-oxzmanager-heading-title"),
1791 DESC(@"oolite-oxzmanager-heading-installed"),
1792 DESC(@"oolite-oxzmanager-heading-downloadable"),
1793 nil]
forRow:OXZ_GUI_ROW_LISTHEAD];
1798 [gui
setArray:[
NSArray arrayWithObjects:DESC(@"gui-back"), @"",@"",@" <-- ", nil]
forRow:OXZ_GUI_ROW_LISTPREV];
1813 [gui
setArray:[
NSArray arrayWithObjects:DESC(@"gui-more"), @"",@"",@" --> ", nil]
forRow:OXZ_GUI_ROW_LISTNEXT];
1840 NSDictionary *manifest =
nil;
1841 BOOL oxzLineSelected = NO;
1843 foreach (manifest, options)
1846 NSString *localPath = [[[
self installPath] stringByAppendingPathComponent:[
manifest oo_stringForKey:kOOManifestIdentifier]] stringByAppendingPathExtension:@"oxz"];
1847 if (installed ==
nil)
1850 installed =
OODictionaryFromFile([localPath stringByAppendingPathComponent:
@"manifest.plist"]);
1855 if ([[NSFileManager defaultManager] fileExistsAtPath:localPath])
1858 installed =
OODictionaryFromFile([localPath stringByAppendingPathComponent:
@"manifest.plist"]);
1870 NSString *installedVersion =
DESC(
@"oolite-oxzmanager-version-none");
1871 if (installed !=
nil)
1873 installedVersion = [
installed oo_stringForKey:kOOManifestVersion defaultValue:DESC(@"oolite-oxzmanager-version-none")];
1879 [
manifest oo_stringForKey:kOOManifestCategory defaultValue:DESC(@"oolite-oxzmanager-missing-field")],
1880 [
manifest oo_stringForKey:kOOManifestTitle defaultValue:DESC(@"oolite-oxzmanager-missing-field")],
1882 [
manifest oo_stringForKey:kOOManifestAvailableVersion defaultValue:[
manifest oo_stringForKey:kOOManifestVersion defaultValue:DESC(@"oolite-oxzmanager-version-none")]],
1889 if (row == [
gui selectedRow])
1891 oxzLineSelected = YES;
1896 [gui
addLongText:[[[
manifest oo_stringForKey:kOOManifestDescription] componentsSeparatedByString:@"\n"] oo_stringAtIndex:0]
startingAtRow:OXZ_GUI_ROW_LISTDESC
align:GUI_ALIGN_LEFT];
1898 NSString *infoUrl = [
manifest oo_stringForKey:kOOManifestInformationURL];
1901 [gui
setArray:[
NSArray arrayWithObjects:DESC(@"oolite-oxzmanager-infoline-url"),infoUrl,nil]
forRow:OXZ_GUI_ROW_LISTINFO1];
1903 NSUInteger
size = [
manifest oo_unsignedIntForKey:kOOManifestFileSize defaultValue:0];
1904 NSString *updatedDesc =
nil;
1906 NSUInteger timestamp = [
manifest oo_unsignedIntegerForKey:kOOManifestUploadDate defaultValue:0];
1910 NSDate *updated = [
NSDate dateWithTimeIntervalSince1970:timestamp];
1913 updatedDesc = [[[
updated description] componentsSeparatedByString:@" "] oo_stringAtIndex:0];
1915 [gui
setArray:[
NSArray arrayWithObjects:DESC(@"oolite-oxzmanager-infoline-size"),[
self humanSize:size],DESC(@"oolite-oxzmanager-infoline-date"),updatedDesc,nil]
forRow:OXZ_GUI_ROW_LISTINFO2];
1930 if (!oxzLineSelected)
1950- (BOOL) removeOXZ:(NSUInteger)item
1952 NSArray *remList = _filteredList;
1953 if ([remList
count] <= item)
1955 OOLog(
kOOOXZDebugLog,
@"Unable to remove item %lu as only %lu in list", (
unsigned long)item, (
unsigned long)[remList
count]);
1958 NSString *
filename = [[
remList objectAtIndex:item] oo_stringForKey:kOOManifestFilePath];
1961 OOLog(
kOOOXZDebugLog,
@"Unable to remove item %lu as filename not found", (
unsigned long)item);
1965 if (![[NSFileManager defaultManager] oo_removeItemAtPath:
filename])
1980 NSArray *remList = _filteredList;
1981 if ([remList
count] == 0)
1985 NSUInteger start = _offset;
1986 if (start >= [remList
count])
1992 if (end > [remList
count])
1996 return [
remList subarrayWithRange:NSMakeRange(start,end-start)];
2018 [gui
setArray:[
NSArray arrayWithObjects:DESC(@"oolite-oxzmanager-heading-category"),
2019 DESC(@"oolite-oxzmanager-heading-title"),
2020 DESC(@"oolite-oxzmanager-heading-version"),
2021 nil]
forRow:OXZ_GUI_ROW_LISTHEAD];
2025 [gui
setArray:[
NSArray arrayWithObjects:DESC(@"gui-back"), @"",@" <-- ", nil]
forRow:OXZ_GUI_ROW_LISTPREV];
2040 [gui
setArray:[
NSArray arrayWithObjects:DESC(@"gui-more"), @"",@" --> ", nil]
forRow:OXZ_GUI_ROW_LISTNEXT];
2068 NSDictionary *manifest =
nil;
2069 BOOL oxzSelected = NO;
2071 foreach (manifest, options)
2075 [
manifest oo_stringForKey:kOOManifestCategory defaultValue:DESC(@"oolite-oxzmanager-missing-field")],
2076 [
manifest oo_stringForKey:kOOManifestTitle defaultValue:DESC(@"oolite-oxzmanager-missing-field")],
2077 [
manifest oo_stringForKey:kOOManifestVersion defaultValue:DESC(@"oolite-oxzmanager-missing-field")],
2079 NSString *identifier = [
manifest oo_stringForKey:kOOManifestIdentifier];
2084 if (row == [
gui selectedRow])
2089 [gui
addLongText:[[[
manifest oo_stringForKey:kOOManifestDescription] componentsSeparatedByString:@"\n"] oo_stringAtIndex:0]
startingAtRow:OXZ_GUI_ROW_LISTDESC
align:GUI_ALIGN_LEFT];
2178- (NSString *) extractOXZ:(NSUInteger)item
2182 NSDictionary *manifest = [
_filteredList oo_dictionaryAtIndex:item];
2183 NSString *version = [
manifest oo_stringForKey:kOOManifestVersion];
2184 NSString *identifier = [
manifest oo_stringForKey:kOOManifestIdentifier];
2191 NSString *oxzfile = [
manifest oo_stringForKey:kOOManifestFilePath];
2192 if (![fmgr fileExistsAtPath:oxzfile])
2195 [
extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-no-original")];
2198 const char* zipname = [
oxzfile UTF8String];
2204 [
extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-bad-original")];
2208 if ([fmgr fileExistsAtPath:path])
2211 [
extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-main-exists")];
2215 if (![fmgr oo_createDirectoryAtPath:path attributes:
nil])
2218 [
extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-main-unmakeable")];
2222 [
extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-main-created")];
2223 NSUInteger counter = 0;
2224 char rawComponentName[512];
2232 rawComponentName, 512,
2235 NSString *componentName = [
NSString stringWithUTF8String:rawComponentName];
2236 if ([componentName hasSuffix:
@"/"])
2239 if (![fmgr oo_createDirectoryAtPath:[path stringByAppendingPathComponent:componentName] attributes:
nil])
2242 [
extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-sub-failed")];
2255 NSString *folder = [[
path stringByAppendingPathComponent:componentName] stringByDeletingLastPathComponent];
2256 if ([folder length] > 0 && ![fmgr fileExistsAtPath:folder] && ![fmgr oo_createDirectoryAtPath:folder attributes:
nil])
2259 [
extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-sub-failed")];
2269 NSData *tmp = [
NSData oo_dataWithOXZFile:[
oxzfile stringByAppendingPathComponent:componentName]];
2273 [
extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-sub-failed")];
2280 if (![tmp writeToFile:[path stringByAppendingPathComponent:componentName] atomically:YES])
2283 [
extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-sub-failed")];
2303 [
extractionLog appendFormat:DESC(@"oolite-oxzmanager-extract-log-num-u-extracted"),counter];
2304 [
extractionLog appendFormat:DESC(@"oolite-oxzmanager-extract-log-extracted-to-@"),path];
2313- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
2317 _downloadExpected = [
response expectedContentLength];
2318 _downloadProgress = 0;
2322 if (_fileWriter ==
nil)
2331- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
2336 _downloadProgress += [
data length];
2354 [[
NSRunLoop currentRunLoop] limitDateForMode:NSDefaultRunLoopMode];
2359- (void)connectionDidFinishLoading:(NSURLConnection *)connection
2383 OOLog(
kOOOXZErrorLog,
@"Error: download completed in unexpected state %d. This is an internal error - please report it.",_interfaceState);
2389- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
2404NSComparisonResult
oxzSort(
id m1,
id m2,
void *context)
2406 NSComparisonResult result = [[m1 oo_stringForKey:kOOManifestCategory defaultValue:@"zz"] localizedCompare:[m2 oo_stringForKey:kOOManifestCategory defaultValue:@"zz"]];
2407 if (result == NSOrderedSame)
2409 result = [[m1 oo_stringForKey:kOOManifestTitle defaultValue:@"zz"] localizedCompare:[m2 oo_stringForKey:kOOManifestTitle defaultValue:@"zz"]];
2410 if (result == NSOrderedSame)
2412 result = [[m2 oo_stringForKey:kOOManifestVersion defaultValue:@"0"] localizedCompare:[m1 oo_stringForKey:kOOManifestVersion defaultValue:@"0"]];
OOGUITabStop OOGUITabSettings[GUI_MAX_COLUMNS]
static OODebugMonitor * sSingleton
#define OOLog(class, format,...)
static NSString *const kOOManifestAvailableVersion
static NSString *const kOOManifestRelationIdentifier
static NSString *const kOOManifestIdentifier
static NSString *const kOOManifestVersion
static NSString *const kOOManifestFilePath
@ OXZ_STATE_PICK_INSTALLED
static NSString *const kOOOXZFilterDays
static NSString *const kOOOXZErrorLog
static NSString *const kOOOXZFilterTag
static NSString *const kOOOXZFilterKeyword
@ OXZ_INSTALLABLE_DEPENDENCIES
@ OXZ_INSTALLABLE_CONFLICTS
@ OXZ_UNINSTALLABLE_VERSION
@ OXZ_UNINSTALLABLE_ALREADY
@ OXZ_UNINSTALLABLE_NOREMOTE
@ OXZ_UNINSTALLABLE_MANUAL
@ OXZ_GUI_ROW_FILTERCURRENT
static NSString *const kOOOXZManifestCache
static NSString *const kOOOXZFilterUpdates
static NSString *const kOOOXZFilterAll
static NSString *const kOOOXZFilterCategory
static NSString *const kOOOXZFilterInstallable
static NSString *const kOOOXZTmpPlistPath
static NSString *const kOOOXZFilterAuthor
NSComparisonResult oxzSort(id m1, id m2, void *context)
static NSString *const kOOOXZDataURL
static NSString *const kOOOXZTmpPath
static NSString *const kOOOXZDataConfig
static NSString *const kOOOXZDebugLog
NSDictionary * OODictionaryFromFile(NSString *path)
NSArray * ComponentsFromVersionString(NSString *string)
NSComparisonResult CompareVersions(NSArray *version1, NSArray *version2)
BOOL processDownloadedOXZ()
NSString * downloadPath()
NSArray * installOptions()
BOOL processDownloadedManifests()
NSArray * removeOptions()
NSString * manifestPath()
BOOL setSelectedRow:(OOGUIRow row)
OOGUIRow addLongText:startingAtRow:align:(NSString *str,[startingAtRow] OOGUIRow row,[align] OOGUIAlignment alignment)
void setText:forRow:(NSString *str,[forRow] OOGUIRow row)
void setText:forRow:align:(NSString *str,[forRow] OOGUIRow row,[align] OOGUIAlignment alignment)
void clearAndKeepBackground:(BOOL keepBackground)
void setSelectableRange:(NSRange range)
void setColor:forRow:(OOColor *color,[forRow] OOGUIRow row)
void setTitle:(NSString *str)
void setTabStops:(OOGUITabSettings stops)
void setArray:forRow:(NSArray *arr,[forRow] OOGUIRow row)
void setKey:forRow:(NSString *str,[forRow] OOGUIRow row)
NSString * cacheDirectoryPathCreatingIfNecessary:(BOOL create)
OOCacheManager * sharedCache()
void setProgressStatus:(NSString *new)
BOOL _downloadAllDependencies
OOGUIRow showRemoveOptions()
NSArray * installOptions()
NSDictionary * installedManifestForIdentifier:(NSString *identifier)
NSURLConnection * _currentDownload
void setFilteredList:(NSArray *list)
NSArray * removeOptions()
void processOptionsNext()
NSString * extractOXZ:(NSUInteger item)
NSString * extractionBasePathForIdentifier:andVersion:(NSString *identifier, [andVersion] NSString *version)
void setFilter:(NSString *filter)
NSString * _currentFilter
OXZDownloadStatus _downloadStatus
NSString * manifestPath()
void setCurrentDownload:withLabel:(NSURLConnection *download, [withLabel] NSString *label)
NSArray * applyCurrentFilter:(NSArray *list)
NSString * humanSize:(NSUInteger bytes)
void processOptionsPrev()
BOOL installOXZ:(NSUInteger item)
BOOL _interfaceShowingOXZDetail
NSString * installStatusForManifest:(NSDictionary *manifest)
void setOXZList:(NSArray *list)
NSString * downloadPath()
OOColor * colorForManifest:(NSDictionary *manifest)
BOOL isAcceptingGUIInput()
NSString * extractAddOnsPath()
NSMutableSet * _dependencyStack
OOOXZManager * sharedManager()
BOOL beginDownload:(NSMutableURLRequest *request)
OXZInterfaceState _interfaceState
BOOL removeOXZ:(NSUInteger item)
BOOL isAcceptingTextInput()
OOGUIRow showInstallOptions()
void processShowInfoKey()
NSArray * additionalAddOnsPaths()
void resetManifestKnowledgeForOXZManager()
NSDictionary * manifestForIdentifier:(NSString *identifier)
NSArray * userRootPaths()
int ZEXPORT unzGetCurrentFileInfo64(unzFile file, unz_file_info64 *pfile_info, char *szFileName, uLong fileNameBufferSize, void *extraField, uLong extraFieldBufferSize, char *szComment, uLong commentBufferSize)
int ZEXPORT unzGoToFirstFile(unzFile file)
unzFile ZEXPORT unzOpen64(const void *path)
int ZEXPORT unzGoToNextFile(unzFile file)
int ZEXPORT unzClose(unzFile file)
struct unz_file_info64_s unz_file_info64