summaryrefslogtreecommitdiff
path: root/QSDeliciousPlugIn_Source.m
diff options
context:
space:
mode:
authorjnj <jnj@57e2f9b5-c12c-0410-8e95-a1ee7272c91a>2008-11-13 18:59:12 +0000
committerjnj <jnj@57e2f9b5-c12c-0410-8e95-a1ee7272c91a>2008-11-13 18:59:12 +0000
commitba310e8b58d686ee9897b26a7edab5b778a8d96f (patch)
treef7b5feaf4151d88b2283ed657133737b378f7eba /QSDeliciousPlugIn_Source.m
Add remaining plugins
git-svn-id: https://blacktree-elements-public.googlecode.com/svn/trunk@41 57e2f9b5-c12c-0410-8e95-a1ee7272c91a
Diffstat (limited to 'QSDeliciousPlugIn_Source.m')
-rw-r--r--QSDeliciousPlugIn_Source.m235
1 files changed, 235 insertions, 0 deletions
diff --git a/QSDeliciousPlugIn_Source.m b/QSDeliciousPlugIn_Source.m
new file mode 100644
index 0000000..899b847
--- /dev/null
+++ b/QSDeliciousPlugIn_Source.m
@@ -0,0 +1,235 @@
+//
+// QSDeliciousPlugIn_Source.m
+// QSDeliciousPlugIn
+//
+// Created by Nicholas Jitkoff on 9/18/04.
+// Copyright __MyCompanyName__ 2004. All rights reserved.
+//
+
+#import "QSDeliciousPlugIn_Source.h"
+#import <QSCore/QSCore.h>
+
+#define DELICIOUS_API_URL @"api.del.icio.us/v1"
+#define MAGNOLIA_API_URL @"ma.gnolia.com/api/mirrord/v1"
+
+@implementation QSDeliciousPlugIn_Source
++ (void)initialize{
+ [self setKeys:[NSArray arrayWithObject:@"selection"] triggerChangeNotificationsForDependentKey:@"currentPassword"];
+}
+- (BOOL)indexIsValidFromDate:(NSDate *)indexDate forEntry:(NSDictionary *)theEntry{
+ return -[indexDate timeIntervalSinceNow] < 24*60*60;
+}
+
+- (BOOL)isVisibleSource{return YES;}
+
+- (NSImage *) iconForEntry:(NSDictionary *)dict{
+ return [[NSBundle bundleForClass:[self class]]imageNamed:@"bookmark_icon"];
+}
+
+- (NSString *)identifierForObject:(id <QSObject>)object{
+ return nil;
+}
+
+- (NSView *) settingsView{
+ if (![super settingsView]){
+ [NSBundle loadNibNamed:@"QSDeliciousPlugInSource" owner:self];
+ }
+ return [super settingsView];
+}
+
+- (NSData *)cachedBookmarkDataForUser:(NSString *)username{
+ NSString *cachePath=[QSApplicationSupportSubPath(@"Caches/del.icio.us/",NO) stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.xml",username]];
+ return [NSData dataWithContentsOfFile:cachePath];
+}
+- (NSString *)passwordForUser:(NSString *)username{
+ NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"http://%@@del.icio.us/",username]];
+ return [url keychainPassword];
+}
+- (NSData *)bookmarkDataForUser:(NSString *)username onSite:(int)isMagnolia{
+
+ NSString *password=[self passwordForUser:username];
+ if (VERBOSE)NSLog(@"Downloading del.icio.us bookmarks for %@ %d",username, isMagnolia);
+ //NSString *count=[[self currentEntry] objectForKey:@"QSDeliciousRecentCount"];
+
+ if (!username || !password) return nil;
+ //if (!count)count=@"50";
+
+
+ NSString *apiurl=isMagnolia?MAGNOLIA_API_URL:DELICIOUS_API_URL;
+
+ NSError *error;
+ NSURL *url=[NSURL URLWithString:
+ [NSString stringWithFormat:@"https://%@:%@@%@/posts/all?",username,password,apiurl]];
+
+ NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:url
+ cachePolicy:NSURLRequestUseProtocolCachePolicy
+ timeoutInterval:60.0];
+
+ [theRequest setValue:@"Quicksilver (Blacktree,MacOSX)" forHTTPHeaderField:@"User-Agent"];
+
+
+ // NSURLConnection *theConnection=[[[NSURLConnection alloc] initWithRequest:theRequest delegate:nil];
+
+ //NSLog(@"url %@",url);
+ NSData *data=[NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:&error];
+ NSString *cachePath=[QSApplicationSupportSubPath(@"Caches/del.icio.us/",YES) stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.xml",username]];
+ [data writeToFile:cachePath atomically:NO];
+ return data;
+}
+- (QSObject *)objectForPost:(NSDictionary *)post{
+ QSObject *newObject=[QSObject makeObjectWithIdentifier:[post objectForKey:@"hash"]];
+ [newObject setObject:[post objectForKey:@"href"] forType:QSURLType];
+ [newObject setName:[post objectForKey:@"description"]];
+ [newObject setDetails:[post objectForKey:@"extended"]];
+ [newObject setPrimaryType:QSURLType];
+ //NSDate *date=[NSCalendarDate dateWithString:[post objectForKey:@"time"]
+ // calendarFormat:@"%Y-%m-%dT%H:%M:%SZ"];
+ //[date setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
+ //[newObject setObject:date forMeta:kQSObjectCreationDate];
+ return newObject;
+}
+
+- (NSArray *) objectsForEntry:(NSDictionary *)theEntry{
+ NSString *username=[theEntry objectForKey:@"username"];
+ NSData *data=nil;//[self cachedBookmarkDataForUser:username];
+ if (![data length]) data=[self bookmarkDataForUser:username onSite:[[theEntry objectForKey:@"site"]intValue]];
+
+ //NSString *string=[[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]autorelease];
+ //NSLog(@"data %@",string);
+
+ NSXMLParser *postParser=[[NSXMLParser alloc]initWithData:data];
+
+ [postParser setDelegate:self];
+ posts=[NSMutableArray arrayWithCapacity:1];
+ [postParser parse];
+
+ NSMutableArray *objects=[NSMutableArray arrayWithCapacity:1];
+ QSObject *newObject;
+ NSEnumerator *e=[posts objectEnumerator];
+ NSDictionary *post;
+ NSMutableSet *tagSet=[NSMutableSet set];
+ while(post=[e nextObject]){
+ newObject=[self objectForPost:post];
+ [tagSet addObjectsFromArray:[[post objectForKey:@"tag"]componentsSeparatedByString:@" "]];
+ [objects addObject:newObject];
+ }
+ NSString *tag;
+ e=[tagSet objectEnumerator];
+
+ if ([[theEntry objectForKey:@"includeTags"]boolValue]){
+ while(tag=[e nextObject]){
+ newObject=[QSObject makeObjectWithIdentifier:[NSString stringWithFormat:@"[del.icio.us tag]:%@",tag]];
+ [newObject setObject:tag forType:kQSDeliciousTagType];
+ [newObject setObject:username forMeta:@"us.icio.del.username"];
+ [newObject setName:tag];
+ [newObject setPrimaryType:kQSDeliciousTagType];
+ [objects addObject:newObject];
+ }
+ }
+ [postParser release];
+
+ return objects;
+
+}
+
+- (NSArray *)objectsForTag:(NSString *)tag username:(NSString *)username{
+ NSData *data=[self cachedBookmarkDataForUser:username];
+
+ NSXMLParser *postParser=[[NSXMLParser alloc]initWithData:data];
+ [postParser setDelegate:self];
+ posts=[NSMutableArray arrayWithCapacity:1];
+ [postParser parse];
+
+ NSMutableArray *objects=[NSMutableArray arrayWithCapacity:1];
+ QSObject *newObject;
+ NSEnumerator *e=[posts objectEnumerator];
+ NSDictionary *post;
+ NSMutableSet *tagSet=[NSMutableSet set];
+ while(post=[e nextObject]){
+ if ([[post objectForKey:@"tag"]rangeOfString:tag].location==NSNotFound)continue;
+ newObject=[self objectForPost:post];
+ [objects addObject:newObject];
+ }
+ return objects;
+}
+
+// XML Stuff
+- (void)parser:(NSXMLParser*)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
+ // NSLog(@"started %@ %@ %@ %@",elementName,namespaceURI,qName,attributeDict);
+
+ if ([elementName isEqualToString:@"post"] && attributeDict)
+ [posts addObject:attributeDict];
+}
+
+- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
+ // NSLog(@"ended %@ %@ %@ %@",elementName,namespaceURI,qName);
+}
+
+
+
+
+
+
+
+// Object Handler Methods
+
+/*
+ - (void)setQuickIconForObject:(QSObject *)object{
+ [object setIcon:nil]; // An icon that is either already in memory or easy to load
+ }
+ - (BOOL)loadIconForObject:(QSObject *)object{
+ return NO;
+ id data=[object objectForType:QSDeliciousPlugInType];
+ [object setIcon:nil];
+ return YES;
+ }
+ */
+
+
+
+
+
+- (NSString *) mainNibName{
+ return @"QSDeliciousPrefPane";
+}
+
+- (void)populateFields{
+}
+- (NSString *)currentPassword{
+ NSString *account=[[self currentEntry] objectForKey:@"username"];
+ if (!account)return nil;
+ NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"http://%@@del.icio.us/",account]];
+ NSString *password=[url keychainPassword];
+ return password;
+}
+- (void)setCurrentPassword:(NSString *)newPassword{
+ NSString *account=[[self currentEntry] objectForKey:@"username"];
+ NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%@@del.icio.us/",account,newPassword]];
+ if ([newPassword length])
+ [url addPasswordToKeychain];
+
+}
+
+
+
+
+
+
+
+
+
+- (void)setQuickIconForObject:(QSObject *)object{
+ [object setIcon:[[NSBundle bundleForClass:[self class]]imageNamed:@"bookmark_icon"]];
+}
+- (BOOL)loadChildrenForObject:(QSObject *)object{
+ [object setChildren:
+ [self objectsForTag:[object objectForType:kQSDeliciousTagType]
+ username:[object objectForMeta:@"us.icio.del.username"]]];
+ return YES;
+}
+
+
+
+
+
+@end