SameBoy | Accurate GB/GBC emulator |
| download: https://git.y1.nz/archives/sameboy.tar.gz | |
| README | Files | Log | Refs | LICENSE |
commit 21f21f6bc7789b12d2951323679d8ac0c9e39ab2 parent 322ead9b930b37854380fc8710c03b500a6d4a3d Author: Lior Halphon <LIJI32@gmail.com> Date: Wed, 18 Jan 2023 23:08:17 +0200 Allow importing ROMs and Files app interaction Diffstat:
| M | iOS/GBROMManager.h | 2 | +- |
| M | iOS/GBROMManager.m | 46 | ++++++++++++++++++++++++++++++++++++++++++++++ |
| M | iOS/GBViewController.m | 19 | ++++++++++++++++++- |
| M | iOS/Info.plist | 105 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
4 files changed, 170 insertions(+), 2 deletions(-)
diff --git a/iOS/GBROMManager.h b/iOS/GBROMManager.h @@ -15,5 +15,5 @@ - (NSString *)batterySaveFileForROM:(NSString *)rom; - (NSString *)autosaveStateFileForROM:(NSString *)rom; - (NSString *)stateFile:(unsigned)index forROM:(NSString *)rom; - +- (NSString *)importROM:(NSString *)romFile keepOriginal:(bool)keep; @end diff --git a/iOS/GBROMManager.m b/iOS/GBROMManager.m @@ -114,4 +114,50 @@ return ret; } +- (NSString *)importROM:(NSString *)romFile keepOriginal:(bool)keep +{ + NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\([^)]+\\)|\\[[^\\]]+\\]" options:0 error:nil]; + NSString *friendlyName = [[romFile lastPathComponent] stringByDeletingPathExtension]; + friendlyName = [regex stringByReplacingMatchesInString:friendlyName options:0 range:NSMakeRange(0, [friendlyName length]) withTemplate:@""]; + friendlyName = [friendlyName stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + NSString *root = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true).firstObject; + if ([[NSFileManager defaultManager] fileExistsAtPath:[root stringByAppendingPathComponent:friendlyName]]) { + unsigned i = 2; + while (true) { + NSString *attempt = [friendlyName stringByAppendingFormat:@" %u", i]; + if ([[NSFileManager defaultManager] fileExistsAtPath:[root stringByAppendingPathComponent:attempt]]) { + i++; + continue; + } + friendlyName = attempt; + break; + } + } + + NSString *romFolder = [root stringByAppendingPathComponent:friendlyName]; + [[NSFileManager defaultManager] createDirectoryAtPath:romFolder + withIntermediateDirectories:false + attributes:nil + error:nil]; + + NSString *newROMPath = [romFolder stringByAppendingPathComponent:romFile.lastPathComponent]; + + NSError *error = nil; + + if (keep) { + [[NSFileManager defaultManager] linkItemAtPath:romFile + toPath:newROMPath + error:&error]; + } + else { + [[NSFileManager defaultManager] moveItemAtPath:romFile + toPath:newROMPath + error:&error]; + } + NSLog(@"%@", error); + + return friendlyName; +} + @end diff --git a/iOS/GBViewController.m b/iOS/GBViewController.m @@ -316,7 +316,7 @@ static void rumbleCallback(GB_gameboy_t *gb, double amp) /* Convert the screenshot to a CGImageRef */ CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, data.bytes, data.length, NULL); CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); - CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; + CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaNoneSkipLast; CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; CGImageRef iref = CGImageCreate(width, @@ -473,4 +473,21 @@ static void rumbleCallback(GB_gameboy_t *gb, double amp) { GB_set_palette(&_gb, [self userPalette]); } + +- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options +{ + [self stop]; + NSString *potentialROM = [[url.path stringByDeletingLastPathComponent] lastPathComponent]; + if ([[[GBROMManager sharedManager] romFileForROM:potentialROM].stringByStandardizingPath isEqualToString:url.path.stringByStandardizingPath]) { + [GBROMManager sharedManager].currentROM = potentialROM; + } + else { + [GBROMManager sharedManager].currentROM = + [[GBROMManager sharedManager] importROM:url.path + keepOriginal:[options[UIApplicationOpenURLOptionsOpenInPlaceKey] boolValue]]; + } + [self loadROM]; + [self start]; + return false; +} @end diff --git a/iOS/Info.plist b/iOS/Info.plist @@ -48,5 +48,110 @@ </dict> <key>LSApplicationCategoryType</key> <string>public.app-category.games</string> + <key>LSSupportsOpeningDocumentsInPlace</key> + <true/> + <key>UIFileSharingEnabled</key> + <true/> + <key>UISupportsDocumentBrowser</key> + <true/> + <key>CFBundleDocumentTypes</key> + <array> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>gb</string> + </array> + <key>CFBundleTypeName</key> + <string>Game Boy Game</string> + <key>LSItemContentTypes</key> + <array> + <string>com.github.liji32.sameboy.gb</string> + </array> + <key>LSHandlerRank</key> + <string>Owner</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>gbc</string> + </array> + <key>CFBundleTypeName</key> + <string>Game Boy Color Game</string> + <key>LSItemContentTypes</key> + <array> + <string>com.github.liji32.sameboy.gbc</string> + </array> + <key>LSHandlerRank</key> + <string>Owner</string> + </dict> + <dict> + <key>CFBundleTypeExtensions</key> + <array> + <string>isx</string> + </array> + <key>CFBundleTypeName</key> + <string>Game Boy ISX File</string> + <key>LSItemContentTypes</key> + <array> + <string>com.github.liji32.sameboy.isx</string> + </array> + <key>LSHandlerRank</key> + <string>Owner</string> + </dict> + </array> + <key>UTExportedTypeDeclarations</key> + <array> + <dict> + <key>UTTypeConformsTo</key> + <array> + <string>public.data</string> + </array> + <key>UTTypeDescription</key> + <string>Game Boy Game</string> + <key>UTTypeIdentifier</key> + <string>com.github.liji32.sameboy.gb</string> + <key>UTTypeTagSpecification</key> + <dict> + <key>public.filename-extension</key> + <array> + <string>gb</string> + </array> + </dict> + </dict> + <dict> + <key>UTTypeConformsTo</key> + <array> + <string>public.data</string> + </array> + <key>UTTypeDescription</key> + <string>Game Boy Color Game</string> + <key>UTTypeIdentifier</key> + <string>com.github.liji32.sameboy.gbc</string> + <key>UTTypeTagSpecification</key> + <dict> + <key>public.filename-extension</key> + <array> + <string>gbc</string> + </array> + </dict> + </dict> + <dict> + <key>UTTypeConformsTo</key> + <array> + <string>public.data</string> + </array> + <key>UTTypeDescription</key> + <string>Game Boy ISX File</string> + <key>UTTypeIdentifier</key> + <string>com.github.liji32.sameboy.isx</string> + <key>UTTypeTagSpecification</key> + <dict> + <key>public.filename-extension</key> + <array> + <string>isx</string> + </array> + </dict> + </dict> + </array> </dict> </plist>
This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.