mirror of
https://github.com/OpenEmu/OpenEmu-SDK.git
synced 2025-11-01 10:15:12 +00:00
133 lines
3.4 KiB
Objective-C
133 lines
3.4 KiB
Objective-C
//
|
|
// OEFile.m
|
|
// OpenEmu-SDK
|
|
//
|
|
// Created by Remy Demarest on 28/08/2016.
|
|
//
|
|
//
|
|
|
|
#import "OEFile.h"
|
|
|
|
@implementation OEFile {
|
|
NSFileHandle *_fileHandle;
|
|
NSUInteger _fileSize;
|
|
}
|
|
|
|
static NSMutableDictionary<NSString *, Class> *extensionToSubclassDictionary;
|
|
|
|
+ (void)initialize
|
|
{
|
|
if (self != [OEFile class])
|
|
return;
|
|
|
|
extensionToSubclassDictionary = [NSMutableDictionary dictionary];
|
|
|
|
[self registerClass:NSClassFromString(@"OECUESheet") forFileExtension:@"cue"];
|
|
[self registerClass:NSClassFromString(@"OECloneCD") forFileExtension:@"ccd"];
|
|
[self registerClass:NSClassFromString(@"OEDreamcastGDI") forFileExtension:@"gdi"];
|
|
[self registerClass:NSClassFromString(@"OEM3UFile") forFileExtension:@"m3u"];
|
|
}
|
|
|
|
+ (__kindof OEFile *)fileWithURL:(NSURL *)fileURL error:(NSError **)error
|
|
{
|
|
Class discDescriptorClass = extensionToSubclassDictionary[fileURL.pathExtension.lowercaseString];
|
|
if (discDescriptorClass != Nil)
|
|
return [[discDescriptorClass alloc] initWithFileURL:fileURL error:error];
|
|
|
|
return [[OEFile alloc] initWithFileURL:fileURL error:error];
|
|
}
|
|
|
|
+ (void)registerClass:(Class)cls forFileExtension:(NSString *)fileExtension
|
|
{
|
|
NSAssert([cls isSubclassOfClass:[OEFile class]], @"Subclass of OEFile required.");
|
|
extensionToSubclassDictionary[fileExtension] = cls;
|
|
}
|
|
|
|
- (nullable instancetype)initWithFileURL:(NSURL *)fileURL error:(NSError **)error
|
|
{
|
|
if (!(self = [super init]))
|
|
return nil;
|
|
|
|
_fileURL = [fileURL copy];
|
|
_fileExtension = _fileURL.pathExtension.lowercaseString;
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)dealloc
|
|
{
|
|
[_fileHandle closeFile];
|
|
}
|
|
|
|
- (NSArray<NSURL *> *)allFileURLs
|
|
{
|
|
return @[ _fileURL ];
|
|
}
|
|
|
|
- (NSUInteger)fileSize
|
|
{
|
|
if (_fileSize == 0) {
|
|
NSNumber *fileSize;
|
|
[_fileURL getResourceValue:&fileSize forKey:NSURLFileSizeKey error:nil];
|
|
_fileSize = fileSize.unsignedIntegerValue;
|
|
}
|
|
|
|
return _fileSize;
|
|
}
|
|
|
|
- (NSURL *)dataTrackFileURL
|
|
{
|
|
return _fileURL;
|
|
}
|
|
|
|
- (NSData *)readDataInRange:(NSRange)dataRange
|
|
{
|
|
if (_fileHandle == nil)
|
|
_fileHandle = [NSFileHandle fileHandleForReadingFromURL:self.dataTrackFileURL error:nil];
|
|
|
|
if (_fileHandle == nil)
|
|
return [NSData data];
|
|
|
|
@try {
|
|
[_fileHandle seekToFileOffset:dataRange.location];
|
|
}
|
|
@catch (...) {
|
|
return [NSData data];
|
|
}
|
|
|
|
return [_fileHandle readDataOfLength:dataRange.length];
|
|
}
|
|
|
|
- (NSString *)readASCIIStringInRange:(NSRange)dataRange
|
|
{
|
|
return [[NSString alloc] initWithData:[self readDataInRange:dataRange] encoding:NSASCIIStringEncoding] ?: @"";
|
|
}
|
|
|
|
- (instancetype)fileByMovingFileToURL:(NSURL *)destinationURL error:(NSError **)error
|
|
{
|
|
if (![self moveToURL:destinationURL error:error])
|
|
return nil;
|
|
|
|
return [[self.class alloc] initWithFileURL:destinationURL error:error];
|
|
}
|
|
|
|
- (instancetype)fileByCopyingFileToURL:(NSURL *)destinationURL error:(NSError **)error
|
|
{
|
|
if (![self copyToURL:destinationURL error:error])
|
|
return nil;
|
|
|
|
return [[self.class alloc] initWithFileURL:destinationURL error:error];
|
|
}
|
|
|
|
- (BOOL)moveToURL:(NSURL *)destinationURL error:(NSError **)error
|
|
{
|
|
return [[NSFileManager defaultManager] moveItemAtURL:_fileURL toURL:destinationURL error:error];
|
|
}
|
|
|
|
- (BOOL)copyToURL:(NSURL *)destinationURL error:(NSError **)error
|
|
{
|
|
return [[NSFileManager defaultManager] copyItemAtURL:_fileURL toURL:destinationURL error:error];
|
|
}
|
|
|
|
@end
|