324{
325 NSDirectoryEnumerator *dirEnum =
nil;
326 NSString *name =
nil,
332 NSMutableDictionary *directoryListings =
nil,
333 *directoryCases =
nil,
335 NSDictionary *dirFiles =
nil;
336 NSSet *readMeNames =
nil;
337
338 _basePath = [[[self verifier] oxpPath] copy];
339
340 _junkFileNames = [[self verifier] configurationSetForKey:@"junkFiles"];
341 _skipDirectoryNames = [[self verifier] configurationSetForKey:@"skipDirectories"];
342
343 directoryCases = [NSMutableDictionary dictionary];
344 directoryListings = [NSMutableDictionary dictionary];
345 rootFiles = [NSMutableDictionary dictionary];
346 readMeNames = [self constructReadMeNames];
347
348 dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:_basePath];
349 while ((name = [dirEnum nextObject]))
350 {
351 path = [_basePath stringByAppendingPathComponent:name];
352 type = [[dirEnum fileAttributes] fileType];
353 lcName = [name lowercaseString];
354
355 if ([type isEqualToString:NSFileTypeDirectory])
356 {
357 [dirEnum skipDescendents];
358
359 if ([_skipDirectoryNames containsObject:name])
360 {
361
362 OOLog(
@"verifyOXP.verbose.listFiles",
@"- Skipping %@/", name);
363 }
364 else if (!
CheckNameConflict(lcName, directoryCases, rootFiles, &existing, &existingType))
365 {
366 OOLog(
@"verifyOXP.verbose.listFiles",
@"- %@/", name);
368 dirFiles = [self scanDirectory:path];
369 [directoryListings setObject:dirFiles forKey:lcName];
370 [directoryCases setObject:name forKey:lcName];
372 }
373 else
374 {
375 OOLog(
@"verifyOXP.scanFiles.overloadedName",
@"***** ERROR: %@ '%@' conflicts with %@ named '%@', ignoring. (OXPs must work on case-insensitive file systems!)",
@"directory", name, existingType, existing);
376 }
377 }
378 else if ([type isEqualToString:NSFileTypeRegular])
379 {
380 if ([_junkFileNames containsObject:name])
381 {
382 OOLog(
@"verifyOXP.scanFiles.skipJunk",
@"NOTE: skipping junk file %@.", name);
383 }
384 else if ([readMeNames containsObject:lcName])
385 {
386 OOLog(
@"verifyOXP.scanFiles.readMe",
@"----- WARNING: apparent Read Me file (\"%@\
") inside OXP. This is the wrong place for a Read Me file, because it will not be read.", name);
387 }
388 else if (!
CheckNameConflict(lcName, directoryCases, rootFiles, &existing, &existingType))
389 {
390 OOLog(
@"verifyOXP.verbose.listFiles",
@"- %@", name);
391 [rootFiles setObject:name forKey:lcName];
392 }
393 else
394 {
395 OOLog(
@"verifyOXP.scanFiles.overloadedName",
@"***** ERROR: %@ '%@' conflicts with %@ named '%@', ignoring. (OXPs must work on case-insensitive file systems!)",
@"file", name, existingType, existing);
396 }
397 }
398 else if ([type isEqualToString:NSFileTypeSymbolicLink])
399 {
400 OOLog(
@"verifyOXP.scanFiles.symLink",
@"----- WARNING: \"%@\
" is a symbolic link, ignoring.", name);
401 }
402 else
403 {
404 OOLog(
@"verifyOXP.scanFiles.nonStandardFile",
@"----- WARNING: \"%@\
" is a non-standard file (%@), ignoring.", name, type);
405 }
406 }
407
408 _junkFileNames =
nil;
409 _skipDirectoryNames =
nil;
410
411 [directoryListings setObject:rootFiles forKey:@""];
412 _directoryListings = [directoryListings copy];
413 _directoryCases = [directoryCases copy];
414}
static BOOL CheckNameConflict(NSString *lcName, NSDictionary *directoryCases, NSDictionary *rootFiles, NSString **outExisting, NSString **outExistingType)
#define OOLogOutdentIf(class)
#define OOLogIndentIf(class)