summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Info.plist2
-rw-r--r--QSDeliciousPlugIn.xcodeproj/project.pbxproj8
-rw-r--r--QSDeliciousPlugInSource.nib/classes.nib45
-rw-r--r--QSDeliciousPlugInSource.nib/designable.nib930
-rw-r--r--QSDeliciousPlugInSource.nib/info.nib16
-rw-r--r--QSDeliciousPlugInSource.nib/keyedobjects.nibbin7815 -> 9343 bytes
-rw-r--r--QSDeliciousPlugIn_Source.h4
-rw-r--r--QSDeliciousPlugIn_Source.m351
8 files changed, 1172 insertions, 184 deletions
diff --git a/Info.plist b/Info.plist
index dc1afde..239f99e 100644
--- a/Info.plist
+++ b/Info.plist
@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleVersion</key>
- <string>94</string>
+ <string>130</string>
<key>NSPrincipalClass</key>
<string>QSDeliciousPlugIn</string>
<key>QSPlugIn</key>
diff --git a/QSDeliciousPlugIn.xcodeproj/project.pbxproj b/QSDeliciousPlugIn.xcodeproj/project.pbxproj
index 03b9ea3..c6b5bd2 100644
--- a/QSDeliciousPlugIn.xcodeproj/project.pbxproj
+++ b/QSDeliciousPlugIn.xcodeproj/project.pbxproj
@@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
+ 28855EDF1207EA17003DC758 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28855EDE1207EA17003DC758 /* Security.framework */; };
7F8AD05107F2503600011548 /* QSDeliciousPlugInSource.nib in Resources */ = {isa = PBXBuildFile; fileRef = 7F8AD05007F2503600011548 /* QSDeliciousPlugInSource.nib */; };
7F9441A10803A9D9007EDC31 /* QSObjectSource.name.strings in Resources */ = {isa = PBXBuildFile; fileRef = 7F9441A00803A9D9007EDC31 /* QSObjectSource.name.strings */; };
7FB0DC1A0B91FF8600A5B6FF /* bookmark_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 7FB0DC190B91FF8600A5B6FF /* bookmark_icon.png */; };
@@ -30,11 +31,12 @@
14A6EB3E10CFFC79000B05B4 /* QSPlugIn_Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = QSPlugIn_Release.xcconfig; sourceTree = "<group>"; };
14A6EB3F10CFFC79000B05B4 /* QSPlugIn.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = QSPlugIn.xcconfig; sourceTree = "<group>"; };
14A6EB4010CFFC79000B05B4 /* Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = "<group>"; };
+ 28855EDE1207EA17003DC758 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
7F8AD05007F2503600011548 /* QSDeliciousPlugInSource.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = QSDeliciousPlugInSource.nib; sourceTree = "<group>"; };
7F9441A00803A9D9007EDC31 /* QSObjectSource.name.strings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; path = QSObjectSource.name.strings; sourceTree = "<group>"; };
7FB0DC190B91FF8600A5B6FF /* bookmark_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bookmark_icon.png; sourceTree = "<group>"; };
- 7FB0DC2D0B91FFC500A5B6FF /* QSCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = QSCore.framework; sourceTree = "<group>"; };
- 7FB0DC2E0B91FFC600A5B6FF /* QSFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = QSFoundation.framework; sourceTree = "<group>"; };
+ 7FB0DC2D0B91FFC500A5B6FF /* QSCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QSCore.framework; path = /Applications/Quicksilver.app/Contents/Frameworks/QSCore.framework; sourceTree = "<absolute>"; };
+ 7FB0DC2E0B91FFC600A5B6FF /* QSFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QSFoundation.framework; path = /Applications/Quicksilver.app/Contents/Frameworks/QSFoundation.framework; sourceTree = "<absolute>"; };
8D1AC9730486D14A00FE50C9 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
8D1AC9740486D14A00FE50C9 /* Social Bookmarks.qsplugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Social Bookmarks.qsplugin"; sourceTree = BUILT_PRODUCTS_DIR; };
DD92D38A0106425D02CA0E72 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
@@ -55,6 +57,7 @@
E182BE5B06FC9C46007BF2C2 /* PreferencePanes.framework in Frameworks */,
7FB0DC2F0B91FFC600A5B6FF /* QSCore.framework in Frameworks */,
7FB0DC300B91FFC600A5B6FF /* QSFoundation.framework in Frameworks */,
+ 28855EDF1207EA17003DC758 /* Security.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -114,6 +117,7 @@
7FB0DC2E0B91FFC600A5B6FF /* QSFoundation.framework */,
E182BE5A06FC9C46007BF2C2 /* PreferencePanes.framework */,
DD92D38A0106425D02CA0E72 /* Cocoa.framework */,
+ 28855EDE1207EA17003DC758 /* Security.framework */,
);
name = Frameworks;
sourceTree = "<group>";
diff --git a/QSDeliciousPlugInSource.nib/classes.nib b/QSDeliciousPlugInSource.nib/classes.nib
deleted file mode 100644
index 9ea8de6..0000000
--- a/QSDeliciousPlugInSource.nib/classes.nib
+++ /dev/null
@@ -1,45 +0,0 @@
-{
- IBClasses = (
- {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
- {CLASS = NSObject; LANGUAGE = ObjC; },
- {
- CLASS = NSPreferencePane;
- LANGUAGE = ObjC;
- OUTLETS = {
- "_firstKeyView" = NSView;
- "_initialKeyView" = NSView;
- "_lastKeyView" = NSView;
- "_window" = NSWindow;
- };
- SUPERCLASS = NSObject;
- },
- {
- CLASS = QSAllApplicationsObjectSource;
- LANGUAGE = ObjC;
- SUPERCLASS = QSObjectSource;
- },
- {
- ACTIONS = {savePassword = id; };
- CLASS = "QSDeliciousPlugIn_Source";
- LANGUAGE = ObjC;
- OUTLETS = {passField = NSTextField; userField = NSTextField; };
- SUPERCLASS = QSObjectSource;
- },
- {
- ACTIONS = {savePassword = id; };
- CLASS = QSDeliciousPrefPane;
- LANGUAGE = ObjC;
- OUTLETS = {passField = NSTextField; userField = NSTextField; };
- SUPERCLASS = NSPreferencePane;
- },
- {CLASS = QSGroupObjectSource; LANGUAGE = ObjC; SUPERCLASS = QSObjectSource; },
- {
- CLASS = QSObjectSource;
- LANGUAGE = ObjC;
- OUTLETS = {settingsView = NSView; };
- SUPERCLASS = NSObject;
- },
- {CLASS = QSVolumesObjectSource; LANGUAGE = ObjC; SUPERCLASS = QSObjectSource; }
- );
- IBVersion = 1;
-} \ No newline at end of file
diff --git a/QSDeliciousPlugInSource.nib/designable.nib b/QSDeliciousPlugInSource.nib/designable.nib
new file mode 100644
index 0000000..030965a
--- /dev/null
+++ b/QSDeliciousPlugInSource.nib/designable.nib
@@ -0,0 +1,930 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10">
+ <data>
+ <int key="IBDocument.SystemTarget">1060</int>
+ <string key="IBDocument.SystemVersion">10F569</string>
+ <string key="IBDocument.InterfaceBuilderVersion">762</string>
+ <string key="IBDocument.AppKitVersion">1038.29</string>
+ <string key="IBDocument.HIToolboxVersion">461.00</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="6"/>
+ </object>
+ <reference key="IBDocument.PluginDependencies" ref="0"/>
+ <object class="NSMutableDictionary" key="IBDocument.Metadata">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="791608857">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="755236013">
+ <string key="NSClassName">QSDeliciousPlugIn_Source</string>
+ </object>
+ <object class="NSCustomObject" id="949435413">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1037187928">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="523381760">
+ <int key="NSWindowStyleMask">15</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{62, 510}, {270, 151}}</string>
+ <int key="NSWTFlags">1886912512</int>
+ <object class="NSMutableString" key="NSWindowTitle">
+ <characters key="NS.bytes">Window</characters>
+ </object>
+ <string key="NSWindowClass">NSWindow</string>
+ <object class="NSMutableString" key="NSViewClass">
+ <characters key="NS.bytes">View</characters>
+ </object>
+ <string key="NSWindowContentMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ <string key="NSWindowContentMinSize">{213, 107}</string>
+ <object class="NSView" key="NSWindowView" id="246154705">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="220887054">
+ <reference key="NSNextResponder" ref="246154705"/>
+ <int key="NSvFlags">266</int>
+ <string key="NSFrame">{{89, 85}, {150, 19}}</string>
+ <reference key="NSSuperview" ref="246154705"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="388661522">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">4326400</int>
+ <string key="NSContents"/>
+ <object class="NSFont" key="NSSupport" id="26">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">11</double>
+ <int key="NSfFlags">3100</int>
+ </object>
+ <reference key="NSControlView" ref="220887054"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor" id="251902835">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textBackgroundColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="941678540">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textColor</string>
+ <object class="NSColor" key="NSColor" id="697840755">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="487755233">
+ <reference key="NSNextResponder" ref="246154705"/>
+ <int key="NSvFlags">264</int>
+ <string key="NSFrame">{{6, 88}, {78, 14}}</string>
+ <reference key="NSSuperview" ref="246154705"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="837401498">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">71434240</int>
+ <string key="NSContents">Name:</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="487755233"/>
+ <object class="NSColor" key="NSBackgroundColor" id="685423289">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="690248854">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <reference key="NSColor" ref="697840755"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="697429448">
+ <reference key="NSNextResponder" ref="246154705"/>
+ <int key="NSvFlags">264</int>
+ <string key="NSFrame">{{6, 61}, {78, 14}}</string>
+ <reference key="NSSuperview" ref="246154705"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="314007513">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">71434240</int>
+ <string key="NSContents">Password:</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="697429448"/>
+ <reference key="NSBackgroundColor" ref="685423289"/>
+ <reference key="NSTextColor" ref="690248854"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="932260227">
+ <reference key="NSNextResponder" ref="246154705"/>
+ <int key="NSvFlags">266</int>
+ <string key="NSFrame">{{89, 58}, {150, 19}}</string>
+ <reference key="NSSuperview" ref="246154705"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="574259110">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">4326400</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="932260227"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="251902835"/>
+ <reference key="NSTextColor" ref="941678540"/>
+ </object>
+ </object>
+ <object class="NSButton" id="1030464026">
+ <reference key="NSNextResponder" ref="246154705"/>
+ <int key="NSvFlags">264</int>
+ <string key="NSFrame">{{86, 34}, {87, 18}}</string>
+ <reference key="NSSuperview" ref="246154705"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="11812574">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">131072</int>
+ <string key="NSContents">Include tags</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="1030464026"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">2</int>
+ <object class="NSButtonImageSource" key="NSAlternateImage">
+ <string key="NSImageName">NSSwitch</string>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSPopUpButton" id="583724646">
+ <reference key="NSNextResponder" ref="246154705"/>
+ <int key="NSvFlags">264</int>
+ <string key="NSFrame">{{86, 113}, {126, 26}}</string>
+ <reference key="NSSuperview" ref="246154705"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSPopUpButtonCell" key="NSCell" id="986910851">
+ <int key="NSCellFlags">-2076049856</int>
+ <int key="NSCellFlags2">2048</int>
+ <object class="NSFont" key="NSSupport">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="583724646"/>
+ <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags2">1</int>
+ <object class="NSFont" key="NSAlternateImage">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">13</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSAlternateContents"/>
+ <object class="NSMutableString" key="NSKeyEquivalent">
+ <characters key="NS.bytes"/>
+ </object>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ <object class="NSMenuItem" key="NSMenuItem" id="842183426">
+ <reference key="NSMenu" ref="396821977"/>
+ <string key="NSTitle">del.icio.us</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <int key="NSState">1</int>
+ <object class="NSCustomResource" key="NSOnImage" id="596243717">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuCheckmark</string>
+ </object>
+ <object class="NSCustomResource" key="NSMixedImage" id="117193000">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuMixedState</string>
+ </object>
+ <string key="NSAction">_popUpItemAction:</string>
+ <reference key="NSTarget" ref="986910851"/>
+ </object>
+ <bool key="NSMenuItemRespectAlignment">YES</bool>
+ <object class="NSMenu" key="NSMenu" id="396821977">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">OtherViews</characters>
+ </object>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="842183426"/>
+ <object class="NSMenuItem" id="174640103">
+ <reference key="NSMenu" ref="396821977"/>
+ <string key="NSTitle">ma.gnolia</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="596243717"/>
+ <reference key="NSMixedImage" ref="117193000"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">1</int>
+ <reference key="NSTarget" ref="986910851"/>
+ </object>
+ <object class="NSMenuItem" id="257964281">
+ <reference key="NSMenu" ref="396821977"/>
+ <string key="NSTitle">pinboard.in</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="596243717"/>
+ <reference key="NSMixedImage" ref="117193000"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">2</int>
+ <reference key="NSTarget" ref="986910851"/>
+ </object>
+ </object>
+ </object>
+ <int key="NSPreferredEdge">3</int>
+ <bool key="NSUsesItemFromMenu">YES</bool>
+ <bool key="NSAltersState">YES</bool>
+ <int key="NSArrowPosition">1</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="397416172">
+ <reference key="NSNextResponder" ref="246154705"/>
+ <int key="NSvFlags">264</int>
+ <string key="NSFrame">{{6, 119}, {78, 14}}</string>
+ <reference key="NSSuperview" ref="246154705"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="816301873">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">71434240</int>
+ <string key="NSContents">Site:</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="397416172"/>
+ <reference key="NSBackgroundColor" ref="685423289"/>
+ <reference key="NSTextColor" ref="690248854"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{270, 151}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1024, 746}}</string>
+ <string key="NSMinSize">{213, 129}</string>
+ <string key="NSMaxSize">{1.79769e+308, 1.79769e+308}</string>
+ </object>
+ <object class="NSObjectController" id="1002997712">
+ <object class="NSMutableArray" key="NSDeclaredKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>username</string>
+ <string>includeTags</string>
+ <string>site</string>
+ </object>
+ <bool key="NSEditable">YES</bool>
+ <object class="_NSManagedProxy" key="_NSManagedProxy"/>
+ </object>
+ </object>
+ <object class="IBObjectContainer" key="IBDocument.Objects">
+ <object class="NSMutableArray" key="connectionRecords">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">nextKeyView</string>
+ <reference key="source" ref="220887054"/>
+ <reference key="destination" ref="932260227"/>
+ </object>
+ <int key="connectionID">56</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">nextKeyView</string>
+ <reference key="source" ref="932260227"/>
+ <reference key="destination" ref="220887054"/>
+ </object>
+ <int key="connectionID">57</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">userField</string>
+ <reference key="source" ref="755236013"/>
+ <reference key="destination" ref="220887054"/>
+ </object>
+ <int key="connectionID">65</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">passField</string>
+ <reference key="source" ref="755236013"/>
+ <reference key="destination" ref="932260227"/>
+ </object>
+ <int key="connectionID">66</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">settingsView</string>
+ <reference key="source" ref="755236013"/>
+ <reference key="destination" ref="246154705"/>
+ </object>
+ <int key="connectionID">69</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: selection.username</string>
+ <reference key="source" ref="220887054"/>
+ <reference key="destination" ref="1002997712"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="220887054"/>
+ <reference key="NSDestination" ref="1002997712"/>
+ <string key="NSLabel">value: selection.username</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">selection.username</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">82</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: selection.includeTags</string>
+ <reference key="source" ref="1030464026"/>
+ <reference key="destination" ref="1002997712"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="1030464026"/>
+ <reference key="NSDestination" ref="1002997712"/>
+ <string key="NSLabel">value: selection.includeTags</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">selection.includeTags</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">84</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">value: currentPassword</string>
+ <reference key="source" ref="932260227"/>
+ <reference key="destination" ref="755236013"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="932260227"/>
+ <reference key="NSDestination" ref="755236013"/>
+ <string key="NSLabel">value: currentPassword</string>
+ <string key="NSBinding">value</string>
+ <string key="NSKeyPath">currentPassword</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">85</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">contentObject: selection.info</string>
+ <reference key="source" ref="1002997712"/>
+ <reference key="destination" ref="755236013"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="1002997712"/>
+ <reference key="NSDestination" ref="755236013"/>
+ <string key="NSLabel">contentObject: selection.info</string>
+ <string key="NSBinding">contentObject</string>
+ <string key="NSKeyPath">selection.info</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">91</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBBindingConnection" key="connection">
+ <string key="label">selectedTag: selection.site</string>
+ <reference key="source" ref="583724646"/>
+ <reference key="destination" ref="1002997712"/>
+ <object class="NSNibBindingConnector" key="connector">
+ <reference key="NSSource" ref="583724646"/>
+ <reference key="NSDestination" ref="1002997712"/>
+ <string key="NSLabel">selectedTag: selection.site</string>
+ <string key="NSBinding">selectedTag</string>
+ <string key="NSKeyPath">selection.site</string>
+ <int key="NSNibBindingConnectorVersion">2</int>
+ </object>
+ </object>
+ <int key="connectionID">98</int>
+ </object>
+ </object>
+ <object class="IBMutableOrderedSet" key="objectRecords">
+ <object class="NSArray" key="orderedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBObjectRecord">
+ <int key="objectID">0</int>
+ <reference key="object" ref="0"/>
+ <reference key="children" ref="791608857"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="755236013"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">File's Owner</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="949435413"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="523381760"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="246154705"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Window</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">6</int>
+ <reference key="object" ref="246154705"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="220887054"/>
+ <reference ref="487755233"/>
+ <reference ref="697429448"/>
+ <reference ref="932260227"/>
+ <reference ref="1030464026"/>
+ <reference ref="583724646"/>
+ <reference ref="397416172"/>
+ </object>
+ <reference key="parent" ref="523381760"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">50</int>
+ <reference key="object" ref="220887054"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="388661522"/>
+ </object>
+ <reference key="parent" ref="246154705"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">51</int>
+ <reference key="object" ref="487755233"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="837401498"/>
+ </object>
+ <reference key="parent" ref="246154705"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">52</int>
+ <reference key="object" ref="697429448"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="314007513"/>
+ </object>
+ <reference key="parent" ref="246154705"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">53</int>
+ <reference key="object" ref="932260227"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="574259110"/>
+ </object>
+ <reference key="parent" ref="246154705"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">70</int>
+ <reference key="object" ref="1030464026"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="11812574"/>
+ </object>
+ <reference key="parent" ref="246154705"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">92</int>
+ <reference key="object" ref="583724646"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="986910851"/>
+ </object>
+ <reference key="parent" ref="246154705"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">99</int>
+ <reference key="object" ref="397416172"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="816301873"/>
+ </object>
+ <reference key="parent" ref="246154705"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">75</int>
+ <reference key="object" ref="1002997712"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Settings</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">101</int>
+ <reference key="object" ref="388661522"/>
+ <reference key="parent" ref="220887054"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">102</int>
+ <reference key="object" ref="837401498"/>
+ <reference key="parent" ref="487755233"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">103</int>
+ <reference key="object" ref="314007513"/>
+ <reference key="parent" ref="697429448"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">104</int>
+ <reference key="object" ref="574259110"/>
+ <reference key="parent" ref="932260227"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">105</int>
+ <reference key="object" ref="11812574"/>
+ <reference key="parent" ref="1030464026"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">106</int>
+ <reference key="object" ref="986910851"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="396821977"/>
+ </object>
+ <reference key="parent" ref="583724646"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">107</int>
+ <reference key="object" ref="816301873"/>
+ <reference key="parent" ref="397416172"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">93</int>
+ <reference key="object" ref="396821977"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="174640103"/>
+ <reference ref="842183426"/>
+ <reference ref="257964281"/>
+ </object>
+ <reference key="parent" ref="986910851"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">95</int>
+ <reference key="object" ref="174640103"/>
+ <reference key="parent" ref="396821977"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">94</int>
+ <reference key="object" ref="842183426"/>
+ <reference key="parent" ref="396821977"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1037187928"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">108</int>
+ <reference key="object" ref="257964281"/>
+ <reference key="parent" ref="396821977"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>108.ImportedFromIB2</string>
+ <string>5.IBEditorWindowLastContentRect</string>
+ <string>5.IBWindowTemplateEditedContentRect</string>
+ <string>5.ImportedFromIB2</string>
+ <string>5.windowTemplate.hasMinSize</string>
+ <string>5.windowTemplate.minSize</string>
+ <string>50.ImportedFromIB2</string>
+ <string>51.ImportedFromIB2</string>
+ <string>52.ImportedFromIB2</string>
+ <string>53.CustomClassName</string>
+ <string>53.ImportedFromIB2</string>
+ <string>6.ImportedFromIB2</string>
+ <string>70.ImportedFromIB2</string>
+ <string>75.ImportedFromIB2</string>
+ <string>92.ImportedFromIB2</string>
+ <string>93.IBEditorWindowLastContentRect</string>
+ <string>93.ImportedFromIB2</string>
+ <string>94.ImportedFromIB2</string>
+ <string>95.ImportedFromIB2</string>
+ <string>99.ImportedFromIB2</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <boolean value="YES"/>
+ <string>{{0, 994}, {270, 151}}</string>
+ <string>{{0, 994}, {270, 151}}</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>{213, 107}</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>NSSecureTextField</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <string>{{75, 1070}, {145, 63}}</string>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ <boolean value="YES"/>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="activeLocalization"/>
+ <object class="NSMutableDictionary" key="localizations">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference key="dict.sortedKeys" ref="0"/>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">108</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">FirstResponder</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">QSDeliciousPlugIn_Source</string>
+ <string key="superclassName">QSObjectSource</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>passField</string>
+ <string>userField</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSTextField</string>
+ <string>NSTextField</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">QSDeliciousPlugIn_Source.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">QSDeliciousPlugIn_Source</string>
+ <string key="superclassName">QSObjectSource</string>
+ <object class="NSMutableDictionary" key="actions">
+ <string key="NS.key.0">savePassword:</string>
+ <string key="NS.object.0">id</string>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">QSObjectSource</string>
+ <string key="superclassName">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableArray" key="referencedPartialClassDescriptionsV3.2+">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSApplication</string>
+ <object class="NSMutableDictionary" key="actions">
+ <string key="NS.key.0">relaunch:</string>
+ <string key="NS.object.0">id</string>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSFoundation.framework/Headers/NSApplication_BLTRExtensions.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/QSIconLoader.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/QSObject.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="662394336">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/QSObjectSource.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/QSObject_FileHandling.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/QSPlugIn.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/QSProxyObject.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/QSRegistry.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/QSTask.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/QSTriggerCenter.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/QSURLDownloadWrapper.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/UKFileWatcher.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/UKKQueue.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSCore.framework/Headers/UKMainThreadProxy.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSFoundation.framework/Headers/NDHotKeyEvent.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSFoundation.framework/Headers/NSArray_BLTRExtensions.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSFoundation.framework/Headers/NSObject+BLTRExtensions.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSFoundation.framework/Headers/NSObject+ReaperExtensions.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSView</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSFoundation.framework/Headers/NSView_BLTRExtensions.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSWindow</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBFrameworkSource</string>
+ <string key="minorKey">QSFoundation.framework/Headers/NSWindow_BLTRExtensions.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">QSObjectSource</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">settingsView</string>
+ <string key="NS.object.0">NSView</string>
+ </object>
+ <reference key="sourceIdentifier" ref="662394336"/>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1060" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencyDefaults">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.macosx</string>
+ <integer value="1060" key="NS.object.0"/>
+ </object>
+ <object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDevelopmentDependencies">
+ <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3</string>
+ <integer value="3000" key="NS.object.0"/>
+ </object>
+ <bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+ <nil key="IBDocument.LastKnownRelativeProjectPath"/>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ <object class="NSMutableDictionary" key="IBDocument.LastKnownImageSizes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSMenuCheckmark</string>
+ <string>NSMenuMixedState</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>{9, 8}</string>
+ <string>{7, 2}</string>
+ </object>
+ </object>
+ </data>
+</archive>
diff --git a/QSDeliciousPlugInSource.nib/info.nib b/QSDeliciousPlugInSource.nib/info.nib
deleted file mode 100644
index 06fc562..0000000
--- a/QSDeliciousPlugInSource.nib/info.nib
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>IBDocumentLocation</key>
- <string>365 116 356 240 0 0 1024 746 </string>
- <key>IBFramework Version</key>
- <string>446.1</string>
- <key>IBOpenObjects</key>
- <array>
- <integer>5</integer>
- </array>
- <key>IBSystem Version</key>
- <string>8J135</string>
-</dict>
-</plist>
diff --git a/QSDeliciousPlugInSource.nib/keyedobjects.nib b/QSDeliciousPlugInSource.nib/keyedobjects.nib
index 6ef063b..a794dc2 100644
--- a/QSDeliciousPlugInSource.nib/keyedobjects.nib
+++ b/QSDeliciousPlugInSource.nib/keyedobjects.nib
Binary files differ
diff --git a/QSDeliciousPlugIn_Source.h b/QSDeliciousPlugIn_Source.h
index 5ddd9d2..89729de 100644
--- a/QSDeliciousPlugIn_Source.h
+++ b/QSDeliciousPlugIn_Source.h
@@ -9,7 +9,7 @@
#import "QSDeliciousPlugIn_Source.h"
-@interface QSDeliciousPlugIn_Source : QSObjectSource{
+@interface QSDeliciousPlugIn_Source : QSObjectSource <NSXMLParserDelegate> {
NSMutableArray *posts;
NSMutableArray *tags;
NSMutableArray *dates;
@@ -18,7 +18,5 @@
IBOutlet NSTextField *passField;
}
-- (IBAction)savePassword:(id)sender;
-
@end
diff --git a/QSDeliciousPlugIn_Source.m b/QSDeliciousPlugIn_Source.m
index 1267654..a2d6494 100644
--- a/QSDeliciousPlugIn_Source.m
+++ b/QSDeliciousPlugIn_Source.m
@@ -9,75 +9,237 @@
#import "QSDeliciousPlugIn_Source.h"
#import <QSCore/QSCore.h>
-#define kQSDeliciousTagType @"us.icio.del.tag"
-#define DELICIOUS_API_URL @"api.del.icio.us/v1"
-#define MAGNOLIA_API_URL @"ma.gnolia.com/api/mirrord/v1"
+#import <Security/Security.h>
@implementation QSDeliciousPlugIn_Source
-+ (void)initialize{
+
++ (void)initialize {
[self setKeys:[NSArray arrayWithObject:@"selection"] triggerChangeNotificationsForDependentKey:@"currentPassword"];
}
-- (BOOL)indexIsValidFromDate:(NSDate *)indexDate forEntry:(NSDictionary *)theEntry{
- return -[indexDate timeIntervalSinceNow] < 24*60*60;
+
+- (BOOL)indexIsValidFromDate:(NSDate *)indexDate forEntry:(NSDictionary *)theEntry {
+ return -[indexDate timeIntervalSinceNow] < 24 * 60 * 60;
}
-- (BOOL)isVisibleSource{return YES;}
+- (BOOL)isVisibleSource{ return YES; }
-- (NSImage *) iconForEntry:(NSDictionary *)dict{
+- (NSImage *) iconForEntry:(NSDictionary *)dict {
return [[NSBundle bundleForClass:[self class]]imageNamed:@"bookmark_icon"];
}
-- (NSString *)identifierForObject:(id <QSObject>)object{
- return nil;
+- (NSString *) mainNibName {
+ return @"QSDeliciousPrefPane";
}
-- (NSView *) settingsView{
- if (![super settingsView]){
+- (void)populateFields {
+ NSLog(@"populating: %@/%@", [[selection info] objectForKey:@"username"], [[selection info] objectForKey:@"site"]);
+}
+
+- (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];
+// Keychain Access -- The QS Built-in ones seems to be broken
+
+- (SecProtocolType)protocolTypeForString:(NSString *)protocol {
+ if ([protocol isEqualToString:@"ftp"]) return kSecProtocolTypeFTP;
+ else if ([protocol isEqualToString:@"http"]) return kSecProtocolTypeHTTP;
+ else if ([protocol isEqualToString:@"sftp"]) return kSecProtocolTypeFTPS;
+ else if ([protocol isEqualToString:@"eppc"]) return kSecProtocolTypeEPPC;
+ else if ([protocol isEqualToString:@"afp"]) return kSecProtocolTypeAFP;
+ else if ([protocol isEqualToString:@"smb"]) return kSecProtocolTypeSMB;
+ else if ([protocol isEqualToString:@"ssh"]) return kSecProtocolTypeSSH;
+ else if ([protocol isEqualToString:@"telnet"]) return kSecProtocolTypeTelnet;
+ return 0;
}
-- (NSString *)passwordForUser:(NSString *)username{
- NSURL *url=[NSURL URLWithString:[NSString stringWithFormat:@"http://%@@del.icio.us/",username]];
- return [url keychainPassword];
+
+- (NSString *)passwordForHost:(NSString *)host user:(NSString *)user andType:(SecProtocolType)type {
+ const char *buffer;
+ UInt32 length = 0;
+ OSErr err;
+
+ err = SecKeychainFindInternetPassword(NULL,
+ [host length], [host UTF8String],
+ 0,
+ NULL,
+ [user length], [user UTF8String],
+ 0, NULL,
+ 0,
+ type,
+ 0,
+ &length, (void**)&buffer,
+ NULL);
+
+ if (err == noErr) {
+ NSString *password = [[[NSString alloc] initWithCString:buffer length:length] autorelease];
+ SecKeychainItemFreeContent(NULL,(void *)buffer);
+ return password;
+ }
+ return nil;
}
-- (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"];
+- (NSString *)passwordForHost:(NSString *)host user:(NSString *)user andScheme:(NSString *)scheme {
+ NSString *password = nil;
+
+ SecProtocolType type = [self protocolTypeForString:scheme];
+
+ password = [self passwordForHost:host user:user andType:type];
- if (!username || !password) return nil;
- //if (!count)count=@"50";
+ if (!password && type == kSecProtocolTypeFTP)
+ password = [self passwordForHost:host user:user andType:kSecProtocolTypeFTPAccount]; // Workaround for Transmit's old type usage
+ if ( !password )
+ password = [self passwordForHost:host user:user andType:0];
+ if ( !password )
+ NSLog(@"Couldn't find password. URL:%@ %@ %@", host, user,scheme );
+ return password;
+}
+
+- (NSString *)keychainPasswordForURL:(NSURL *)url {
+ return [self passwordForHost:[url host] user:[url user] andScheme:[url scheme]];
+}
-
- NSString *apiurl=isMagnolia?MAGNOLIA_API_URL:DELICIOUS_API_URL;
+- (OSErr)addURLPasswordToKeychain:(NSURL *)url {
+ OSErr err;
- NSError *error;
- NSURL *url=[NSURL URLWithString:
- [NSString stringWithFormat:@"https://%@:%@@%@/posts/all?",username,password,apiurl]];
+ NSString *host = [url host];
+ NSString *user = [url user];
+ NSString *pass = [url password];
- NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:url
- cachePolicy:NSURLRequestUseProtocolCachePolicy
- timeoutInterval:60.0];
+ SecProtocolType type = [self protocolTypeForString:[url scheme]];
- [theRequest setValue:@"Quicksilver (Blacktree,MacOSX)" forHTTPHeaderField:@"User-Agent"];
+ SecKeychainItemRef existing = NULL;
+
+ err = SecKeychainFindInternetPassword(NULL,
+ [host length], [host UTF8String],
+ 0, NULL,
+ [user length], [user UTF8String],
+ 0, NULL,
+ 0,
+ type,
+ 0,
+ NULL,NULL,
+ &existing);
+
+ if ( !err ) {
+ err = SecKeychainItemModifyContent( existing, NULL, [pass length], [pass UTF8String] );
+ CFRelease( existing );
+ } else {
+ err = SecKeychainAddInternetPassword(NULL,
+ [host length], [host UTF8String],
+ 0, NULL,
+ [user length], [user UTF8String],
+ 0, NULL,
+ 0,
+ type,
+ 0,
+ [pass length], [pass UTF8String],
+ NULL);
+ }
+
+ return err;
+}
+
+// Site Index/API/URL
+
+- (int)siteIndex {
+ return [[selection info] objectForKey:@"site"] != nil ? [[[selection info] objectForKey:@"site"] integerValue] : 0;
+}
+
+- (NSString *)siteURLForIndex:(int)siteIndex {
+ if (siteIndex == 0) return @"del.icio.us";
+ else if (siteIndex == 1) return @"ma.gnolia.com";
+ else if (siteIndex == 2) return @"pinboard.in";
+ else return nil;
+}
+
+- (NSString *)reversedSiteURLForIndex:(int)siteIndex {
+ if (siteIndex == 0) return @"us.icio.del";
+ else if (siteIndex == 1) return @"com.gnolia.ma";
+ else if (siteIndex == 2) return @"in.pinboard";
+ else return nil;
+}
+
+- (NSString *)tagURLForIndex:(int)siteIndex {
+ return [NSString stringWithFormat:@"%2.%2", [self reversedSiteURLForIndex:[self siteIndex]], @"tag"];
+}
+
+- (NSString *)apiURLForIndex:(int)siteIndex {
+ if (siteIndex == 0) return @"api.del.icio.us/v1";
+ else if (siteIndex == 1) return @"ma.gnolia.com/api/mirrord/v1";
+ else if (siteIndex == 2) return @"api.pinboard.in/v1";
+ else return nil;
+}
+
+// Current Site/API URL
+
+- (NSString *)currentSiteURL {
+ return [self siteURLForIndex:[self siteIndex]];
+}
+
+- (NSString *)currentAPIURL {
+ return [self apiURLForIndex:[self siteIndex]];
+}
+
+// Useranme
+
+- (NSString *)currentUsername {
+ return [[selection info] objectForKey:@"username"];
+}
+
+// Password Related
+
+- (NSString *)currentPassword {
+ NSString *account = [self currentUsername];
+ if (!account) return nil;
+ NSURL *keychainURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@@%@/", account, [self currentSiteURL]]];
+ NSString *password = [self keychainPasswordForURL:keychainURL];
+
+ return password;
+}
+
+- (void)setCurrentPassword:(NSString *)newPassword {
+ NSString *account = [self currentUsername];
+ if (!account) return;
+ if ([newPassword length] <= 0) return;
- // NSURLConnection *theConnection=[[[NSURLConnection alloc] initWithRequest:theRequest delegate:nil];
+ NSURL *keychainURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%@@%@/", account, newPassword, [self currentSiteURL]]];
- //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]];
+ [self addURLPasswordToKeychain:keychainURL];
+}
+
+// Bookarmk/Caching
+
+- (NSData *)cachedBookmarkData {
+ NSString *cachePath=[QSApplicationSupportSubPath([NSString stringWithFormat:@"Caches/%@/", [self currentSiteURL]], NO) stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.xml", [self currentUsername]]];
+ return [NSData dataWithContentsOfFile:cachePath];
+}
+
+- (NSData *)bookmarkData {
+ if (![self currentUsername] || ![self currentPassword]) return nil;
+
+ NSString *urlString = [NSString stringWithFormat:@"https://%@:%@@%@/posts/all?", [self currentUsername], [self currentPassword], [self currentAPIURL]];
+ NSURL *requestURL = [NSURL URLWithString:urlString];
+
+ NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:requestURL
+ cachePolicy:NSURLRequestUseProtocolCachePolicy
+ timeoutInterval:60.0];
+ [theRequest setHTTPMethod:@"POST"];
+ [theRequest setValue:@"text/xml" forHTTPHeaderField:@"Content-type"];
+ [theRequest setValue:@"Quicksilver (Blacktree,MacOSX)" forHTTPHeaderField:@"User-Agent"];
+
+ NSError *error;
+ NSData *data = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:&error];
+
+ NSString *cachePath = [QSApplicationSupportSubPath([NSString stringWithFormat:@"Caches/%@/", [self currentSiteURL]], YES) stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.xml", [self currentUsername]]];
[data writeToFile:cachePath atomically:NO];
+
return data;
}
-- (QSObject *)objectForPost:(NSDictionary *)post{
+
+- (QSObject *)objectForPost:(NSDictionary *)post {
QSObject *newObject=[QSObject makeObjectWithIdentifier:[post objectForKey:@"hash"]];
[newObject setObject:[post objectForKey:@"href"] forType:QSURLType];
[newObject setName:[post objectForKey:@"description"]];
@@ -90,18 +252,15 @@
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]];
+- (NSArray *)objectsForEntry:(NSDictionary *)theEntry {
+ NSData *data = nil;//[self cachedBookmarkData];
+ if (![data length]) data = [self bookmarkData];
- //NSString *string=[[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]autorelease];
- //NSLog(@"data %@",string);
+ NSXMLParser *postParser = [[NSXMLParser alloc]initWithData:data];
+ [postParser setDelegate:self];
- NSXMLParser *postParser=[[NSXMLParser alloc]initWithData:data];
+ posts = [NSMutableArray arrayWithCapacity:1];
- [postParser setDelegate:self];
- posts=[NSMutableArray arrayWithCapacity:1];
[postParser parse];
NSMutableArray *objects=[NSMutableArray arrayWithCapacity:1];
@@ -120,10 +279,10 @@
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 setObject:tag forType:[self tagURLForIndex:[self siteIndex]]];
+ [newObject setObject:[self currentUsername] forMeta:@"us.icio.del.username"];
[newObject setName:tag];
- [newObject setPrimaryType:kQSDeliciousTagType];
+ [newObject setPrimaryType:[self tagURLForIndex:[self siteIndex]]];
[objects addObject:newObject];
}
}
@@ -134,7 +293,7 @@
}
- (NSArray *)objectsForTag:(NSString *)tag username:(NSString *)username{
- NSData *data=[self cachedBookmarkDataForUser:username];
+ NSData *data=[self cachedBookmarkData];
NSXMLParser *postParser=[[NSXMLParser alloc]initWithData:data];
[postParser setDelegate:self];
@@ -145,7 +304,7 @@
QSObject *newObject;
NSEnumerator *e=[posts objectEnumerator];
NSDictionary *post;
- NSMutableSet *tagSet=[NSMutableSet set];
+ // NSMutableSet *tagSet=[NSMutableSet set];
while(post=[e nextObject]){
if ([[post objectForKey:@"tag"]rangeOfString:tag].location==NSNotFound)continue;
newObject=[self objectForPost:post];
@@ -154,83 +313,41 @@
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)setQuickIconForObject:(QSObject *)object {
+ [object setIcon:nil]; // An icon that is either already in memory or easy to load
}
-- (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];
-
+- (BOOL)loadIconForObject:(QSObject *)object {
+ return NO;
+ id data=[object objectForType:QSDeliciousPlugInType];
+ [object setIcon:nil];
+ return YES;
}
+*/
-
-
-
-
-
-
-
-
-- (void)setQuickIconForObject:(QSObject *)object{
+- (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"]]];
+
+- (BOOL)loadChildrenForObject:(QSObject *)object {
+ [object setChildren:[self objectsForTag:[object objectForType:[self tagURLForIndex:[self siteIndex]]]
+ username:[object objectForMeta:@"us.icio.del.username"]]];
return YES;
}
+// NSXMLParserDelegate Functions
+- (void)parser:(NSXMLParser*)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
+ NSLog(@"XML Parser 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(@"XML Parser ended %@ %@ %@", elementName, namespaceURI, qName);
+}
@end