42#import "MyOpenGLView.h"
51static NSString *
const kOOOXZDataURL =
@"https://addons.oolite.space/api/1.0/overview";
117NSComparisonResult
oxzSort(
id m1,
id m2,
void *context);
122#if OOLITE_MAC_OS_X_10_7
123@interface OOOXZManager (OOPrivate) <NSURLConnectionDataDelegate>
125@interface OOOXZManager (NSURLConnectionDataDelegate)
128- (NSString *) manifestPath;
129- (NSString *) downloadPath;
130- (NSString *) extractionBasePathForIdentifier:(NSString *)identifier andVersion:(NSString *)version;
131- (NSString *) dataURL;
132- (NSString *) humanSize:(NSUInteger)bytes;
134- (BOOL) ensureInstallPath;
136- (BOOL) beginDownload:(NSMutableURLRequest *)request;
137- (BOOL) processDownloadedManifests;
138- (BOOL) processDownloadedOXZ;
141- (
OOColor *) colorForManifest:(NSDictionary *)manifest;
142- (NSString *) installStatusForManifest:(NSDictionary *)manifest;
144- (BOOL) validateFilter:(NSString *)input;
146- (void) setOXZList:(NSArray *)list;
147- (void) setFilteredList:(NSArray *)list;
148- (NSArray *) applyCurrentFilter:(NSArray *)list;
150- (void) setCurrentDownload:(NSURLConnection *)download withLabel:(NSString *)label;
151- (void) setProgressStatus:(NSString *)newStatus;
153- (BOOL) installOXZ:(NSUInteger)item;
154- (BOOL) updateAllOXZ;
155- (BOOL) removeOXZ:(NSUInteger)item;
156- (NSArray *) installOptions;
157- (NSArray *) removeOptions;
159- (NSString *) extractOXZ:(NSUInteger)item;
162- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
163- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
164- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
165- (void)connectionDidFinishLoading:(NSURLConnection *)connection;
169@interface OOOXZManager (OOFilterRules)
170- (BOOL) applyFilterByNoFilter:(NSDictionary *)manifest;
171- (BOOL) applyFilterByUpdateRequired:(NSDictionary *)manifest;
172- (BOOL) applyFilterByInstallable:(NSDictionary *)manifest;
173- (BOOL) applyFilterByKeyword:(NSDictionary *)manifest keyword:(NSString *)keyword;
174- (BOOL) applyFilterByAuthor:(NSDictionary *)manifest author:(NSString *)author;
175- (BOOL) applyFilterByDays:(NSDictionary *)manifest days:(NSString *)days;
176- (BOOL) applyFilterByTag:(NSDictionary *)manifest tag:(NSString *)tag;
177- (BOOL) applyFilterByCategory:(NSDictionary *)manifest category:(NSString *)category;
200 [
self setOXZList:OOArrayFromFile([
self manifestPath])];
203 _currentFilter =
@"*";
205 _interfaceShowingOXZDetail = NO;
207 _downloadAllDependencies = NO;
208 _dependencyStack = [[NSMutableSet alloc] initWithCapacity:8];
209 [
self setProgressStatus:@""];
219 [
self setCurrentDownload:nil withLabel:nil];
231- (NSString *) installPath
233 const char *managedAddOnsEnv = SDL_getenv(
"OO_MANAGEDADDONSDIR");
235 if (managedAddOnsEnv)
237 return [NSString stringWithUTF8String:managedAddOnsEnv];
241 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory,NSUserDomainMask,YES);
242 NSString *appPath = [paths objectAtIndex:0];
245 appPath = [appPath stringByAppendingPathComponent:@"Oolite"];
247 appPath = [appPath stringByAppendingPathComponent:@"Managed AddOns"];
252 appPath = [appPath stringByAppendingPathComponent:@"ManagedAddOns"];
261- (NSString *) extractAddOnsPath
263 const char *addOnsExtractEnv = SDL_getenv(
"OO_ADDONSEXTRACTDIR");
265 if (addOnsExtractEnv)
267 return [NSString stringWithUTF8String:addOnsExtractEnv];
272 #if OO_GAME_DATA_TO_USER_FOLDER
273 return [NSString stringWithFormat:@"%s\\Oolite\\AddOns", SDL_getenv("LOCALAPPDATA")];
278 return [[NSHomeDirectory() stringByAppendingPathComponent:@".Oolite"] stringByAppendingPathComponent:@"AddOns"];
284- (NSArray *) additionalAddOnsPaths
286 const char *additionalAddOnsEnv = SDL_getenv(
"OO_ADDITIONALADDONSDIRS");
288 if (additionalAddOnsEnv) {
289 NSString *envStr = [NSString stringWithUTF8String:additionalAddOnsEnv];
290 return [envStr componentsSeparatedByString:@","];
292 return [NSArray array];
296- (NSString *) extractionBasePathForIdentifier:(NSString *)identifier andVersion:(NSString *)version
299 NSString *rawMainDir = [NSString stringWithFormat:@"%@-%@.off",identifier,version];
301 NSCharacterSet *blacklist = [NSCharacterSet characterSetWithCharactersInString:@"'#%^&{}[]/~|\\?<,:\" "];
302 return [[[basePath stringByAppendingPathComponent:[[rawMainDir componentsSeparatedByCharactersInSet:blacklist] componentsJoinedByString:@""]] retain] autorelease];
306- (BOOL) ensureInstallPath
308 BOOL exists, directory;
309 NSFileManager *fmgr = [NSFileManager defaultManager];
310 NSString *path = [
self installPath];
312 exists = [fmgr fileExistsAtPath:path isDirectory:&directory];
314 if (exists && !directory)
321 if (![fmgr oo_createDirectoryAtPath:path attributes:
nil])
332- (NSString *) manifestPath
341- (NSString *) downloadPath
354- (NSString *) dataURL
357 NSString *url = [[NSUserDefaults standardUserDefaults] stringForKey:kOOOXZDataConfig];
366- (NSString *) humanSize:(NSUInteger)bytes
370 return DESC(
@"oolite-oxzmanager-missing-field");
372 else if (bytes < 1024)
376 else if (bytes < 1024*1024)
378 return [NSString stringWithFormat:@"%llu kB",bytes>>10];
382 return [NSString stringWithFormat:@"%.2f MB",((float)(bytes>>10))/1024];
387- (void) setOXZList:(NSArray *)list
392 _oxzList = [[list sortedArrayUsingFunction:oxzSort context:NULL] retain];
399- (void) setFilteredList:(NSArray *)list
402 _filteredList = [list copy];
406- (void) setFilter:(NSString *)filter
409 _currentFilter = [[filter lowercaseString] copy];
413- (NSArray *) applyCurrentFilter:(NSArray *)list
415 SEL filterSelector =
@selector(applyFilterByNoFilter:);
416 NSString *parameter =
nil;
419 filterSelector =
@selector(applyFilterByUpdateRequired:);
423 filterSelector =
@selector(applyFilterByInstallable:);
427 filterSelector =
@selector(applyFilterByKeyword:keyword:);
428 parameter = [_currentFilter substringFromIndex:[kOOOXZFilterKeyword length]];
432 filterSelector =
@selector(applyFilterByAuthor:author:);
433 parameter = [_currentFilter substringFromIndex:[kOOOXZFilterAuthor length]];
437 filterSelector =
@selector(applyFilterByDays:days:);
438 parameter = [_currentFilter substringFromIndex:[kOOOXZFilterDays length]];
442 filterSelector =
@selector(applyFilterByTag:tag:);
443 parameter = [_currentFilter substringFromIndex:[kOOOXZFilterTag length]];
447 filterSelector =
@selector(applyFilterByCategory:category:);
448 parameter = [_currentFilter substringFromIndex:[kOOOXZFilterCategory length]];
451 NSMutableArray *filteredList = [NSMutableArray arrayWithCapacity:[list count]];
452 NSDictionary *manifest =
nil;
453 NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[
self class] instanceMethodSignatureForSelector:filterSelector]];
454 [invocation setSelector:filterSelector];
455 [invocation setTarget:self];
456 if (parameter !=
nil)
458 [invocation setArgument:¶meter atIndex:3];
461 foreach (manifest, list)
463 [invocation setArgument:&manifest atIndex:2];
465 BOOL filterAccepted = NO;
466 [invocation getReturnValue:&filterAccepted];
469 [filteredList addObject:manifest];
474 return [[filteredList copy] autorelease];
479- (BOOL) applyFilterByNoFilter:(NSDictionary *)manifest
485- (BOOL) applyFilterByUpdateRequired:(NSDictionary *)manifest
491- (BOOL) applyFilterByInstallable:(NSDictionary *)manifest
497- (BOOL) applyFilterByKeyword:(NSDictionary *)manifest keyword:(NSString *)keyword
499 NSString *parameter =
nil;
500 NSArray *parameters = [NSArray arrayWithObjects:kOOManifestTitle,kOOManifestDescription,kOOManifestCategory,nil];
503 keyword = [keyword stringByTrimmingLeadingWhitespaceAndNewlineCharacters];
505 foreach (parameter,parameters)
507 if ([[manifest oo_stringForKey:parameter] rangeOfString:keyword options:NSCaseInsensitiveSearch].location != NSNotFound)
513 parameters = [manifest oo_arrayForKey:kOOManifestTags];
514 foreach (parameter,parameters)
516 if ([parameter rangeOfString:keyword options:NSCaseInsensitiveSearch].location != NSNotFound)
526- (BOOL) applyFilterByAuthor:(NSDictionary *)manifest author:(NSString *)author
529 author = [author stringByTrimmingLeadingWhitespaceAndNewlineCharacters];
531 NSString *mAuth = [manifest oo_stringForKey:kOOManifestAuthor];
532 return ([mAuth rangeOfString:author options:NSCaseInsensitiveSearch].location != NSNotFound);
536- (BOOL) applyFilterByDays:(NSDictionary *)manifest days:(NSString *)days
538 NSInteger i = [days integerValue];
545 NSUInteger updated = [manifest oo_unsignedIntegerForKey:kOOManifestUploadDate];
546 NSUInteger now = (NSUInteger)[[NSDate date] timeIntervalSince1970];
547 return (updated + (86400 * i) > now);
552- (BOOL) applyFilterByTag:(NSDictionary *)manifest tag:(NSString *)tag
554 NSString *parameter =
nil;
555 NSArray *parameters = [manifest oo_arrayForKey:kOOManifestTags];
558 tag = [tag stringByTrimmingLeadingWhitespaceAndNewlineCharacters];
560 foreach (parameter,parameters)
562 if ([parameter rangeOfString:tag options:NSCaseInsensitiveSearch].location != NSNotFound)
572- (BOOL) applyFilterByCategory:(NSDictionary *)manifest category:(NSString *)category
575 category = [category stringByTrimmingLeadingWhitespaceAndNewlineCharacters];
577 NSString *mCategory = [manifest oo_stringForKey:kOOManifestCategory];
578 return ([mCategory rangeOfString:category options:NSCaseInsensitiveSearch].location != NSNotFound);
584- (BOOL) validateFilter:(NSString *)input
586 NSString *filter = [input lowercaseString];
587 if (([filter length] == 0)
605- (void) setCurrentDownload:(NSURLConnection *)download withLabel:(NSString *)label
607 if (_currentDownload !=
nil)
609 [_currentDownload cancel];
611 _currentDownload = [download retain];
613 _currentDownloadName = [label copy];
617- (void) setProgressStatus:(NSString *)new
620 _progressStatus = [new copy];
623- (BOOL) updateManifests
625 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[
self dataURL]]];
632 [
self setProgressStatus:@""];
634 return [
self beginDownload:request];
638- (BOOL) beginDownload:(NSMutableURLRequest *)request
640 NSString *userAgent = [NSString stringWithFormat:@"Oolite/%@", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]];
641 [request setValue:userAgent forHTTPHeaderField:@"User-Agent"];
642 [request setHTTPShouldHandleCookies:NO];
643 NSURLConnection *download = [[NSURLConnection alloc] initWithRequest:request delegate:self];
646 _downloadProgress = 0;
647 _downloadExpected = 0;
648 NSString *label =
DESC(
@"oolite-oxzmanager-download-label-list");
651 NSDictionary *expectedManifest =
nil;
652 expectedManifest = [_filteredList objectAtIndex:_item];
654 label = [expectedManifest oo_stringForKey:kOOManifestTitle defaultValue:DESC(@"oolite-oxzmanager-download-label-oxz")];
657 [
self setCurrentDownload:download withLabel:label];
659 OOLog(
kOOOXZDebugLog,
@"Download request received, using %@ and downloading to %@",[request URL],[
self downloadPath]);
678 if (_currentDownload !=
nil)
680 [_currentDownload cancel];
684 NSString *path = [
self downloadPath];
685 [[NSFileManager defaultManager] oo_removeItemAtPath:path];
701- (NSArray *) manifests
707- (NSArray *) managedOXZs
709 if (_managedList ==
nil)
713 NSArray *managedOXZs = [[NSFileManager defaultManager] oo_directoryContentsAtPath:[
self installPath]];
714 NSMutableArray *manifests = [NSMutableArray arrayWithCapacity:[managedOXZs count]];
716 NSString *fullpath =
nil;
717 NSDictionary *manifest =
nil;
720 fullpath = [[
self installPath] stringByAppendingPathComponent:filename];
724 NSMutableDictionary *adjManifest = [NSMutableDictionary dictionaryWithDictionary:manifest];
725 [adjManifest setObject:fullpath forKey:kOOManifestFilePath];
727 NSDictionary *stored =
nil;
732 BOOL foundInstallable = NO;
733 foreach (stored, _oxzList)
737 if (foundInstallable == NO)
739 [adjManifest setObject:[stored oo_stringForKey:kOOManifestVersion] forKey:kOOManifestAvailableVersion];
740 [adjManifest setObject:[stored oo_stringForKey:kOOManifestDownloadURL] forKey:kOOManifestDownloadURL];
743 foundInstallable = YES;
749 [manifests addObject:adjManifest];
752 [manifests sortUsingFunction:oxzSort context:NULL];
754 _managedList = [manifests copy];
760- (BOOL) processDownloadedManifests
766 [
self setOXZList:OOArrayFromFile([
self downloadPath])];
769 [_oxzList writeToFile:[
self manifestPath] atomically:YES];
771 [[NSFileManager defaultManager] oo_removeItemAtPath:[
self downloadPath]];
781 OOLog(
kOOOXZErrorLog,
@"Downloaded manifest was not a valid plist, has been left in %@",[
self downloadPath]);
783 [
self setOXZList:OOArrayFromFile([
self manifestPath])];
791- (BOOL) processDownloadedOXZ
798 NSDictionary *downloadedManifest =
OODictionaryFromFile([[
self downloadPath] stringByAppendingPathComponent:
@"manifest.plist"]);
799 if (downloadedManifest ==
nil)
802 OOLog(
kOOOXZErrorLog,
@"Downloaded OXZ does not contain a manifest.plist, has been left in %@",[
self downloadPath]);
807 NSDictionary *expectedManifest =
nil;
808 expectedManifest = [_filteredList objectAtIndex:_item];
810 if (expectedManifest ==
nil ||
816 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.");
823 NSString *
filename = [[downloadedManifest oo_stringForKey:kOOManifestIdentifier] stringByAppendingString:@".oxz"];
825 if (![
self ensureInstallPath])
835 NSString *destination = [[
self installPath] stringByAppendingPathComponent:filename];
836 [[NSFileManager defaultManager] oo_removeItemAtPath:destination];
839 if (![[NSFileManager defaultManager] oo_moveItemAtPath:[
self downloadPath] toPath:destination])
864 NSArray *
requires = [downloadedManifest oo_arrayForKey:kOOManifestRequiresOXPs defaultValue:nil];
868 requires = [expectedManifest oo_arrayForKey:kOOManifestRequiresOXPs defaultValue:nil];
870 NSDictionary *requirement =
nil;
871 NSMutableString *progress = [NSMutableString stringWithCapacity:2048];
874 if ([_dependencyStack
count] > 0)
877 NSSet *tempStack = [NSSet setWithSet:_dependencyStack];
878 foreach (requirement, tempStack)
881 if (![
ResourceManager manifest:downloadedManifest HasUnmetDependency:requirement logErrors:NO]
882 && requires !=
nil && [requires containsObject:requirement])
885 [progress appendFormat:DESC(@"oolite-oxzmanager-progress-now-has-@"),[requirement oo_stringForKey:kOOManifestRelationDescription defaultValue:[requirement oo_stringForKey:kOOManifestRelationIdentifier]]];
886 [_dependencyStack removeObject:requirement];
890 [_dependencyStack removeObject:requirement];
896 foreach (requirement,
requires)
898 if ([
ResourceManager manifest:downloadedManifest HasUnmetDependency:requirement logErrors:NO])
901 [_dependencyStack addObject:requirement];
902 [progress appendFormat:DESC(@"oolite-oxzmanager-progress-requires-@"),[requirement oo_stringForKey:kOOManifestRelationDescription defaultValue:[requirement oo_stringForKey:kOOManifestRelationIdentifier]]];
906 if ([_dependencyStack
count] > 0)
910 BOOL undownloadedRequirement = NO;
911 NSDictionary *availableDownload =
nil;
912 BOOL foundDownload = NO;
913 NSUInteger index = 0;
914 NSString *needsIdentifier =
nil;
918 undownloadedRequirement = YES;
919 requirement = [_dependencyStack anyObject];
922 if (!_downloadAllDependencies)
924 [progress appendString:DESC(@"oolite-oxzmanager-progress-get-required")];
926 needsIdentifier = [requirement oo_stringForKey:kOOManifestRelationIdentifier];
928 foreach (availableDownload, _oxzList)
936 index = [_oxzList indexOfObject:availableDownload];
950 [_dependencyStack removeObject:requirement];
951 if ([_dependencyStack
count] > 0)
954 undownloadedRequirement = NO;
965 while (!undownloadedRequirement);
970 [
self setFilteredList:_oxzList];
973 if (_downloadAllDependencies)
976 if (![
self installOXZ:index]) {
979 [progress appendFormat:DESC(@"oolite-oxzmanager-progress-required-@-not-found"),[requirement oo_stringForKey:kOOManifestRelationDescription defaultValue:[requirement oo_stringForKey:kOOManifestRelationIdentifier]]];
980 [
self setProgressStatus:progress];
981 OOLog(
kOOOXZErrorLog,
@"OXZ dependency %@ could not be found for automatic download.",needsIdentifier);
994 [
self setProgressStatus:progress];
999 else if ([_dependencyStack
count] > 0)
1001 [progress appendFormat:DESC(@"oolite-oxzmanager-progress-required-@-not-found"),[requirement oo_stringForKey:kOOManifestRelationDescription defaultValue:[requirement oo_stringForKey:kOOManifestRelationIdentifier]]];
1002 [
self setProgressStatus:progress];
1003 OOLog(
kOOOXZErrorLog,
@"OXZ dependency %@ could not be found for automatic download.",needsIdentifier);
1012 [
self setProgressStatus:@""];
1014 [_dependencyStack removeAllObjects];
1015 _downloadAllDependencies = NO;
1021- (NSDictionary *) installedManifestForIdentifier:(NSString *)identifier
1023 NSArray *installed = [
self managedOXZs];
1024 NSDictionary *manifest =
nil;
1025 foreach (manifest,installed)
1038 NSString *title = [manifest oo_stringForKey:kOOManifestTitle defaultValue:nil];
1039 NSString *identifier = [manifest oo_stringForKey:kOOManifestIdentifier defaultValue:nil];
1041 if (![
ResourceManager checkVersionCompatibility:manifest forOXP:title])
1046 NSDictionary *installed = [
self installedManifestForIdentifier:identifier];
1047 if (installed ==
nil)
1053 if (installed !=
nil)
1061 && [[NSFileManager defaultManager] fileExistsAtPath:[installed oo_stringForKey:
kOOManifestFilePath]])
1079 if (installed !=
nil)
1081 NSString *availableVersion = [manifest oo_stringForKey:kOOManifestAvailableVersion];
1082 if (availableVersion ==
nil)
1084 availableVersion = [manifest oo_stringForKey:kOOManifestVersion];
1086 NSString *installedVersion = [installed oo_stringForKey:kOOManifestVersion];
1087 OOLog(
@"version.debug",
@"%@ mv:%@ mav:%@",identifier,installedVersion,availableVersion);
1095 if ([
ResourceManager manifestHasMissingDependencies:manifest logErrors:NO])
1103- (
OOColor *) colorForManifest:(NSDictionary *)manifest
1105 switch ([
self installableState:manifest])
1128- (NSString *) installStatusForManifest:(NSDictionary *)manifest
1130 switch ([
self installableState:manifest])
1133 return DESC(
@"oolite-oxzmanager-installable-okay");
1135 return DESC(
@"oolite-oxzmanager-installable-update");
1137 return DESC(
@"oolite-oxzmanager-installable-depend");
1139 return DESC(
@"oolite-oxzmanager-installable-conflicts");
1141 return DESC(
@"oolite-oxzmanager-installable-already");
1143 return DESC(
@"oolite-oxzmanager-installable-manual");
1145 return DESC(
@"oolite-oxzmanager-installable-version");
1147 return DESC(
@"oolite-oxzmanager-installable-noremote");
1163 [PLAYER destroySound];
1167 [gui
setTitle:DESC(@"oolite-oxzmanager-title")];
1171 switch (_interfaceState)
1174 [gui
setTitle:DESC(@"oolite-oxzmanager-title-setfilter")];
1175 [gui
setText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-currentfilter-is-@"),_currentFilter]
forRow:OXZ_GUI_ROW_FILTERCURRENT
align:GUI_ALIGN_LEFT];
1181 if (_oxzList ==
nil)
1184 [gui
setText:DESC(@"oolite-oxzmanager-download-list")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1193 [gui
setText:DESC(@"oolite-oxzmanager-download-noupdate")
forRow:OXZ_GUI_ROW_PROCEED
align:GUI_ALIGN_CENTER];
1196 [gui
setText:DESC(@"oolite-oxzmanager-update-list")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1213 [gui
setText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-currentfilter-is-@-@"),OOExpand(@"[oolite_key_oxzmanager_setfilter]"),_currentFilter]
forRow:OXZ_GUI_ROW_LISTFILTER
align:GUI_ALIGN_LEFT];
1217 [gui
setText:DESC(@"oolite-oxzmanager-install")
forRow:OXZ_GUI_ROW_INSTALL
align:GUI_ALIGN_CENTER];
1219 [gui
setText:DESC(@"oolite-oxzmanager-installed")
forRow:OXZ_GUI_ROW_INSTALLED
align:GUI_ALIGN_CENTER];
1220 [gui
setKey:@"_INSTALLED"
forRow:OXZ_GUI_ROW_INSTALLED];
1221 [gui
setText:DESC(@"oolite-oxzmanager-remove")
forRow:OXZ_GUI_ROW_REMOVE
align:GUI_ALIGN_CENTER];
1223 [gui
setText:DESC(@"oolite-oxzmanager-update-list")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1225 [gui
setText:DESC(@"oolite-oxzmanager-update-all")
forRow:OXZ_GUI_ROW_UPDATE_ALL
align:GUI_ALIGN_CENTER];
1226 [gui
setKey:@"_UPDATE_ALL"
forRow:OXZ_GUI_ROW_UPDATE_ALL];
1232 [gui
setTitle:DESC(@"oolite-oxzmanager-title-downloading")];
1240 [gui
addLongText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-progress-@-is-@-of-@"),_currentDownloadName,[
self humanSize:_downloadProgress],[
self humanSize:_downloadExpected]]
startingAtRow:OXZ_GUI_ROW_PROGRESS
align:GUI_ALIGN_LEFT];
1244 [gui
setText:DESC(@"oolite-oxzmanager-cancel")
forRow:OXZ_GUI_ROW_CANCEL
align:GUI_ALIGN_CENTER];
1249 [gui
setTitle:DESC(@"oolite-oxzmanager-title-dependencies")];
1251 [gui
setText:DESC(@"oolite-oxzmanager-dependencies-decision")
forRow:OXZ_GUI_ROW_PROGRESS
align:GUI_ALIGN_LEFT];
1256 [gui
setText:DESC(@"oolite-oxzmanager-dependencies-yes-all")
forRow:OXZ_GUI_ROW_INSTALLED
align:GUI_ALIGN_CENTER];
1257 [gui
setKey:@"_PROCEED_ALL"
forRow:OXZ_GUI_ROW_INSTALLED];
1259 [gui
setText:DESC(@"oolite-oxzmanager-dependencies-yes")
forRow:OXZ_GUI_ROW_PROCEED
align:GUI_ALIGN_CENTER];
1262 [gui
setText:DESC(@"oolite-oxzmanager-dependencies-no")
forRow:OXZ_GUI_ROW_CANCEL
align:GUI_ALIGN_CENTER];
1268 [gui
setText:DESC(@"oolite-oxzmanager-acknowledge")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1275 [gui
addLongText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-progress-done-%u-%u"),[_oxzList count],[[
self managedOXZs] count]]
startingAtRow:OXZ_GUI_ROW_PROGRESS
align:GUI_ALIGN_LEFT];
1283 [gui
setText:DESC(@"oolite-oxzmanager-acknowledge")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1289 NSDictionary *manifest = [_filteredList oo_dictionaryAtIndex:_item];
1290 NSString *title = [manifest oo_stringForKey:kOOManifestTitle];
1291 NSString *version = [manifest oo_stringForKey:kOOManifestVersion];
1292 NSString *identifier = [manifest oo_stringForKey:kOOManifestIdentifier];
1293 [gui
setTitle:DESC(@"oolite-oxzmanager-title-extract")];
1294 [gui
setText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-title-@-version-@"),
1304 NSString *path = [
self extractionBasePathForIdentifier:identifier andVersion:version];
1305 if ([[NSFileManager defaultManager] fileExistsAtPath:path])
1307 [gui
addLongText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-extract-@-already-exists"), path]
1310 [gui
setText:DESC(@"oolite-oxzmanager-extract-unavailable")
forRow:OXZ_GUI_ROW_PROCEED
align:GUI_ALIGN_CENTER];
1315 [gui
addLongText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-extract-to-@"), path]
1318 [gui
setText:DESC(@"oolite-oxzmanager-extract-proceed")
forRow:OXZ_GUI_ROW_PROCEED
align:GUI_ALIGN_CENTER];
1322 [gui
setText:DESC(@"oolite-oxzmanager-extract-cancel")
forRow:OXZ_GUI_ROW_CANCEL
align:GUI_ALIGN_CENTER];
1329 [gui
setText:DESC(@"oolite-oxzmanager-acknowledge")
forRow:OXZ_GUI_ROW_UPDATE
align:GUI_ALIGN_CENTER];
1338 [gui
setTitle:DESC(@"oolite-oxzmanager-title-install")];
1339 [
self setFilteredList:[
self applyCurrentFilter:_oxzList]];
1340 startRow = [
self showInstallOptions];
1344 [gui
setTitle:DESC(@"oolite-oxzmanager-title-installed")];
1345 [
self setFilteredList:[
self applyCurrentFilter:[
self managedOXZs]]];
1346 startRow = [
self showInstallOptions];
1350 [gui
setTitle:DESC(@"oolite-oxzmanager-title-remove")];
1351 [
self setFilteredList:[
self applyCurrentFilter:[
self managedOXZs]]];
1352 startRow = [
self showRemoveOptions];
1358 [gui
setText:DESC(@"oolite-oxzmanager-exit-restart")
forRow:OXZ_GUI_ROW_EXIT
align:GUI_ALIGN_CENTER];
1362 [gui
setText:DESC(@"oolite-oxzmanager-exit")
forRow:OXZ_GUI_ROW_EXIT
align:GUI_ALIGN_CENTER];
1382- (BOOL) isRestarting
1389 [UNIVERSE reinitAndShowDemo:YES];
1402- (void) processSelection
1409 [
self cancelUpdate];
1410 [_dependencyStack removeAllObjects];
1411 _downloadAllDependencies = NO;
1419 [PLAYER setGuiToIntroFirstGo:YES];
1420 if (_oxzList !=
nil)
1440 [_dependencyStack removeAllObjects];
1441 _downloadAllDependencies = NO;
1447 [_dependencyStack removeAllObjects];
1448 _downloadAllDependencies = NO;
1454 [
self cancelUpdate];
1462 [
self updateManifests];
1473 _downloadAllDependencies = YES;
1474 [
self installOXZ:_item];
1485 [
self installOXZ:_item];
1493 [
self setProgressStatus:[
self extractOXZ:_item]];
1504 [
self updateAllOXZ];
1508 [
self processOptionsPrev];
1513 [
self processOptionsNext];
1521 [
self removeOXZ:item];
1526 [
self installOXZ:item];
1531 [
self installOXZ:item];
1540- (BOOL) isAcceptingTextInput
1546- (BOOL) isAcceptingGUIInput
1548 return !_interfaceShowingOXZDetail;
1552- (void) processTextInput:(NSString *)input
1554 if ([
self validateFilter:input])
1556 if ([input length] > 0)
1558 [
self setFilter:input];
1567- (void) refreshTextInput:(NSString *)input
1570 [gui
setText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-text-prompt-@"), input]
forRow:OXZ_GUI_ROW_INPUT
align:GUI_ALIGN_LEFT];
1571 if ([
self validateFilter:input])
1582- (void) processFilterKey
1584 if (_interfaceShowingOXZDetail)
1586 _interfaceShowingOXZDetail = NO;
1591 [[UNIVERSE gameView] resetTypedString];
1598- (void) processShowInfoKey
1604 if (_interfaceShowingOXZDetail)
1606 _interfaceShowingOXZDetail = NO;
1611 [
self showOptionsUpdate];
1626 NSDictionary *manifest = [_filteredList oo_dictionaryAtIndex:_item];
1627 _interfaceShowingOXZDetail = YES;
1630 [gui
setTitle:DESC(@"oolite-oxzmanager-title-infopage")];
1633 [gui
setText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-title-@-version-@"),
1634 [manifest oo_stringForKey:kOOManifestTitle],
1635 [manifest oo_stringForKey:kOOManifestVersion]]
1639 [gui
setText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-author-@"),
1640 [manifest oo_stringForKey:kOOManifestAuthor]]
1644 [gui
addLongText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-license-@"),
1645 [manifest oo_stringForKey:kOOManifestLicense]]
1649 [gui
addLongText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-tags-@"),[[manifest oo_arrayForKey:kOOManifestTags] componentsJoinedByString: @", "]]
1652 [gui
addLongText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-description-@"),[manifest oo_stringForKey:kOOManifestDescription]]
1656 NSString *infoURLString = [manifest oo_stringForKey:kOOManifestInformationURL];
1657 [gui
setText:[NSString stringWithFormat:DESC(@"oolite-oxzmanager-infopage-infourl-@"),
1661 [[UNIVERSE gameView] stringToClipboard:infoURLString];
1664 [gui
setText:OOExpand(DESC(@"oolite-oxzmanager-infopage-return"))
forRow:27
align:GUI_ALIGN_CENTER];
1672- (void) processExtractKey
1694- (BOOL) installOXZ:(NSUInteger)item
1696 NSArray *picklist = _filteredList;
1698 if ([picklist
count] <= item)
1702 NSDictionary *manifest = [picklist objectAtIndex:item];
1711 NSString *url = [manifest objectForKey:kOOManifestDownloadURL];
1717 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
1725 [
self setProgressStatus:@""];
1726 return [
self beginDownload:request];
1730- (BOOL) updateAllOXZ
1732 [_dependencyStack removeAllObjects];
1733 _downloadAllDependencies = YES;
1734 [
self setFilteredList:_oxzList];
1735 NSDictionary *manifest =
nil;
1737 foreach (manifest,_oxzList)
1742 [_dependencyStack addObject:manifest];
1745 NSDictionary *first = [_dependencyStack anyObject];
1746 NSString* identifier = [first oo_stringForKey:kOOManifestRelationIdentifier];
1747 NSUInteger item = NSUIntegerMax;
1748 NSDictionary *availableDownload =
nil;
1749 foreach (availableDownload, _oxzList)
1753 item = [_oxzList indexOfObject:availableDownload];
1757 return [
self installOXZ:item];
1761- (NSArray *) installOptions
1763 NSUInteger start = _offset;
1764 if (start >= [_filteredList
count])
1770 if (end > [_filteredList
count])
1772 end = [_filteredList count];
1774 return [_filteredList subarrayWithRange:NSMakeRange(start,end-start)];
1782 NSArray *options = [
self installOptions];
1783 NSUInteger optCount = [_filteredList count];
1793 [gui
setArray:[NSArray arrayWithObjects:DESC(@"oolite-oxzmanager-heading-category"),
1794 DESC(@"oolite-oxzmanager-heading-title"),
1795 DESC(@"oolite-oxzmanager-heading-installed"),
1796 DESC(@"oolite-oxzmanager-heading-downloadable"),
1797 nil]
forRow:OXZ_GUI_ROW_LISTHEAD];
1802 [gui
setArray:[NSArray arrayWithObjects:DESC(@"gui-back"), @"",@"",@" <-- ", nil]
forRow:OXZ_GUI_ROW_LISTPREV];
1814 if (_offset + 10 < optCount)
1817 [gui
setArray:[NSArray arrayWithObjects:DESC(@"gui-more"), @"",@"",@" --> ", nil]
forRow:OXZ_GUI_ROW_LISTNEXT];
1844 NSDictionary *manifest =
nil;
1845 BOOL oxzLineSelected = NO;
1847 foreach (manifest, options)
1850 NSString *localPath = [[[
self installPath] stringByAppendingPathComponent:[manifest oo_stringForKey:kOOManifestIdentifier]] stringByAppendingPathExtension:@"oxz"];
1851 if (installed ==
nil)
1854 installed =
OODictionaryFromFile([localPath stringByAppendingPathComponent:
@"manifest.plist"]);
1859 if ([[NSFileManager defaultManager] fileExistsAtPath:localPath])
1862 installed =
OODictionaryFromFile([localPath stringByAppendingPathComponent:
@"manifest.plist"]);
1874 NSString *installedVersion =
DESC(
@"oolite-oxzmanager-version-none");
1875 if (installed !=
nil)
1877 installedVersion = [installed oo_stringForKey:kOOManifestVersion defaultValue:DESC(@"oolite-oxzmanager-version-none")];
1882 [gui
setArray:[NSArray arrayWithObjects:
1883 [manifest oo_stringForKey:kOOManifestCategory defaultValue:DESC(@"oolite-oxzmanager-missing-field")],
1884 [manifest oo_stringForKey:kOOManifestTitle defaultValue:DESC(@"oolite-oxzmanager-missing-field")],
1886 [manifest oo_stringForKey:kOOManifestAvailableVersion defaultValue:[manifest oo_stringForKey:kOOManifestVersion defaultValue:DESC(@"oolite-oxzmanager-version-none")]],
1889 [gui
setKey:[manifest oo_stringForKey:kOOManifestIdentifier]
forRow:row];
1893 if (row == [gui selectedRow])
1895 oxzLineSelected = YES;
1897 [gui
setText:[
self installStatusForManifest:manifest]
forRow:OXZ_GUI_ROW_LISTSTATUS];
1900 [gui
addLongText:[[[manifest oo_stringForKey:kOOManifestDescription] componentsSeparatedByString:@"\n"] oo_stringAtIndex:0]
startingAtRow:OXZ_GUI_ROW_LISTDESC
align:GUI_ALIGN_LEFT];
1902 NSString *infoUrl = [manifest oo_stringForKey:kOOManifestInformationURL];
1905 [gui
setArray:[NSArray arrayWithObjects:DESC(@"oolite-oxzmanager-infoline-url"),infoUrl,nil]
forRow:OXZ_GUI_ROW_LISTINFO1];
1907 NSUInteger
size = [manifest oo_unsignedIntForKey:kOOManifestFileSize defaultValue:0];
1908 NSString *updatedDesc =
nil;
1910 NSUInteger timestamp = [manifest oo_unsignedIntegerForKey:kOOManifestUploadDate defaultValue:0];
1914 NSDate *updated = [NSDate dateWithTimeIntervalSince1970:timestamp];
1917 updatedDesc = [[[updated description] componentsSeparatedByString:@" "] oo_stringAtIndex:0];
1919 [gui
setArray:[NSArray arrayWithObjects:DESC(@"oolite-oxzmanager-infoline-size"),[
self humanSize:size],DESC(@"oolite-oxzmanager-infoline-date"),updatedDesc,nil]
forRow:OXZ_GUI_ROW_LISTINFO2];
1924 [gui
setArray:[NSArray arrayWithObjects:DESC(@"oolite-oxzmanager-infoline-size"),[
self humanSize:size],nil]
forRow:OXZ_GUI_ROW_LISTINFO2];
1934 if (!oxzLineSelected)
1954- (BOOL) removeOXZ:(NSUInteger)item
1956 NSArray *remList = _filteredList;
1957 if ([remList
count] <= item)
1959 OOLog(
kOOOXZDebugLog,
@"Unable to remove item %lu as only %lu in list", (
unsigned long)item, (
unsigned long)[remList
count]);
1962 NSString *
filename = [[remList objectAtIndex:item] oo_stringForKey:kOOManifestFilePath];
1965 OOLog(
kOOOXZDebugLog,
@"Unable to remove item %lu as filename not found", (
unsigned long)item);
1969 if (![[NSFileManager defaultManager] oo_removeItemAtPath:
filename])
1982- (NSArray *) removeOptions
1984 NSArray *remList = _filteredList;
1985 if ([remList
count] == 0)
1989 NSUInteger start = _offset;
1990 if (start >= [remList
count])
1996 if (end > [remList
count])
1998 end = [remList count];
2000 return [remList subarrayWithRange:NSMakeRange(start,end-start)];
2008 NSArray *options = [
self removeOptions];
2022 [gui
setArray:[NSArray arrayWithObjects:DESC(@"oolite-oxzmanager-heading-category"),
2023 DESC(@"oolite-oxzmanager-heading-title"),
2024 DESC(@"oolite-oxzmanager-heading-version"),
2025 nil]
forRow:OXZ_GUI_ROW_LISTHEAD];
2029 [gui
setArray:[NSArray arrayWithObjects:DESC(@"gui-back"), @"",@" <-- ", nil]
forRow:OXZ_GUI_ROW_LISTPREV];
2044 [gui
setArray:[NSArray arrayWithObjects:DESC(@"gui-more"), @"",@" --> ", nil]
forRow:OXZ_GUI_ROW_LISTNEXT];
2072 NSDictionary *manifest =
nil;
2073 BOOL oxzSelected = NO;
2075 foreach (manifest, options)
2078 [gui
setArray:[NSArray arrayWithObjects:
2079 [manifest oo_stringForKey:kOOManifestCategory defaultValue:DESC(@"oolite-oxzmanager-missing-field")],
2080 [manifest oo_stringForKey:kOOManifestTitle defaultValue:DESC(@"oolite-oxzmanager-missing-field")],
2081 [manifest oo_stringForKey:kOOManifestVersion defaultValue:DESC(@"oolite-oxzmanager-missing-field")],
2083 NSString *identifier = [manifest oo_stringForKey:kOOManifestIdentifier];
2088 if (row == [gui selectedRow])
2090 [gui
setText:[
self installStatusForManifest:manifest]
forRow:OXZ_GUI_ROW_LISTSTATUS];
2093 [gui
addLongText:[[[manifest oo_stringForKey:kOOManifestDescription] componentsSeparatedByString:@"\n"] oo_stringAtIndex:0]
startingAtRow:OXZ_GUI_ROW_LISTDESC
align:GUI_ALIGN_LEFT];
2109- (void) showOptionsUpdate
2114 [
self setFilteredList:[
self applyCurrentFilter:_oxzList]];
2115 [
self showInstallOptions];
2119 [
self setFilteredList:[
self applyCurrentFilter:[
self managedOXZs]]];
2120 [
self showInstallOptions];
2124 [
self setFilteredList:[
self applyCurrentFilter:[
self managedOXZs]]];
2125 [
self showRemoveOptions];
2131- (void) showOptionsPrev
2138 [
self processSelection];
2144- (void) processOptionsPrev
2154 [
self showOptionsUpdate];
2158- (void) processOptionsNext
2164 [
self showOptionsUpdate];
2169- (void) showOptionsNext
2176 [
self processSelection];
2182- (NSString *) extractOXZ:(NSUInteger)item
2184 NSFileManager *fmgr = [NSFileManager defaultManager];
2185 NSMutableString *extractionLog = [[NSMutableString alloc] init];
2186 NSDictionary *manifest = [_filteredList oo_dictionaryAtIndex:item];
2187 NSString *version = [manifest oo_stringForKey:kOOManifestVersion];
2188 NSString *identifier = [manifest oo_stringForKey:kOOManifestIdentifier];
2189 NSString *path = [
self extractionBasePathForIdentifier:identifier andVersion:version];
2195 NSString *oxzfile = [manifest oo_stringForKey:kOOManifestFilePath];
2196 if (![fmgr fileExistsAtPath:oxzfile])
2199 [extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-no-original")];
2200 return [extractionLog autorelease];
2202 const char* zipname = [oxzfile UTF8String];
2208 [extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-bad-original")];
2209 return [extractionLog autorelease];
2212 if ([fmgr fileExistsAtPath:path])
2215 [extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-main-exists")];
2217 return [extractionLog autorelease];
2219 if (![fmgr oo_createDirectoryAtPath:path attributes:
nil])
2222 [extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-main-unmakeable")];
2224 return [extractionLog autorelease];
2226 [extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-main-created")];
2227 NSUInteger counter = 0;
2228 char rawComponentName[512];
2236 rawComponentName, 512,
2239 NSString *componentName = [NSString stringWithUTF8String:rawComponentName];
2240 if ([componentName hasSuffix:
@"/"])
2243 if (![fmgr oo_createDirectoryAtPath:[path stringByAppendingPathComponent:componentName] attributes:
nil])
2246 [extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-sub-failed")];
2259 NSString *folder = [[path stringByAppendingPathComponent:componentName] stringByDeletingLastPathComponent];
2260 if ([folder length] > 0 && ![fmgr fileExistsAtPath:folder] && ![fmgr oo_createDirectoryAtPath:folder attributes:
nil])
2263 [extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-sub-failed")];
2272 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
2273 NSData *tmp = [NSData oo_dataWithOXZFile:[oxzfile stringByAppendingPathComponent:componentName]];
2277 [extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-sub-failed")];
2284 if (![tmp writeToFile:[path stringByAppendingPathComponent:componentName] atomically:YES])
2287 [extractionLog appendString:DESC(@"oolite-oxzmanager-extract-log-sub-failed")];
2307 [extractionLog appendFormat:DESC(@"oolite-oxzmanager-extract-log-num-u-extracted"),counter];
2308 [extractionLog appendFormat:DESC(@"oolite-oxzmanager-extract-log-extracted-to-@"),path];
2311 return [extractionLog autorelease];
2317- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
2321 _downloadExpected = [response expectedContentLength];
2322 _downloadProgress = 0;
2324 [[NSFileManager defaultManager] createFileAtPath:[
self downloadPath] contents:nil attributes:nil];
2325 _fileWriter = [[NSFileHandle fileHandleForWritingAtPath:[
self downloadPath]] retain];
2326 if (_fileWriter ==
nil)
2330 [
self cancelUpdate];
2335- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
2338 [_fileWriter seekToEndOfFile];
2339 [_fileWriter writeData:data];
2340 _downloadProgress += [data length];
2358 [[NSRunLoop currentRunLoop] limitDateForMode:NSDefaultRunLoopMode];
2363- (void)connectionDidFinishLoading:(NSURLConnection *)connection
2367 [_fileWriter synchronizeFile];
2368 [_fileWriter closeFile];
2373 if (![
self processDownloadedManifests])
2380 if (![
self processDownloadedOXZ])
2387 OOLog(
kOOOXZErrorLog,
@"Error: download completed in unexpected state %d. This is an internal error - please report it.",_interfaceState);
2393- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
2397 [_fileWriter closeFile];
2408NSComparisonResult
oxzSort(
id m1,
id m2,
void *context)
2410 NSComparisonResult result = [[m1 oo_stringForKey:kOOManifestCategory defaultValue:@"zz"] localizedCompare:[m2 oo_stringForKey:kOOManifestCategory defaultValue:@"zz"]];
2411 if (result == NSOrderedSame)
2413 result = [[m1 oo_stringForKey:kOOManifestTitle defaultValue:@"zz"] localizedCompare:[m2 oo_stringForKey:kOOManifestTitle defaultValue:@"zz"]];
2414 if (result == NSOrderedSame)
2416 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
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 OOOXZManager * sSingleton
static NSString *const kOOOXZDebugLog
@ OXZ_GUI_ROW_FILTERCURRENT
NSDictionary * OODictionaryFromFile(NSString *path)
NSArray * ComponentsFromVersionString(NSString *string)
NSComparisonResult CompareVersions(NSArray *version1, NSArray *version2)
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 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)