From 91508f0dde824ccdaabbcec7a6365cc6cd209573 Mon Sep 17 00:00:00 2001 From: Michael Starke Date: Wed, 6 Dec 2017 20:02:22 +0100 Subject: [PATCH] changed plugin APIs for entryAcitonPlugins and customAttributePlugins. Internal housekeeping on MPPluginHost to allow for better access to certain plugins Still pending: menu action to plugin delegation --- MacPass/MPPlugin.h | 6 +++--- MacPass/MPPluginHost.h | 2 ++ MacPass/MPPluginHost.m | 35 +++++++++++++++++++++++++++++++++-- 3 files changed, 38 insertions(+), 5 deletions(-) diff --git a/MacPass/MPPlugin.h b/MacPass/MPPlugin.h index 3b290234..29d388f8 100644 --- a/MacPass/MPPlugin.h +++ b/MacPass/MPPlugin.h @@ -65,13 +65,13 @@ NS_ASSUME_NONNULL_BEGIN MacPass will call you back via -[MPPlugin performActionFroMenuItem:withEntries:] */ @protocol MPEntryActionPlugin -@optional -- (NSMenuItem * _Nullable)menuItemForEntry; +@required +- (NSArray *)menuItemsForEntries:(NSArray< KPKEntry *>*)entries; - (void)performActionForMenuItem:(NSMenuItem *)item withEntries:(NSArray *)entries; @end @protocol MPCustomAttributePlugin -@optional +@required /* Supply a list of attribute keys that will get suggested for autocompletion as well as added to the extend add for custom fields */ @property (nonatomic,copy) NSArray* attributeKeys; /* diff --git a/MacPass/MPPluginHost.h b/MacPass/MPPluginHost.h index ddc83374..fec0ca0c 100644 --- a/MacPass/MPPluginHost.h +++ b/MacPass/MPPluginHost.h @@ -30,6 +30,7 @@ FOUNDATION_EXPORT NSString *const MPPluginHostDidLoadPlugin; FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey; @class MPPlugin; +@class KPKEntry; @interface MPPluginHost : NSObject @@ -50,4 +51,5 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey; - (NSArray *)autotypePlugins; - (NSArray *)entryContextMenuPlugins; */ +- (NSArray *)menuItemsForEntries:(NSArray *)entries; @end diff --git a/MacPass/MPPluginHost.m b/MacPass/MPPluginHost.m index 5928596a..227fef21 100644 --- a/MacPass/MPPluginHost.m +++ b/MacPass/MPPluginHost.m @@ -40,6 +40,10 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun @interface MPPluginHost () @property (strong) NSMutableArray *mutablePlugins; +@property (strong) NSPointerArray *entryActionPlugins; +@property (strong) NSPointerArray *customAttributePlugins; + + @property (nonatomic) BOOL loadUnsecurePlugins; @property (copy) NSArray *disabledPlugins; @@ -70,6 +74,9 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun _mutablePlugins = [[NSMutableArray alloc] init]; _disabledPlugins = [[NSUserDefaults standardUserDefaults] arrayForKey:kMPSettingsKeyLoadUnsecurePlugins]; _loadUnsecurePlugins = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyLoadUnsecurePlugins]; + _entryActionPlugins = [NSPointerArray weakObjectsPointerArray]; + _customAttributePlugins = [NSPointerArray weakObjectsPointerArray]; + [self _loadPlugins]; [self bind:NSStringFromSelector(@selector(loadUnsecurePlugins)) @@ -205,7 +212,7 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun [[NSNotificationCenter defaultCenter] postNotificationName:MPPluginHostWillLoadPlugin object:self userInfo:@{ MPPluginHostPluginBundleIdentifiyerKey : plugin.identifier }]; - [self.mutablePlugins addObject:plugin]; + [self _addPlugin:plugin]; [[NSNotificationCenter defaultCenter] postNotificationName:MPPluginHostDidLoadPlugin object:self userInfo:@{ MPPluginHostPluginBundleIdentifiyerKey : plugin.identifier }]; @@ -222,7 +229,7 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun plugin.bundle = bundle; plugin.enabled = NO; plugin.errorMessage = errorMessage; - [self.mutablePlugins addObject:plugin]; + [self _addPlugin:plugin]; } - (BOOL)_validateUniqueBundle:(NSBundle *)bundle { @@ -286,4 +293,28 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun return NO; } +- (void)_addPlugin:(MPPlugin *)plugin { + [self.mutablePlugins addObject:plugin]; + if([plugin conformsToProtocol:@protocol(MPEntryActionPlugin)]) { + [self.entryActionPlugins addPointer:(__bridge void * _Nullable)(plugin)]; + } + if([plugin conformsToProtocol:@protocol(MPCustomAttributePlugin)]) { + [self.customAttributePlugins addPointer:(__bridge void * _Nullable)(plugin)]; + } +} + +#pragma mark Action Plugins + +- (NSArray *)menuItemsForEntries:(NSArray *)entries { + NSMutableArray *items = [[NSMutableArray alloc] init]; + for(id plugin in self.entryActionPlugins) { + if(plugin) { + [items addObjectsFromArray:[plugin menuItemsForEntries:entries]]; + } + } + return [items copy]; +} + + + @end