34#if OO_OXP_VERIFIER_ENABLED
39#pragma push_macro("interface")
41#define interface struct
47#pragma pop_macro("interface")
65@interface OOOXPVerifier (OOPrivate)
67- (id)initWithPath:(NSString *)path;
76- (BOOL)setUpDependencies:(NSSet *)dependencies
79- (void)setUpDependents:(NSSet *)dependents
98 NSArray *arguments =
nil;
99 NSEnumerator *argEnum =
nil;
101 NSString *foundPath =
nil;
102 BOOL exists, isDirectory;
104 NSAutoreleasePool *pool =
nil;
111 for (argEnum = [arguments objectEnumerator]; (arg = [
argEnum nextObject]); )
113 if ([arg isEqual:
@"-verify-oxp"] || [arg isEqual:
@"--verify-oxp"])
115 foundPath = [
argEnum nextObject];
116 if (foundPath ==
nil)
118 OOLog(
@"verifyOXP.noPath",
@"***** ERROR: %@ passed without path argument; nothing to verify.", arg);
122 foundPath = [
foundPath stringByExpandingTildeInPath];
127 if (foundPath ==
nil)
134 exists = [[
NSFileManager defaultManager] fileExistsAtPath:foundPath isDirectory:&isDirectory];
137 OOLog(
@"verifyOXP.badPath",
@"***** ERROR: no OXP exists at path \"%@\
"; nothing to verify.", foundPath);
139 else if (!isDirectory)
141 OOLog(
@"verifyOXP.badPath",
@"***** ERROR: \"%@\
" is a file, not an OXP directory; nothing to verify.", foundPath);
160 [_verifierPList release];
162 [_displayName release];
163 [_stagesByName release];
164 [_waitingStages release];
172 NSString *name =
nil;
176 if (stage ==
nil)
return;
180 OOLog(
@"verifyOXP.registration.failed",
@"Attempt to register class %@ as a verifier stage, but it is not a subclass of OOOXPVerifierStage; ignoring.", [stage
class]);
186 OOLog(
@"verifyOXP.registration.failed",
@"Attempt to register verifier stage %@ after registration closed, ignoring.", stage);
193 OOLog(
@"verifyOXP.registration.failed",
@"Attempt to register verifier stage %@ with nil name, ignoring.", stage);
198 existing = [_stagesByName objectForKey:name];
199 if (existing == stage)
return;
202 OOLog(
@"verifyOXP.registration.failed",
@"Attempt to register verifier stage %@ with same name as stage %@, ignoring.", stage, existing);
208 [_stagesByName setObject:stage forKey:name];
209 [_waitingStages addObject:stage];
215 return [[_basePath retain] autorelease];
221 return [[_displayName retain] autorelease];
225- (id)stageWithName:(NSString *)name
227 if (name ==
nil)
return nil;
229 return [_stagesByName objectForKey:name];
233- (id)configurationValueForKey:(NSString *)key
235 return [_verifierPList objectForKey:key];
239- (NSArray *)configurationArrayForKey:(NSString *)key
241 return [_verifierPList oo_arrayForKey:key];
245- (NSDictionary *)configurationDictionaryForKey:(NSString *)key
247 return [_verifierPList oo_dictionaryForKey:key];
251- (NSString *)configurationStringForKey:(NSString *)key
253 return [_verifierPList oo_stringForKey:key];
257- (NSSet *)configurationSetForKey:(NSString *)key
259 NSArray *array = [_verifierPList oo_arrayForKey:key];
260 return array !=
nil ? [
NSSet setWithArray:array] :
nil;
266@implementation OOOXPVerifier (OOPrivate)
268- (id)initWithPath:(NSString *)path
274 NSString *verifierPListPath = [[[
ResourceManager builtInPath] stringByAppendingPathComponent:@"Config"] stringByAppendingPathComponent:@"verifyOXP.plist"];
275 _verifierPList = [[
NSDictionary dictionaryWithContentsOfFile:verifierPListPath] retain];
277 _basePath = [
path copy];
278 _displayName = [[
NSFileManager defaultManager] displayNameAtPath:_basePath];
279 if (_displayName ==
nil) _displayName = [
_basePath lastPathComponent];
285 if (_verifierPList ==
nil ||
288 OOLog(
@"verifyOXP.setup.failed",
@"%@",
@"***** ERROR: failed to set up OXP verifier.");
293 _openForRegistration = YES;
317 OOLog(
@"verifyOXP.start",
@"Running OXP verifier for %@", _basePath);
324 OOLog(
@"verifyOXP.done",
@"%@",
@"OXP verification complete.");
332 NSDictionary *overrides =
nil;
333 NSEnumerator *messageClassEnum =
nil;
334 NSString *messageClass =
nil;
339 overrides = [
_verifierPList oo_dictionaryForKey:@"logControlOverride"];
340 for (messageClassEnum = [overrides keyEnumerator]; (messageClass = [
messageClassEnum nextObject]); )
349 verbose = [[
NSUserDefaults standardUserDefaults] objectForKey:@"oxp-verifier-verbose-logging"];
356 NSAutoreleasePool *pool =
nil;
358 NSSet *excludeStages =
nil;
359 NSEnumerator *stageEnum =
nil;
360 NSString *stageName =
nil;
361 Class stageClass = Nil;
369 if ([excludeStages
count] != 0)
371 stages = [[
stages mutableCopy] autorelease];
374 for (stageEnum = [stages objectEnumerator]; (stageName = [
stageEnum nextObject]); )
376 if ([stageName isKindOfClass:[NSString
class]])
378 stageClass = NSClassFromString(stageName);
379 if (stageClass == Nil)
381 OOLog(
@"verifyOXP.registration.failed",
@"Attempt to register unknown class %@ as a verifier stage, ignoring.", stageName);
396 NSAutoreleasePool *pool =
nil;
397 NSArray *stageKeys =
nil;
398 NSEnumerator *stageEnum =
nil;
399 NSString *stageKey =
nil;
401 NSString *name =
nil;
402 NSMutableDictionary *dependenciesByStage =
nil,
403 *dependentsByStage =
nil;
404 NSSet *dependencies =
nil,
424 if (stage ==
nil)
break;
427 key = [
NSValue valueWithNonretainedObject:stage];
430 if (dependencies !=
nil)
437 if (dependents !=
nil)
444 _waitingStages =
nil;
445 _openForRegistration = NO;
450 for (stageEnum = [stageKeys objectEnumerator]; (stageKey = [
stageEnum nextObject]); )
453 if (stage ==
nil)
continue;
457 if (![stageKey isEqualToString:name])
459 OOLog(
@"verifyOXP.buildDependencyGraph.badName",
@"***** Stage name appears to have changed from \"%@\
" to \"%@\" for verifier stage %@, removing.", stageKey, name, stage);
465 key = [
NSValue valueWithNonretainedObject:stage];
468 if (dependencies !=
nil && ![
self setUpDependencies:dependencies forStage:stage])
480 for (stageEnum = [stageKeys objectEnumerator]; (stageKey = [
stageEnum nextObject]); )
483 if (stage ==
nil)
continue;
486 key = [
NSValue valueWithNonretainedObject:stage];
489 if (dependents !=
nil)
496 [
_waitingStages makeObjectsPerformSelector:@selector(dependencyRegistrationComplete)];
498 if ([[NSUserDefaults standardUserDefaults] boolForKey:
@"oxp-verifier-dump-debug-graphviz"])
509 NSAutoreleasePool *pool =
nil;
510 NSEnumerator *stageEnum =
nil;
513 NSString *stageName =
nil;
522 for (stageEnum = [_waitingStages objectEnumerator]; (candidateStage = [
stageEnum nextObject]); )
524 if ([candidateStage canRun])
526 stageToRun = candidateStage;
530 if (stageToRun ==
nil)
542 if ([stageToRun shouldRun])
545 OOLog(
@"verifyOXP.runStage",
@"%@", stageName);
551 OOLog(
@"verifyOXP.verbose.skipStage",
@"- Skipping stage: %@ (nothing to do).", stageName);
555 @catch (NSException *exception)
557 if (stageName ==
nil) stageName = [[
stageToRun class] description];
558 OOLog(
@"verifyOXP.exception",
@"***** Exception occurred when running OXP verifier stage \"%@\
": %@: %@", stageName, [exception name], [exception reason]);
568 if ([_waitingStages
count] != 0)
570 OOLog(
@"verifyOXP.incomplete",
@"%@",
@"Some verifier stages could not be run:");
572 for (stageEnum = [_waitingStages objectEnumerator]; (candidateStage = [
stageEnum nextObject]); )
574 OOLog(
@"verifyOXP.incomplete.item",
@"%@", candidateStage);
579 _waitingStages =
nil;
585- (BOOL)setUpDependencies:(NSSet *)dependencies
588 NSString *depName =
nil;
589 NSEnumerator *depEnum =
nil;
593 for (depEnum = [dependencies objectEnumerator]; (depName = [
depEnum nextObject]); )
598 OOLog(
@"verifyOXP.buildDependencyGraph.unresolved",
@"Verifier stage %@ has unresolved dependency \"%@\
", skipping.", stage, depName);
602 if ([depStage isDependentOf:stage])
604 OOLog(
@"verifyOXP.buildDependencyGraph.circularReference",
@"Verifier stages %@ and %@ have a dependency loop, skipping.", stage, depStage);
609 [
stage registerDependency:depStage];
616- (void)setUpDependents:(NSSet *)dependents
619 NSString *depName =
nil;
620 NSEnumerator *depEnum =
nil;
624 for (depEnum = [dependents objectEnumerator]; (depName = [
depEnum nextObject]); )
629 OOLog(
@"verifyOXP.buildDependencyGraph.unresolved",
@"Verifier stage %@ has unresolved dependent \"%@\
".", stage, depName);
633 if ([stage isDependentOf:depStage])
635 OOLog(
@"verifyOXP.buildDependencyGraph.circularReference",
@"Verifier stage %@ lists %@ as both dependent and dependency (possibly indirectly); will execute %@ after %@.", stage, depStage, stage, depStage);
639 [
depStage registerDependency:stage];
646 NSMutableString *graphViz =
nil;
647 NSDictionary *graphVizTemplate =
nil;
648 NSString *
template =
nil,
649 *startTemplate =
nil,
651 NSEnumerator *stageEnum =
nil;
654 NSEnumerator *depEnum =
nil;
664 for (stageEnum = [_stagesByName objectEnumerator]; (stage = [
stageEnum nextObject]); )
675 for (stageEnum = [_stagesByName objectEnumerator]; (stage = [
stageEnum nextObject]); )
678 if ([deps
count] != 0)
680 for (depEnum = [deps objectEnumerator]; (dep = [
depEnum nextObject]); )
682 [
graphViz appendFormat:template, dep, stage];
687 [
graphViz appendFormat:startTemplate, stage];
697 for (stageEnum = [_stagesByName objectEnumerator]; (stage = [
stageEnum nextObject]); )
700 if ([deps
count] != 0)
702 for (depEnum = [deps objectEnumerator]; (dep = [
depEnum nextObject]); )
704 [
graphViz appendFormat:template, dep, stage];
709 [
graphViz appendFormat:endTemplate, stage];
728 name = [name stringByAppendingPathExtension:@"log"];
729 OOLog(
@"verifyOXP.switchingLog",
@"Switching log files -- logging to \"%@\
".", name);
748 if ([[NSUserDefaults standardUserDefaults] oo_boolForKey:
@"oxp-verifier-open-log" defaultValue:YES])
751 [[NSWorkspace sharedWorkspace] openFile:OOLogHandlerGetLogPath()];
void OOSetStandardsForOXPVerifierMode(void)
NSString * OOLogHandlerGetLogPath(void)
void OOLogOutputHandlerChangeLogFile(NSString *newLogName)
void OOLogPushIndent(void)
void OOLogPopIndent(void)
#define OOLog(class, format,...)
void OOLogSetDisplayMessagesInClass(NSString *inClass, BOOL inFlag)
void OOLogSetShowMessageClassTemporary(BOOL flag)
static void SwitchLogFile(NSString *name)
static void NoteVerificationStage(NSString *displayName, NSString *stage)
static void OpenLogFile(NSString *name)
void registerBaseStages()
void buildDependencyGraph()
BOOL runVerificationIfRequested()
GameController * sharedController()
void logProgress:(NSString *message)
void setAllowCacheWrites:(BOOL flag)
OOCacheManager * sharedCache()
NSSet * resolvedDependents()
void setVerifier:(OOOXPVerifier *verifier)
NSSet * resolvedDependencies()
void registerBaseStages()
void setUpDependents:forStage:(NSSet *dependents,[forStage] OOOXPVerifierStage *stage)
BOOL _openForRegistration
NSSet * configurationSetForKey:(NSString *key)
void buildDependencyGraph()
void registerStage:(OOOXPVerifierStage *stage)
NSDictionary * configurationDictionaryForKey:(NSString *key)
NSString * oxpDisplayName()
BOOL writeDiagnosticString:toFileNamed:(NSString *string,[toFileNamed] NSString *name)
void setUseAddOns:(NSString *useAddOns)