Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions Factories/QSBookmarkProviderFactory.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// QSBookmarkProviderFactory.h
// QSDeliciousPlugIn
//
// Factory for managing bookmark providers
//

#import "QSBookmarkProvider.h"
#import "SocialSite.h"
#import <Foundation/Foundation.h>

@interface QSBookmarkProviderFactory : NSObject

@property(nonatomic, strong, readonly)
NSArray<id<QSBookmarkProvider>> *providers;

+ (instancetype)sharedFactory;

/**
* Get the appropriate provider for the given site configuration
*/
- (id<QSBookmarkProvider>)providerForSite:(SocialSite)site
username:(NSString *)username
password:(NSString *)password
host:(NSString *)host;

/**
* Get all available providers
*/
- (NSArray<id<QSBookmarkProvider>> *)allProviders;

@end
70 changes: 70 additions & 0 deletions Factories/QSBookmarkProviderFactory.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
//
// QSBookmarkProviderFactory.m
// QSDeliciousPlugIn
//

#import "QSBookmarkProviderFactory.h"
#import "QSDeliciousAPIProvider.h"
#import "QSLinkdingProvider.h"
#import "SocialSite.h"

@interface QSBookmarkProviderFactory ()
@property(nonatomic, strong, readwrite)
NSArray<id<QSBookmarkProvider>> *providers;
@end

@implementation QSBookmarkProviderFactory

+ (instancetype)sharedFactory {
static QSBookmarkProviderFactory *sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}

- (instancetype)init {
self = [super init];
if (self) {
[self setupProviders];
}
return self;
}

- (void)setupProviders {
NSMutableArray *mutableProviders = [NSMutableArray array];

// Create Delicious / Pinboard API providers for each supported site
QSDeliciousAPIProvider *deliciousAPIProvider =
[[QSDeliciousAPIProvider alloc] init];

// Create Linkding provider
QSLinkdingProvider *linkdingProvider = [[QSLinkdingProvider alloc] init];

[mutableProviders addObject:deliciousAPIProvider];
[mutableProviders addObject:linkdingProvider];

self.providers = [mutableProviders copy];
}

- (id<QSBookmarkProvider>)providerForSite:(SocialSite)site
username:(NSString *)username
password:(NSString *)password
host:(NSString *)host {
for (id<QSBookmarkProvider> provider in self.providers) {
if ([provider canHandleSite:site
username:username
password:password
host:host]) {
return provider;
}
}
return nil;
}

- (NSArray<id<QSBookmarkProvider>> *)allProviders {
return self.providers;
}

@end
6 changes: 3 additions & 3 deletions Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>2.1.0</string>
<string>3.0.0</string>
<key>CFBundleVersion</key>
<string>131</string>
<string>150</string>
<key>NSPrincipalClass</key>
<string>QSDeliciousPlugIn</string>
<key>QSPlugIn</key>
Expand All @@ -42,7 +42,7 @@
</dict>
<key>QSObjectHandlers</key>
<dict>
<key>us.icio.del.tag</key>
<key>qs.tag.socialbookmark</key>
<string>QSDeliciousPlugIn_Source</string>
</dict>
<key>QSObjectSources</key>
Expand Down
45 changes: 45 additions & 0 deletions Protocols/QSBookmarkProvider.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
//
// QSBookmarkProvider.h
// QSDeliciousPlugIn
//
// Protocol for social bookmark providers
//

#import "SocialSite.h"
#import <Foundation/Foundation.h>

@class QSObject;

@protocol QSBookmarkProvider <NSObject>

@required
/**
* Check if this provider can handle the given site configuration
*/
- (BOOL)canHandleSite:(SocialSite)site
username:(NSString *)username
password:(NSString *)password
host:(NSString *)host;

/**
* Fetch bookmarks for the given configuration
* Returns an NSArray of QSObject instances
*/
- (NSArray *)fetchBookmarksForSite:(SocialSite)site
username:(NSString *)username
password:(NSString *)password
identifier:(NSString *)identifier
host:(NSString *)host
includeTags:(BOOL)includeTags;

@optional
/**
* Get bookmarks for a specific tag (used for child loading)
*/
- (NSArray *)fetchBookmarksForTag:(NSString *)tag
site:(SocialSite)site
username:(NSString *)username
password:(NSString *)password
host:(NSString *)host;

@end
30 changes: 30 additions & 0 deletions Providers/QSDeliciousAPIProvider.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//
// QSDeliciousAPIProvider.h
// QSDeliciousPlugIn
//
// Base provider for Pinboard v1 API (XML-based with Basic Auth)
// Used by Delicious, Magnolia, and Pinboard
//

#import "QSBookmarkProvider.h"
#import <Foundation/Foundation.h>

@interface QSDeliciousAPIProvider
: NSObject <QSBookmarkProvider, NSXMLParserDelegate>

@property(nonatomic, strong) NSMutableArray *posts;

- (NSString *)apiURLForSite:(SocialSite)site andHost:(NSString *)host;
- (NSURL *)requestURLForSite:(SocialSite)site
username:(NSString *)username
password:(NSString *)password
host:(NSString *)host;
- (NSData *)cachedBookmarkDataForSite:(SocialSite)site
username:(NSString *)username
host:(NSString *)host;
- (void)cacheBookmarkData:(NSData *)data
forSite:(SocialSite)site
username:(NSString *)username
host:(NSString *)host;

@end
Loading