Skip to content

Commit fed64c6

Browse files
committed
Implement the wrappers around throwing functions.
1 parent dce2fca commit fed64c6

14 files changed

+990
-45
lines changed

CSFileHandle.h

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424

2525
#define CSFileHandle XADFileHandle
2626

27-
extern NSString *CSCannotOpenFileException;
28-
extern NSString *CSFileErrorException;
27+
extern NSExceptionName const CSCannotOpenFileException;
28+
extern NSExceptionName const CSFileErrorException;
2929

3030
@interface CSFileHandle:CSHandle
3131
{
@@ -41,6 +41,12 @@ extern NSString *CSFileErrorException;
4141
+(CSFileHandle *)fileHandleForReadingAtPath:(NSString *)path;
4242
+(CSFileHandle *)fileHandleForWritingAtPath:(NSString *)path;
4343
+(CSFileHandle *)fileHandleForPath:(NSString *)path modes:(NSString *)modes;
44+
+(CSFileHandle *)fileHandleForReadingAtFileURL:(NSURL *)path NS_SWIFT_UNAVAILABLE("Use throwing methods instead");
45+
+(CSFileHandle *)fileHandleForWritingAtFileURL:(NSURL *)path NS_SWIFT_UNAVAILABLE("Use throwing methods instead");
46+
+(CSFileHandle *)fileHandleForFileURL:(NSURL *)path modes:(NSString *)modes NS_SWIFT_UNAVAILABLE("Use throwing methods instead");
47+
+(CSFileHandle *)fileHandleForReadingAtFileURL:(NSURL *)path error:(NSError**)outErr;
48+
+(CSFileHandle *)fileHandleForWritingAtFileURL:(NSURL *)path error:(NSError**)outErr;
49+
+(CSFileHandle *)fileHandleForFileURL:(NSURL *)path modes:(NSString *)modes error:(NSError**)outErr;
4450
+(CSFileHandle *)fileHandleForStandardInput;
4551
+(CSFileHandle *)fileHandleForStandardOutput;
4652
+(CSFileHandle *)fileHandleForStandardError;
@@ -52,12 +58,12 @@ extern NSString *CSFileErrorException;
5258
-(void)close;
5359

5460
// Public methods
55-
-(FILE *)filePointer;
61+
@property (NS_NONATOMIC_IOSONLY, readonly) FILE *filePointer NS_RETURNS_INNER_POINTER;
5662

5763
// Implemented by this class
58-
-(off_t)fileSize;
59-
-(off_t)offsetInFile;
60-
-(BOOL)atEndOfFile;
64+
@property (NS_NONATOMIC_IOSONLY, readonly) off_t fileSize;
65+
@property (NS_NONATOMIC_IOSONLY, readonly) off_t offsetInFile;
66+
@property (NS_NONATOMIC_IOSONLY, readonly) BOOL atEndOfFile;
6167

6268
-(void)seekToFileOffset:(off_t)offs;
6369
-(void)seekToEndOfFile;

CSFileHandle.m

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,95 @@
1919
* MA 02110-1301 USA
2020
*/
2121
#import "CSFileHandle.h"
22+
#import "XADException.h"
2223

2324
#include <sys/stat.h>
2425

2526

2627

27-
NSString *CSCannotOpenFileException=@"CSCannotOpenFileException";
28-
NSString *CSFileErrorException=@"CSFileErrorException";
28+
NSString *const CSCannotOpenFileException=@"CSCannotOpenFileException";
29+
NSString *const CSFileErrorException=@"CSFileErrorException";
2930

3031

3132

3233

3334
@implementation CSFileHandle
35+
@synthesize filePointer = fh;
36+
37+
+(CSFileHandle *)fileHandleForReadingAtFileURL:(NSURL *)path
38+
{ return [self fileHandleForFileURL:path modes:@"rb"]; }
39+
40+
+(CSFileHandle *)fileHandleForWritingAtFileURL:(NSURL *)path
41+
{ return [self fileHandleForFileURL:path modes:@"wb"]; }
42+
43+
+(CSFileHandle *)fileHandleForFileURL:(NSURL *)path modes:(NSString *)modes
44+
{
45+
if(!path) return nil;
46+
47+
#if defined(__COCOTRON__) // Cocotron
48+
FILE *fileh=_wfopen([path fileSystemRepresentationW],
49+
(const wchar_t *)[modes cStringUsingEncoding:NSUnicodeStringEncoding]);
50+
#elif defined(__MINGW32__) // GNUstep under mingw32 - sort of untested
51+
FILE *fileh=_wfopen((const wchar_t *)[path fileSystemRepresentation],
52+
(const wchar_t *)[modes cStringUsingEncoding:NSUnicodeStringEncoding]);
53+
#else // Cocoa or GNUstep under Linux
54+
FILE *fileh=fopen(path.fileSystemRepresentation,modes.UTF8String);
55+
#endif
56+
57+
if(!fileh) [[NSException exceptionWithName:CSCannotOpenFileException
58+
reason: [NSString stringWithFormat:@"Error attempting to open file \"%@\" in mode \"%@\" (%d).",path,modes, (int)errno]
59+
userInfo:@{NSUnderlyingErrorKey: [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil],
60+
NSURLErrorKey: path
61+
}] raise];
62+
63+
CSFileHandle *handle=[[CSFileHandle alloc] initWithFilePointer:fileh closeOnDealloc:YES path:path.path];
64+
if(handle) return handle;
65+
66+
fclose(fileh);
67+
return nil;
68+
}
69+
70+
+(CSFileHandle *)fileHandleForReadingAtFileURL:(NSURL *)path error:(NSError *__autoreleasing *)outErr
71+
{ return [self fileHandleForFileURL:path modes:@"rb" error:outErr]; }
72+
73+
+(CSFileHandle *)fileHandleForWritingAtFileURL:(NSURL *)path error:(NSError *__autoreleasing *)outErr
74+
{ return [self fileHandleForFileURL:path modes:@"wb" error:outErr]; }
75+
76+
+(CSFileHandle *)fileHandleForFileURL:(NSURL *)path modes:(NSString *)modes error:(NSError *__autoreleasing *)outErr
77+
{
78+
if(!path) {
79+
if (outErr) {
80+
*outErr = [NSError errorWithDomain:XADErrorDomain code:XADErrorBadParameters userInfo:nil];
81+
}
82+
return nil;
83+
}
84+
85+
#if defined(__COCOTRON__) // Cocotron
86+
FILE *fileh=_wfopen([path fileSystemRepresentationW],
87+
(const wchar_t *)[modes cStringUsingEncoding:NSUnicodeStringEncoding]);
88+
#elif defined(__MINGW32__) // GNUstep under mingw32 - sort of untested
89+
FILE *fileh=_wfopen((const wchar_t *)[path fileSystemRepresentation],
90+
(const wchar_t *)[modes cStringUsingEncoding:NSUnicodeStringEncoding]);
91+
#else // Cocoa or GNUstep under Linux
92+
FILE *fileh=fopen(path.fileSystemRepresentation,modes.UTF8String);
93+
#endif
94+
95+
if(!fileh) {
96+
if (outErr) {
97+
*outErr = [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:@{NSURLErrorKey: path}];
98+
}
99+
return nil;
100+
}
101+
102+
CSFileHandle *handle=[[CSFileHandle alloc] initWithFilePointer:fileh closeOnDealloc:YES path:path.path];
103+
if(handle) return handle;
104+
105+
fclose(fileh);
106+
if (outErr) {
107+
*outErr = [NSError errorWithDomain:XADErrorDomain code:XADErrorUnknown userInfo:@{NSURLErrorKey: path}];
108+
}
109+
return nil;
110+
}
34111

35112
+(CSFileHandle *)fileHandleForReadingAtPath:(NSString *)path
36113
{ return [self fileHandleForPath:path modes:@"rb"]; }

Checksums.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727

2828
@interface CSHandle (Checksums)
2929

30-
-(BOOL)hasChecksum;
31-
-(BOOL)isChecksumCorrect;
30+
@property (nonatomic, readonly) BOOL hasChecksum;
31+
@property (nonatomic, readonly, getter=isChecksumCorrect) BOOL checksumCorrect;
3232

3333
@end
3434

XADArchiveParser.h

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,29 @@ resourceFork:(XADResourceFork *)fork name:(NSString *)name propertiesToAdd:(NSMu
148148
+(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry resourceForkDictionary:(NSDictionary *)forkentry archiveParser:(XADArchiveParser *)parser wantChecksum:(BOOL)checksum;
149149
+(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry resourceForkDictionary:(NSDictionary *)forkentry archiveParser:(XADArchiveParser *)parser wantChecksum:(BOOL)checksum error:(XADError *)errorptr;
150150

151+
#pragma mark NSError functions
152+
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle name:(NSString *)name nserror:(NSError **)errorptr NS_SWIFT_NAME(archiveParser(for:name:));
153+
+(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary<XADArchiveKeys,id> *)entry
154+
archiveParser:(XADArchiveParser *)parser wantChecksum:(BOOL)checksum nserror:(NSError **)errorptr
155+
NS_SWIFT_NAME(archiveParser(with:archiveParser:wantChecksum:));
156+
+(XADArchiveParser *)archiveParserForEntryWithDictionary:(NSDictionary *)entry
157+
resourceForkDictionary:(NSDictionary *)forkentry archiveParser:(XADArchiveParser *)parser
158+
wantChecksum:(BOOL)checksum nserror:(NSError **)errorptr
159+
NS_SWIFT_NAME(archiveParser(with:resourceForkDictionary:archiveParser:wantChecksum:));
160+
+(XADArchiveParser *)archiveParserForPath:(NSString *)filename nserror:(NSError **)errorptr
161+
NS_SWIFT_NAME(archiveParser(forPath:));
162+
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header
163+
resourceFork:(XADResourceFork *)fork name:(NSString *)name nserror:(NSError **)errorptr
164+
NS_SWIFT_NAME(archiveParser(for:firstBytes:resourceFork:name:));
165+
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle resourceFork:(XADResourceFork *)fork
166+
name:(NSString *)name nserror:(NSError **)errorptr
167+
NS_SWIFT_NAME(archiveParser(for:resourceFork:name:));
168+
+(XADArchiveParser *)archiveParserForHandle:(CSHandle *)handle firstBytes:(NSData *)header
169+
name:(NSString *)name nserror:(NSError **)errorptr
170+
NS_SWIFT_NAME(archiveParser(for:firstBytes:name:));
171+
+(XADArchiveParser *)archiveParserForFileURL:(NSURL *)filename error:(NSError **)errorptr
172+
NS_SWIFT_NAME(archiveParser(for:));
173+
151174
-(id)init;
152175
-(void)dealloc;
153176

@@ -182,8 +205,9 @@ resourceFork:(XADResourceFork *)fork name:(NSString *)name propertiesToAdd:(NSMu
182205
@property (readonly) BOOL wasStopped;
183206

184207
@property (nonatomic, readonly) BOOL hasChecksum;
185-
-(BOOL)testChecksum;
208+
-(BOOL)testChecksum NS_SWIFT_UNAVAILABLE("throws exception");
186209
-(XADError)testChecksumWithoutExceptions;
210+
-(BOOL)testChecksumWithError:(NSError**)error NS_REFINED_FOR_SWIFT;
187211

188212

189213

@@ -214,8 +238,8 @@ regex:(XADRegex *)regex firstFileExtension:(NSString *)firstext;
214238
-(XADString *)XADStringWithString:(NSString *)string;
215239
-(XADString *)XADStringWithData:(NSData *)data;
216240
-(XADString *)XADStringWithData:(NSData *)data encodingName:(XADStringEncodingName)encoding;
217-
-(XADString *)XADStringWithBytes:(const void *)bytes length:(int)length;
218-
-(XADString *)XADStringWithBytes:(const void *)bytes length:(int)length encodingName:(XADStringEncodingName)encoding;
241+
-(XADString *)XADStringWithBytes:(const void *)bytes length:(NSInteger)length;
242+
-(XADString *)XADStringWithBytes:(const void *)bytes length:(NSInteger)length encodingName:(XADStringEncodingName)encoding;
219243
-(XADString *)XADStringWithCString:(const char *)cstring;
220244
-(XADString *)XADStringWithCString:(const char *)cstring encodingName:(XADStringEncodingName)encoding;
221245

@@ -237,7 +261,9 @@ regex:(XADRegex *)regex firstFileExtension:(NSString *)firstext;
237261

238262

239263
// Subclasses implement these:
240-
264+
#if __has_feature(objc_class_property)
265+
@property (class, readonly) int requiredHeaderSize;
266+
#endif
241267
+(int)requiredHeaderSize;
242268
+(BOOL)recognizeFileWithHandle:(CSHandle *)handle firstBytes:(NSData *)data
243269
name:(NSString *)name;
@@ -259,6 +285,13 @@ name:(NSString *)name;
259285
-(XADError)parseWithoutExceptions;
260286
-(CSHandle *)handleForEntryWithDictionary:(NSDictionary *)dict wantChecksum:(BOOL)checksum error:(XADError *)errorptr;
261287

288+
//! Exception-free wrapper for subclass method.<br>
289+
//! Will, in addition, pass `XADErrorBreak` and return `NO` if the delegate
290+
//! requested parsing to stop.
291+
-(BOOL)parseWithError:(NSError**)error;
292+
//! Exception-free wrapper for subclass method.
293+
-(CSHandle *)handleForEntryWithDictionary:(NSDictionary<XADArchiveKeys,id> *)dict wantChecksum:(BOOL)checksum nserror:(NSError **)errorptr ;
294+
262295
@end
263296

264297
@protocol XADArchiveParserDelegate <NSObject>

0 commit comments

Comments
 (0)