5 * Created by Nathan Day on Thu Feb 07 2002.
6 * Copyright (c) 2002 Nathan Day. All rights reserved.
10 #import "NSURL+NDCarbonUtilities.h"
12 @interface NDAlias (Private)
13 - (BOOL)createAliasRecordFor:(NSURL *)aURL fromURL:(NSURL *)aFromURL;
16 @implementation NDAlias
21 + (id)aliasWithURL:(NSURL *)aURL
23 return [[[self alloc] initWithURL:aURL] autorelease];
27 * aliasWithURL:fromURL:
29 + (id)aliasWithURL:(NSURL *)aURL fromURL:(NSURL *)aFromURL
31 return [[[self alloc] initWithURL:aURL fromURL:aFromURL] autorelease];
37 + (id)aliasWithPath:(NSString *)aPath
39 return [[[self alloc] initWithPath:aPath] autorelease];
43 * aliasWithPath:fromPath:
45 + (id)aliasWithPath:(NSString *)aPath fromPath:(NSString *)aFromPath
47 return [[[self alloc] initWithPath:aPath fromPath:aFromPath] autorelease];
50 + (id)aliasWithData:(NSData *)aData
52 return [[[self alloc] initWithData:aData] autorelease];
56 * initWithPath:fromPath:
58 - (id)initWithPath:(NSString *)aPath
60 return [self initWithPath:aPath fromPath:nil];
64 * initWithPath:fromPath:
66 - (id)initWithPath:(NSString *)aPath fromPath:(NSString *)aFromPath
68 if( aPath && [[NSFileManager defaultManager] fileExistsAtPath:aPath] )
70 if( aFromPath && [[NSFileManager defaultManager] fileExistsAtPath:aFromPath] )
71 return [self initWithURL:[NSURL fileURLWithPath:aPath] fromURL:[NSURL fileURLWithPath:aFromPath]];
73 return [self initWithURL:[NSURL fileURLWithPath:aPath] fromURL:nil];
85 - (id)initWithURL:(NSURL *)aURL
87 return [self initWithURL:aURL fromURL:nil];
91 * initWithURL:fromURL:
93 - (id)initWithURL:(NSURL *)aURL fromURL:(NSURL *)aFromURL
95 if( (self = [self init]) != nil )
97 if( aURL && [self createAliasRecordFor:aURL fromURL:aFromURL] )
114 - (id)initWithCoder:(NSCoder *)aDecoder
116 return [self initWithData:[aDecoder decodeDataObject]];
120 - (id)initWithData:(NSData *)aData
122 if( (self = [self init]) != nil )
124 if( aData && PtrToHand( [aData bytes], (Handle*)&aliasHandle, [aData length] ) == noErr )
141 - (void)encodeWithCoder:(NSCoder *)anEncoder
143 [anEncoder encodeDataObject:[self data]];
151 DisposeHandle( (Handle)aliasHandle );
156 * -setAllowUserInteraction:
158 - (void)setAllowUserInteraction:(BOOL)aFlag
160 mountFlags = aFlag ? (mountFlags & ~kResolveAliasFileNoUI) : (mountFlags | kResolveAliasFileNoUI);
164 * -allowUserInteraction
166 - (BOOL)allowUserInteraction
168 return mountFlags & kResolveAliasFileNoUI ? NO : YES;
172 * -setTryFileIDFirst:
174 - (void)setTryFileIDFirst:(BOOL)aFlag
176 mountFlags = aFlag ? (mountFlags | kResolveAliasTryFileIDFirst) : (mountFlags & ~kResolveAliasTryFileIDFirst);
182 - (BOOL)tryFileIDFirst
184 return mountFlags & kResolveAliasTryFileIDFirst ? YES : NO;
195 if( (theError = FSResolveAliasWithMountFlags( NULL, aliasHandle, &theTarget, &changed, mountFlags )) == noErr )
197 theURL = [NSURL URLWithFSRef:&theTarget];
207 return [[self url] path];
215 return changed != false;
221 - (BOOL)setURL:(NSURL *)aURL
223 return [self setURL:aURL fromURL:nil];
229 - (BOOL)setURL:(NSURL *)aURL fromURL:(NSURL *)aFromURL
231 OSErr theError = !noErr;
235 if( aURL != nil && [aURL isFileURL] && [aURL getFSRef:&theReference] )
237 if( aFromURL != nil && [aFromURL isFileURL] && [aFromURL getFSRef:&theFromReference] )
238 theError = FSUpdateAlias( &theFromReference, &theReference, aliasHandle, &changed );
240 theError = FSUpdateAlias( NULL, &theReference, aliasHandle, &changed );
243 return theError == noErr;
249 - (BOOL)setPath:(NSString *)aPath
251 return [self setPath:aPath fromPath:nil];
257 - (BOOL)setPath:(NSString *)aPath fromPath:(NSString *)aFromPath
259 BOOL theSuccess = NO;;
260 if( [[NSFileManager defaultManager] fileExistsAtPath:aPath] )
262 if( [[NSFileManager defaultManager] fileExistsAtPath:aFromPath] )
263 theSuccess = [self setURL:[NSURL fileURLWithPath:aPath] fromURL:[NSURL fileURLWithPath:aFromPath]];
265 theSuccess = [self setURL:[NSURL fileURLWithPath:aPath] fromURL:nil];
274 - (NSString *)description
281 NSData * theData = nil;
282 if( aliasHandle != NULL )
284 HLock((Handle)aliasHandle);
285 theData = [NSData dataWithBytes:*aliasHandle length:GetHandleSize((Handle) aliasHandle)];
286 HUnlock((Handle)aliasHandle);
294 @implementation NDAlias (Private)
297 * createAliasRecordFor:fromURL:
299 - (BOOL)createAliasRecordFor:(NSURL *)aURL fromURL:(NSURL *)aFromURL
301 OSErr theError = noErr;
305 if( aURL != nil && [aURL isFileURL] && [aURL getFSRef:&theReference] )
307 if( aFromURL != nil && [aFromURL isFileURL] && [aFromURL getFSRef:&theFromReference] )
309 theError = FSNewAlias( &theFromReference, &theReference, &aliasHandle );
313 theError = FSNewAliasMinimal( &theReference, &aliasHandle );
317 return theError == noErr;