summaryrefslogtreecommitdiff
path: root/macosx/Source/PluginList.m
diff options
context:
space:
mode:
authorSND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2014-07-20 05:09:43 +0000
committerSND\MaddTheSane_cp <SND\MaddTheSane_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2014-07-20 05:09:43 +0000
commitd6942932d64a02aa92b1e04e91f6126f33fdb05e (patch)
tree7cad698308e39abc2b0e1c71674c610ec3ce74dd /macosx/Source/PluginList.m
parentb8d0d24d56dbc0ee64f4ec9a72ab917604d8109d (diff)
downloadpcsxr-d6942932d64a02aa92b1e04e91f6126f33fdb05e.tar.gz
OS X: Move source files to their own folder.
git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@90999 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'macosx/Source/PluginList.m')
-rw-r--r--macosx/Source/PluginList.m318
1 files changed, 318 insertions, 0 deletions
diff --git a/macosx/Source/PluginList.m b/macosx/Source/PluginList.m
new file mode 100644
index 00000000..6b86bd90
--- /dev/null
+++ b/macosx/Source/PluginList.m
@@ -0,0 +1,318 @@
+//
+// PluginList.m
+// Pcsxr
+//
+// Created by Gil Pedersen on Sun Sep 21 2003.
+// Copyright (c) 2003 __MyCompanyName__. All rights reserved.
+//
+
+#import "EmuThread.h"
+#import "PluginList.h"
+#import "PcsxrPlugin.h"
+#include "psxcommon.h"
+#include "plugins.h"
+
+static PluginList __weak *sPluginList = nil;
+const static int typeList[] = {PSE_LT_GPU, PSE_LT_SPU, PSE_LT_CDR, PSE_LT_PAD, PSE_LT_NET, PSE_LT_SIO1};
+
+@interface PluginList ()
+@property (strong) NSMutableArray *pluginList;
+@property BOOL missingPlugins;
+@property (strong) PcsxrPlugin *activeGpuPlugin;
+@property (strong) PcsxrPlugin *activeSpuPlugin;
+@property (strong) PcsxrPlugin *activeCdrPlugin;
+@property (strong) PcsxrPlugin *activePadPlugin;
+@property (strong) PcsxrPlugin *activeNetPlugin;
+@property (strong) PcsxrPlugin *activeSIO1Plugin;
+
+@end
+
+@implementation PluginList
+@synthesize missingPlugins;
+
++ (PluginList *)list
+{
+ return sPluginList;
+}
+
+- (id)init
+{
+ NSUInteger i;
+
+ if (!(self = [super init]))
+ {
+ return nil;
+ }
+
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ self.pluginList = [[NSMutableArray alloc] initWithCapacity:20];
+
+ self.activeGpuPlugin = self.activeSpuPlugin = self.activeCdrPlugin = self.activePadPlugin = self.activeNetPlugin = self.activeSIO1Plugin = nil;
+
+ missingPlugins = NO;
+ for (i = 0; i < sizeof(typeList) / sizeof(typeList[0]); i++) {
+ NSString *path = [defaults stringForKey:[PcsxrPlugin defaultKeyForType:typeList[i]]];
+ if (nil == path) {
+ missingPlugins = YES;
+ continue;
+ }
+ if ([path isEqualToString:@"Disabled"])
+ continue;
+
+ if (![self hasPluginAtPath:path]) {
+ @autoreleasepool {
+ PcsxrPlugin *plugin = [[PcsxrPlugin alloc] initWithPath:path];
+ if (plugin) {
+ [self.pluginList addObject:plugin];
+ if (![self setActivePlugin:plugin forType:typeList[i]])
+ missingPlugins = YES;
+ } else {
+ missingPlugins = YES;
+ }
+ }
+ }
+ }
+
+ if (missingPlugins) {
+ [self refreshPlugins];
+ }
+
+ sPluginList = self;
+
+ return self;
+}
+
+- (void)refreshPlugins
+{
+ NSDirectoryEnumerator *dirEnum;
+ NSString *pname;
+ NSUInteger i;
+
+ // verify that the ones that are in list still works
+ for (i=0; i < [self.pluginList count]; i++) {
+ if (![(self.pluginList)[i] verifyOK]) {
+ [self.pluginList removeObjectAtIndex:i]; i--;
+ }
+ }
+
+ for (NSString *plugDir in [PcsxrPlugin pluginsPaths])
+ {
+ // look for new ones in the plugin directory
+ dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:plugDir];
+
+ while ((pname = [dirEnum nextObject])) {
+ if ([[pname pathExtension] isEqualToString:@"psxplugin"] ||
+ [[pname pathExtension] isEqualToString:@"so"]) {
+ [dirEnum skipDescendents]; /* don't enumerate this
+ directory */
+
+ if (![self hasPluginAtPath:pname]) {
+ @autoreleasepool {
+ PcsxrPlugin *plugin = [[PcsxrPlugin alloc] initWithPath:pname];
+ if (plugin != nil) {
+ [self.pluginList addObject:plugin];
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // check the we have the needed plugins
+ missingPlugins = NO;
+ for (i=0; i < 4 /*sizeof(*typeList)*/; i++) {
+ PcsxrPlugin *plugin = [self activePluginForType:typeList[i]];
+ if (nil == plugin) {
+ NSArray *list = [self pluginsForType:typeList[i]];
+ NSUInteger j;
+
+ for (j=0; j < [list count]; j++) {
+ if ([self setActivePlugin:list[j] forType:typeList[i]])
+ break;
+ }
+ if (j == [list count])
+ missingPlugins = YES;
+ }
+ }
+}
+
+- (NSArray *)pluginsForType:(int)typeMask
+{
+ NSMutableArray *types = [NSMutableArray array];
+
+ for (PcsxrPlugin *plugin in self.pluginList) {
+ if ([plugin type] & typeMask) {
+ [types addObject:plugin];
+ }
+ }
+
+ return types;
+}
+
+- (BOOL)hasPluginAtPath:(NSString *)path
+{
+ if (nil == path)
+ return NO;
+
+ for (PcsxrPlugin *plugin in self.pluginList) {
+ if ([[plugin path] isEqualToString:path])
+ return YES;
+ }
+
+ return NO;
+}
+
+// returns if all the required plugins are available
+- (BOOL)configured
+{
+ return !missingPlugins;
+}
+
+- (BOOL)doInitPlugins
+{
+ BOOL bad = NO;
+
+ if ([self.activeGpuPlugin runAs:PSE_LT_GPU] != 0)
+ bad = YES;
+ if ([self.activeSpuPlugin runAs:PSE_LT_SPU] != 0)
+ bad = YES;
+ if ([self.activeCdrPlugin runAs:PSE_LT_CDR] != 0)
+ bad = YES;
+ if ([self.activePadPlugin runAs:PSE_LT_PAD] != 0)
+ bad = YES;
+ if ([self.activeNetPlugin runAs:PSE_LT_NET] != 0)
+ bad = YES;
+ if ([self.activeSIO1Plugin runAs:PSE_LT_SIO1] != 0)
+ bad = YES;
+
+ return !bad;
+}
+
+- (PcsxrPlugin *)activePluginForType:(int)type
+{
+ switch (type) {
+ case PSE_LT_GPU: return self.activeGpuPlugin; break;
+ case PSE_LT_CDR: return self.activeCdrPlugin; break;
+ case PSE_LT_SPU: return self.activeSpuPlugin; break;
+ case PSE_LT_PAD: return self.activePadPlugin; break;
+ case PSE_LT_NET: return self.activeNetPlugin; break;
+ case PSE_LT_SIO1: return self.activeSIO1Plugin; break;
+ }
+
+ return nil;
+}
+
+- (BOOL)setActivePlugin:(PcsxrPlugin *)plugin forType:(int)type
+{
+ PcsxrPlugin *pluginPtr = nil;
+
+ switch (type) {
+ case PSE_LT_SIO1:
+ case PSE_LT_GPU:
+ case PSE_LT_CDR:
+ case PSE_LT_SPU:
+ case PSE_LT_PAD:
+ case PSE_LT_NET: pluginPtr = [self activePluginForType:type]; break;
+ default: return NO; break;
+ }
+ if (plugin == pluginPtr) {
+ return YES;
+ }
+
+ BOOL active = pluginPtr && [EmuThread active];
+ BOOL wasPaused = NO;
+ if (active) {
+ // TODO: temporary freeze?
+ wasPaused = [EmuThread pauseSafe];
+ ClosePlugins();
+ ReleasePlugins();
+ }
+
+ // stop the old plugin and start the new one
+ if (pluginPtr) {
+ [pluginPtr shutdownAs:type];
+ pluginPtr = nil;
+ }
+
+ if ([plugin runAs:type] != 0) {
+ plugin = nil;
+ }
+
+ switch (type) {
+ case PSE_LT_GPU:
+ self.activeGpuPlugin = plugin;
+ break;
+ case PSE_LT_CDR:
+ self.activeCdrPlugin = plugin;
+ break;
+ case PSE_LT_SPU:
+ self.activeSpuPlugin = plugin;
+ break;
+ case PSE_LT_PAD:
+ self.activePadPlugin = plugin;
+ break;
+ case PSE_LT_NET:
+ self.activeNetPlugin = plugin;
+ break;
+ case PSE_LT_SIO1:
+ self.activeSIO1Plugin = plugin;
+ break;
+ }
+
+ // write path to the correct config entry
+ const char *str;
+ if (plugin != nil) {
+ str = [[plugin path] fileSystemRepresentation];
+ if (str == NULL) {
+ str = "Invalid Plugin";
+ }
+ } else {
+ str = "Invalid Plugin";
+ }
+
+ char **dst = [PcsxrPlugin configEntriesForType:type];
+ while (*dst) {
+ strlcpy(*dst, str, MAXPATHLEN);
+ dst++;
+ }
+
+ if (active) {
+ LoadPlugins();
+ OpenPlugins();
+
+ if (!wasPaused) {
+ [EmuThread resume];
+ }
+ }
+
+ return plugin != nil;
+}
+
+- (void)disableNetPlug
+{
+ char **dst = [PcsxrPlugin configEntriesForType:PSE_LT_NET];
+ while (*dst) {
+ strcpy(*dst, "Disabled");
+ dst++;
+ }
+}
+
+- (void)enableNetPlug
+{
+ PcsxrPlugin *netPlug = [self activePluginForType:PSE_LT_NET];
+
+ const char *str = NULL;
+ if (netPlug) {
+ str = [[netPlug path] fileSystemRepresentation];
+ }
+ if (str) {
+ char **dst = [PcsxrPlugin configEntriesForType:PSE_LT_NET];
+ while (*dst) {
+ strlcpy(*dst, str, MAXPATHLEN);
+ dst++;
+ }
+ }
+
+}
+
+@end