This is DirArray.m in view mode; [Download] [Up]
//============================================================================= // // Copyright (C) 1995-1997 by Paul S. McCarthy and Eric Sunshine. // Written by Paul S. McCarthy and Eric Sunshine. // All Rights Reserved. // // This notice may not be removed from this source code. // // This object is included in the MiscKit by permission from the authors // and its use is governed by the MiscKit license, found in the file // "License.rtf" in the MiscKit distribution. Please refer to that file // for a list of all applicable permissions and restrictions. // //============================================================================= //----------------------------------------------------------------------------- // DirArray.m // // An extensible array of directory entries. // //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // $Id: DirArray.m,v 1.3 97/06/24 07:58:02 sunshine Exp $ // $Log: DirArray.m,v $ // Revision 1.3 97/06/24 07:58:02 sunshine // v15.1: Removed unused dictionary keys. Fixed bug: Wasn't taking sticky bit // into account when computing canToggleLock. // // Revision 1.2 97/04/25 19:53:21 sunshine // v14.2: Ported to OPENSTEP 4.2 (prerelease) for Mach & NT. // Completely rewrote to use NSFileManager rather than Unix directory-scanning // functions so that it works on Windows NT. // // Revision 1.1 97/03/23 01:59:00 sunshine // v13.1: Extensible array of directory entries. //----------------------------------------------------------------------------- #import "DirArray.h" #import <AppKit/NSApplication.h> #import <AppKit/NSImage.h> #import <AppKit/NSWorkspace.h> #import <Foundation/NSFileManager.h> NSString* const DA_SHORT_NAME = @"ShortName"; NSString* const DA_LONG_NAME = @"LongName"; NSString* const DA_SOFT_LINK = @"SoftLink"; NSString* const DA_IS_DIRECTORY = @"IsDirectory"; NSString* const DA_IS_LOCKED = @"IsLocked"; NSString* const DA_CAN_TOGGLE_LOCK = @"CanToggleLock"; static NSString* const DA_SCALED_ICON = @"ScaledIcon"; static NSString* const DA_UNSCALED_ICON = @"UnscaledIcon"; //============================================================================= // DirArray IMPELEMENTATION //============================================================================= @implementation DirArray - (unsigned int)count { return [files count]; } - (id)objectAtIndex:(unsigned int)n { return [files objectAtIndex:n]; } - (size_t)totalBytes { return totalBytes; } - (BOOL)writable { return writable; } - (BOOL)sticky { return sticky; } - (NSString*)username { return username; } //----------------------------------------------------------------------------- // init //----------------------------------------------------------------------------- - (id)init { [super init]; name = [[NSString allocWithZone:[self zone]] init]; files = [[NSMutableArray allocWithZone:[self zone]] init]; totalBytes = 0; writable = NO; sticky = NO; username = [NSUserName() retain]; return self; } //----------------------------------------------------------------------------- // dealloc //----------------------------------------------------------------------------- - (void)dealloc { [files release]; [name release]; [username release]; [super dealloc]; } //----------------------------------------------------------------------------- // dirWritable: //----------------------------------------------------------------------------- - (BOOL)dirWritable:(NSString*)path { return [[NSFileManager defaultManager] isWritableFileAtPath:path]; } //----------------------------------------------------------------------------- // dirSticky: //----------------------------------------------------------------------------- - (BOOL)dirSticky:(NSDirectoryEnumerator*)enumerator { int const STICKY_BIT = 01000; unsigned long n = [[enumerator directoryAttributes] filePosixPermissions]; return ((n & STICKY_BIT) != 0); } //----------------------------------------------------------------------------- // addFile:attributes: //----------------------------------------------------------------------------- - (void)addFile:(NSString*)file attributes:(NSDictionary*)attributes { NSFileManager* const manager = [NSFileManager defaultManager]; NSString* const longName = [file isEqualToString:@".."] ? name : [name stringByAppendingPathComponent:file]; BOOL const canToggle = writable && ![file isEqualToString:@".."] && (!sticky || [[attributes fileOwnerAccountName] isEqualToString:username]); BOOL const isLink = [[attributes fileType] isEqualToString:NSFileTypeSymbolicLink]; NSDictionary* const deepAttributes = !isLink ? attributes : [manager fileAttributesAtPath:longName traverseLink:YES]; BOOL const isDir = [[deepAttributes fileType] isEqualToString:NSFileTypeDirectory]; NSMutableDictionary* const dict = [[attributes mutableCopy] autorelease]; [dict setObject:file forKey:DA_SHORT_NAME]; [dict setObject:longName forKey:DA_LONG_NAME]; [dict setObject:isLink ? [manager pathContentOfSymbolicLinkAtPath:longName] : @"" forKey:DA_SOFT_LINK]; [dict setObject:[NSNumber numberWithBool:isDir] forKey:DA_IS_DIRECTORY]; [dict setObject:[NSNumber numberWithBool:canToggle] forKey:DA_CAN_TOGGLE_LOCK]; [dict setObject:[NSNumber numberWithBool:!canToggle] forKey:DA_IS_LOCKED]; [files addObject:dict]; } //----------------------------------------------------------------------------- // loadPath:showHidden: //----------------------------------------------------------------------------- - (BOOL)loadPath:(NSString*)path showHidden:(BOOL)showHidden { NSFileManager* manager = [NSFileManager defaultManager]; NSDirectoryEnumerator* enumerator = [manager enumeratorAtPath:path]; [files removeAllObjects]; [name autorelease]; name = [path copyWithZone:[self zone]]; writable = [self dirWritable:path]; sticky = [self dirSticky:enumerator]; totalBytes = 0; if (enumerator != 0) { NSString* file; [self addFile:@".." attributes: [manager fileAttributesAtPath:path traverseLink:NO]]; while ((file = [enumerator nextObject]) != 0) { NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; NSDictionary* attributes = [enumerator fileAttributes]; if (showHidden || [file characterAtIndex:0] != '.') { totalBytes += [attributes fileSize]; [self addFile:file attributes:attributes]; } if ([[attributes fileType] isEqualToString:NSFileTypeDirectory]) [enumerator skipDescendents]; [pool release]; } } return (enumerator != 0); } @end //============================================================================= // NSMutableDictionary(DirArray) IMPLEMENTATION //============================================================================= @interface NSMutableDictionary(DirArray) - (void)loadImages; @end @implementation NSMutableDictionary(DirArray) //----------------------------------------------------------------------------- // loadImages //----------------------------------------------------------------------------- - (void)loadImages { NSImage* image; NSString* name = [self objectForKey:DA_LONG_NAME]; NSParameterAssert( name != 0 ); image = [[NSWorkspace sharedWorkspace] iconForFile:name]; [self setObject:[[image copy] autorelease] forKey:DA_UNSCALED_ICON]; [image setScalesWhenResized:YES]; [self setObject:image forKey:DA_SCALED_ICON]; } @end //============================================================================= // NSDictionary(DirArray) IMPLEMENTATION //============================================================================= @implementation NSDictionary(DirArray) //----------------------------------------------------------------------------- // getImage: //----------------------------------------------------------------------------- - (id)getImage:(NSString*)key { id image = 0; if ([self isKindOfClass:[NSMutableDictionary class]]) { if ([self objectForKey:key] == 0) [(NSMutableDictionary*)self loadImages]; image = [self objectForKey:key]; } return image; } //----------------------------------------------------------------------------- // [un]scaledImage //----------------------------------------------------------------------------- - (id)scaledImage { return [self getImage:DA_SCALED_ICON ]; } - (id)unscaledImage { return [self getImage:DA_UNSCALED_ICON]; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.