@@ -18,20 +18,29 @@ #import "OFOpenItemFailedException.h" #import "OFString.h" #import "OFURL.h" @implementation OFOpenItemFailedException -@synthesize URL = _URL, mode = _mode, errNo = _errNo; +@synthesize URL = _URL, path = _path, mode = _mode, errNo = _errNo; + (instancetype)exceptionWithURL: (OFURL *)URL mode: (OFString *)mode errNo: (int)errNo { return [[[self alloc] initWithURL: URL mode: mode errNo: errNo] autorelease]; } + ++ (instancetype)exceptionWithPath: (OFString *)path + mode: (OFString *)mode + errNo: (int)errNo +{ + return [[[self alloc] initWithPath: path + mode: mode + errNo: errNo] autorelease]; +} + (instancetype)exception { OF_UNRECOGNIZED_SELECTOR } @@ -51,30 +60,56 @@ @throw e; } return self; } + +- (instancetype)initWithPath: (OFString *)path + mode: (OFString *)mode + errNo: (int)errNo +{ + self = [super init]; + + @try { + _path = [path copy]; + _mode = [mode copy]; + _errNo = errNo; + } @catch (id e) { + [self release]; + @throw e; + } + + return self; +} - (instancetype)init { OF_INVALID_INIT_METHOD } - (void)dealloc { [_URL release]; + [_path release]; [_mode release]; [super dealloc]; } - (OFString *)description { + id item = nil; + + if (_URL != nil) + item = _URL; + else if (_path != nil) + item = _path; + if (_mode != nil) return [OFString stringWithFormat: @"Failed to open item %@ with mode %@: %@", - _URL, _mode, OFStrError(_errNo)]; + item, _mode, OFStrError(_errNo)]; else return [OFString stringWithFormat: - @"Failed to open item %@: %@", _URL, OFStrError(_errNo)]; + @"Failed to open item %@: %@", item, OFStrError(_errNo)]; } @end