34#if OO_OXP_VERIFIER_ENABLED
53@interface OOOXPVerifier (OOPrivate)
55- (id)initWithPath:(NSString *)path;
64- (BOOL)setUpDependencies:(NSSet *)dependencies
67- (void)setUpDependents:(NSSet *)dependents
86 NSArray *arguments =
nil;
87 NSEnumerator *argEnum =
nil;
89 NSString *foundPath =
nil;
90 BOOL exists, isDirectory;
92 NSAutoreleasePool *pool =
nil;
99 for (argEnum = [arguments objectEnumerator]; (arg = [
argEnum nextObject]); )
101 if ([arg isEqual:
@"-verify-oxp"] || [arg isEqual:
@"--verify-oxp"])
103 foundPath = [
argEnum nextObject];
104 if (foundPath ==
nil)
106 OOLog(
@"verifyOXP.noPath",
@"***** ERROR: %@ passed without path argument; nothing to verify.", arg);
110 foundPath = [
foundPath stringByExpandingTildeInPath];
115 if (foundPath ==
nil)
122 exists = [[
NSFileManager defaultManager] fileExistsAtPath:foundPath isDirectory:&isDirectory];
125 OOLog(
@"verifyOXP.badPath",
@"***** ERROR: no OXP exists at path \"%@\
"; nothing to verify.", foundPath);
127 else if (!isDirectory)
129 OOLog(
@"verifyOXP.badPath",
@"***** ERROR: \"%@\
" is a file, not an OXP directory; nothing to verify.", foundPath);
148 [_verifierPList release];
150 [_displayName release];
151 [_stagesByName release];
152 [_waitingStages release];
160 NSString *name =
nil;
164 if (stage ==
nil)
return;
168 OOLog(
@"verifyOXP.registration.failed",
@"Attempt to register class %@ as a verifier stage, but it is not a subclass of OOOXPVerifierStage; ignoring.", [stage
class]);
174 OOLog(
@"verifyOXP.registration.failed",
@"Attempt to register verifier stage %@ after registration closed, ignoring.", stage);
181 OOLog(
@"verifyOXP.registration.failed",
@"Attempt to register verifier stage %@ with nil name, ignoring.", stage);
186 existing = [_stagesByName objectForKey:name];
187 if (existing == stage)
return;
190 OOLog(
@"verifyOXP.registration.failed",
@"Attempt to register verifier stage %@ with same name as stage %@, ignoring.", stage, existing);
196 [_stagesByName setObject:stage forKey:name];
197 [_waitingStages addObject:stage];
203 return [[_basePath retain] autorelease];
209 return [[_displayName retain] autorelease];
213- (id)stageWithName:(NSString *)name
215 if (name ==
nil)
return nil;
217 return [_stagesByName objectForKey:name];
213- (id)stageWithName:(NSString *)name {
…}
221- (id)configurationValueForKey:(NSString *)key
223 return [_verifierPList objectForKey:key];
221- (id)configurationValueForKey:(NSString *)key {
…}
227- (NSArray *)configurationArrayForKey:(NSString *)key
229 return [_verifierPList oo_arrayForKey:key];
227- (NSArray *)configurationArrayForKey:(NSString *)key {
…}
233- (NSDictionary *)configurationDictionaryForKey:(NSString *)key
235 return [_verifierPList oo_dictionaryForKey:key];
233- (NSDictionary *)configurationDictionaryForKey:(NSString *)key {
…}
239- (NSString *)configurationStringForKey:(NSString *)key
241 return [_verifierPList oo_stringForKey:key];
239- (NSString *)configurationStringForKey:(NSString *)key {
…}
245- (NSSet *)configurationSetForKey:(NSString *)key
247 NSArray *array = [_verifierPList oo_arrayForKey:key];
248 return array !=
nil ? [
NSSet setWithArray:array] :
nil;
245- (NSSet *)configurationSetForKey:(NSString *)key {
…}
254@implementation OOOXPVerifier (OOPrivate)
256- (id)initWithPath:(NSString *)path
262 NSString *verifierPListPath = [[[
ResourceManager builtInPath] stringByAppendingPathComponent:@"Config"] stringByAppendingPathComponent:@"verifyOXP.plist"];
263 _verifierPList = [[
NSDictionary dictionaryWithContentsOfFile:verifierPListPath] retain];
265 _basePath = [
path copy];
266 _displayName = [[
NSFileManager defaultManager] displayNameAtPath:_basePath];
267 if (_displayName ==
nil) _displayName = [
_basePath lastPathComponent];
273 if (_verifierPList ==
nil ||
276 OOLog(
@"verifyOXP.setup.failed",
@"%@",
@"***** ERROR: failed to set up OXP verifier.");
281 _openForRegistration = YES;
256- (id)initWithPath:(NSString *)path {
…}
305 OOLog(
@"verifyOXP.start",
@"Running OXP verifier for %@", _basePath);
312 OOLog(
@"verifyOXP.done",
@"%@",
@"OXP verification complete.");
320 NSDictionary *overrides =
nil;
321 NSEnumerator *messageClassEnum =
nil;
322 NSString *messageClass =
nil;
327 overrides = [
_verifierPList oo_dictionaryForKey:@"logControlOverride"];
328 for (messageClassEnum = [overrides keyEnumerator]; (messageClass = [
messageClassEnum nextObject]); )
337 verbose = [[
NSUserDefaults standardUserDefaults] objectForKey:@"oxp-verifier-verbose-logging"];
344 NSAutoreleasePool *pool =
nil;
346 NSSet *excludeStages =
nil;
347 NSEnumerator *stageEnum =
nil;
348 NSString *stageName =
nil;
349 Class stageClass = Nil;
357 if ([excludeStages
count] != 0)
359 stages = [[
stages mutableCopy] autorelease];
362 for (stageEnum = [stages objectEnumerator]; (stageName = [
stageEnum nextObject]); )
364 if ([stageName isKindOfClass:[NSString
class]])
366 stageClass = NSClassFromString(stageName);
367 if (stageClass == Nil)
369 OOLog(
@"verifyOXP.registration.failed",
@"Attempt to register unknown class %@ as a verifier stage, ignoring.", stageName);
384 NSAutoreleasePool *pool =
nil;
385 NSArray *stageKeys =
nil;
386 NSEnumerator *stageEnum =
nil;
387 NSString *stageKey =
nil;
389 NSString *name =
nil;
390 NSMutableDictionary *dependenciesByStage =
nil,
391 *dependentsByStage =
nil;
392 NSSet *dependencies =
nil,
412 if (stage ==
nil)
break;
415 key = [
NSValue valueWithNonretainedObject:stage];
418 if (dependencies !=
nil)
425 if (dependents !=
nil)
432 _waitingStages =
nil;
433 _openForRegistration = NO;
438 for (stageEnum = [stageKeys objectEnumerator]; (stageKey = [
stageEnum nextObject]); )
441 if (stage ==
nil)
continue;
445 if (![stageKey isEqualToString:name])
447 OOLog(
@"verifyOXP.buildDependencyGraph.badName",
@"***** Stage name appears to have changed from \"%@\
" to \"%@\" for verifier stage %@, removing.", stageKey, name, stage);
453 key = [
NSValue valueWithNonretainedObject:stage];
456 if (dependencies !=
nil && ![
self setUpDependencies:dependencies forStage:stage])
468 for (stageEnum = [stageKeys objectEnumerator]; (stageKey = [
stageEnum nextObject]); )
471 if (stage ==
nil)
continue;
474 key = [
NSValue valueWithNonretainedObject:stage];
477 if (dependents !=
nil)
484 [
_waitingStages makeObjectsPerformSelector:@selector(dependencyRegistrationComplete)];
486 if ([[NSUserDefaults standardUserDefaults] boolForKey:
@"oxp-verifier-dump-debug-graphviz"])
497 NSAutoreleasePool *pool =
nil;
498 NSEnumerator *stageEnum =
nil;
501 NSString *stageName =
nil;
510 for (stageEnum = [_waitingStages objectEnumerator]; (candidateStage = [
stageEnum nextObject]); )
512 if ([candidateStage canRun])
514 stageToRun = candidateStage;
518 if (stageToRun ==
nil)
530 if ([stageToRun shouldRun])
533 OOLog(
@"verifyOXP.runStage",
@"%@", stageName);
539 OOLog(
@"verifyOXP.verbose.skipStage",
@"- Skipping stage: %@ (nothing to do).", stageName);
543 @catch (NSException *exception)
545 if (stageName ==
nil) stageName = [[
stageToRun class] description];
546 OOLog(
@"verifyOXP.exception",
@"***** Exception occurred when running OXP verifier stage \"%@\
": %@: %@", stageName, [exception name], [exception reason]);
556 if ([_waitingStages
count] != 0)
558 OOLog(
@"verifyOXP.incomplete",
@"%@",
@"Some verifier stages could not be run:");
560 for (stageEnum = [_waitingStages objectEnumerator]; (candidateStage = [
stageEnum nextObject]); )
562 OOLog(
@"verifyOXP.incomplete.item",
@"%@", candidateStage);
567 _waitingStages =
nil;
573- (BOOL)setUpDependencies:(NSSet *)dependencies
576 NSString *depName =
nil;
577 NSEnumerator *depEnum =
nil;
581 for (depEnum = [dependencies objectEnumerator]; (depName = [
depEnum nextObject]); )
586 OOLog(
@"verifyOXP.buildDependencyGraph.unresolved",
@"Verifier stage %@ has unresolved dependency \"%@\
", skipping.", stage, depName);
590 if ([depStage isDependentOf:stage])
592 OOLog(
@"verifyOXP.buildDependencyGraph.circularReference",
@"Verifier stages %@ and %@ have a dependency loop, skipping.", stage, depStage);
597 [
stage registerDependency:depStage];
573- (BOOL)setUpDependencies:(NSSet *)dependencies {
…}
604- (void)setUpDependents:(NSSet *)dependents
607 NSString *depName =
nil;
608 NSEnumerator *depEnum =
nil;
612 for (depEnum = [dependents objectEnumerator]; (depName = [
depEnum nextObject]); )
617 OOLog(
@"verifyOXP.buildDependencyGraph.unresolved",
@"Verifier stage %@ has unresolved dependent \"%@\
".", stage, depName);
621 if ([stage isDependentOf:depStage])
623 OOLog(
@"verifyOXP.buildDependencyGraph.circularReference",
@"Verifier stage %@ lists %@ as both dependent and dependency (possibly indirectly); will execute %@ after %@.", stage, depStage, stage, depStage);
627 [
depStage registerDependency:stage];
604- (void)setUpDependents:(NSSet *)dependents {
…}
634 NSMutableString *graphViz =
nil;
635 NSDictionary *graphVizTemplate =
nil;
636 NSString *
template =
nil,
637 *startTemplate =
nil,
639 NSEnumerator *stageEnum =
nil;
642 NSEnumerator *depEnum =
nil;
652 for (stageEnum = [_stagesByName objectEnumerator]; (stage = [
stageEnum nextObject]); )
663 for (stageEnum = [_stagesByName objectEnumerator]; (stage = [
stageEnum nextObject]); )
666 if ([deps
count] != 0)
668 for (depEnum = [deps objectEnumerator]; (dep = [
depEnum nextObject]); )
670 [
graphViz appendFormat:template, dep, stage];
675 [
graphViz appendFormat:startTemplate, stage];
685 for (stageEnum = [_stagesByName objectEnumerator]; (stage = [
stageEnum nextObject]); )
688 if ([deps
count] != 0)
690 for (depEnum = [deps objectEnumerator]; (dep = [
depEnum nextObject]); )
692 [
graphViz appendFormat:template, dep, stage];
697 [
graphViz appendFormat:endTemplate, stage];
716 name = [name stringByAppendingPathExtension:@"log"];
717 OOLog(
@"verifyOXP.switchingLog",
@"Switching log files -- logging to \"%@\
".", name);
736 if ([[NSUserDefaults standardUserDefaults] oo_boolForKey:
@"oxp-verifier-open-log" defaultValue:YES])
739 [[NSWorkspace sharedWorkspace] openFile:OOLogHandlerGetLogPath()];
743 DWORD dwSize = MAX_PATH;
744 TCHAR applicationPath[MAX_PATH] = TEXT(
"notepad");
745 HRESULT hr = AssocQueryString (0,
754 OOLog(
@"OXP Verifier",
@"Could not find application for opening .log files - using Notepad by default.");
758 system([[NSString stringWithFormat:
@"start \"\
" \"%s\" \"Logs\\%@.log\"", applicationPath, name] UTF8String]);
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)