Utility: Add stubs to regenerate Info.plist with file type associations

CQTexperiment
Christopher Snowhill 2022-01-18 03:06:03 -08:00
parent e70efdaa5a
commit 39a5ee8ab7
23 changed files with 348 additions and 1 deletions

View File

@ -44,6 +44,8 @@
17F94DD60B8D0F7000A34E87 /* PluginController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17F94DD40B8D0F7000A34E87 /* PluginController.m */; };
17F94DDD0B8D101100A34E87 /* Plugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 17F94DDC0B8D101100A34E87 /* Plugin.h */; settings = {ATTRIBUTES = (Public, ); }; };
832BEF04278DD06D005E1BC4 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 832BEF03278DD06D005E1BC4 /* AVFoundation.framework */; };
8347C7412796C58800FA8A7D /* NSFileHandle+CreateFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 8347C73F2796C58800FA8A7D /* NSFileHandle+CreateFile.h */; };
8347C7422796C58800FA8A7D /* NSFileHandle+CreateFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8347C7402796C58800FA8A7D /* NSFileHandle+CreateFile.m */; };
8384912718080FF100E7332D /* Logging.h in Headers */ = {isa = PBXBuildFile; fileRef = 8384912618080FF100E7332D /* Logging.h */; };
8389F270278E64590074164C /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 8389F225278E64590074164C /* config.h */; };
8389F279278E64590074164C /* utf.h in Headers */ = {isa = PBXBuildFile; fileRef = 8389F236278E64590074164C /* utf.h */; };
@ -152,6 +154,8 @@
17F94DDC0B8D101100A34E87 /* Plugin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = Plugin.h; sourceTree = "<group>"; };
32DBCF5E0370ADEE00C91783 /* CogAudio_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CogAudio_Prefix.pch; sourceTree = "<group>"; };
832BEF03278DD06D005E1BC4 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
8347C73F2796C58800FA8A7D /* NSFileHandle+CreateFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSFileHandle+CreateFile.h"; path = "../../Utils/NSFileHandle+CreateFile.h"; sourceTree = "<group>"; };
8347C7402796C58800FA8A7D /* NSFileHandle+CreateFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSFileHandle+CreateFile.m"; path = "../../Utils/NSFileHandle+CreateFile.m"; sourceTree = "<group>"; };
8384912618080FF100E7332D /* Logging.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Logging.h; path = ../../Utils/Logging.h; sourceTree = "<group>"; };
8389F225278E64590074164C /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
8389F228278E64590074164C /* encoding_utf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = encoding_utf.c; sourceTree = "<group>"; };
@ -378,6 +382,8 @@
17D21CDC0B8BE5B400D1EBDE /* Utils */ = {
isa = PBXGroup;
children = (
8347C73F2796C58800FA8A7D /* NSFileHandle+CreateFile.h */,
8347C7402796C58800FA8A7D /* NSFileHandle+CreateFile.m */,
8384912618080FF100E7332D /* Logging.h */,
17D21CF10B8BE5EF00D1EBDE /* Semaphore.h */,
17D21CF20B8BE5EF00D1EBDE /* Semaphore.m */,
@ -742,6 +748,7 @@
8389F27D278E64590074164C /* strl.h in Headers */,
8389F281278E64590074164C /* msvc.h in Headers */,
8389F2A3278E646E0074164C /* lpc.h in Headers */,
8347C7412796C58800FA8A7D /* NSFileHandle+CreateFile.h in Headers */,
8389F290278E64590074164C /* boolean.h in Headers */,
8389F295278E64590074164C /* retro_assert.h in Headers */,
8389F28A278E64590074164C /* retro_inline.h in Headers */,
@ -849,6 +856,7 @@
8389F29B278E64590074164C /* sinc_resampler.c in Sources */,
8389F299278E64590074164C /* memalign.c in Sources */,
17D21CF40B8BE5EF00D1EBDE /* Semaphore.m in Sources */,
8347C7422796C58800FA8A7D /* NSFileHandle+CreateFile.m in Sources */,
17D21DC80B8BE79700D1EBDE /* CoreAudioUtils.m in Sources */,
839366681815923C006DD712 /* CogPluginMulti.m in Sources */,
17D21EBE0B8BF44000D1EBDE /* AudioPlayer.m in Sources */,

View File

@ -31,6 +31,7 @@
@required
+ (NSArray *)mimeTypes;
+ (NSArray *)fileTypes; //mp3, ogg, etc
+ (NSArray *)fileTypeAssociations; // array of NSArray of NSString, where first item in array is the type name, the second is the icon name, and the rest are the extensions
+ (float)priority; // should be 0.0 ... 1.0, higher means you get selected first, should default to 1.0 unless you know a reason why any of your extensions may behave badly, ie. greedily taking over some file type extension without performing any header validation on it
//For KVO

View File

@ -4,6 +4,8 @@
#import "Logging.h"
#import "NSFileHandle+CreateFile.h"
@implementation PluginController
@synthesize sources;
@ -262,6 +264,146 @@ static PluginController *sharedPluginController = nil;
ALog(@"Decoders by Extension: %@", self.decodersByExtension);
ALog(@"Decoders by Mime Type: %@", self.decodersByMimeType);
#if 0
// XXX Keep in sync with Info.plist on disk!
NSString * plistHeader = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\
<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n\
<plist version=\"1.0\">\n\
<dict>\n\
\t<key>CFBundleDevelopmentRegion</key>\n\
\t<string>English</string>\n\
\t<key>CFBundleDocumentTypes</key>\n\
\t<array>\n\
\t\t<dict>\n\
\t\t\t<key>CFBundleTypeExtensions</key>\n\
\t\t\t<array>\n\
\t\t\t\t<string>*</string>\n\
\t\t\t</array>\n\
\t\t\t<key>CFBundleTypeIconFile</key>\n\
\t\t\t<string>song.icns</string>\n\
\t\t\t<key>CFBundleTypeOSTypes</key>\n\
\t\t\t<array>\n\
\t\t\t\t<string>****</string>\n\
\t\t\t\t<string>fold</string>\n\
\t\t\t\t<string>disk</string>\n\
\t\t\t</array>\n\
\t\t\t<key>CFBundleTypeRole</key>\n\
\t\t\t<string>None</string>\n\
\t\t</dict>\n";
NSString * plistFooter = @"\t</array>\n\
\t<key>CFBundleExecutable</key>\n\
\t<string>Cog</string>\n\
\t<key>CFBundleHelpBookFolder</key>\n\
\t<string>Cog.help</string>\n\
\t<key>CFBundleHelpBookName</key>\n\
\t<string>org.cogx.cog.help</string>\n\
\t<key>CFBundleIdentifier</key>\n\
\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\
\t<key>CFBundleInfoDictionaryVersion</key>\n\
\t<string>6.0</string>\n\
\t<key>CFBundlePackageType</key>\n\
\t<string>APPL</string>\n\
\t<key>CFBundleShortVersionString</key>\n\
\t<string>0.08</string>\n\
\t<key>CFBundleSignature</key>\n\
\t<string>????</string>\n\
\t<key>CFBundleVersion</key>\n\
\t<string>r516</string>\n\
\t<key>LSApplicationCategoryType</key>\n\
\t<string>public.app-category.music</string>\n\
\t<key>LSMinimumSystemVersion</key>\n\
\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\
\t<key>NSAppTransportSecurity</key>\n\
\t<dict>\n\
\t\t<key>NSAllowsArbitraryLoads</key>\n\
\t\t<true/>\n\
\t</dict>\n\
\t<key>NSAppleScriptEnabled</key>\n\
\t<string>YES</string>\n\
\t<key>NSCalendarsUsageDescription</key>\n\
\t<string>Cog has no use for your calendar information. Why are you trying to open your Calendar with an audio player?</string>\n\
\t<key>NSCameraUsageDescription</key>\n\
\t<string>Cog is an audio player. It will never use your camera. Why is it asking for permission to use your camera?</string>\n\
\t<key>NSContactsUsageDescription</key>\n\
\t<string>Cog has no use for your contacts information. Why are you trying to open your contacts with an audio player?</string>\n\
\t<key>NSLocationUsageDescription</key>\n\
\t<string>Cog has no use for your location information. Something is obviously wrong with the application.</string>\n\
\t<key>NSMainNibFile</key>\n\
\t<string>MainMenu</string>\n\
\t<key>NSMicrophoneUsageDescription</key>\n\
\t<string>Cog is an audio player. It does not, however, record audio. Why is it asking for permission to use your microphone?</string>\n\
\t<key>NSPhotoLibraryUsageDescription</key>\n\
\t<string>Cog is an audio player. Why are you trying to access your Photos Library with an audio player?</string>\n\
\t<key>NSPrincipalClass</key>\n\
\t<string>MediaKeysApplication</string>\n\
\t<key>NSRemindersUsageDescription</key>\n\
\t<string>Cog has no use for your reminders. Why are you trying to access them with an audio player?</string>\n\
\t<key>SUFeedURL</key>\n\
\t<string>https://cogcdn.cog.losno.co/mercury.xml</string>\n\
\t<key>SUPublicEDKey</key>\n\
\t<string>omxG7Rp0XK9/YEvKbVy7cd44eVAh1LJB6CmjQwjOJz4=</string>\n\
</dict>\n\
</plist>\n";
NSMutableArray * decodersRegistered = [[NSMutableArray alloc] init];
NSArray * allKeys = [self.decodersByExtension allKeys];
for (NSString * ext in allKeys) {
NSArray * decoders = [self.decodersByExtension objectForKey:ext];
for (NSString * decoder in decoders) {
if (![decodersRegistered containsObject:decoder]) {
[decodersRegistered addObject:decoder];
}
}
}
NSMutableArray * stringList = [[NSMutableArray alloc] init];
[stringList addObject:plistHeader];
for (NSString * decoderString in decodersRegistered) {
Class decoder = NSClassFromString(decoderString);
if (decoder && [decoder respondsToSelector:@selector(fileTypeAssociations)]) {
NSArray * types = [decoder fileTypeAssociations];
for (NSArray * type in types) {
[stringList addObject:@"\t\t<dict>\n\
\t\t\t<key>CFBundleTypeExtensions</key>\n\
\t\t\t<array>\n\
"];
for (size_t i = 2; i < [type count]; ++i) {
[stringList addObject:@"\t\t\t\t<string>"];
[stringList addObject:[[type objectAtIndex:i] lowercaseString]];
[stringList addObject:@"</string>\n"];
}
[stringList addObject:@"\t\t\t</array>\n\
\t\t\t<key>CFBundleTypeIconFile</key>\n\
\t\t\t<string>"];
[stringList addObject:[type objectAtIndex:1]];
[stringList addObject:@"</string>\n\
\t\t\t<key>CFBundleTypeName</key>\n\
\t\t\t<string>"];
[stringList addObject:[type objectAtIndex:0]];
[stringList addObject:@"</string>\n\
\t\t\t<key>CFBundleTypeRole</key>\n\
\t\t\t<string>Viewer</string>\n\
\t\t\t<key>LSTypeIsPackage</key>\n\
\t\t\t<false/>\n\
\t\t</dict>\n"];
}
}
}
[stringList addObject:plistFooter];
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:@"/tmp/Cog_Info.plist" createFile:YES];
if (!fileHandle) {
DLog(@"Error saving Info.plist!");
return;
}
[fileHandle truncateFileAtOffset:0];
[fileHandle writeData:[[stringList componentsJoinedByString:@""] dataUsingEncoding:NSUTF8StringEncoding]];
[fileHandle closeFile];
#endif
}
- (id<CogSource>) audioSourceForURL:(NSURL *)url

View File

@ -17,6 +17,13 @@
return 1.0;
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"APL Link Files", @"song.icns", @"apl"]
];
}
- (NSDictionary *)properties {
NSMutableDictionary *properties = [[decoder properties] mutableCopy];
@ -118,4 +125,5 @@
}
@end

View File

@ -206,4 +206,14 @@ static CAdPlugDatabase * g_database = NULL;
return 0.5;
}
+ (NSArray *)fileTypeAssociations
{
NSMutableArray * ret = [[NSMutableArray alloc] init];
[ret addObject:@"AdPlug Files"];
[ret addObject:@"vg.icns"];
[ret addObjectsFromArray:[self fileTypes]];
return [NSArray arrayWithObject:ret];
}
@end

View File

@ -318,6 +318,25 @@ static SInt64 getSizeProc(void* clientData) {
return 1.5;
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"WAVE Files", @"wav.icns", @"wav", @"w64"],
@[@"AIFF Files", @"aiff.icns", @"aif", @"aiff", @"aifc"],
@[@"CAF Files", @"song.icns", @"caf"],
@[@"AU Files", @"song.icns", @"au"],
@[@"MPEG Audio Files", @"mp3.icns", @"mp3", @"mp2", @"mp1", @"m2a", @"mpa"],
@[@"MPEG Stream Files", @"song.icns", @"mpeg"],
@[@"MPEG-4 Audio Files", @"m4a.icns", @"m4a", @"mp4", @"m4b", @"m4r"],
@[@"MPEG-4 AAC Audio Files", @"song.icns", @"aac", @"adts"],
@[@"AMR Audio Files", @"song.icns", @"amr"],
@[@"USAC Audio Files", @"song.icns", @"xhe"],
@[@"AC-3 Audio Files", @"song.icns", @"ac3"],
@[@"FLAC Audio Files", @"flac.icns", @"flac"],
@[@"SND Audio Files", @"song.icns", @"snd"]
];
}
- (NSDictionary *)properties
{
return [NSDictionary dictionaryWithObjectsAndKeys:

View File

@ -31,6 +31,13 @@
return 16.0f;
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"Cue Sheet Files", @"cue.icns", @"cue"]
];
}
- (NSDictionary *)properties
{
NSMutableDictionary *properties = [[decoder properties] mutableCopy];

View File

@ -594,6 +594,26 @@ int lockmgr_callback(void ** mutex, enum AVLockOp op)
return [NSArray arrayWithObjects:@"application/wma", @"application/x-wma", @"audio/x-wma", @"audio/x-ms-wma", @"audio/x-tak", @"application/ogg", @"audio/aacp", @"audio/mpeg", @"audio/mp4", @"audio/x-mp3", @"audio/x-mp2", @"audio/x-matroska", @"audio/x-ape", @"audio/x-ac3", @"audio/x-dts", @"audio/x-dtshd", @"audio/x-at3", @"audio/wav", @"audio/tta", @"audio/x-tta", @"audio/x-twinvq", nil];
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"Windows Media Audio Files", @"song.icns", @"wma", @"asf"],
@[@"TAK Audio Files", @"song.icns", @"tak"],
@[@"MPEG-4 Audio Files", @"m4a.icns", @"mp4", @"m4a"],
@[@"MPEG-4 AAC Audio Files", @"song.icns", @"aac"],
@[@"MPEG Audio Files", @"mp3.icns", @"mp3", @"m2a", @"mpa"],
@[@"Monkey's Audio Files", @"ape.icns", @"ape"],
@[@"AC-3 Audio Files", @"song.icns", @"ac3"],
@[@"DTS Audio Files", @"song.icns", @"dts"],
@[@"DTS-HD MA Audio Files", @"song.icns", @"dtshd"],
@[@"True Audio Files", @"song.icns", @"tta"],
@[@"TrueVQ Audio Files", @"song.icns", @"vqf", @"vqe", @"vql"],
@[@"Real Audio Files", @"song.icns", @"ra", @"rm", @"rmj"],
@[@"Matroska Audio Files", @"song.icns", @"mka"],
@[@"WebM Audio Files", @"song.icns", @"weba"]
];
}
+ (float)priority
{
if (@available(macOS 10.15, *))

View File

@ -366,4 +366,11 @@ void ErrorCallback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorS
return 2.0;
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"FLAC Audio Files", @"flac.icns", @"flac"]
];
}
@end

View File

@ -209,7 +209,7 @@ gme_err_t readCallback( void* data, void* out, long count )
+ (NSArray *)fileTypes
{
return [NSArray arrayWithObjects:@"ay", @"gbs", @"hes", @"kss", @"nsf", @"nsfe", @"sap", @"sfm", @"sgc", @"spc", @"vgm", @"vgz", nil];
return [NSArray arrayWithObjects:@"ay", @"gbs", @"hes", @"kss", @"nsf", @"nsfe", @"sap", @"sfm", @"sgc", @"spc", nil];
}
+ (NSArray *)mimeTypes
@ -222,6 +222,17 @@ gme_err_t readCallback( void* data, void* out, long count )
return 1.0;
}
+ (NSArray *)fileTypeAssociations
{
NSMutableArray * ret = [[NSMutableArray alloc] init];
[ret addObject:@"Game Music Emu Files"];
[ret addObject:@"vg.icns"];
[ret addObjectsFromArray:[self fileTypes]];
return [NSArray arrayWithObject:ret];
}
- (void)setSource:(id<CogSource>)s
{
source = s;

View File

@ -1752,5 +1752,15 @@ static int usf_info(void * context, const char * name, const char * value)
return 1.0;
}
+ (NSArray *)fileTypeAssociations
{
NSMutableArray * ret = [[NSMutableArray alloc] init];
[ret addObject:@"PSF Format Files"];
[ret addObject:@"vg.icns"];
[ret addObjectsFromArray:[self fileTypes]];
return [NSArray arrayWithObject:ret];
}
@end

View File

@ -194,6 +194,14 @@ static void oneTimeInit(void)
return [NSArray arrayWithObjects:@"hvl", @"ahx", nil];
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"Hively Tracker Files", @"song.icns", @"hvl"],
@[@"AHX Tracker Files", @"song.icns", @"ahx"]
];
}
+ (NSArray *)mimeTypes
{
return nil;

View File

@ -368,4 +368,17 @@ static OSType getOSType(const char * in_)
return 1.0;
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"General MIDI Files", @"song.icns", @"mid", @"midi", @"kar"],
@[@"RIFF MIDI Files", @"song.icns", @"rmi"],
@[@"MIDS MIDI Files", @"song.icns", @"mids", @"mds"],
@[@"HMI MIDI Files", @"song.icns", @"hmi", @"hmp", @"hmq"],
@[@"id Software MUS MIDI Files", @"song.icns", @"mus"],
@[@"XMI MIDI Files", @"song.icns", @"xmi"],
@[@"Loudness MIDI Files", @"song.icns", @"lds"]
];
}
@end

View File

@ -233,4 +233,11 @@ mpc_bool_t CanSeekProc(mpc_reader *p_reader)
return 1.0;
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"Musepack Audio Files", @"mpc.icns", @"mpc"]
];
}
@end

View File

@ -193,4 +193,14 @@ static void g_push_archive_extensions(std::vector<std::string> & list)
return 1.0;
}
+ (NSArray *)fileTypeAssociations
{
NSMutableArray * ret = [[NSMutableArray alloc] init];
[ret addObject:@"libOpenMPT Module Files"];
[ret addObject:@"song.icns"];
[ret addObjectsFromArray:[self fileTypes]];
return [NSArray arrayWithObject:ret];
}
@end

View File

@ -185,4 +185,14 @@ static void g_push_archive_extensions(std::vector<std::string> & list)
return 1.0;
}
+ (NSArray *)fileTypeAssociations
{
NSMutableArray * ret = [[NSMutableArray alloc] init];
[ret addObject:@"libOpenMPT Module Files"];
[ret addObject:@"song.icns"];
[ret addObjectsFromArray:[self fileTypes]];
return [NSArray arrayWithObject:ret];
}
@end

View File

@ -188,4 +188,12 @@ opus_int64 sourceTell(void *_stream)
return 1.0;
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"Opus Audio Files", @"ogg.icns", @"opus"],
@[@"Ogg Audio Files", @"ogg.icns", @"ogg"]
];
}
@end

View File

@ -113,5 +113,12 @@
return 1.0;
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"Shorten Audio Files", @"shn.icns", @"shn"]
];
}
@end

View File

@ -180,4 +180,11 @@ long sourceTell(void *datasource)
return 1.0;
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"Ogg Vorbis Files", @"ogg.icns", @"ogg"]
];
}
@end

View File

@ -331,5 +331,11 @@ int32_t WriteBytesProc(void *ds, void *data, int32_t bcount)
return 1.0;
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"WavPack Audio Files", @"wv.icns", @"wv", @"wvp"]
];
}
@end

View File

@ -291,6 +291,16 @@ const int masterVol = 0x10000; // Fixed point 16.16
return 1.25;
}
+ (NSArray *)fileTypeAssociations
{
NSMutableArray * ret = [[NSMutableArray alloc] init];
[ret addObject:@"libvgm Files"];
[ret addObject:@"vg.icns"];
[ret addObjectsFromArray:[self fileTypes]];
return [NSArray arrayWithObject:ret];
}
- (void)setSource:(id<CogSource>)s
{
source = s;

View File

@ -374,4 +374,12 @@ static void sidTuneLoader(const char* fileName, std::vector<uint8_t>& bufferRef)
return 0.5;
}
+ (NSArray *)fileTypeAssociations
{
return @[
@[@"SID Files", @"vg.icns", @"sid"],
@[@"SID MUS Files", @"song.icns", @"mus"]
];
}
@end

View File

@ -416,4 +416,14 @@ static NSString* get_description_tag(const char* description, const char *tag, c
return 0.0;
}
+ (NSArray *)fileTypeAssociations
{
NSMutableArray * ret = [[NSMutableArray alloc] init];
[ret addObject:@"VGMStream Files"];
[ret addObject:@"vg.icns"];
[ret addObjectsFromArray:[self fileTypes]];
return [NSArray arrayWithObject:ret];
}
@end