--- /dev/null
+/*!
+ @header ApertureExportManager.h
+ @copyright 2006 Apple Inc. All rights reserved.
+ @abstract Protocol declaration for Aperture's export interface.
+ @discussion Aperture export plug-ins use these methods to control the export process. Version 1.0.
+*/
+
+#import "ApertureSDKCommon.h"
+
+/*!
+ @protocol ApertureExportManager
+ @discussion Protocol definition for the Aperture export interface. You use this protocol to communicate with the Aperture application.
+ */
+@protocol ApertureExportManager
+
+
+/*!
+ @abstract Returns the number of images the user wants to export.
+ @result An unsigned integer indicating the number of images the user wants to export.
+ @discussion Note that the image count may change if the user is allowed to choose between Master and Version export (see -allowsMasterExport). If the user switches, the Aperture export manager sends the plug-in a message (see -exportManagerExportTypeDidChange). The plug-in should then call -imageCount to make sure the number of images to export is correct.
+*/
+- (unsigned)imageCount;
+
+
+/*!
+ @abstract Returns a dictionary containing all the properties for an image.
+ @param index The index of the target image.
+ @result A dictionary containing the available properties for the specified image. The returned dictionary contains a thumbnail image whose size is kExportThumbnailSizeMini.
+ @discussion For Master images, the returned properties come from the original import properties. These include properties from the image file and camera as well as any IPTC values the user added on import. The keys contained in the properties dictionary are defined at the beginning of this header file.
+ */
+- (NSDictionary *)propertiesForImageAtIndex:(unsigned)index;
+
+
+/* New in Aperture 1.5.1, Part of ApertureExportManager version 2 */
+/*!
+ @abstract Returns a dictionary containing all the properties for an image, but without a value for the kExportKeyThumbnailImage key.
+ @param index The index of the target image.
+ @result A dictionary containing all the available properties for the specified image, except a thumbnail. You may obtain a thumbnail separately using the -thumbnailImageForImageAtIndex:size: method.
+ @discussion For Master images, the returned properties come from the original import properties. These include properties from the image file and camera as well as any IPTC values the user added on import. The keys contained in the properties dictionary are defined at the beginning of this header file. This method is available in version 2 of the ApertureExportManager protocol in Aperture 1.5.1. Your plug-in must specify support for this version in its Info.plist, and you can ask the export manager which version it is by calling -conformsToProtocol:version: (defined in the PROAPIObject PROAPIAccessing.h)
+*/
+- (NSDictionary *)propertiesWithoutThumbnailForImageAtIndex:(unsigned)index;
+
+
+/* New in version 2 of the ApertureExportManager protocol, as part of Aperture 1.5.1 */
+/*!
+ @abstract (Version 2) Returns a small version of the specified image.
+ @param index The index of the target image
+ @param size The constant indicating how large of a thumbnail image Aperture should return.
+ @result An image object containing the thumbnail data
+ @discussion New in version 2 of the ApertureExportManager protocol. Supported by Aperture 1.5.1 and later. For master images, this method may return nil. You may check if the Aperture your plug-in is running in supports version 2 by using the PROAPIAccessing protocol.
+*/
+- (NSImage *)thumbnailForImageAtIndex:(unsigned)index
+ size:(ApertureExportThumbnailSize)size;
+
+/*!
+ @abstract Returns the key-value pairs defining the currently-selected export presets for a Version export.
+ @result A pointer to an NSDictionary structure.
+ @discussion Returns the key-value pairs defining the currently-selected export presets for a Version export. Returns nil if the user is exporting a Master image.
+*/
+- (NSDictionary *)selectedExportPresetDictionary;
+
+
+/*!
+ @abstract Adds keywords to a Version image.
+ @param keywords An NSArray of NSString objects representing the keywords to add.
+ @param index The index of the target image.
+ @discussion This method has no effect if called on a Master image.
+*/
+- (void)addKeywords:(NSArray *)keywords
+ toImageAtIndex:(unsigned)index;
+
+
+/*!
+ @abstract Adds keyword hierarchies to a Version image.
+ @param hierarchicalKeywords This is an NSArray of NSArray objects, each containing NSString objects representing the hierarchy of a single keyword. For each NSArray, the NSString at index 0 is the keyword, with the item at index 1 being its parent, and so on.
+ @param index The index of the target image.
+ @discussion This method has no effect if called on a Master image.
+ */
+- (void)addHierarchicalKeywords:(NSArray *)hierarchicalKeywords
+ toImageAtIndex:(unsigned)index;
+
+/*!
+ @abstract Adds custom metadata to a Version image.
+ @param customMetadata An NSDictionary containing NSString key-value pairs representing the custom metadata.
+ @param index The index of the target image.
+ @discussion This method has no effect if called on a Master image.
+*/
+- (void)addCustomMetadataKeyValues:(NSDictionary *)customMetadata
+ toImageAtIndex:(unsigned)index;
+
+
+/*!
+ @abstract Provides reference to frontmost window.
+ @result A reference to the current frontmost window.
+ @discussion Until the plug-in calls -shouldBeginExport, the reference points to the export window. After the export process begins, the reference points to the progress sheet or to Aperture's main window.
+*/
+- (id)window;
+
+
+/*!
+ @abstract Indicates whether Aperture is exporting Master or Version images.
+ @result Returns YES if Aperture is exporting Master images. Returns NO if Aperture is exporting Version images.
+*/
+- (BOOL)isMasterExport;
+
+
+/*!
+ @abstract Tells Aperture to start the export process.
+ @discussion Calling this method causes Aperture to determine the destination path for export, confirm the images to export, put away the export window, and begin the export process. A plug-in should call this method only in response to -exportManagerShouldBeginExport and after performing any necessary validations, network checks, and so on.
+*/
+- (void)shouldBeginExport;
+
+
+/*!
+ @abstract Tells Aperture to cancel the export process.
+ @discussion The plug-in can call this method at any time to have Aperture put away all export windows, stop the export process, and return the user to the workspace. Additionally, if Aperture calls -exportManagerShouldCancelExport, Aperture then halts all activity and waits for the plug-in to call this method.
+*/
+- (void)shouldCancelExport;
+
+
+/*!
+ @abstract Signals that Aperture can deallocate the plug-in.
+ @discussion When Aperture finishes processing the export image data, it calls -exportManagerDidFinishExport. It continues to ask the plug-in for progress updates until the plug-in calls this method. Once this happens, Aperture closes the export modal window and deallocates the plug-in.
+*/
+- (void)shouldFinishExport;
+
+
+@end
\ No newline at end of file
--- /dev/null
+/*!
+ @header ApertureExportPlugIn.h
+ @abstract Protocol declaration for implementing an Aperture Export Plug-in.
+ @copyright 2006 Apple Inc. All rights reserved.
+
+ */
+
+/*Copyright: 2006 Apple Computer, Inc. All rights reserved.*/
+
+
+#import <PluginManager/PROAPIAccessing.h>
+#import "ApertureSDKCommon.h"
+#import "ApertureExportManager.h"
+
+/*!
+ @typedef ApertureExportProgress
+ @abstract Provides values for UI progress display during export.
+ @field currentValue Current progress.
+ @field totalValue Total to do.
+ @field message Progress message.
+ @field indeterminateProgress Set to YES to display an indeterminate progress bar.
+ @discussion Aperture uses the values in this structure to display the export progress in the
+ UI. Aperture starts calling this method after a plug-in calls -shouldBeginExport
+ and stops calling this method after the plug-in calls -shouldFinishExport or
+ -shouldCancelExport.
+ */
+typedef struct
+{
+ unsigned long currentValue;
+ unsigned long totalValue;
+ NSString *message;
+ BOOL indeterminateProgress;
+} ApertureExportProgress;
+
+
+/*!
+ @protocol ApertureExportPlugIn
+ @abstract Specifies the methods that all Aperture export plug-ins must implement.
+ @discussion Any plug-in that does not implement the entire protocol fails when a user
+ selects the plug-in.
+ */
+@protocol ApertureExportPlugIn
+
+
+/*!
+ @abstract Brokers version management between a plug-in and the host application.
+ @param apiManager The ProPlug plug-in manager object.
+ @result An initialized plug-in controller object.
+ @discussion The apiManager object is the protocol broker between a plug-in and the host. It
+ ensures that a plug-in supporting a particular version of the API is given the host
+ objects that correspond to this version. A plug-in should call -apiForProtocol on
+ the apiManager object to obtain a reference to the host export manager for use
+ throughout the export process. If the plug-in fails to obtain a reference to the
+ host export manager, it should fail to initialize.
+ */
+- (id)initWithAPIManager:(id<PROAPIAccessing>)apiManager;
+
+
+/*!
+ @abstract Creates an NSBox for plug-in controls.
+ @result The subclass of NSBox that contains all of the plug-ins UI and controls.
+ @discussion Aperture currently limits the size of the export window to 1100px wide by 750px
+ tall. If the size of the window plus the settings view is too large, Aperture
+ places the view in the window and then resizes to the maximum. For best results,
+ make sure your settings view can resize if necessary. (This is also useful if
+ future versions of Aperture change the maximum size.) Visually, plug-ins should
+ attempt to separate their controls from the items Aperture provides. Placing
+ plug-in controls inside an NSBox is generally the best way to do this.
+ */
+- (NSView *)settingsView;
+
+
+/*!
+ @abstract Returns a reference to first item of settingsView.
+ @result Returns a reference to the first item in the tab order of settingsView.
+*/
+- (NSView *)firstView;
+
+
+/*!
+ @abstract Returns a reference to the last item of settingsView.
+ @result Returns a reference to the last item in the tab order of settingsView.
+*/
+- (NSView *)lastView;
+
+
+/*!
+ @abstract Called when the user displays a plug-in's export UI, or when the export window
+ becomes the active window.
+*/
+- (void)willBeActivated;
+
+
+/*!
+ @abstract Called when a plug-in's export UI is no longer the active view.
+*/
+- (void)willBeDeactivated;
+
+
+/*!
+ @abstract Controls visibility of presets.
+ @result If a plug-in includes a file called "Export Presets.plist" in the Resources folder
+ of its bundle and if this file contains valid definitions for one or more export
+ presets, then these presets are included in the user's export preset list when the
+ plug-in is active and when the user is exporting Versions. If the plug-in also
+ returns YES from this method, then only the supplied presets are visible in the
+ list. If the plug-in returns NO from this method, then all the user's existing
+ presets are visible in addition to the plug-in presets. If the plug-in does not
+ provide an "Export Presets.plist" file, or if the file does not contain any
+ valid preset definitions, then the return value of this method has no effect and
+ Aperture displays the users existing list.
+*/
+- (BOOL)allowsOnlyPlugInPresets;
+
+
+/*!
+ @abstract Controls type of export.
+ @result Returning YES allows the user to export Master images that contain the original, unmodified camera data in its original format. Returning NO allows only Version export.
+*/
+- (BOOL)allowsMasterExport;
+
+
+/*!
+ @abstract Controls type of export.
+ @result Returning YES allows the user to export Version images. (Versions contain all modifications and adjustments to an image and are processed with the options contained in the currently-selected Export Preset.) Returning NO means Aperture only allows the export of Master images.
+*/
+- (BOOL)allowsVersionExport;
+
+/*!
+ @abstract Controls visibility of File Naming Policy options.
+ @result Returning YES allows the user to use Aperture's File Naming Policy options to specify the file name and folder hierarchy for exported images. Returning NO hides the File Naming Policy controls on the export window. The UI elements affected include the Export Name Format popup menu, the Custom Name field, and the Example Name field.
+*/
+- (BOOL)wantsFileNamingControls;
+
+
+/*!
+ @abstract Alerts plug-in that user has switched type of export.
+ @discussion This method indicates that the user has switched between Master and Version export. The plug-in can use -isMasterExport to ask the export manager for the type of export now being used. Because several version images may be based on a single master, the total count of images, along with the properties for each image, may have changed. The plug-in can use -imageCount to get the new image count before calling any other methods on the export manager.
+*/
+- (void)exportManagerExportTypeDidChange;
+
+
+/*!
+ @abstract Controls user prompt for destination path.
+ @result If this method returns YES, Aperture prompts the user for a destination path for an exported image or images. If this method returns NO, Aperture assumes a valid path is provided by -destinationPath.
+*/
+- (BOOL)wantsDestinationPathPrompt;
+
+
+/*!
+ @abstract Returns starting directory.
+ @return If the user is prompted for a destination path (-wantsDestinationPathPrompt return YES), this method should return the starting directory for the dialog box.
+*/
+- (NSString *)defaultDirectory;
+
+
+/*!
+ @abstract Returns a valid destination path for writing the file.
+ @result A valid destination path when Aperture is writing the file (-exportManagerShouldWriteImageData: returns YES) and when no user prompt is requested (-wantsDestinationPathPrompt returns NO). If nil is returned, and if the plug-in asks Aperture to write image data, it will be written to ~/Pictures/Aperture Exports/.
+*/
+- (NSString *)destinationPath;
+
+
+/*!
+ @abstract Alerts plug-in that user has clicked Export button.
+ @discussion Aperture calls this plug-in method when the user clicks the Export button. The plug-in should perform any UI validations here. When the plug-in is ready to begin the export process, it should call Aperture's -shouldBeginExport method to begin the export process.
+*/
+- (void)exportManagerShouldBeginExport;
+
+
+/*!
+ @abstract Indicates the base directory where images will be written.
+ @param path The base file system path where images will be written.
+ @discussion The path designations for each image will be relative to this path. The path is provided by the plug-in or by the user, depending on whether the plug-in asked Aperture to display a destination prompt or not. Because the File Naming Policy controls allow the user to specify a hierarchy of export directories based on image data, other export calls may specify a series of subdirectories. The plug-in should retain a reference to this path in order to build the full destination path.
+*/
+- (void)exportManagerWillBeginExportToPath:(NSString *)path;
+
+
+/*!
+ @abstract Gives the plug-in the option to selectively export an image.
+ @param index The index of an image.
+ @result Returning YES causes Aperture to export the image at the specified index. Returning NO does nothing.
+ @discussion Aperture generates image data for the specified image, either reading Master data from disk or generating the Version data based on the currently-selected options.
+ */
+- (BOOL)exportManagerShouldExportImageAtIndex:(unsigned)index;
+
+
+/*!
+ @abstract Confirms indexed image to be exported.
+ @param index The index of an image.
+ @discussion This method confirms the index value that the plug-in returned to -exportManagerShouldExportImageAtIndex:.
+*/
+- (void)exportManagerWillExportImageAtIndex:(unsigned)index;
+
+
+/*!
+ @abstract Provides option for plug-in itself to handle image data.
+ @param imageData An object containing all the data for an image and the specified index.
+ @param path The relative path where the object should be written. (The base path is set in -exportManagerWillBeginExportToPath:.) The file name is the last component of this parameter.
+ @param index The index for the image.
+ @result Returning YES instructs Aperture to write the image data. Returning NO means the plug-in itself retains the data object and can process the image as appropriate.
+ @discussion This method is called every time the plug-in asks Aperture to export and image. NOTE: This method may be called on a secondary thread.
+*/
+- (BOOL)exportManagerShouldWriteImageData:(NSData*)imageData
+ toRelativePath:(NSString*)path
+ forImageAtIndex:(unsigned)index;
+
+
+/*!
+ @abstract Confirms that Aperture has written an image.
+ @param path The relative path where the object was written.
+ @param index The index of the specified image.
+ @discussion This method is only called if the plug-in returned YES from the -exportManagerShouldWriteImageData: method. NOTE: This method may be called on a secondary thread.
+
+*/
+- (void)exportManagerDidWriteImageDataToRelativePath:(NSString *)path
+ forImageAtIndex:(unsigned)index;
+
+
+/*!
+ @abstract Confirms that Aperture has completed processing all export images.
+ @discussion Aperture calls this method once if it has completed generating and (optionally) writing data for the export images requested by the plug-in. Aperture assumes that the plug-in is still performing export operations until the plug-in calls either -shouldCancelExport or -shouldFinishExport. NOTE: This method may be called on a secondary thread.
+*/
+- (void)exportManagerDidFinishExport;
+
+
+/*!
+ @abstract Indicates that export should be cancelled.
+ @discussion Indicates that Aperture has encountered an error, or that the user has clicked the Cancel button. Aperture has stopped exporting image data but waits for the plug-in to signal that it is ready to cancel by calling -shouldCancelExport. Aperture then cleans up the export or progress windows.
+ */
+- (void)exportManagerShouldCancelExport;
+
+
+/*!
+ @abstract Displays progress information.
+ @result A pointer to a valid ApertureExportProgress structure.
+ @discussion Aperture uses the values in this structure to display the progress UI. Aperture begins calling this method after the plug-in calls -shouldBeginExport and stops calling this method after the plug-in calls -shouldFinishExport or -shouldCancelExport.
+*/
+- (ApertureExportProgress *)progress;
+
+
+/*!
+ @abstract Locks ApertureExportProgress structures.
+ @discussion The plug-in should maintain an NSLock or similar object and perform any necessary locking here. Aperture will always call this method from the main thread before calling -progress.
+*/
+- (void)lockProgress;
+
+
+/*!
+ @abstract Alerts plug-in to unlock objects.
+ @discussion The plug-in should maintain an NSLock or similar object and perform any necessary unlocking here. Aperture will always call this method from the main thread after calling -progress.
+*/
+- (void)unlockProgress;
+
+
+@end
--- /dev/null
+/*!
+ @header ApertureSDKCommon.h
+ @copyright 2007-2008 Apple Inc.. All rights reserved.
+
+*/
+
+/*!
+ @define kExportKeyThumbnailImage
+ @discussion An NSImage object containing a reduced-size JPEG of the specified image. Note that values may be nil during export for this key for Master images, or for versions of unsupported master formats.
+ */
+#define kExportKeyThumbnailImage @"kExportKeyThumbnailImage"
+
+
+/*!
+ @define kExportKeyVersionName
+ @discussion An NSString specifying the version name of the selected image.
+ */
+#define kExportKeyVersionName @"kExportKeyVersionName"
+
+
+/*!
+ @define kExportKeyProjectName
+ @discussion An NSString specifying the name of the project containing the image.
+ */
+#define kExportKeyProjectName @"kExportKeyProjectName"
+
+
+/*!
+ @define kExportKeyEXIFProperties
+ @discussion An NSDictionary specifying the EXIF key-value pairs for the image.
+ */
+#define kExportKeyEXIFProperties @"kExportKeyEXIFProperties"
+
+
+/*!
+ @define kExportKeyIPTCProperties
+ @discussion An NSDictionary specifying all the IPTC key-value pairs for the image.
+ */
+#define kExportKeyIPTCProperties @"kExportKeyIPTCProperties"
+
+
+/*!
+ @define kExportKeyCustomProperties
+ @discussion An NSDictionary specifying all the Custom Metadata key-value pairs for the image.
+ */
+#define kExportKeyCustomProperties @"kExportKeyCustomProperties"
+
+
+/*!
+ @define kExportKeyKeywords
+ @discussion An NSArray specifying an NSString for each keyword for this image.
+ */
+#define kExportKeyKeywords @"kExportKeyKeywords"
+
+
+/*!
+ @define kExportKeyHierarchicalKeywords
+ @discussion (New in Aperture 1.5.1) An NSArray specifying hierarchical keywords. Each entry in the array represents a single keyword and is itself an NSArray of NSStrings. Each hierarchy array starts with the keyword itself at index 0, followed by its parent, and so on.
+ */
+#define kExportKeyHierarchicalKeywords @"kExportKeyHierarchicalKeywords"
+
+
+/*!
+ @define kExportKeyMainRating
+ @discussion An NSNumber specifying the rating for this image.
+ */
+#define kExportKeyMainRating @"kExportKeyMainRating"
+
+
+/*!
+ @define kExportKeyXMPString
+ @discussion An NSString specifying the XMP data for the original master of this image.
+ */
+#define kExportKeyXMPString @"kExportKeyXMPString"
+
+
+/*!
+ @define kExportKeyReferencedMasterPath
+ @discussion An NSString specifying the absolute path to the master image file.
+ */
+#define kExportKeyReferencedMasterPath @"kExportKeyReferencedMasterPath"
+
+
+/*!
+ @define kExportKeyMasterPath
+ @discussion An NSString specifying the absolute path to the master image file. (The same value as kExportKeyReferencedMasterPath)
+ */
+#define kExportKeyMasterPath @"kExportKeyReferencedMasterPath"
+
+
+/*!
+ @define kExportKeyUniqueID
+ @discussion An NSString specifying a unique identifier for specified image.
+ */
+#define kExportKeyUniqueID @"kExportKeyUniqueID"
+
+
+/*!
+ @define kExportKeyImageSize
+ @discussion An NSValue object specifying an NSSize with the pixel dimensions of the specified image. For Version images, the pixel dimensions take all cropping, adjustments, and rotations into account. For Master images, the size is the original pixel dimensions of the image.
+ */
+#define kExportKeyImageSize @"kExportKeyImageSize"
+
+/*!
+ @define kExportKeyImageHasAdjustments
+ @discussion (New in Aperture 2.0) An NSNumber object specifying a Boolean value. YES indicates that the user has applied at least one adjustment to this version besides the RAW decode; NO indicates that no adjustments have been applied.
+ */
+#define kExportKeyImageHasAdjustments @"kExportKeyImageHasAdjustments"
+
+
+/*!
+ @define kExportKeyWhiteBalanceTemperature
+ @discussion (New in Aperture 2.0) An NSNumber object specifying the color temperature value determined by Aperture.
+ */
+#define kExportKeyWhiteBalanceTemperature @"kExportKeyWhiteBalanceTemperature"
+
+/*!
+ @define kExportKeyWhiteBalanceTint
+ @discussion (New in Aperture 2.0) An NSNumber object specifying the color tint value determined by Aperture.
+ */
+#define kExportKeyWhiteBalanceTint @"kExportKeyWhiteBalanceTint"
+
+/*!
+ @define kkExportKeyIsRAWImage
+ @discussion (New in Aperture 2.0) An NSNumber object specifying a Boolean value. YES indicates that this version is based off a RAW master file. NO indicates that the master file is not RAW.
+ */
+#define kExportKeyIsRAWImage @"kExportKeyIsRAWImage"
+
+/* New in Aperture 1.5.1, Part of ApertureExportManager version 2 */
+/*!
+ */
+typedef enum
+{
+ kExportThumbnailSizeThumbnail = 0,
+ kExportThumbnailSizeMini,
+ kExportThumbnailSizeTiny
+} ApertureExportThumbnailSize;
--- /dev/null
+//
+// ApertureToAnselExportPlugin.h
+// ApertureToAnselExportPlugin
+//
+// Created by Michael Rubinsky on 8/29/09.
+// Copyright __MyCompanyName__ 2009. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import <Quartz/Quartz.h>
+#import <Foundation/Foundation.h>
+#import "ApertureExportManager.h"
+#import "ApertureExportPlugIn.h"
+
+@class TURAnsel, TURAnselGallery;
+@interface ApertureToAnselExportPlugin : NSObject <ApertureExportPlugIn>
+{
+ // The cached API Manager object, as passed to the -initWithAPIManager: method.
+ id _apiManager;
+
+ // The cached Aperture Export Manager object - you should fetch this from the API Manager during -initWithAPIManager:
+ NSObject<ApertureExportManager, PROAPIObject> *_exportManager;
+
+ // The lock used to protect all access to the ApertureExportProgress structure
+ NSLock *_progressLock;
+
+ // Top-level objects in the nib are automatically retained - this array
+ // tracks those, and releases them
+ NSArray *_topLevelNibObjects;
+
+ // The structure used to pass all progress information back to Aperture
+ ApertureExportProgress exportProgress;
+
+ // Outlets to your plug-ins user interface
+ IBOutlet NSView *settingsView;
+ IBOutlet NSView *firstView;
+ IBOutlet NSView *lastView;
+
+ IBOutlet NSComboBox *galleryCombo;
+ IBOutlet NSTextField *statusLabel;
+ IBOutlet NSProgressIndicator *spinner;
+ IBOutlet NSImageView *defaultImageView;
+ IBOutlet NSButton *mNewGalleryButton;
+ IBOutlet NSPopUpButton *mServersPopUp;
+ IBOutlet NSButton *mCancelConnect;
+ IBOutlet NSTextField *mImageCountLabel;
+
+ // New Server sheet
+ IBOutlet NSWindow *newServerSheet;
+ IBOutlet NSTextField *mServerSheetHostURL;
+ IBOutlet NSTextField *mServerSheetUsername;
+ IBOutlet NSSecureTextField *mServerSheetPassword;
+ IBOutlet NSTextField *mServerSheetServerNickName;
+ IBOutlet NSButton *mMakeNewServerDefault;
+
+ // Server list
+ IBOutlet NSPanel *serverListPanel;
+ IBOutlet NSTableView *serverTable;
+
+ // Currently selected server data
+ NSMutableArray *_anselServers;
+ NSDictionary *_currentServer;
+
+ // Gallery View
+ IBOutlet NSButton *viewGallery;
+ IBOutlet NSWindow *mviewGallerySheet;
+ IBOutlet NSButton *closeGalleryView;
+ IBOutlet IKImageBrowserView *browserView;
+
+ BOOL cancelExport;
+ TURAnselGallery *_currentGallery;
+ int _currentImageCount;
+ TURAnsel *_anselController;
+ NSMutableArray *_browserData;
+
+ // Remembers the selected server before it changes. Used to reselect the
+ // proper server if necessary when server panels are closed.
+ int mIndexOfPreviouslySelectedServer;
+}
+
+- (IBAction) showNewGallery: (id)sender;
+- (IBAction) doAddServer: (id)sender;
+- (IBAction) doCancelAddServer: (id)sender;
+- (IBAction) clickServer: (id)sender;
+- (IBAction) clickCancelConnect: (id)sender;
+
+- (IBAction) clickViewGallery: (id)sender;
+- (IBAction) closeGalleryView: (id)sender;
+
+// Server List
+- (IBAction) closeServerList: (id)sender;
+- (IBAction) removeServer: (id)sender;
+
+- (NSWindow *)window;
+@end
--- /dev/null
+//
+// ApertureToAnselExportPlugin.m
+// ApertureToAnselExportPlugin
+//
+// Created by Michael Rubinsky on 8/29/09.
+// Copyright __MyCompanyName__ 2009. All rights reserved.
+//
+
+#import "ApertureToAnselExportPlugin.h"
+#import "TURAnsel.h"
+#import "TURAnselGallery.h"
+
+@interface ApertureToAnselExportPlugin (PrivateAPI)
+- (void)showNewServerSheet;
+- (void)showServerListPanel;
+- (void)updateServersPopupMenu;
+- (void)doConnect;
+- (void)connect;
+- (void)disconnect;
+- (void)postProgressStatus:(NSString *)status;
+- (void)privatePerformExport;
+- (void)runExport;
+- (void)canExport;
+- (void)setStatusText: (NSString *)message withColor:(NSColor *)theColor;
+- (void)setStatusText: (NSString *)message;
+@end
+
+
+// User default keys
+NSString * const TURAnselServersKey = @"AnselServers";
+NSString * const TURAnselExportSize = @"AnselExportSize";
+NSString * const TURAnselDefaultServerKey = @"AnselDefaultServer";
+
+// Server property keys
+NSString * const TURAnselServerNickKey = @"nickname";
+NSString * const TURAnselServerEndpointKey = @"endpoint";
+NSString * const TURAnselServerUsernameKey = @"username";
+NSString * const TURAnselServerPasswordKey = @"password";
+
+@implementation ApertureToAnselExportPlugin
+
+//---------------------------------------------------------
+// initWithAPIManager:
+//
+// This method is called when a plug-in is first loaded, and
+// is a good point to conduct any checks for anti-piracy or
+// system compatibility. This is also your only chance to
+// obtain a reference to Aperture's export manager. If you
+// do not obtain a valid reference, you should return nil.
+// Returning nil means that a plug-in chooses not to be accessible.
+//---------------------------------------------------------
+ - (id)initWithAPIManager:(id<PROAPIAccessing>)apiManager
+{
+ if (self = [super init]) {
+ _apiManager = apiManager;
+ _exportManager = [[_apiManager apiForProtocol:@protocol(ApertureExportManager)] retain];
+ if (!_exportManager)
+ return nil;
+
+ _progressLock = [[NSLock alloc] init];
+
+ // Finish your initialization here
+ // Test
+// _currentServer = [NSDictionary dictionaryWithObjectsAndKeys:@"http://localhost:8080/horde/rpc.php", TURAnselServerEndpointKey,
+// @"localhost", TURAnselServerNickKey,
+// @"mike", TURAnselServerUsernameKey,
+// @"n329sp", TURAnselServerPasswordKey, nil];
+// NSDictionary *p = [[NSDictionary alloc] initWithObjects: [NSArray arrayWithObjects:
+// [_currentServer objectForKey:TURAnselServerEndpointKey],
+// [_currentServer objectForKey:TURAnselServerUsernameKey],
+// [_currentServer objectForKey:TURAnselServerPasswordKey],
+// nil]
+// forKeys: [NSArray arrayWithObjects:@"endpoint", @"username", @"password", nil]];
+// // Create our controller
+// NSLog(@"Creating anselController %@", p);
+// _anselController = [[TURAnsel alloc] initWithConnectionParameters:p];
+// [_anselController setDelegate:self];
+
+
+ // Register Application Defaults
+ NSMutableDictionary *defaultValues = [NSMutableDictionary dictionary];
+ [defaultValues setObject: [NSNumber numberWithInt: 2]
+ forKey: TURAnselExportSize];
+
+ [defaultValues setObject: [[NSArray alloc] init] forKey: TURAnselServersKey];
+
+ [defaultValues setObject: [[NSDictionary alloc] init]
+ forKey: TURAnselDefaultServerKey];
+
+ NSUserDefaults *userPrefs = [NSUserDefaults standardUserDefaults];
+ [userPrefs registerDefaults: defaultValues];
+ [self setStatusText: @"Not Connected" withColor: [NSColor redColor]];
+ [spinner stopAnimation: self];
+
+ // See if we have any configured servers (need a mutable array, hence the extra step here)
+ _anselServers = [[NSMutableArray alloc] initWithArray: [userPrefs objectForKey:TURAnselServersKey]];
+
+ // Wait until iPhoto's export window is fully loaded before attempting a sheet
+ [[NSNotificationCenter defaultCenter] addObserver: self
+ selector: @selector(exportWindowDidBecomeKey:)
+ name: NSWindowDidBecomeKeyNotification
+ object :nil];
+
+ // Holds gallery's images info for the gallery preview
+ _browserData = [[NSMutableArray alloc] init];
+ }
+
+ NSLog(@"initWithAPIManager completed");
+ return self;
+}
+
+- (void)dealloc
+{
+ [_anselServers release];
+ [_anselController setDelegate:nil];
+ [_anselController release];
+
+ // Release the top-level objects from the nib.
+ [_topLevelNibObjects makeObjectsPerformSelector:@selector(release)];
+ [_topLevelNibObjects release];
+ [_progressLock release];
+ [_exportManager release];
+ [super dealloc];
+}
+
+
+#pragma mark -
+// UI Methods
+#pragma mark UI Methods
+
+- (NSView *)settingsView
+{
+ if (nil == settingsView)
+ {
+ // Load the nib using NSNib, and retain the array of top-level objects so we can release
+ // them properly in dealloc
+ NSBundle *myBundle = [NSBundle bundleForClass:[self class]];
+ NSNib *myNib = [[NSNib alloc] initWithNibNamed:@"ApertureToAnselExportPlugin" bundle:myBundle];
+ if ([myNib instantiateNibWithOwner:self topLevelObjects:&_topLevelNibObjects])
+ {
+ [_topLevelNibObjects retain];
+ }
+ [myNib release];
+ }
+
+ return settingsView;
+}
+
+- (NSView *)firstView
+{
+ return firstView;
+}
+
+- (NSView *)lastView
+{
+ return lastView;
+}
+
+- (void)willBeActivated
+{
+
+}
+
+- (void)willBeDeactivated
+{
+
+}
+
+#pragma mark
+// Aperture UI Controls
+#pragma mark Aperture UI Controls
+
+- (BOOL)allowsOnlyPlugInPresets
+{
+ return NO;
+}
+
+- (BOOL)allowsMasterExport
+{
+ return NO;
+}
+
+- (BOOL)allowsVersionExport
+{
+ return YES;
+}
+
+- (BOOL)wantsFileNamingControls
+{
+ return NO;
+}
+
+- (void)exportManagerExportTypeDidChange
+{
+
+}
+
+
+#pragma mark -
+// Save Path Methods
+#pragma mark Save/Path Methods
+
+- (BOOL)wantsDestinationPathPrompt
+{
+ return NO;
+}
+
+- (NSString *)destinationPath
+{
+ return @"/tmp";
+}
+
+- (NSString *)defaultDirectory
+{
+ return nil;
+}
+
+
+#pragma mark -
+// Export Process Methods
+#pragma mark Export Process Methods
+
+- (void)exportManagerShouldBeginExport
+{ // You must call [_exportManager shouldBeginExport] here or elsewhere before Aperture will begin the export process
+ NSLog(@"exportManagerShouldBeginExport");
+ [_exportManager shouldBeginExport];
+}
+
+- (void)exportManagerWillBeginExportToPath:(NSString *)path {}
+
+- (BOOL)exportManagerShouldExportImageAtIndex:(unsigned)index
+{
+ return YES;
+}
+
+- (void)exportManagerWillExportImageAtIndex:(unsigned)index
+{
+
+}
+
+- (BOOL)exportManagerShouldWriteImageData:(NSData *)imageData toRelativePath:(NSString *)path forImageAtIndex:(unsigned)index
+{
+// // Detach to a new thread for the export.
+// [NSApplication detachDrawingThread: @selector(runExport)
+// toTarget: self
+// withObject: nil];
+
+ NSString *base64ImageData = [NSString base64StringFromData: imageData
+ length: [imageData length]];
+ NSDictionary *properties = [_exportManager propertiesWithoutThumbnailForImageAtIndex: index];
+ NSArray *keys = [[NSArray alloc] initWithObjects:
+ @"filename", @"description", @"data", @"type", @"tags", nil];
+
+ NSString *fileType = @"jpeg"; //@TODO
+ NSArray *values = [[NSArray alloc] initWithObjects:
+ path,
+ [properties objectForKey: kExportKeyVersionName], //imagedescription
+ base64ImageData,
+ fileType,
+ [properties objectForKey:kExportKeyKeywords], //keywords
+ nil];
+
+
+
+ NSDictionary *imageDataDict = [[NSDictionary alloc] initWithObjects:values
+ forKeys:keys];
+ NSDictionary *params = [[NSDictionary alloc] initWithObjectsAndKeys:
+ imageDataDict, @"data",
+ [NSNumber numberWithBool:NO], @"default",
+ nil];
+//
+ //Start upload with current gallery.
+ NSLog(@"Uploading photo %d out of %d", index, [_exportManager imageCount]);
+ [_currentGallery uploadImageObject: params];
+ [keys release];
+ [values release];
+ [imageDataDict release];
+ //[metadata release];
+ [params release];
+ //[iptcDict release];
+
+ return NO;
+}
+
+- (void)exportManagerDidWriteImageDataToRelativePath:(NSString *)relativePath forImageAtIndex:(unsigned)index
+{
+ NSLog(@"exportManagerDidWriteImageDataToRelativePath %d", index);
+}
+
+- (void)exportManagerDidFinishExport
+{
+ // You must call [_exportManager shouldFinishExport] before Aperture will put away the progress window and complete the export.
+ // NOTE: You should assume that your plug-in will be deallocated immediately following this call. Be sure you have cleaned up
+ // any callbacks or running threads before calling.
+ [_exportManager shouldFinishExport];
+}
+
+- (void)exportManagerShouldCancelExport
+{
+ // You must call [_exportManager shouldCancelExport] here or elsewhere before Aperture will cancel the export process
+ // NOTE: You should assume that your plug-in will be deallocated immediately following this call. Be sure you have cleaned up
+ // any callbacks or running threads before calling.
+ [_exportManager shouldCancelExport];
+}
+
+
+#pragma mark -
+ // Progress Methods
+#pragma mark Progress Methods
+
+- (ApertureExportProgress *)progress
+{
+ return &exportProgress;
+}
+
+- (void)lockProgress
+{
+
+ if (!_progressLock)
+ _progressLock = [[NSLock alloc] init];
+
+ [_progressLock lock];
+}
+
+- (void)unlockProgress
+{
+ [_progressLock unlock];
+}
+
+- (NSWindow *)window
+{
+ return [_exportManager window];
+}
+
+#pragma mark NSPopUpButton Notification Handlers
+- (void) NSPopUpWillPopUp:(id)theButton
+{
+ // Remember the previous selection before it changes.
+ // The 'clickServer' action will handle what to do with the selection.
+ mIndexOfPreviouslySelectedServer = [mServersPopUp indexOfSelectedItem];
+}
+
+#pragma mark -
+#pragma mark TURAnselDelegate
+
+// The ansel controller is initialized, populate the gallery data
+// and update the UI.
+- (void)TURAnselDidInitialize
+{
+ NSLog(@"TURAnselDidInitialize");
+ [galleryCombo reloadData];
+ [galleryCombo setEnabled: true];
+ [mNewGalleryButton setEnabled: true];
+ [self setStatusText: @"Connected" withColor: [NSColor greenColor]];
+ [self canExport];
+ [spinner stopAnimation: self];
+ [mServersPopUp setEnabled: true];
+}
+
+
+- (void)TURAnselHadError: (NSError *)error
+{
+ NSLog(@"TURAnselHadError");
+ // Stop the spinner
+ [spinner stopAnimation: self];
+ [self disconnect];
+ [mServersPopUp setEnabled: true];
+
+ NSAlert *alert;
+ // For some reason, this method doesn't pick up our userInfo dictionary...
+ if ([[error userInfo] valueForKey:@"NSLocalizedDescriptionKey"] == nil) {
+ alert = [[NSAlert alertWithError: error] retain];
+ } else {
+ alert = [[NSAlert alloc] init];
+ [alert setAlertStyle:NSWarningAlertStyle];
+ [alert setMessageText:[[error userInfo] valueForKey:@"NSLocalizedDescriptionKey"]];
+ if ([[error userInfo] valueForKey: @"NSLocalizedRecoverySuggestionErrorKey"] != nil) {
+ [alert setInformativeText: [[error userInfo] valueForKey: @"NSLocalizedRecoverySuggestionErrorKey"]];
+ }
+ }
+
+ [alert beginSheetModalForWindow:[self window]
+ modalDelegate:nil
+ didEndSelector:nil
+ contextInfo:nil];
+ [alert release];
+}
+
+#pragma mark -
+#pragma mark comboBoxDelegate
+- (void)comboBoxSelectionDidChange:(NSNotification *)notification
+{
+ [spinner startAnimation: self];
+ [self setStatusText: @"Loading gallery data..."];
+ int row = [galleryCombo indexOfSelectedItem];
+ [_currentGallery setDelegate:nil];
+ [_currentGallery autorelease];
+ _currentGallery = [[_anselController getGalleryByIndex:row] retain];
+ [_currentGallery setDelegate: self];
+
+ // Obtain and properly size the image for screen
+ NSImage *theImage = [[NSImage alloc] initWithContentsOfURL: [_currentGallery galleryDefaultImageURL]];
+ NSSize imageSize;
+ imageSize.width = [[theImage bestRepresentationForDevice:nil] pixelsWide];
+ imageSize.height = [[theImage bestRepresentationForDevice:nil] pixelsHigh];
+ [theImage setScalesWhenResized:YES];
+ [theImage setSize:imageSize];
+
+ // Show it
+ [defaultImageView setImage: theImage];
+
+ [theImage release];
+ [self canExport];
+ [viewGallery setEnabled: YES];
+ [spinner stopAnimation: self];
+ [self setStatusText: @"Connected" withColor: [NSColor greenColor]];
+}
+
+#pragma mark export notifications
+- (void)exportWindowWillClose: (NSNotification *)notification
+{
+ [mServersPopUp selectItemAtIndex: 0];
+ [self disconnect];
+ [[NSNotificationCenter defaultCenter] removeObserver: self
+ name: NSWindowWillCloseNotification
+ object: nil];
+}
+
+- (void)exportWindowDidBecomeKey: (NSNotification *)notification
+{
+ NSLog(@"exportWindowDidBecomeKey");
+ // Register for the close notification
+ [[NSNotificationCenter defaultCenter] addObserver: self
+ selector: @selector(exportWindowWillClose:)
+ name: NSWindowWillCloseNotification
+ object :nil];
+
+ // Only do this once
+ [[NSNotificationCenter defaultCenter] removeObserver: self
+ name: NSWindowDidBecomeKeyNotification
+ object: nil];
+
+ [self updateServersPopupMenu];
+
+ // Register for notifications
+ [[NSNotificationCenter defaultCenter] addObserver: self
+ selector: @selector(NSPopUpWillPopUp:)
+ name:@"NSPopUpButtonWillPopUpNotification"
+ object: nil];
+ if ([_anselServers count] == 0) {
+ [self showNewServerSheet];
+ } else {
+ // Try to autoconnect and select the proper server in the popup.
+ NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
+ NSDictionary *defaultServer = [prefs objectForKey:TURAnselDefaultServerKey];
+ if ([defaultServer count]) {
+ _currentServer = [defaultServer retain];
+ int itemCount = [mServersPopUp numberOfItems];
+
+ // C99 mode is off by default in Apple's gcc.
+ int i;
+ for (i = 0; i < itemCount; i++) {
+ NSDictionary *menuItem = [[mServersPopUp itemAtIndex: i] representedObject];
+ if ([[menuItem objectForKey: TURAnselServerNickKey] isEqual: [_currentServer objectForKey:TURAnselServerNickKey]]) {
+ [mServersPopUp selectItemAtIndex: i];
+ break;
+ }
+ }
+
+ [self doConnect];
+ }
+ }
+}
+// Server setup sheet
+-(IBAction)doAddServer: (id)sender
+{
+ // TODO: Sanity checks
+ NSDictionary *newServer = [[NSDictionary alloc] initWithObjectsAndKeys:
+ [mServerSheetServerNickName stringValue], TURAnselServerNickKey,
+ [mServerSheetHostURL stringValue], TURAnselServerEndpointKey,
+ [mServerSheetUsername stringValue], TURAnselServerUsernameKey,
+ [mServerSheetPassword stringValue], TURAnselServerPasswordKey,
+ nil];
+ [_anselServers addObject: newServer];
+ [NSApp endSheet: newServerSheet];
+ [newServerSheet orderOut: nil];
+ _currentServer = [newServer retain];
+ [self doConnect];
+
+ // Save it to the userdefaults
+ NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
+ [prefs setObject:_anselServers forKey:TURAnselServersKey];
+
+ int defaultState = [mMakeNewServerDefault state];
+ if (defaultState == NSOnState) {
+ [prefs setObject: _currentServer forKey: TURAnselDefaultServerKey];
+ }
+
+ [prefs synchronize];
+ [self updateServersPopupMenu];
+ [newServer release];
+}
+
+- (IBAction)doCancelAddServer: (id)sender
+{
+ [NSApp endSheet: newServerSheet];
+ [newServerSheet orderOut: nil];
+}
+
+// Action sent by the server pop up menu
+- (IBAction)clickServer: (id)sender
+{
+ // Are we set to "none" now?
+ if ([mServersPopUp indexOfSelectedItem] == 0) {
+ [self disconnect];
+ } else if ([mServersPopUp indexOfSelectedItem] == [mServersPopUp numberOfItems] - 1) {
+ // Server list
+ [self showServerListPanel];
+ } else if ([mServersPopUp indexOfSelectedItem] == [mServersPopUp numberOfItems] - 2) {
+ // New Server
+ [self showNewServerSheet];
+ } else if (![[[mServersPopUp selectedItem] title] isEqual:@"(None)"]) {
+ // Connect to a server
+ if (_currentServer != nil) {
+ [self disconnect];
+ }
+ _currentServer = [[mServersPopUp selectedItem] representedObject];
+ [self doConnect];
+ }
+}
+
+#pragma mark -
+#pragma mark PrivateAPI
+
+// See if we have everything we need to export...
+- (void)canExport
+{
+ if ([_anselController state] == TURAnselStateConnected) {
+ [mNewGalleryButton setEnabled: YES];
+ [galleryCombo setEnabled: YES];
+ } else {
+ [mNewGalleryButton setEnabled: NO];
+ [galleryCombo setEnabled: NO];
+ [viewGallery setEnabled: NO];
+ }
+}
+
+- (void)setStatusText: (NSString *)message withColor:(NSColor *)theColor
+{
+ [statusLabel setStringValue: message];
+ [statusLabel setTextColor: theColor];
+}
+
+- (void)setStatusText: (NSString *)message
+{
+ [statusLabel setStringValue: message];
+ [statusLabel setTextColor: [NSColor blackColor]];
+}
+
+- (void)updateServersPopupMenu
+{
+ [mServersPopUp removeAllItems];
+ [mServersPopUp addItemWithTitle:@"(None)"];
+ for (NSDictionary *server in _anselServers) {
+ NSMenuItem *menuItem = [[NSMenuItem alloc] initWithTitle: [server objectForKey: TURAnselServerNickKey]
+ action: nil
+ keyEquivalent: @""];
+ [menuItem setRepresentedObject: server];
+ [[mServersPopUp menu] addItem: menuItem];
+ }
+
+ // add separator
+ [[mServersPopUp menu] addItem:[NSMenuItem separatorItem]];
+
+ // add Add Gallery... and Edit List... options
+ [mServersPopUp addItemWithTitle:@"Add Server..."];
+ [mServersPopUp addItemWithTitle:@"Edit Server List..."];
+
+ // fix selection
+ [mServersPopUp selectItemAtIndex:0];
+}
+
+- (void) showNewServerSheet
+{
+ [NSApp beginSheet: newServerSheet
+ modalForWindow: [self window]
+ modalDelegate: nil
+ didEndSelector: nil
+ contextInfo: nil];
+
+ // Make sure these are cleared.
+ [mServerSheetHostURL setStringValue: @""];
+ [mServerSheetUsername setStringValue: @""];
+ [mServerSheetPassword setStringValue: @""];
+ [mServerSheetServerNickName setStringValue: @""];
+}
+
+- (void) showServerListPanel
+{
+ [NSApp beginSheet: serverListPanel
+ modalForWindow: [self window]
+ modalDelegate: nil
+ didEndSelector: nil
+ contextInfo: nil];
+
+ [serverTable setDelegate: self];
+}
+
+// Start the connection process.
+-(void)doConnect
+{
+ [galleryCombo deselectItemAtIndex: [galleryCombo indexOfSelectedItem]];
+ [mServersPopUp setEnabled: NO];
+ [mNewGalleryButton setEnabled: NO];
+ [viewGallery setEnabled: NO];
+ [self setStatusText: @"Connecting..."];
+ [spinner startAnimation: self];
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ NSDictionary *p = [[NSDictionary alloc] initWithObjects: [NSArray arrayWithObjects:
+ [_currentServer objectForKey:TURAnselServerEndpointKey],
+ [_currentServer objectForKey:TURAnselServerUsernameKey],
+ [_currentServer objectForKey:TURAnselServerPasswordKey],
+ nil]
+ forKeys: [NSArray arrayWithObjects:@"endpoint", @"username", @"password", nil]];
+ // Create our controller
+ _anselController = [[TURAnsel alloc] initWithConnectionParameters:p];
+ [_anselController setDelegate:self];
+
+ // Set up the galleryCombo
+ [galleryCombo setDataSource:_anselController];
+ [galleryCombo setDelegate:self];
+ [spinner startAnimation:self];
+ // Detach to a new thread and do the actual login/retrieval of gallery list
+ [NSApplication detachDrawingThread: @selector(connect)
+ toTarget: self
+ withObject: nil];
+ [p release];
+ [pool drain];
+}
+// Runs in a new thread.
+- (void)connect
+{
+ NSAutoreleasePool *threadPool = [[NSAutoreleasePool alloc] init];
+ [_anselController connect];
+ [threadPool drain];
+}
+@end
--- /dev/null
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 42;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; };
+ 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; };
+ B0AE230C1049F19D0096565B /* Panel.nib in Resources */ = {isa = PBXBuildFile; fileRef = B0AE230A1049F19D0096565B /* Panel.nib */; };
+ B0AE23391049F7770096565B /* TURAnselGalleryPanelController.m in Sources */ = {isa = PBXBuildFile; fileRef = B0AE23361049F7770096565B /* TURAnselGalleryPanelController.m */; };
+ B0AE23411049F7A20096565B /* AnselGalleryPanel.nib in Resources */ = {isa = PBXBuildFile; fileRef = B0AE233D1049F7A20096565B /* AnselGalleryPanel.nib */; };
+ B0D311D01049A7DE006B06C6 /* TURAnsel.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D311CB1049A7DE006B06C6 /* TURAnsel.m */; };
+ B0D311D11049A7DE006B06C6 /* TURAnselGallery.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D311CD1049A7DE006B06C6 /* TURAnselGallery.m */; };
+ B0D311D21049A7DE006B06C6 /* TURXMLConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D311CF1049A7DE006B06C6 /* TURXMLConnection.m */; };
+ B0D312241049A977006B06C6 /* NSDataAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D3120F1049A977006B06C6 /* NSDataAdditions.m */; };
+ B0D312251049A977006B06C6 /* NSStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D312111049A977006B06C6 /* NSStringAdditions.m */; };
+ B0D312271049A977006B06C6 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B0D312141049A977006B06C6 /* Localizable.strings */; };
+ B0D312281049A977006B06C6 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = B0D312161049A977006B06C6 /* LICENSE */; };
+ B0D312291049A977006B06C6 /* README in Resources */ = {isa = PBXBuildFile; fileRef = B0D312171049A977006B06C6 /* README */; };
+ B0D3122A1049A977006B06C6 /* XMLRPCConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D3121B1049A977006B06C6 /* XMLRPCConnection.m */; };
+ B0D3122B1049A977006B06C6 /* XMLRPCDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D3121D1049A977006B06C6 /* XMLRPCDecoder.m */; };
+ B0D3122C1049A977006B06C6 /* XMLRPCEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D3121F1049A977006B06C6 /* XMLRPCEncoder.m */; };
+ B0D3122D1049A977006B06C6 /* XMLRPCRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D312211049A977006B06C6 /* XMLRPCRequest.m */; };
+ B0D3122E1049A977006B06C6 /* XMLRPCResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D312231049A977006B06C6 /* XMLRPCResponse.m */; };
+ B0D312321049A9F2006B06C6 /* XMLRPC-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = B0D312311049A9F2006B06C6 /* XMLRPC-Info.plist */; };
+ B0D312591049AD08006B06C6 /* XMLRPC.h in Headers */ = {isa = PBXBuildFile; fileRef = B0D312181049A977006B06C6 /* XMLRPC.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B0D3125A1049AD16006B06C6 /* XMLRPCConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = B0D3121A1049A977006B06C6 /* XMLRPCConnection.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B0D3125B1049AD16006B06C6 /* XMLRPCDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B0D3121C1049A977006B06C6 /* XMLRPCDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B0D3125C1049AD16006B06C6 /* XMLRPCEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B0D3121E1049A977006B06C6 /* XMLRPCEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B0D3125D1049AD16006B06C6 /* XMLRPCRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = B0D312201049A977006B06C6 /* XMLRPCRequest.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B0D3125E1049AD16006B06C6 /* XMLRPCResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = B0D312221049A977006B06C6 /* XMLRPCResponse.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B0D3125F1049AD42006B06C6 /* XMLRPCConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D3121B1049A977006B06C6 /* XMLRPCConnection.m */; };
+ B0D312601049AD42006B06C6 /* XMLRPCDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D3121D1049A977006B06C6 /* XMLRPCDecoder.m */; };
+ B0D312611049AD42006B06C6 /* XMLRPCEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D3121F1049A977006B06C6 /* XMLRPCEncoder.m */; };
+ B0D312621049AD42006B06C6 /* XMLRPCRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D312211049A977006B06C6 /* XMLRPCRequest.m */; };
+ B0D312631049AD42006B06C6 /* XMLRPCResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D312231049A977006B06C6 /* XMLRPCResponse.m */; };
+ B0D312641049AD51006B06C6 /* NSDataAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = B0D3120E1049A977006B06C6 /* NSDataAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B0D312651049AD51006B06C6 /* NSStringAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = B0D312101049A977006B06C6 /* NSStringAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ B0D312661049AD5B006B06C6 /* NSDataAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D3120F1049A977006B06C6 /* NSDataAdditions.m */; };
+ B0D312671049AD5B006B06C6 /* NSStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B0D312111049A977006B06C6 /* NSStringAdditions.m */; };
+ B0D312681049AD7F006B06C6 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = B0D312161049A977006B06C6 /* LICENSE */; };
+ B0D312691049AD7F006B06C6 /* README in Resources */ = {isa = PBXBuildFile; fileRef = B0D312171049A977006B06C6 /* README */; };
+ B0D3126A1049AD9A006B06C6 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B0D312141049A977006B06C6 /* Localizable.strings */; };
+ B0D312A01049B26B006B06C6 /* XMLRPC.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = B0D312941049B24A006B06C6 /* XMLRPC.framework */; };
+ D118EA660AC08CCB006DD2FE /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D118EA640AC08CCB006DD2FE /* Localizable.strings */; };
+ D15DEA4A0ABF639500CBE3A5 /* PluginManager.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D15DEA490ABF639500CBE3A5 /* PluginManager.framework */; };
+ D15DEA4F0ABF63C600CBE3A5 /* ApertureToAnselExportPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = D15DEA4D0ABF63C600CBE3A5 /* ApertureToAnselExportPlugin.m */; };
+ D15DEA520ABF641300CBE3A5 /* ApertureToAnselExportPlugin.nib in Resources */ = {isa = PBXBuildFile; fileRef = D15DEA500ABF641300CBE3A5 /* ApertureToAnselExportPlugin.nib */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ B0D312401049AB4A006B06C6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 089C1669FE841209C02AAC07 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = B0D312371049AACC006B06C6;
+ remoteInfo = XMLRPC;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ B0D3124D1049AB8B006B06C6 /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ B0D312A01049B26B006B06C6 /* XMLRPC.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 089C1672FE841209C02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
+ 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
+ 089C167FFE841241C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
+ 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
+ 287924B70DAEB2A20074992A /* ApertureExportManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApertureExportManager.h; sourceTree = "<group>"; };
+ 287924B80DAEB2A20074992A /* ApertureExportPlugIn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApertureExportPlugIn.h; sourceTree = "<group>"; };
+ 287924B90DAEB2A20074992A /* ApertureSDKCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApertureSDKCommon.h; sourceTree = "<group>"; };
+ 32DBCF630370AF2F00C91783 /* ApertureToAnselExportPlugin_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApertureToAnselExportPlugin_Prefix.pch; sourceTree = "<group>"; };
+ 8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ B0AE230B1049F19D0096565B /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Panel.nib; sourceTree = "<group>"; };
+ B0AE23351049F7770096565B /* TURAnselGalleryPanelController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnselGalleryPanelController.h; sourceTree = "<group>"; };
+ B0AE23361049F7770096565B /* TURAnselGalleryPanelController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnselGalleryPanelController.m; sourceTree = "<group>"; };
+ B0AE233E1049F7A20096565B /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/AnselGalleryPanel.nib; sourceTree = "<group>"; };
+ B0D311CA1049A7DE006B06C6 /* TURAnsel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnsel.h; sourceTree = "<group>"; };
+ B0D311CB1049A7DE006B06C6 /* TURAnsel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnsel.m; sourceTree = "<group>"; };
+ B0D311CC1049A7DE006B06C6 /* TURAnselGallery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnselGallery.h; sourceTree = "<group>"; };
+ B0D311CD1049A7DE006B06C6 /* TURAnselGallery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnselGallery.m; sourceTree = "<group>"; };
+ B0D311CE1049A7DE006B06C6 /* TURXMLConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURXMLConnection.h; sourceTree = "<group>"; };
+ B0D311CF1049A7DE006B06C6 /* TURXMLConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURXMLConnection.m; sourceTree = "<group>"; };
+ B0D3120E1049A977006B06C6 /* NSDataAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDataAdditions.h; sourceTree = "<group>"; };
+ B0D3120F1049A977006B06C6 /* NSDataAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDataAdditions.m; sourceTree = "<group>"; };
+ B0D312101049A977006B06C6 /* NSStringAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSStringAdditions.h; sourceTree = "<group>"; };
+ B0D312111049A977006B06C6 /* NSStringAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSStringAdditions.m; sourceTree = "<group>"; };
+ B0D312151049A977006B06C6 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = "<group>"; };
+ B0D312161049A977006B06C6 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
+ B0D312171049A977006B06C6 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
+ B0D312181049A977006B06C6 /* XMLRPC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPC.h; sourceTree = "<group>"; };
+ B0D312191049A977006B06C6 /* XMLRPC.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPC.pch; sourceTree = "<group>"; };
+ B0D3121A1049A977006B06C6 /* XMLRPCConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPCConnection.h; sourceTree = "<group>"; };
+ B0D3121B1049A977006B06C6 /* XMLRPCConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLRPCConnection.m; sourceTree = "<group>"; };
+ B0D3121C1049A977006B06C6 /* XMLRPCDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPCDecoder.h; sourceTree = "<group>"; };
+ B0D3121D1049A977006B06C6 /* XMLRPCDecoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLRPCDecoder.m; sourceTree = "<group>"; };
+ B0D3121E1049A977006B06C6 /* XMLRPCEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPCEncoder.h; sourceTree = "<group>"; };
+ B0D3121F1049A977006B06C6 /* XMLRPCEncoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLRPCEncoder.m; sourceTree = "<group>"; };
+ B0D312201049A977006B06C6 /* XMLRPCRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPCRequest.h; sourceTree = "<group>"; };
+ B0D312211049A977006B06C6 /* XMLRPCRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLRPCRequest.m; sourceTree = "<group>"; };
+ B0D312221049A977006B06C6 /* XMLRPCResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPCResponse.h; sourceTree = "<group>"; };
+ B0D312231049A977006B06C6 /* XMLRPCResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLRPCResponse.m; sourceTree = "<group>"; };
+ B0D312311049A9F2006B06C6 /* XMLRPC-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "XMLRPC-Info.plist"; sourceTree = "<group>"; };
+ B0D312391049AACC006B06C6 /* XMLRPC-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "XMLRPC-Info.plist"; sourceTree = "<group>"; };
+ B0D312941049B24A006B06C6 /* XMLRPC.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = XMLRPC.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D118EA650AC08CCB006DD2FE /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = "<group>"; };
+ D118EB0F0AC08EAE006DD2FE /* ApertureToAnselExportPlugin.ApertureExport */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ApertureToAnselExportPlugin.ApertureExport; sourceTree = BUILT_PRODUCTS_DIR; };
+ D15DEA490ABF639500CBE3A5 /* PluginManager.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PluginManager.framework; path = /Library/Frameworks/PluginManager.framework; sourceTree = "<absolute>"; };
+ D15DEA4D0ABF63C600CBE3A5 /* ApertureToAnselExportPlugin.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = ApertureToAnselExportPlugin.m; sourceTree = "<group>"; };
+ D15DEA4E0ABF63C600CBE3A5 /* ApertureToAnselExportPlugin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ApertureToAnselExportPlugin.h; sourceTree = "<group>"; };
+ D15DEA510ABF641300CBE3A5 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/ApertureToAnselExportPlugin.nib; sourceTree = "<group>"; };
+ D2F7E65807B2D6F200F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8D5B49B3048680CD000E48DA /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */,
+ D15DEA4A0ABF639500CBE3A5 /* PluginManager.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ B0D312361049AACC006B06C6 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 089C166AFE841209C02AAC07 /* MyApertureExportPlugIn */ = {
+ isa = PBXGroup;
+ children = (
+ B0D312931049B17F006B06C6 /* AnselToolkit */,
+ 287924B60DAEB2A20074992A /* ApertureHeaders */,
+ 08FB77AFFE84173DC02AAC07 /* Classes */,
+ 32C88E010371C26100C91783 /* Other Sources */,
+ 089C167CFE841241C02AAC07 /* Resources */,
+ 089C1671FE841209C02AAC07 /* Frameworks and Libraries */,
+ D118EB1C0AC08EE7006DD2FE /* Products */,
+ B0D312391049AACC006B06C6 /* XMLRPC-Info.plist */,
+ );
+ name = MyApertureExportPlugIn;
+ sourceTree = "<group>";
+ };
+ 089C1671FE841209C02AAC07 /* Frameworks and Libraries */ = {
+ isa = PBXGroup;
+ children = (
+ B0D3120C1049A977006B06C6 /* xmlrpc-1.5.1 */,
+ 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */,
+ 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */,
+ );
+ name = "Frameworks and Libraries";
+ sourceTree = "<group>";
+ };
+ 089C167CFE841241C02AAC07 /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ B0AE233D1049F7A20096565B /* AnselGalleryPanel.nib */,
+ B0AE230A1049F19D0096565B /* Panel.nib */,
+ D15DEA500ABF641300CBE3A5 /* ApertureToAnselExportPlugin.nib */,
+ 8D5B49B7048680CD000E48DA /* Info.plist */,
+ D118EA640AC08CCB006DD2FE /* Localizable.strings */,
+ 089C167DFE841241C02AAC07 /* InfoPlist.strings */,
+ );
+ name = Resources;
+ sourceTree = "<group>";
+ };
+ 08FB77AFFE84173DC02AAC07 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ D15DEA4E0ABF63C600CBE3A5 /* ApertureToAnselExportPlugin.h */,
+ D15DEA4D0ABF63C600CBE3A5 /* ApertureToAnselExportPlugin.m */,
+ );
+ name = Classes;
+ sourceTree = "<group>";
+ };
+ 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ D15DEA490ABF639500CBE3A5 /* PluginManager.framework */,
+ 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */,
+ );
+ name = "Linked Frameworks";
+ sourceTree = "<group>";
+ };
+ 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 089C167FFE841241C02AAC07 /* AppKit.framework */,
+ D2F7E65807B2D6F200F64583 /* CoreData.framework */,
+ 089C1672FE841209C02AAC07 /* Foundation.framework */,
+ );
+ name = "Other Frameworks";
+ sourceTree = "<group>";
+ };
+ 287924B60DAEB2A20074992A /* ApertureHeaders */ = {
+ isa = PBXGroup;
+ children = (
+ 287924B70DAEB2A20074992A /* ApertureExportManager.h */,
+ 287924B80DAEB2A20074992A /* ApertureExportPlugIn.h */,
+ 287924B90DAEB2A20074992A /* ApertureSDKCommon.h */,
+ );
+ path = ApertureHeaders;
+ sourceTree = "<group>";
+ };
+ 32C88E010371C26100C91783 /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ B0D311CF1049A7DE006B06C6 /* TURXMLConnection.m */,
+ B0D311CE1049A7DE006B06C6 /* TURXMLConnection.h */,
+ 32DBCF630370AF2F00C91783 /* ApertureToAnselExportPlugin_Prefix.pch */,
+ );
+ name = "Other Sources";
+ sourceTree = "<group>";
+ };
+ B0D3120C1049A977006B06C6 /* xmlrpc-1.5.1 */ = {
+ isa = PBXGroup;
+ children = (
+ B0D312311049A9F2006B06C6 /* XMLRPC-Info.plist */,
+ B0D3120D1049A977006B06C6 /* Additions */,
+ B0D312131049A977006B06C6 /* Languages */,
+ B0D312161049A977006B06C6 /* LICENSE */,
+ B0D312171049A977006B06C6 /* README */,
+ B0D312181049A977006B06C6 /* XMLRPC.h */,
+ B0D312191049A977006B06C6 /* XMLRPC.pch */,
+ B0D3121A1049A977006B06C6 /* XMLRPCConnection.h */,
+ B0D3121B1049A977006B06C6 /* XMLRPCConnection.m */,
+ B0D3121C1049A977006B06C6 /* XMLRPCDecoder.h */,
+ B0D3121D1049A977006B06C6 /* XMLRPCDecoder.m */,
+ B0D3121E1049A977006B06C6 /* XMLRPCEncoder.h */,
+ B0D3121F1049A977006B06C6 /* XMLRPCEncoder.m */,
+ B0D312201049A977006B06C6 /* XMLRPCRequest.h */,
+ B0D312211049A977006B06C6 /* XMLRPCRequest.m */,
+ B0D312221049A977006B06C6 /* XMLRPCResponse.h */,
+ B0D312231049A977006B06C6 /* XMLRPCResponse.m */,
+ );
+ path = "xmlrpc-1.5.1";
+ sourceTree = "<group>";
+ };
+ B0D3120D1049A977006B06C6 /* Additions */ = {
+ isa = PBXGroup;
+ children = (
+ B0D3120E1049A977006B06C6 /* NSDataAdditions.h */,
+ B0D3120F1049A977006B06C6 /* NSDataAdditions.m */,
+ B0D312101049A977006B06C6 /* NSStringAdditions.h */,
+ B0D312111049A977006B06C6 /* NSStringAdditions.m */,
+ );
+ path = Additions;
+ sourceTree = "<group>";
+ };
+ B0D312131049A977006B06C6 /* Languages */ = {
+ isa = PBXGroup;
+ children = (
+ B0D312141049A977006B06C6 /* Localizable.strings */,
+ );
+ path = Languages;
+ sourceTree = "<group>";
+ };
+ B0D312931049B17F006B06C6 /* AnselToolkit */ = {
+ isa = PBXGroup;
+ children = (
+ B0AE23351049F7770096565B /* TURAnselGalleryPanelController.h */,
+ B0AE23361049F7770096565B /* TURAnselGalleryPanelController.m */,
+ B0D311CC1049A7DE006B06C6 /* TURAnselGallery.h */,
+ B0D311CB1049A7DE006B06C6 /* TURAnsel.m */,
+ B0D311CA1049A7DE006B06C6 /* TURAnsel.h */,
+ B0D311CD1049A7DE006B06C6 /* TURAnselGallery.m */,
+ );
+ name = AnselToolkit;
+ sourceTree = "<group>";
+ };
+ D118EB1C0AC08EE7006DD2FE /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ B0D312941049B24A006B06C6 /* XMLRPC.framework */,
+ D118EB0F0AC08EAE006DD2FE /* ApertureToAnselExportPlugin.ApertureExport */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+ B0D312331049AACC006B06C6 /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ B0D312641049AD51006B06C6 /* NSDataAdditions.h in Headers */,
+ B0D312651049AD51006B06C6 /* NSStringAdditions.h in Headers */,
+ B0D3125A1049AD16006B06C6 /* XMLRPCConnection.h in Headers */,
+ B0D3125B1049AD16006B06C6 /* XMLRPCDecoder.h in Headers */,
+ B0D3125C1049AD16006B06C6 /* XMLRPCEncoder.h in Headers */,
+ B0D3125D1049AD16006B06C6 /* XMLRPCRequest.h in Headers */,
+ B0D3125E1049AD16006B06C6 /* XMLRPCResponse.h in Headers */,
+ B0D312591049AD08006B06C6 /* XMLRPC.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+ 8D5B49AC048680CD000E48DA /* ApertureToAnselExportPlugin */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1DEB913A08733D840010E9CD /* Build configuration list for PBXNativeTarget "ApertureToAnselExportPlugin" */;
+ buildPhases = (
+ 8D5B49AF048680CD000E48DA /* Resources */,
+ 8D5B49B1048680CD000E48DA /* Sources */,
+ 8D5B49B3048680CD000E48DA /* Frameworks */,
+ B0D3124D1049AB8B006B06C6 /* CopyFiles */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ B0D312411049AB4A006B06C6 /* PBXTargetDependency */,
+ );
+ name = ApertureToAnselExportPlugin;
+ productInstallPath = "$(HOME)/Library/Bundles";
+ productName = MyApertureExportPlugIn;
+ productReference = D118EB0F0AC08EAE006DD2FE /* ApertureToAnselExportPlugin.ApertureExport */;
+ productType = "com.apple.product-type.bundle";
+ };
+ B0D312371049AACC006B06C6 /* XMLRPC */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = B0D3123C1049AACD006B06C6 /* Build configuration list for PBXNativeTarget "XMLRPC" */;
+ buildPhases = (
+ B0D312331049AACC006B06C6 /* Headers */,
+ B0D312341049AACC006B06C6 /* Resources */,
+ B0D312351049AACC006B06C6 /* Sources */,
+ B0D312361049AACC006B06C6 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = XMLRPC;
+ productName = XMLRPC;
+ productReference = B0D312941049B24A006B06C6 /* XMLRPC.framework */;
+ productType = "com.apple.product-type.framework";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 089C1669FE841209C02AAC07 /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "ApertureToAnselExportPlugin" */;
+ compatibilityVersion = "Xcode 2.4";
+ hasScannedForEncodings = 1;
+ mainGroup = 089C166AFE841209C02AAC07 /* MyApertureExportPlugIn */;
+ productRefGroup = 089C166AFE841209C02AAC07 /* MyApertureExportPlugIn */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 8D5B49AC048680CD000E48DA /* ApertureToAnselExportPlugin */,
+ B0D312371049AACC006B06C6 /* XMLRPC */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 8D5B49AF048680CD000E48DA /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */,
+ D15DEA520ABF641300CBE3A5 /* ApertureToAnselExportPlugin.nib in Resources */,
+ D118EA660AC08CCB006DD2FE /* Localizable.strings in Resources */,
+ B0D312271049A977006B06C6 /* Localizable.strings in Resources */,
+ B0D312281049A977006B06C6 /* LICENSE in Resources */,
+ B0D312291049A977006B06C6 /* README in Resources */,
+ B0D312321049A9F2006B06C6 /* XMLRPC-Info.plist in Resources */,
+ B0AE230C1049F19D0096565B /* Panel.nib in Resources */,
+ B0AE23411049F7A20096565B /* AnselGalleryPanel.nib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ B0D312341049AACC006B06C6 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ B0D3126A1049AD9A006B06C6 /* Localizable.strings in Resources */,
+ B0D312681049AD7F006B06C6 /* LICENSE in Resources */,
+ B0D312691049AD7F006B06C6 /* README in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8D5B49B1048680CD000E48DA /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ D15DEA4F0ABF63C600CBE3A5 /* ApertureToAnselExportPlugin.m in Sources */,
+ B0D311D01049A7DE006B06C6 /* TURAnsel.m in Sources */,
+ B0D311D11049A7DE006B06C6 /* TURAnselGallery.m in Sources */,
+ B0D311D21049A7DE006B06C6 /* TURXMLConnection.m in Sources */,
+ B0D312241049A977006B06C6 /* NSDataAdditions.m in Sources */,
+ B0D312251049A977006B06C6 /* NSStringAdditions.m in Sources */,
+ B0D3122A1049A977006B06C6 /* XMLRPCConnection.m in Sources */,
+ B0D3122B1049A977006B06C6 /* XMLRPCDecoder.m in Sources */,
+ B0D3122C1049A977006B06C6 /* XMLRPCEncoder.m in Sources */,
+ B0D3122D1049A977006B06C6 /* XMLRPCRequest.m in Sources */,
+ B0D3122E1049A977006B06C6 /* XMLRPCResponse.m in Sources */,
+ B0AE23391049F7770096565B /* TURAnselGalleryPanelController.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ B0D312351049AACC006B06C6 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ B0D312661049AD5B006B06C6 /* NSDataAdditions.m in Sources */,
+ B0D312671049AD5B006B06C6 /* NSStringAdditions.m in Sources */,
+ B0D3125F1049AD42006B06C6 /* XMLRPCConnection.m in Sources */,
+ B0D312601049AD42006B06C6 /* XMLRPCDecoder.m in Sources */,
+ B0D312611049AD42006B06C6 /* XMLRPCEncoder.m in Sources */,
+ B0D312621049AD42006B06C6 /* XMLRPCRequest.m in Sources */,
+ B0D312631049AD42006B06C6 /* XMLRPCResponse.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ B0D312411049AB4A006B06C6 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = B0D312371049AACC006B06C6 /* XMLRPC */;
+ targetProxy = B0D312401049AB4A006B06C6 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 089C167DFE841241C02AAC07 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C167EFE841241C02AAC07 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "<group>";
+ };
+ B0AE230A1049F19D0096565B /* Panel.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ B0AE230B1049F19D0096565B /* English */,
+ );
+ name = Panel.nib;
+ sourceTree = "<group>";
+ };
+ B0AE233D1049F7A20096565B /* AnselGalleryPanel.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ B0AE233E1049F7A20096565B /* English */,
+ );
+ name = AnselGalleryPanel.nib;
+ sourceTree = "<group>";
+ };
+ B0D312141049A977006B06C6 /* Localizable.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ B0D312151049A977006B06C6 /* English */,
+ );
+ name = Localizable.strings;
+ sourceTree = "<group>";
+ };
+ D118EA640AC08CCB006DD2FE /* Localizable.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D118EA650AC08CCB006DD2FE /* English */,
+ );
+ name = Localizable.strings;
+ sourceTree = "<group>";
+ };
+ D15DEA500ABF641300CBE3A5 /* ApertureToAnselExportPlugin.nib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ D15DEA510ABF641300CBE3A5 /* English */,
+ );
+ name = ApertureToAnselExportPlugin.nib;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 1DEB913B08733D840010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ DEPLOYMENT_LOCATION = YES;
+ DSTROOT = /;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = ApertureToAnselExportPlugin_Prefix.pch;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "/Users/mrubinsk/Library/Application Support/Aperture/Plug-Ins";
+ PRODUCT_NAME = ApertureToAnselExportPlugin;
+ SDKROOT = /Developer/SDKs/MacOSX10.5.sdk;
+ WRAPPER_EXTENSION = ApertureExport;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ 1DEB913C08733D840010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = (
+ ppc,
+ i386,
+ );
+ DSTROOT = /;
+ GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = ApertureToAnselExportPlugin_Prefix.pch;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Library/Application Support/Aperture/Plug-Ins/Export/";
+ PRODUCT_NAME = ApertureToAnselExportPlugin;
+ WRAPPER_EXTENSION = ApertureExport;
+ };
+ name = Release;
+ };
+ 1DEB913F08733D840010E9CD /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ FRAMEWORK_SEARCH_PATHS = "/Library/Frameworks//**";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+ };
+ name = Debug;
+ };
+ 1DEB914008733D840010E9CD /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = (
+ ppc,
+ i386,
+ );
+ FRAMEWORK_SEARCH_PATHS = "/Library/Frameworks//**";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+ };
+ name = Release;
+ };
+ B0D3123A1049AACC006B06C6 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = NO;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ FRAMEWORK_VERSION = A;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
+ INFOPLIST_FILE = "XMLRPC-Info.plist";
+ INSTALL_PATH = "$(HOME)/Library/Frameworks";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Foundation,
+ "-framework",
+ AppKit,
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = XMLRPC;
+ };
+ name = Debug;
+ };
+ B0D3123B1049AACC006B06C6 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ COPY_PHASE_STRIP = YES;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ FRAMEWORK_VERSION = A;
+ GCC_ENABLE_FIX_AND_CONTINUE = NO;
+ GCC_MODEL_TUNING = G5;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
+ INFOPLIST_FILE = "XMLRPC-Info.plist";
+ INSTALL_PATH = "@loader_path/../Frameworks";
+ OTHER_LDFLAGS = (
+ "-framework",
+ Foundation,
+ "-framework",
+ AppKit,
+ );
+ PREBINDING = NO;
+ PRODUCT_NAME = XMLRPC;
+ ZERO_LINK = NO;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1DEB913A08733D840010E9CD /* Build configuration list for PBXNativeTarget "ApertureToAnselExportPlugin" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB913B08733D840010E9CD /* Debug */,
+ 1DEB913C08733D840010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "ApertureToAnselExportPlugin" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1DEB913F08733D840010E9CD /* Debug */,
+ 1DEB914008733D840010E9CD /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ B0D3123C1049AACD006B06C6 /* Build configuration list for PBXNativeTarget "XMLRPC" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ B0D3123A1049AACC006B06C6 /* Debug */,
+ B0D3123B1049AACC006B06C6 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 089C1669FE841209C02AAC07 /* Project object */;
+}
--- /dev/null
+//
+// Prefix header for all source files of the 'MyApertureExportPlugIn' target in the 'MyApertureExportPlugIn' project.
+//
+
+#ifdef __OBJC__
+ #import <Cocoa/Cocoa.h>
+#endif
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.02">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">9F33</string>
+ <string key="IBDocument.InterfaceBuilderVersion">672</string>
+ <string key="IBDocument.AppKitVersion">949.34</string>
+ <string key="IBDocument.HIToolboxVersion">352.00</string>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="15"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="1001">
+ <string key="NSClassName">TURAnselGalleryPanelController</string>
+ </object>
+ <object class="NSCustomObject" id="1003">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="1004">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="1005">
+ <int key="NSWindowStyleMask">19</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{797, 724}, {267, 276}}</string>
+ <int key="NSWTFlags">-536866816</int>
+ <string key="NSWindowTitle">New Gallery</string>
+ <string key="NSWindowClass">NSPanel</string>
+ <nil key="NSViewClass"/>
+ <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <object class="NSView" key="NSWindowView" id="1006">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="142371246">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{20, 219}, {227, 22}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="104713052">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <object class="NSFont" key="NSSupport" id="1035187758">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.300000e+01</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="142371246"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor" id="926502601">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textBackgroundColor</string>
+ <object class="NSColor" key="NSColor" id="537053071">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="649170679">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textColor</string>
+ <object class="NSColor" key="NSColor" id="957332318">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="970595672">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 240}, {88, 16}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="303822681">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Gallery Name</string>
+ <object class="NSFont" key="NSSupport" id="849304139">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.200000e+01</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <reference key="NSControlView" ref="970595672"/>
+ <object class="NSColor" key="NSBackgroundColor" id="264684485">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor" id="961976611">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="339290383">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <reference key="NSColor" ref="957332318"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="768485006">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 195}, {73, 16}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="441648904">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Gallery Slug</string>
+ <reference key="NSSupport" ref="849304139"/>
+ <reference key="NSControlView" ref="768485006"/>
+ <reference key="NSBackgroundColor" ref="264684485"/>
+ <reference key="NSTextColor" ref="339290383"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="887381497">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{20, 174}, {227, 22}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="347914051">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="1035187758"/>
+ <reference key="NSControlView" ref="887381497"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="926502601"/>
+ <reference key="NSTextColor" ref="649170679"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="703267117">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{20, 103}, {227, 47}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="116149712">
+ <int key="NSCellFlags">-1805517311</int>
+ <int key="NSCellFlags2">272629760</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="1035187758"/>
+ <reference key="NSControlView" ref="703267117"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="926502601"/>
+ <reference key="NSTextColor" ref="649170679"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="568388187">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 150}, {124, 16}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="774003593">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Gallery Description</string>
+ <reference key="NSSupport" ref="849304139"/>
+ <reference key="NSControlView" ref="568388187"/>
+ <reference key="NSBackgroundColor" ref="264684485"/>
+ <reference key="NSTextColor" ref="339290383"/>
+ </object>
+ </object>
+ <object class="NSButton" id="64211119">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{116, 12}, {68, 32}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="490284298">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Cancel</string>
+ <reference key="NSSupport" ref="1035187758"/>
+ <reference key="NSControlView" ref="64211119"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="184111456">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{184, 12}, {69, 32}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="13003559">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Save</string>
+ <reference key="NSSupport" ref="1035187758"/>
+ <reference key="NSControlView" ref="184111456"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSComboBox" id="137843971">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{20, 56}, {230, 26}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSComboBoxCell" key="NSCell" id="625134106">
+ <int key="NSCellFlags">879885888</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="1035187758"/>
+ <reference key="NSControlView" ref="137843971"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="926502601"/>
+ <reference key="NSTextColor" ref="339290383"/>
+ <int key="NSVisibleItemCount">5</int>
+ <bool key="NSHasVerticalScroller">YES</bool>
+ <reference key="NSDelegate" ref="137843971"/>
+ <object class="NSComboTableView" key="NSTableView" id="677168914">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrameSize">{15, 0}</string>
+ <reference key="NSSuperview"/>
+ <reference key="NSWindow"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSMutableArray" key="NSTableColumns">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableColumn">
+ <integer value="0" key="NSIdentifier" id="8"/>
+ <double key="NSWidth">1.200000e+01</double>
+ <double key="NSMinWidth">1.000000e+01</double>
+ <double key="NSMaxWidth">1.000000e+03</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628032</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="849304139"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+ </object>
+ <reference key="NSTextColor" ref="537053071"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <reference key="NSSupport" ref="1035187758"/>
+ <reference key="NSControlView" ref="677168914"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor" id="525076026">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlBackgroundColor</string>
+ <reference key="NSColor" ref="961976611"/>
+ </object>
+ <reference key="NSTextColor" ref="339290383"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <reference key="NSTableView" ref="677168914"/>
+ </object>
+ </object>
+ <double key="NSIntercellSpacingWidth">3.000000e+00</double>
+ <double key="NSIntercellSpacingHeight">2.000000e+00</double>
+ <reference key="NSBackgroundColor" ref="525076026"/>
+ <object class="NSColor" key="NSGridColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">gridColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC41AA</bytes>
+ </object>
+ </object>
+ <double key="NSRowHeight">1.900000e+01</double>
+ <string key="NSAction">tableViewAction:</string>
+ <int key="NSTvFlags">-767524864</int>
+ <reference key="NSDelegate" ref="625134106"/>
+ <reference key="NSDataSource" ref="625134106"/>
+ <reference key="NSTarget" ref="625134106"/>
+ <int key="NSColumnAutoresizingStyle">1</int>
+ <int key="NSDraggingSourceMaskForLocal">15</int>
+ <int key="NSDraggingSourceMaskForNonLocal">0</int>
+ <bool key="NSAllowsTypeSelect">YES</bool>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="793482582">
+ <reference key="NSNextResponder" ref="1006"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 79}, {88, 16}}</string>
+ <reference key="NSSuperview" ref="1006"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="657594086">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Gallery Parent</string>
+ <reference key="NSSupport" ref="849304139"/>
+ <reference key="NSControlView" ref="793482582"/>
+ <reference key="NSBackgroundColor" ref="264684485"/>
+ <reference key="NSTextColor" ref="339290383"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{267, 276}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
+ <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ </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">newGallerySheet</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="1005"/>
+ </object>
+ <int key="connectionID">43</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">doNewGallery:</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="184111456"/>
+ </object>
+ <int key="connectionID">48</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">galleryDescTextField</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="703267117"/>
+ </object>
+ <int key="connectionID">49</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">galleryNameTextField</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="142371246"/>
+ </object>
+ <int key="connectionID">50</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">gallerySlugTextField</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="887381497"/>
+ </object>
+ <int key="connectionID">51</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">cancelNewGallery:</string>
+ <reference key="source" ref="1001"/>
+ <reference key="destination" ref="490284298"/>
+ </object>
+ <int key="connectionID">53</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>
+ <object class="NSArray" key="object" id="1002">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="1000"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="1001"/>
+ <reference key="parent" ref="1002"/>
+ <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="1003"/>
+ <reference key="parent" ref="1002"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="1004"/>
+ <reference key="parent" ref="1002"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">1</int>
+ <reference key="object" ref="1005"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1006"/>
+ </object>
+ <reference key="parent" ref="1002"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">2</int>
+ <reference key="object" ref="1006"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="142371246"/>
+ <reference ref="970595672"/>
+ <reference ref="768485006"/>
+ <reference ref="887381497"/>
+ <reference ref="703267117"/>
+ <reference ref="568388187"/>
+ <reference ref="137843971"/>
+ <reference ref="793482582"/>
+ <reference ref="64211119"/>
+ <reference ref="184111456"/>
+ </object>
+ <reference key="parent" ref="1005"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">3</int>
+ <reference key="object" ref="142371246"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="104713052"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">4</int>
+ <reference key="object" ref="104713052"/>
+ <reference key="parent" ref="142371246"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="970595672"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="303822681"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">6</int>
+ <reference key="object" ref="303822681"/>
+ <reference key="parent" ref="970595672"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">7</int>
+ <reference key="object" ref="768485006"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="441648904"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">8</int>
+ <reference key="object" ref="441648904"/>
+ <reference key="parent" ref="768485006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">9</int>
+ <reference key="object" ref="887381497"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="347914051"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">10</int>
+ <reference key="object" ref="347914051"/>
+ <reference key="parent" ref="887381497"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">11</int>
+ <reference key="object" ref="703267117"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="116149712"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">12</int>
+ <reference key="object" ref="116149712"/>
+ <reference key="parent" ref="703267117"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">13</int>
+ <reference key="object" ref="568388187"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="774003593"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">14</int>
+ <reference key="object" ref="774003593"/>
+ <reference key="parent" ref="568388187"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">15</int>
+ <reference key="object" ref="64211119"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="490284298"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">16</int>
+ <reference key="object" ref="490284298"/>
+ <reference key="parent" ref="64211119"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">17</int>
+ <reference key="object" ref="184111456"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="13003559"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">18</int>
+ <reference key="object" ref="13003559"/>
+ <reference key="parent" ref="184111456"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">19</int>
+ <reference key="object" ref="137843971"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="625134106"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">20</int>
+ <reference key="object" ref="625134106"/>
+ <reference key="parent" ref="137843971"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">21</int>
+ <reference key="object" ref="793482582"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="657594086"/>
+ </object>
+ <reference key="parent" ref="1006"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">22</int>
+ <reference key="object" ref="657594086"/>
+ <reference key="parent" ref="793482582"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.IBPluginDependency</string>
+ <string>-2.IBPluginDependency</string>
+ <string>-3.IBPluginDependency</string>
+ <string>1.IBEditorWindowLastContentRect</string>
+ <string>1.IBPluginDependency</string>
+ <string>1.IBWindowTemplateEditedContentRect</string>
+ <string>1.NSWindowTemplate.visibleAtLaunch</string>
+ <string>1.WindowOrigin</string>
+ <string>1.editorWindowContentRectSynchronizationRect</string>
+ <string>10.IBPluginDependency</string>
+ <string>11.IBPluginDependency</string>
+ <string>12.IBPluginDependency</string>
+ <string>13.IBPluginDependency</string>
+ <string>14.IBPluginDependency</string>
+ <string>15.IBPluginDependency</string>
+ <string>16.IBPluginDependency</string>
+ <string>17.IBPluginDependency</string>
+ <string>18.IBPluginDependency</string>
+ <string>19.IBPluginDependency</string>
+ <string>2.IBPluginDependency</string>
+ <string>20.IBPluginDependency</string>
+ <string>21.IBPluginDependency</string>
+ <string>22.IBPluginDependency</string>
+ <string>3.IBPluginDependency</string>
+ <string>4.IBPluginDependency</string>
+ <string>5.IBPluginDependency</string>
+ <string>6.IBPluginDependency</string>
+ <string>7.IBPluginDependency</string>
+ <string>8.IBPluginDependency</string>
+ <string>9.IBPluginDependency</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{177, 722}, {267, 276}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{177, 722}, {267, 276}}</string>
+ <reference ref="8"/>
+ <string>{196, 240}</string>
+ <string>{{357, 418}, {480, 270}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <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>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">53</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">TURAnsel.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">TURAnselGallery.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier" id="855842895">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">TURAnselGalleryPanelController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">xmlrpc-1.5.1/XMLRPCConnection.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">TURAnselGalleryPanelController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>cancelNewGallery:</string>
+ <string>doNewGallery:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>delegate</string>
+ <string>galleryDescTextField</string>
+ <string>galleryNameTextField</string>
+ <string>gallerySlugTextField</string>
+ <string>newGallerySheet</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>NSTextField</string>
+ <string>NSTextField</string>
+ <string>NSTextField</string>
+ <string>NSPanel</string>
+ </object>
+ </object>
+ <reference key="sourceIdentifier" ref="855842895"/>
+ </object>
+ </object>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../iPhoto2Ansel.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IBClasses</key>
+ <array>
+ <dict>
+ <key>CLASS</key>
+ <string>FirstResponder</string>
+ <key>LANGUAGE</key>
+ <string>ObjC</string>
+ <key>SUPERCLASS</key>
+ <string>NSObject</string>
+ </dict>
+ <dict>
+ <key>CLASS</key>
+ <string>NSObject</string>
+ <key>LANGUAGE</key>
+ <string>ObjC</string>
+ </dict>
+ <dict>
+ <key>ACTIONS</key>
+ <dict>
+ <key>clickCancelConnect</key>
+ <string>id</string>
+ <key>clickServer</key>
+ <string>id</string>
+ <key>clickViewGallery</key>
+ <string>id</string>
+ <key>closeGalleryView</key>
+ <string>id</string>
+ <key>closeServerList</key>
+ <string>id</string>
+ <key>doAddServer</key>
+ <string>id</string>
+ <key>doCancelAddServer</key>
+ <string>id</string>
+ <key>removeServer</key>
+ <string>id</string>
+ <key>showNewGallery</key>
+ <string>id</string>
+ </dict>
+ <key>CLASS</key>
+ <string>ApertureToAnselExportPlugin</string>
+ <key>LANGUAGE</key>
+ <string>ObjC</string>
+ <key>OUTLETS</key>
+ <dict>
+ <key>anselController</key>
+ <string>id</string>
+ <key>browserView</key>
+ <string>IKImageBrowserView</string>
+ <key>closeGalleryView</key>
+ <string>NSButton</string>
+ <key>defaultImageView</key>
+ <string>NSImageView</string>
+ <key>firstView</key>
+ <string>NSView</string>
+ <key>galleryCombo</key>
+ <string>NSComboBox</string>
+ <key>lastView</key>
+ <string>NSView</string>
+ <key>mCancelConnect</key>
+ <string>NSButton</string>
+ <key>mImageCountLabel</key>
+ <string>NSTextField</string>
+ <key>mMakeNewServerDefault</key>
+ <string>NSButton</string>
+ <key>mNewGalleryButton</key>
+ <string>NSButton</string>
+ <key>mServerSheetHostURL</key>
+ <string>NSTextField</string>
+ <key>mServerSheetPassword</key>
+ <string>NSSecureTextField</string>
+ <key>mServerSheetServerNickName</key>
+ <string>NSTextField</string>
+ <key>mServerSheetUsername</key>
+ <string>NSTextField</string>
+ <key>mServersPopUp</key>
+ <string>NSPopUpButton</string>
+ <key>mviewGallerySheet</key>
+ <string>NSWindow</string>
+ <key>newServerSheet</key>
+ <string>NSWindow</string>
+ <key>serverListPanel</key>
+ <string>NSPanel</string>
+ <key>serverTable</key>
+ <string>NSTableView</string>
+ <key>settingsView</key>
+ <string>NSView</string>
+ <key>spinner</key>
+ <string>NSProgressIndicator</string>
+ <key>statusLabel</key>
+ <string>NSTextField</string>
+ <key>viewGallery</key>
+ <string>NSButton</string>
+ </dict>
+ <key>SUPERCLASS</key>
+ <string>NSObject</string>
+ </dict>
+ </array>
+ <key>IBVersion</key>
+ <string>1</string>
+</dict>
+</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>IBFramework Version</key>
+ <string>672</string>
+ <key>IBLastKnownRelativeProjectPath</key>
+ <string>../ApertureToAnselExportPlugin.xcodeproj</string>
+ <key>IBOldestOS</key>
+ <integer>5</integer>
+ <key>IBOpenObjects</key>
+ <array>
+ <integer>63</integer>
+ </array>
+ <key>IBSystem Version</key>
+ <string>9L30</string>
+ <key>targetFramework</key>
+ <string>IBCocoaFramework</string>
+</dict>
+</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.02">
+ <data>
+ <int key="IBDocument.SystemTarget">1050</int>
+ <string key="IBDocument.SystemVersion">9J61</string>
+ <string key="IBDocument.InterfaceBuilderVersion">672</string>
+ <string key="IBDocument.AppKitVersion">949.46</string>
+ <string key="IBDocument.HIToolboxVersion">353.00</string>
+ <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <integer value="137"/>
+ <integer value="577"/>
+ </object>
+ <object class="NSArray" key="IBDocument.PluginDependencies">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.imagekit.ibplugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ </object>
+ <object class="NSMutableArray" key="IBDocument.RootObjects" id="192295378">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSCustomObject" id="685567789">
+ <string key="NSClassName">AnselExportController</string>
+ </object>
+ <object class="NSCustomObject" id="357158831">
+ <string key="NSClassName">FirstResponder</string>
+ </object>
+ <object class="NSCustomObject" id="377299838">
+ <string key="NSClassName">NSApplication</string>
+ </object>
+ <object class="NSWindowTemplate" id="920958882">
+ <int key="NSWindowStyleMask">23</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{196, 315}, {455, 195}}</string>
+ <int key="NSWTFlags">-1543503872</int>
+ <string key="NSWindowTitle">Add Server</string>
+ <string key="NSWindowClass">NSPanel</string>
+ <nil key="NSViewClass"/>
+ <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <object class="NSView" key="NSWindowView" id="345710193">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="143194876">
+ <reference key="NSNextResponder" ref="345710193"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{124, 124}, {311, 22}}</string>
+ <reference key="NSSuperview" ref="345710193"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="954322263">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <object class="NSFont" key="NSSupport" id="1065031457">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.300000e+01</double>
+ <int key="NSfFlags">1044</int>
+ </object>
+ <reference key="NSControlView" ref="143194876"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <object class="NSColor" key="NSBackgroundColor" id="453091517">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textBackgroundColor</string>
+ <object class="NSColor" key="NSColor" id="287527735">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="317661039">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">textColor</string>
+ <object class="NSColor" key="NSColor" id="651434981">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MAA</bytes>
+ </object>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="816852072">
+ <reference key="NSNextResponder" ref="345710193"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 126}, {102, 17}}</string>
+ <reference key="NSSuperview" ref="345710193"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="748421632">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Path to rpc.php</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="816852072"/>
+ <object class="NSColor" key="NSBackgroundColor" id="258809705">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlColor</string>
+ <object class="NSColor" key="NSColor" id="235392093">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
+ </object>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="428586510">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlTextColor</string>
+ <reference key="NSColor" ref="651434981"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="943485916">
+ <reference key="NSNextResponder" ref="345710193"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{124, 92}, {311, 22}}</string>
+ <reference key="NSSuperview" ref="345710193"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="332374721">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="943485916"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="453091517"/>
+ <reference key="NSTextColor" ref="317661039"/>
+ </object>
+ </object>
+ <object class="NSSecureTextField" id="407883474">
+ <reference key="NSNextResponder" ref="345710193"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{124, 60}, {311, 22}}</string>
+ <reference key="NSSuperview" ref="345710193"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSSecureTextFieldCell" key="NSCell" id="321721582">
+ <int key="NSCellFlags">343014976</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="407883474"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="453091517"/>
+ <reference key="NSTextColor" ref="317661039"/>
+ <object class="NSArray" key="NSAllowedInputLocales">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>NSAllRomanInputSourcesLocaleIdentifier</string>
+ </object>
+ </object>
+ </object>
+ <object class="NSTextField" id="545362646">
+ <reference key="NSNextResponder" ref="345710193"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 94}, {67, 17}}</string>
+ <reference key="NSSuperview" ref="345710193"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="726913580">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Username</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="545362646"/>
+ <reference key="NSBackgroundColor" ref="258809705"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="377949113">
+ <reference key="NSNextResponder" ref="345710193"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 62}, {67, 17}}</string>
+ <reference key="NSSuperview" ref="345710193"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="1043094791">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Password</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="377949113"/>
+ <reference key="NSBackgroundColor" ref="258809705"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="17412812">
+ <reference key="NSNextResponder" ref="345710193"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{17, 158}, {102, 17}}</string>
+ <reference key="NSSuperview" ref="345710193"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="1034567103">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Nickname</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="17412812"/>
+ <reference key="NSBackgroundColor" ref="258809705"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="536650280">
+ <reference key="NSNextResponder" ref="345710193"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{124, 156}, {311, 22}}</string>
+ <reference key="NSSuperview" ref="345710193"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="611300750">
+ <int key="NSCellFlags">-1804468671</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="536650280"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="453091517"/>
+ <reference key="NSTextColor" ref="317661039"/>
+ </object>
+ </object>
+ <object class="NSButton" id="931753347">
+ <reference key="NSNextResponder" ref="345710193"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{345, 12}, {96, 32}}</string>
+ <reference key="NSSuperview" ref="345710193"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="192200439">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Save</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="931753347"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="470501331">
+ <reference key="NSNextResponder" ref="345710193"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{244, 12}, {96, 32}}</string>
+ <reference key="NSSuperview" ref="345710193"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="306533473">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Cancel</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="470501331"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="381272541">
+ <reference key="NSNextResponder" ref="345710193"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{18, 18}, {145, 18}}</string>
+ <reference key="NSSuperview" ref="345710193"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="754494626">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Make Default</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="381272541"/>
+ <int key="NSButtonFlags">1211912703</int>
+ <int key="NSButtonFlags2">130</int>
+ <object class="NSCustomResource" key="NSNormalImage">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSSwitch</string>
+ </object>
+ <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>
+ <string key="NSFrameSize">{455, 195}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
+ <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ </object>
+ <object class="NSWindowTemplate" id="114974401">
+ <int key="NSWindowStyleMask">23</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{196, 152}, {679, 358}}</string>
+ <int key="NSWTFlags">-1543503872</int>
+ <string key="NSWindowTitle">Servers</string>
+ <string key="NSWindowClass">NSPanel</string>
+ <nil key="NSViewClass"/>
+ <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <object class="NSView" key="NSWindowView" id="1015540943">
+ <nil key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSButton" id="173168675">
+ <reference key="NSNextResponder" ref="1015540943"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{568, 28}, {96, 28}}</string>
+ <reference key="NSSuperview" ref="1015540943"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="1051407572">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134348800</int>
+ <string key="NSContents">Done</string>
+ <object class="NSFont" key="NSSupport" id="26">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.100000e+01</double>
+ <int key="NSfFlags">3100</int>
+ </object>
+ <reference key="NSControlView" ref="173168675"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSScrollView" id="190463150">
+ <reference key="NSNextResponder" ref="1015540943"/>
+ <int key="NSvFlags">268</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSClipView" id="1028887197">
+ <reference key="NSNextResponder" ref="190463150"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableView" id="122283779">
+ <reference key="NSNextResponder" ref="1028887197"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{626, 247}</string>
+ <reference key="NSSuperview" ref="1028887197"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTableHeaderView" key="NSHeaderView" id="583871843">
+ <reference key="NSNextResponder" ref="490935428"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrameSize">{626, 17}</string>
+ <reference key="NSSuperview" ref="490935428"/>
+ <reference key="NSTableView" ref="122283779"/>
+ </object>
+ <object class="_NSCornerView" key="NSCornerView" id="814300438">
+ <reference key="NSNextResponder" ref="190463150"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{627, 0}, {16, 17}}</string>
+ <reference key="NSSuperview" ref="190463150"/>
+ </object>
+ <object class="NSMutableArray" key="NSTableColumns">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableColumn" id="935876783">
+ <string key="NSIdentifier">nickname</string>
+ <double key="NSWidth">1.010000e+02</double>
+ <double key="NSMinWidth">4.000000e+01</double>
+ <double key="NSMaxWidth">1.000000e+03</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628032</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Server Name</string>
+ <reference key="NSSupport" ref="26"/>
+ <object class="NSColor" key="NSBackgroundColor" id="710729185">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+ </object>
+ <object class="NSColor" key="NSTextColor" id="230673082">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">headerTextColor</string>
+ <reference key="NSColor" ref="651434981"/>
+ </object>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="232409811">
+ <int key="NSCellFlags">337772096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">Text Cell</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="122283779"/>
+ <object class="NSColor" key="NSBackgroundColor" id="508011134">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">controlBackgroundColor</string>
+ <reference key="NSColor" ref="235392093"/>
+ </object>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="122283779"/>
+ </object>
+ <object class="NSTableColumn" id="698453740">
+ <string key="NSIdentifier">username</string>
+ <double key="NSWidth">1.410000e+02</double>
+ <double key="NSMinWidth">4.000000e+01</double>
+ <double key="NSMaxWidth">1.000000e+03</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628032</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Login Name</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSBackgroundColor" ref="710729185"/>
+ <reference key="NSTextColor" ref="230673082"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="110708844">
+ <int key="NSCellFlags">337772096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">Text Cell</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="122283779"/>
+ <reference key="NSBackgroundColor" ref="508011134"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="122283779"/>
+ </object>
+ <object class="NSTableColumn" id="36379594">
+ <string key="NSIdentifier">endpoint</string>
+ <double key="NSWidth">3.750000e+02</double>
+ <double key="NSMinWidth">1.000000e+01</double>
+ <double key="NSMaxWidth">3.402823e+38</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628032</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">URL</string>
+ <reference key="NSSupport" ref="26"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">headerColor</string>
+ <reference key="NSColor" ref="287527735"/>
+ </object>
+ <reference key="NSTextColor" ref="230673082"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell" id="631200346">
+ <int key="NSCellFlags">337772096</int>
+ <int key="NSCellFlags2">2048</int>
+ <string key="NSContents">Text Cell</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="122283779"/>
+ <reference key="NSBackgroundColor" ref="508011134"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <bool key="NSIsEditable">YES</bool>
+ <reference key="NSTableView" ref="122283779"/>
+ </object>
+ </object>
+ <double key="NSIntercellSpacingWidth">3.000000e+00</double>
+ <double key="NSIntercellSpacingHeight">2.000000e+00</double>
+ <reference key="NSBackgroundColor" ref="287527735"/>
+ <object class="NSColor" key="NSGridColor" id="128663657">
+ <int key="NSColorSpace">6</int>
+ <string key="NSCatalogName">System</string>
+ <string key="NSColorName">gridColor</string>
+ <object class="NSColor" key="NSColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC41AA</bytes>
+ </object>
+ </object>
+ <double key="NSRowHeight">1.700000e+01</double>
+ <int key="NSTvFlags">-700448768</int>
+ <int key="NSColumnAutoresizingStyle">4</int>
+ <int key="NSDraggingSourceMaskForLocal">15</int>
+ <int key="NSDraggingSourceMaskForNonLocal">0</int>
+ <bool key="NSAllowsTypeSelect">YES</bool>
+ </object>
+ </object>
+ <string key="NSFrame">{{1, 17}, {626, 247}}</string>
+ <reference key="NSSuperview" ref="190463150"/>
+ <reference key="NSNextKeyView" ref="122283779"/>
+ <reference key="NSDocView" ref="122283779"/>
+ <reference key="NSBGColor" ref="508011134"/>
+ <int key="NScvFlags">4</int>
+ </object>
+ <object class="NSScroller" id="99836435">
+ <reference key="NSNextResponder" ref="190463150"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{627, 17}, {15, 247}}</string>
+ <reference key="NSSuperview" ref="190463150"/>
+ <reference key="NSTarget" ref="190463150"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSCurValue">1.000000e+00</double>
+ <double key="NSPercent">1.947368e-01</double>
+ </object>
+ <object class="NSScroller" id="434957656">
+ <reference key="NSNextResponder" ref="190463150"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{1, 264}, {626, 15}}</string>
+ <reference key="NSSuperview" ref="190463150"/>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="190463150"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">9.984051e-01</double>
+ </object>
+ <object class="NSClipView" id="490935428">
+ <reference key="NSNextResponder" ref="190463150"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="583871843"/>
+ </object>
+ <string key="NSFrame">{{1, 0}, {626, 17}}</string>
+ <reference key="NSSuperview" ref="190463150"/>
+ <reference key="NSNextKeyView" ref="583871843"/>
+ <reference key="NSDocView" ref="583871843"/>
+ <reference key="NSBGColor" ref="508011134"/>
+ <int key="NScvFlags">4</int>
+ </object>
+ <reference ref="814300438"/>
+ </object>
+ <string key="NSFrame">{{20, 60}, {643, 280}}</string>
+ <reference key="NSSuperview" ref="1015540943"/>
+ <reference key="NSNextKeyView" ref="1028887197"/>
+ <int key="NSsFlags">50</int>
+ <reference key="NSVScroller" ref="99836435"/>
+ <reference key="NSHScroller" ref="434957656"/>
+ <reference key="NSContentView" ref="1028887197"/>
+ <reference key="NSHeaderClipView" ref="490935428"/>
+ <reference key="NSCornerView" ref="814300438"/>
+ <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
+ </object>
+ <object class="NSButton" id="887276643">
+ <reference key="NSNextResponder" ref="1015540943"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{15, 28}, {96, 28}}</string>
+ <reference key="NSSuperview" ref="1015540943"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="857791556">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134348800</int>
+ <string key="NSContents">Remove</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="887276643"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSButton" id="261477617">
+ <reference key="NSNextResponder" ref="1015540943"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{109, 28}, {123, 28}}</string>
+ <reference key="NSSuperview" ref="1015540943"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="574730139">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134348800</int>
+ <string key="NSContents">Make Default</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="261477617"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrameSize">{679, 358}</string>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
+ <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ </object>
+ <object class="NSWindowTemplate" id="240545061">
+ <int key="NSWindowStyleMask">23</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{196, 183}, {480, 327}}</string>
+ <int key="NSWTFlags">-1543503872</int>
+ <string key="NSWindowTitle">Window</string>
+ <string key="NSWindowClass">NSPanel</string>
+ <nil key="NSViewClass"/>
+ <string key="NSWindowContentMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ <object class="NSView" key="NSWindowView" id="573233790">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSButton" id="300259137">
+ <reference key="NSNextResponder" ref="573233790"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{370, 12}, {96, 32}}</string>
+ <reference key="NSSuperview" ref="573233790"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="569706565">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134217728</int>
+ <string key="NSContents">Close</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="300259137"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSScrollView" id="445821140">
+ <reference key="NSNextResponder" ref="573233790"/>
+ <int key="NSvFlags">268</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSClipView" id="896759949">
+ <reference key="NSNextResponder" ref="445821140"/>
+ <int key="NSvFlags">2304</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IKImageBrowserView" id="798730592">
+ <reference key="NSNextResponder" ref="896759949"/>
+ <int key="NSvFlags">18</int>
+ <object class="NSMutableSet" key="NSDragTypes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="set.sortedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>Apple PDF pasteboard type</string>
+ <string>Apple PICT pasteboard type</string>
+ <string>Apple PNG pasteboard type</string>
+ <string>Apple URL pasteboard type</string>
+ <string>NSFilenamesPboardType</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6Jy5TR0knA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6JzhCUFMnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0JNUGYnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0VQU0YnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0ZQaXgnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0dJRmYnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0lDTyAnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0pQRUcnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1BERiAnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1BJQ1QnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1BOR2YnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1BOVEcnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1RJRkYnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1RQSUMnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J2pwMiAnA</string>
+ <string type="base64-UTF8">TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J3F0aWYnA</string>
+ <string>NSTypedFilenamesPboardType:BMP</string>
+ <string>NSTypedFilenamesPboardType:CR2</string>
+ <string>NSTypedFilenamesPboardType:CRW</string>
+ <string>NSTypedFilenamesPboardType:CUR</string>
+ <string>NSTypedFilenamesPboardType:DCR</string>
+ <string>NSTypedFilenamesPboardType:DNG</string>
+ <string>NSTypedFilenamesPboardType:EPI</string>
+ <string>NSTypedFilenamesPboardType:EPS</string>
+ <string>NSTypedFilenamesPboardType:EPSF</string>
+ <string>NSTypedFilenamesPboardType:EPSI</string>
+ <string>NSTypedFilenamesPboardType:EXR</string>
+ <string>NSTypedFilenamesPboardType:FAX</string>
+ <string>NSTypedFilenamesPboardType:FPIX</string>
+ <string>NSTypedFilenamesPboardType:FPX</string>
+ <string>NSTypedFilenamesPboardType:GIF</string>
+ <string>NSTypedFilenamesPboardType:HDR</string>
+ <string>NSTypedFilenamesPboardType:ICNS</string>
+ <string>NSTypedFilenamesPboardType:ICO</string>
+ <string>NSTypedFilenamesPboardType:JP2</string>
+ <string>NSTypedFilenamesPboardType:JPEG</string>
+ <string>NSTypedFilenamesPboardType:JPG</string>
+ <string>NSTypedFilenamesPboardType:MAC</string>
+ <string>NSTypedFilenamesPboardType:MRW</string>
+ <string>NSTypedFilenamesPboardType:NEF</string>
+ <string>NSTypedFilenamesPboardType:ORF</string>
+ <string>NSTypedFilenamesPboardType:PCT</string>
+ <string>NSTypedFilenamesPboardType:PDF</string>
+ <string>NSTypedFilenamesPboardType:PIC</string>
+ <string>NSTypedFilenamesPboardType:PICT</string>
+ <string>NSTypedFilenamesPboardType:PNG</string>
+ <string>NSTypedFilenamesPboardType:PNT</string>
+ <string>NSTypedFilenamesPboardType:PNTG</string>
+ <string>NSTypedFilenamesPboardType:PS</string>
+ <string>NSTypedFilenamesPboardType:PSD</string>
+ <string>NSTypedFilenamesPboardType:QTI</string>
+ <string>NSTypedFilenamesPboardType:QTIF</string>
+ <string>NSTypedFilenamesPboardType:RAF</string>
+ <string>NSTypedFilenamesPboardType:RGB</string>
+ <string>NSTypedFilenamesPboardType:SGI</string>
+ <string>NSTypedFilenamesPboardType:SRF</string>
+ <string>NSTypedFilenamesPboardType:TARGA</string>
+ <string>NSTypedFilenamesPboardType:TGA</string>
+ <string>NSTypedFilenamesPboardType:TIF</string>
+ <string>NSTypedFilenamesPboardType:TIFF</string>
+ <string>NSTypedFilenamesPboardType:XBM</string>
+ <string>NSTypedFilenamesPboardType:bmp</string>
+ <string>NSTypedFilenamesPboardType:cr2</string>
+ <string>NSTypedFilenamesPboardType:crw</string>
+ <string>NSTypedFilenamesPboardType:cur</string>
+ <string>NSTypedFilenamesPboardType:dcr</string>
+ <string>NSTypedFilenamesPboardType:dng</string>
+ <string>NSTypedFilenamesPboardType:epi</string>
+ <string>NSTypedFilenamesPboardType:eps</string>
+ <string>NSTypedFilenamesPboardType:epsf</string>
+ <string>NSTypedFilenamesPboardType:epsi</string>
+ <string>NSTypedFilenamesPboardType:exr</string>
+ <string>NSTypedFilenamesPboardType:fax</string>
+ <string>NSTypedFilenamesPboardType:fpix</string>
+ <string>NSTypedFilenamesPboardType:fpx</string>
+ <string>NSTypedFilenamesPboardType:gif</string>
+ <string>NSTypedFilenamesPboardType:hdr</string>
+ <string>NSTypedFilenamesPboardType:icns</string>
+ <string>NSTypedFilenamesPboardType:ico</string>
+ <string>NSTypedFilenamesPboardType:jp2</string>
+ <string>NSTypedFilenamesPboardType:jpeg</string>
+ <string>NSTypedFilenamesPboardType:jpg</string>
+ <string>NSTypedFilenamesPboardType:mac</string>
+ <string>NSTypedFilenamesPboardType:mrw</string>
+ <string>NSTypedFilenamesPboardType:nef</string>
+ <string>NSTypedFilenamesPboardType:orf</string>
+ <string>NSTypedFilenamesPboardType:pct</string>
+ <string>NSTypedFilenamesPboardType:pdf</string>
+ <string>NSTypedFilenamesPboardType:pic</string>
+ <string>NSTypedFilenamesPboardType:pict</string>
+ <string>NSTypedFilenamesPboardType:png</string>
+ <string>NSTypedFilenamesPboardType:pnt</string>
+ <string>NSTypedFilenamesPboardType:pntg</string>
+ <string>NSTypedFilenamesPboardType:ps</string>
+ <string>NSTypedFilenamesPboardType:psd</string>
+ <string>NSTypedFilenamesPboardType:qti</string>
+ <string>NSTypedFilenamesPboardType:qtif</string>
+ <string>NSTypedFilenamesPboardType:raf</string>
+ <string>NSTypedFilenamesPboardType:rgb</string>
+ <string>NSTypedFilenamesPboardType:sgi</string>
+ <string>NSTypedFilenamesPboardType:srf</string>
+ <string>NSTypedFilenamesPboardType:targa</string>
+ <string>NSTypedFilenamesPboardType:tga</string>
+ <string>NSTypedFilenamesPboardType:tif</string>
+ <string>NSTypedFilenamesPboardType:tiff</string>
+ <string>NSTypedFilenamesPboardType:xbm</string>
+ <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
+ <string>NeXT TIFF v4.0 pasteboard type</string>
+ </object>
+ </object>
+ <string key="NSFrameSize">{423, 251}</string>
+ <reference key="NSSuperview" ref="896759949"/>
+ <bool key="constrainsToOriginalSize">NO</bool>
+ <bool key="cellsHaveSubtitle">YES</bool>
+ <bool key="cellsHaveTitle">YES</bool>
+ <bool key="outlinesCells">YES</bool>
+ <bool key="shadowsCells">YES</bool>
+ <bool key="animates">NO</bool>
+ <bool key="allowsReordering">NO</bool>
+ <float key="cellWidth">1.000000e+02</float>
+ <float key="cellHeight">1.000000e+02</float>
+ <reference key="dataSource"/>
+ <reference key="dragDestinationDelegate"/>
+ </object>
+ </object>
+ <string key="NSFrame">{{1, 1}, {423, 251}}</string>
+ <reference key="NSSuperview" ref="445821140"/>
+ <reference key="NSNextKeyView" ref="798730592"/>
+ <reference key="NSDocView" ref="798730592"/>
+ <reference key="NSBGColor" ref="258809705"/>
+ <int key="NScvFlags">6</int>
+ </object>
+ <object class="NSScroller" id="34214668">
+ <reference key="NSNextResponder" ref="445821140"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{424, 1}, {15, 251}}</string>
+ <reference key="NSSuperview" ref="445821140"/>
+ <reference key="NSTarget" ref="445821140"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSCurValue">1.000000e+00</double>
+ <double key="NSPercent">9.636363e-01</double>
+ </object>
+ <object class="NSScroller" id="355872151">
+ <reference key="NSNextResponder" ref="445821140"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{1, 252}, {423, 15}}</string>
+ <reference key="NSSuperview" ref="445821140"/>
+ <int key="NSsFlags">1</int>
+ <reference key="NSTarget" ref="445821140"/>
+ <string key="NSAction">_doScroller:</string>
+ <double key="NSPercent">5.060241e-01</double>
+ </object>
+ </object>
+ <string key="NSFrame">{{20, 60}, {440, 268}}</string>
+ <reference key="NSSuperview" ref="573233790"/>
+ <reference key="NSNextKeyView" ref="896759949"/>
+ <int key="NSsFlags">50</int>
+ <reference key="NSVScroller" ref="34214668"/>
+ <reference key="NSHScroller" ref="355872151"/>
+ <reference key="NSContentView" ref="896759949"/>
+ <bytes key="NSScrollAmts">QSAAAEEgAABCzQAAQvAAAA</bytes>
+ </object>
+ </object>
+ <string key="NSFrameSize">{480, 327}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
+ <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ </object>
+ <object class="NSWindowTemplate" id="68821434">
+ <int key="NSWindowStyleMask">15</int>
+ <int key="NSWindowBacking">2</int>
+ <string key="NSWindowRect">{{220, 358}, {548, 406}}</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">{3.40282e+38, 3.40282e+38}</string>
+ <string key="NSWindowContentMinSize">{213, 107}</string>
+ <object class="NSView" key="NSWindowView" id="442259745">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSBox" id="109597301">
+ <reference key="NSNextResponder" ref="442259745"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSView" id="914781838">
+ <reference key="NSNextResponder" ref="109597301"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSBox" id="387030229">
+ <reference key="NSNextResponder" ref="914781838"/>
+ <int key="NSvFlags">268</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSView" id="917722533">
+ <reference key="NSNextResponder" ref="387030229"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTextField" id="681115975">
+ <reference key="NSNextResponder" ref="917722533"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{15, 71}, {81, 17}}</string>
+ <reference key="NSSuperview" ref="917722533"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="323509275">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Server</string>
+ <object class="NSFont" key="NSSupport" id="471144877">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.200000e+01</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <reference key="NSControlView" ref="681115975"/>
+ <reference key="NSBackgroundColor" ref="258809705"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ </object>
+ <object class="NSPopUpButton" id="447167783">
+ <reference key="NSNextResponder" ref="917722533"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{76, 66}, {382, 26}}</string>
+ <reference key="NSSuperview" ref="917722533"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSPopUpButtonCell" key="NSCell" id="979637046">
+ <int key="NSCellFlags">-2076049856</int>
+ <int key="NSCellFlags2">2048</int>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="447167783"/>
+ <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">400</int>
+ <int key="NSPeriodicInterval">75</int>
+ <object class="NSMenuItem" key="NSMenuItem" id="585870225">
+ <reference key="NSMenu" ref="271704379"/>
+ <string key="NSTitle">(None)</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="441143142">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuCheckmark</string>
+ </object>
+ <object class="NSCustomResource" key="NSMixedImage" id="1052235771">
+ <string key="NSClassName">NSImage</string>
+ <string key="NSResourceName">NSMenuMixedState</string>
+ </object>
+ <string key="NSAction">_popUpItemAction:</string>
+ <reference key="NSTarget" ref="979637046"/>
+ </object>
+ <bool key="NSMenuItemRespectAlignment">YES</bool>
+ <object class="NSMenu" key="NSMenu" id="271704379">
+ <string key="NSTitle">OtherViews</string>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="585870225"/>
+ </object>
+ </object>
+ <int key="NSPreferredEdge">1</int>
+ <bool key="NSUsesItemFromMenu">YES</bool>
+ <bool key="NSAltersState">YES</bool>
+ <int key="NSArrowPosition">2</int>
+ </object>
+ </object>
+ <object class="NSTextField" id="706605497">
+ <reference key="NSNextResponder" ref="917722533"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{77, 33}, {117, 17}}</string>
+ <reference key="NSSuperview" ref="917722533"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="945436340">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272761856</int>
+ <string key="NSContents">Not Logged In</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="706605497"/>
+ <reference key="NSBackgroundColor" ref="258809705"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ </object>
+ <object class="NSProgressIndicator" id="758028067">
+ <reference key="NSNextResponder" ref="917722533"/>
+ <int key="NSvFlags">1292</int>
+ <object class="NSPSMatrix" key="NSDrawMatrix"/>
+ <string key="NSFrame">{{439, 33}, {16, 16}}</string>
+ <reference key="NSSuperview" ref="917722533"/>
+ <int key="NSpiFlags">28938</int>
+ <double key="NSMinValue">1.600000e+01</double>
+ <double key="NSMaxValue">1.000000e+02</double>
+ </object>
+ <object class="NSTextField" id="800292040">
+ <reference key="NSNextResponder" ref="917722533"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{15, 37}, {43, 16}}</string>
+ <reference key="NSSuperview" ref="917722533"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="1013776364">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Status</string>
+ <reference key="NSSupport" ref="471144877"/>
+ <reference key="NSControlView" ref="800292040"/>
+ <reference key="NSBackgroundColor" ref="258809705"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ </object>
+ <object class="NSButton" id="739969881">
+ <reference key="NSNextResponder" ref="917722533"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{367, 32}, {65, 16}}</string>
+ <reference key="NSSuperview" ref="917722533"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="1009076064">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134479872</int>
+ <string key="NSContents">Cancel</string>
+ <object class="NSFont" key="NSSupport" id="22">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">9.000000e+00</double>
+ <int key="NSfFlags">3614</int>
+ </object>
+ <reference key="NSControlView" ref="739969881"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrame">{{1, 1}, {480, 94}}</string>
+ <reference key="NSSuperview" ref="387030229"/>
+ </object>
+ </object>
+ <string key="NSFrame">{{7, 253}, {482, 110}}</string>
+ <reference key="NSSuperview" ref="914781838"/>
+ <string key="NSOffsets">{0, 0}</string>
+ <object class="NSTextFieldCell" key="NSTitleCell">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Connection</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSBackgroundColor" ref="453091517"/>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
+ </object>
+ </object>
+ <reference key="NSContentView" ref="917722533"/>
+ <int key="NSBorderType">1</int>
+ <int key="NSBoxType">0</int>
+ <int key="NSTitlePosition">2</int>
+ <bool key="NSTransparent">NO</bool>
+ </object>
+ <object class="NSBox" id="664773226">
+ <reference key="NSNextResponder" ref="914781838"/>
+ <int key="NSvFlags">268</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSView" id="675618554">
+ <reference key="NSNextResponder" ref="664773226"/>
+ <int key="NSvFlags">256</int>
+ <object class="NSMutableArray" key="NSSubviews">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSButton" id="60291071">
+ <reference key="NSNextResponder" ref="675618554"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{135, 165}, {92, 32}}</string>
+ <reference key="NSSuperview" ref="675618554"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="843634421">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">134479872</int>
+ <string key="NSContents">Create New</string>
+ <reference key="NSSupport" ref="22"/>
+ <reference key="NSControlView" ref="60291071"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <object class="NSFont" key="NSAlternateImage">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">9.000000e+00</double>
+ <int key="NSfFlags">16</int>
+ </object>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSComboBox" id="553805234">
+ <reference key="NSNextResponder" ref="675618554"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{18, 143}, {211, 26}}</string>
+ <reference key="NSSuperview" ref="675618554"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSComboBoxCell" key="NSCell" id="487568130">
+ <int key="NSCellFlags">611450433</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="553805234"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="453091517"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ <int key="NSVisibleItemCount">5</int>
+ <bool key="NSHasVerticalScroller">YES</bool>
+ <bool key="NSUsesDataSource">YES</bool>
+ <bool key="NSCompletes">YES</bool>
+ <nil key="NSDataSource"/>
+ <reference key="NSDelegate" ref="553805234"/>
+ <object class="NSComboTableView" key="NSTableView" id="562062983">
+ <reference key="NSNextResponder"/>
+ <int key="NSvFlags">274</int>
+ <string key="NSFrameSize">{15, 0}</string>
+ <reference key="NSSuperview"/>
+ <reference key="NSWindow"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSMutableArray" key="NSTableColumns">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSTableColumn">
+ <integer value="0" key="NSIdentifier" id="8"/>
+ <double key="NSWidth">1.200000e+01</double>
+ <double key="NSMinWidth">1.000000e+01</double>
+ <double key="NSMaxWidth">1.000000e+03</double>
+ <object class="NSTableHeaderCell" key="NSHeaderCell">
+ <int key="NSCellFlags">75628032</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents"/>
+ <reference key="NSSupport" ref="471144877"/>
+ <object class="NSColor" key="NSBackgroundColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
+ </object>
+ <reference key="NSTextColor" ref="287527735"/>
+ </object>
+ <object class="NSTextFieldCell" key="NSDataCell">
+ <int key="NSCellFlags">338820672</int>
+ <int key="NSCellFlags2">1024</int>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="562062983"/>
+ <bool key="NSDrawsBackground">YES</bool>
+ <reference key="NSBackgroundColor" ref="508011134"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ <int key="NSResizingMask">3</int>
+ <bool key="NSIsResizeable">YES</bool>
+ <reference key="NSTableView" ref="562062983"/>
+ </object>
+ </object>
+ <double key="NSIntercellSpacingWidth">3.000000e+00</double>
+ <double key="NSIntercellSpacingHeight">2.000000e+00</double>
+ <reference key="NSBackgroundColor" ref="508011134"/>
+ <reference key="NSGridColor" ref="128663657"/>
+ <double key="NSRowHeight">1.900000e+01</double>
+ <string key="NSAction">tableViewAction:</string>
+ <int key="NSTvFlags">-767524864</int>
+ <reference key="NSDelegate" ref="487568130"/>
+ <reference key="NSTarget" ref="487568130"/>
+ <int key="NSColumnAutoresizingStyle">1</int>
+ <int key="NSDraggingSourceMaskForLocal">15</int>
+ <int key="NSDraggingSourceMaskForNonLocal">0</int>
+ <bool key="NSAllowsTypeSelect">YES</bool>
+ </object>
+ </object>
+ <nil key="NSDataSource"/>
+ </object>
+ <object class="NSTextField" id="530084779">
+ <reference key="NSNextResponder" ref="675618554"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{15, 173}, {103, 16}}</string>
+ <reference key="NSSuperview" ref="675618554"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="49643720">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Gallery</string>
+ <reference key="NSSupport" ref="471144877"/>
+ <reference key="NSControlView" ref="530084779"/>
+ <reference key="NSBackgroundColor" ref="258809705"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ </object>
+ <object class="NSImageView" id="943334524">
+ <reference key="NSNextResponder" ref="675618554"/>
+ <int key="NSvFlags">268</int>
+ <object class="NSMutableSet" key="NSDragTypes">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="set.sortedObjects">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>Apple PDF pasteboard type</string>
+ <string>Apple PICT pasteboard type</string>
+ <string>Apple PNG pasteboard type</string>
+ <string>NSFilenamesPboardType</string>
+ <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
+ <string>NeXT TIFF v4.0 pasteboard type</string>
+ </object>
+ </object>
+ <string key="NSFrame">{{258, 59}, {214, 118}}</string>
+ <reference key="NSSuperview" ref="675618554"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSImageCell" key="NSCell" id="624236720">
+ <int key="NSCellFlags">130560</int>
+ <int key="NSCellFlags2">33554432</int>
+ <int key="NSAlign">0</int>
+ <int key="NSScale">0</int>
+ <int key="NSStyle">0</int>
+ <bool key="NSAnimates">YES</bool>
+ </object>
+ <bool key="NSEditable">YES</bool>
+ </object>
+ <object class="NSTextField" id="950269879">
+ <reference key="NSNextResponder" ref="675618554"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{258, 175}, {158, 16}}</string>
+ <reference key="NSSuperview" ref="675618554"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="87551637">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Gallery Default Image</string>
+ <reference key="NSSupport" ref="471144877"/>
+ <reference key="NSControlView" ref="950269879"/>
+ <reference key="NSBackgroundColor" ref="258809705"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ </object>
+ <object class="NSTextField" id="597164431">
+ <reference key="NSNextResponder" ref="675618554"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{15, 121}, {114, 17}}</string>
+ <reference key="NSSuperview" ref="675618554"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="457524196">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">272629760</int>
+ <string key="NSContents">Image Size: </string>
+ <reference key="NSSupport" ref="471144877"/>
+ <reference key="NSControlView" ref="597164431"/>
+ <reference key="NSBackgroundColor" ref="258809705"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ </object>
+ <object class="NSPopUpButton" id="371122794">
+ <reference key="NSNextResponder" ref="675618554"/>
+ <int key="NSvFlags">256</int>
+ <string key="NSFrame">{{15, 93}, {130, 26}}</string>
+ <reference key="NSSuperview" ref="675618554"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSPopUpButtonCell" key="NSCell" id="710721070">
+ <int key="NSCellFlags">-2076049856</int>
+ <int key="NSCellFlags2">2048</int>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="371122794"/>
+ <int key="NSButtonFlags">109199615</int>
+ <int key="NSButtonFlags2">1</int>
+ <object class="NSFont" key="NSAlternateImage">
+ <string key="NSName">LucidaGrande</string>
+ <double key="NSSize">1.300000e+01</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="712846521">
+ <reference key="NSMenu" ref="263556285"/>
+ <string key="NSTitle">Large</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <int key="NSState">1</int>
+ <reference key="NSOnImage" ref="441143142"/>
+ <reference key="NSMixedImage" ref="1052235771"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">2</int>
+ <reference key="NSTarget" ref="710721070"/>
+ </object>
+ <bool key="NSMenuItemRespectAlignment">YES</bool>
+ <object class="NSMenu" key="NSMenu" id="263556285">
+ <object class="NSMutableString" key="NSTitle">
+ <characters key="NS.bytes">OtherViews</characters>
+ </object>
+ <object class="NSMutableArray" key="NSMenuItems">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMenuItem" id="474936008">
+ <reference key="NSMenu" ref="263556285"/>
+ <string key="NSTitle">Small</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="441143142"/>
+ <reference key="NSMixedImage" ref="1052235771"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <reference key="NSTarget" ref="710721070"/>
+ </object>
+ <object class="NSMenuItem" id="465499750">
+ <reference key="NSMenu" ref="263556285"/>
+ <string key="NSTitle">Medium</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="441143142"/>
+ <reference key="NSMixedImage" ref="1052235771"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">1</int>
+ <reference key="NSTarget" ref="710721070"/>
+ </object>
+ <reference ref="712846521"/>
+ <object class="NSMenuItem" id="95855543">
+ <reference key="NSMenu" ref="263556285"/>
+ <string key="NSTitle">Full Size</string>
+ <string key="NSKeyEquiv"/>
+ <int key="NSKeyEquivModMask">1048576</int>
+ <int key="NSMnemonicLoc">2147483647</int>
+ <reference key="NSOnImage" ref="441143142"/>
+ <reference key="NSMixedImage" ref="1052235771"/>
+ <string key="NSAction">_popUpItemAction:</string>
+ <int key="NSTag">3</int>
+ <reference key="NSTarget" ref="710721070"/>
+ </object>
+ </object>
+ </object>
+ <int key="NSSelectedIndex">2</int>
+ <int key="NSPreferredEdge">3</int>
+ <bool key="NSUsesItemFromMenu">YES</bool>
+ <bool key="NSAltersState">YES</bool>
+ <int key="NSArrowPosition">1</int>
+ </object>
+ </object>
+ <object class="NSButton" id="511774165">
+ <reference key="NSNextResponder" ref="675618554"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{256, 7}, {96, 28}}</string>
+ <reference key="NSSuperview" ref="675618554"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSButtonCell" key="NSCell" id="645491960">
+ <int key="NSCellFlags">604110336</int>
+ <int key="NSCellFlags2">134348800</int>
+ <string key="NSContents">View Gallery</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSControlView" ref="511774165"/>
+ <int key="NSButtonFlags">-2038284033</int>
+ <int key="NSButtonFlags2">129</int>
+ <string key="NSAlternateContents"/>
+ <string key="NSKeyEquivalent"/>
+ <int key="NSPeriodicDelay">200</int>
+ <int key="NSPeriodicInterval">25</int>
+ </object>
+ </object>
+ <object class="NSBox" id="239316494">
+ <reference key="NSNextResponder" ref="675618554"/>
+ <int key="NSvFlags">12</int>
+ <string key="NSFrame">{{237, 30}, {5, 161}}</string>
+ <reference key="NSSuperview" ref="675618554"/>
+ <string key="NSOffsets">{0, 0}</string>
+ <object class="NSTextFieldCell" key="NSTitleCell">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Box</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSBackgroundColor" ref="453091517"/>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
+ </object>
+ </object>
+ <int key="NSBorderType">3</int>
+ <int key="NSBoxType">2</int>
+ <int key="NSTitlePosition">0</int>
+ <bool key="NSTransparent">NO</bool>
+ </object>
+ <object class="NSTextField" id="140247589">
+ <reference key="NSNextResponder" ref="675618554"/>
+ <int key="NSvFlags">268</int>
+ <string key="NSFrame">{{258, 42}, {207, 17}}</string>
+ <reference key="NSSuperview" ref="675618554"/>
+ <bool key="NSEnabled">YES</bool>
+ <object class="NSTextFieldCell" key="NSCell" id="441029368">
+ <int key="NSCellFlags">68288064</int>
+ <int key="NSCellFlags2">272630784</int>
+ <string key="NSContents">Image Count:</string>
+ <reference key="NSSupport" ref="1065031457"/>
+ <reference key="NSControlView" ref="140247589"/>
+ <reference key="NSBackgroundColor" ref="258809705"/>
+ <reference key="NSTextColor" ref="428586510"/>
+ </object>
+ </object>
+ </object>
+ <string key="NSFrame">{{1, 1}, {480, 197}}</string>
+ <reference key="NSSuperview" ref="664773226"/>
+ </object>
+ </object>
+ <string key="NSFrame">{{14, 36}, {482, 213}}</string>
+ <reference key="NSSuperview" ref="914781838"/>
+ <string key="NSOffsets">{0, 0}</string>
+ <object class="NSTextFieldCell" key="NSTitleCell">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Export Options</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSBackgroundColor" ref="453091517"/>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
+ </object>
+ </object>
+ <reference key="NSContentView" ref="675618554"/>
+ <int key="NSBorderType">1</int>
+ <int key="NSBoxType">0</int>
+ <int key="NSTitlePosition">2</int>
+ <bool key="NSTransparent">NO</bool>
+ </object>
+ </object>
+ <string key="NSFrame">{{2, 2}, {510, 373}}</string>
+ <reference key="NSSuperview" ref="109597301"/>
+ </object>
+ </object>
+ <string key="NSFrame">{{17, 16}, {514, 390}}</string>
+ <reference key="NSSuperview" ref="442259745"/>
+ <string key="NSOffsets">{0, 0}</string>
+ <object class="NSTextFieldCell" key="NSTitleCell">
+ <int key="NSCellFlags">67239424</int>
+ <int key="NSCellFlags2">0</int>
+ <string key="NSContents">Ansel</string>
+ <reference key="NSSupport" ref="26"/>
+ <reference key="NSBackgroundColor" ref="453091517"/>
+ <object class="NSColor" key="NSTextColor">
+ <int key="NSColorSpace">3</int>
+ <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
+ </object>
+ </object>
+ <reference key="NSContentView" ref="914781838"/>
+ <int key="NSBorderType">3</int>
+ <int key="NSBoxType">0</int>
+ <int key="NSTitlePosition">2</int>
+ <bool key="NSTransparent">NO</bool>
+ </object>
+ </object>
+ <string key="NSFrameSize">{548, 406}</string>
+ <reference key="NSSuperview"/>
+ </object>
+ <string key="NSScreenRect">{{0, 0}, {1920, 1178}}</string>
+ <string key="NSMinSize">{213, 129}</string>
+ <string key="NSMaxSize">{3.40282e+38, 3.40282e+38}</string>
+ </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">mSettingsBox</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="109597301"/>
+ </object>
+ <int key="connectionID">37</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mPlugin</string>
+ <reference key="source" ref="109597301"/>
+ <reference key="destination" ref="685567789"/>
+ </object>
+ <int key="connectionID">64</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mSizePopUp</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="371122794"/>
+ </object>
+ <int key="connectionID">65</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">galleryCombo</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="553805234"/>
+ </object>
+ <int key="connectionID">142</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">spinner</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="758028067"/>
+ </object>
+ <int key="connectionID">239</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">showNewGallery:</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="60291071"/>
+ </object>
+ <int key="connectionID">336</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">defaultImageView</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="943334524"/>
+ </object>
+ <int key="connectionID">359</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">doAddServer:</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="931753347"/>
+ </object>
+ <int key="connectionID">419</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">doCancelAddServer:</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="470501331"/>
+ </object>
+ <int key="connectionID">420</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">newServerSheet</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="920958882"/>
+ </object>
+ <int key="connectionID">421</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mServersPopUp</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="447167783"/>
+ </object>
+ <int key="connectionID">490</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">clickServer:</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="447167783"/>
+ </object>
+ <int key="connectionID">492</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">statusLabel</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="706605497"/>
+ </object>
+ <int key="connectionID">497</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">serverListPanel</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="114974401"/>
+ </object>
+ <int key="connectionID">505</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">closeServerList:</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="173168675"/>
+ </object>
+ <int key="connectionID">506</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dataSource</string>
+ <reference key="source" ref="122283779"/>
+ <reference key="destination" ref="685567789"/>
+ </object>
+ <int key="connectionID">518</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">serverTable</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="122283779"/>
+ </object>
+ <int key="connectionID">519</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">removeServer:</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="887276643"/>
+ </object>
+ <int key="connectionID">523</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mCancelConnect</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="739969881"/>
+ </object>
+ <int key="connectionID">525</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">clickCancelConnect:</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="1009076064"/>
+ </object>
+ <int key="connectionID">526</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mMakeNewServerDefault</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="381272541"/>
+ </object>
+ <int key="connectionID">529</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mServerSheetServerNickName</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="536650280"/>
+ </object>
+ <int key="connectionID">530</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mServerSheetHostURL</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="143194876"/>
+ </object>
+ <int key="connectionID">531</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mServerSheetUsername</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="943485916"/>
+ </object>
+ <int key="connectionID">532</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mServerSheetPassword</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="407883474"/>
+ </object>
+ <int key="connectionID">533</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mNewGalleryButton</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="60291071"/>
+ </object>
+ <int key="connectionID">534</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">clickViewGallery:</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="511774165"/>
+ </object>
+ <int key="connectionID">543</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">viewGallery</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="511774165"/>
+ </object>
+ <int key="connectionID">544</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mviewGallerySheet</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="240545061"/>
+ </object>
+ <int key="connectionID">545</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">closeGalleryView</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="300259137"/>
+ </object>
+ <int key="connectionID">548</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBActionConnection" key="connection">
+ <string key="label">closeGalleryView:</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="300259137"/>
+ </object>
+ <int key="connectionID">549</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">dataSource</string>
+ <reference key="source" ref="798730592"/>
+ <reference key="destination" ref="685567789"/>
+ </object>
+ <int key="connectionID">575</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">browserView</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="798730592"/>
+ </object>
+ <int key="connectionID">576</int>
+ </object>
+ <object class="IBConnectionRecord">
+ <object class="IBOutletConnection" key="connection">
+ <string key="label">mImageCountLabel</string>
+ <reference key="source" ref="685567789"/>
+ <reference key="destination" ref="140247589"/>
+ </object>
+ <int key="connectionID">583</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>
+ <object class="NSArray" key="object" id="0">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <reference key="children" ref="192295378"/>
+ <nil key="parent"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-2</int>
+ <reference key="object" ref="685567789"/>
+ <reference key="parent" ref="0"/>
+ <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-1</int>
+ <reference key="object" ref="357158831"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">First Responder</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">-3</int>
+ <reference key="object" ref="377299838"/>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Application</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">387</int>
+ <reference key="object" ref="920958882"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="345710193"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Panel (Add Server)</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">388</int>
+ <reference key="object" ref="345710193"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="143194876"/>
+ <reference ref="816852072"/>
+ <reference ref="943485916"/>
+ <reference ref="407883474"/>
+ <reference ref="545362646"/>
+ <reference ref="377949113"/>
+ <reference ref="17412812"/>
+ <reference ref="536650280"/>
+ <reference ref="931753347"/>
+ <reference ref="470501331"/>
+ <reference ref="381272541"/>
+ </object>
+ <reference key="parent" ref="920958882"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">389</int>
+ <reference key="object" ref="143194876"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="954322263"/>
+ </object>
+ <reference key="parent" ref="345710193"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">391</int>
+ <reference key="object" ref="816852072"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="748421632"/>
+ </object>
+ <reference key="parent" ref="345710193"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">393</int>
+ <reference key="object" ref="943485916"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="332374721"/>
+ </object>
+ <reference key="parent" ref="345710193"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">395</int>
+ <reference key="object" ref="407883474"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="321721582"/>
+ </object>
+ <reference key="parent" ref="345710193"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">397</int>
+ <reference key="object" ref="545362646"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="726913580"/>
+ </object>
+ <reference key="parent" ref="345710193"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">399</int>
+ <reference key="object" ref="377949113"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1043094791"/>
+ </object>
+ <reference key="parent" ref="345710193"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">401</int>
+ <reference key="object" ref="17412812"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1034567103"/>
+ </object>
+ <reference key="parent" ref="345710193"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">403</int>
+ <reference key="object" ref="536650280"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="611300750"/>
+ </object>
+ <reference key="parent" ref="345710193"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">405</int>
+ <reference key="object" ref="931753347"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="192200439"/>
+ </object>
+ <reference key="parent" ref="345710193"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">407</int>
+ <reference key="object" ref="470501331"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="306533473"/>
+ </object>
+ <reference key="parent" ref="345710193"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">409</int>
+ <reference key="object" ref="381272541"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="754494626"/>
+ </object>
+ <reference key="parent" ref="345710193"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">472</int>
+ <reference key="object" ref="954322263"/>
+ <reference key="parent" ref="143194876"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">473</int>
+ <reference key="object" ref="748421632"/>
+ <reference key="parent" ref="816852072"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">474</int>
+ <reference key="object" ref="332374721"/>
+ <reference key="parent" ref="943485916"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">475</int>
+ <reference key="object" ref="321721582"/>
+ <reference key="parent" ref="407883474"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">476</int>
+ <reference key="object" ref="726913580"/>
+ <reference key="parent" ref="545362646"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">477</int>
+ <reference key="object" ref="1043094791"/>
+ <reference key="parent" ref="377949113"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">478</int>
+ <reference key="object" ref="1034567103"/>
+ <reference key="parent" ref="17412812"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">479</int>
+ <reference key="object" ref="611300750"/>
+ <reference key="parent" ref="536650280"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">480</int>
+ <reference key="object" ref="192200439"/>
+ <reference key="parent" ref="931753347"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">481</int>
+ <reference key="object" ref="306533473"/>
+ <reference key="parent" ref="470501331"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">482</int>
+ <reference key="object" ref="754494626"/>
+ <reference key="parent" ref="381272541"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">501</int>
+ <reference key="object" ref="114974401"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1015540943"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">502</int>
+ <reference key="object" ref="1015540943"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="190463150"/>
+ <reference ref="173168675"/>
+ <reference ref="887276643"/>
+ <reference ref="261477617"/>
+ </object>
+ <reference key="parent" ref="114974401"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">503</int>
+ <reference key="object" ref="173168675"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1051407572"/>
+ </object>
+ <reference key="parent" ref="1015540943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">504</int>
+ <reference key="object" ref="1051407572"/>
+ <reference key="parent" ref="173168675"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">507</int>
+ <reference key="object" ref="190463150"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="99836435"/>
+ <reference ref="434957656"/>
+ <reference ref="122283779"/>
+ <reference ref="583871843"/>
+ </object>
+ <reference key="parent" ref="1015540943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">508</int>
+ <reference key="object" ref="99836435"/>
+ <reference key="parent" ref="190463150"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">509</int>
+ <reference key="object" ref="434957656"/>
+ <reference key="parent" ref="190463150"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">510</int>
+ <reference key="object" ref="122283779"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="935876783"/>
+ <reference ref="698453740"/>
+ <reference ref="36379594"/>
+ </object>
+ <reference key="parent" ref="190463150"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">511</int>
+ <reference key="object" ref="583871843"/>
+ <reference key="parent" ref="190463150"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">512</int>
+ <reference key="object" ref="935876783"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="232409811"/>
+ </object>
+ <reference key="parent" ref="122283779"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">513</int>
+ <reference key="object" ref="698453740"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="110708844"/>
+ </object>
+ <reference key="parent" ref="122283779"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">514</int>
+ <reference key="object" ref="110708844"/>
+ <reference key="parent" ref="698453740"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">515</int>
+ <reference key="object" ref="232409811"/>
+ <reference key="parent" ref="935876783"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">516</int>
+ <reference key="object" ref="36379594"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="631200346"/>
+ </object>
+ <reference key="parent" ref="122283779"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">517</int>
+ <reference key="object" ref="631200346"/>
+ <reference key="parent" ref="36379594"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">521</int>
+ <reference key="object" ref="887276643"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="857791556"/>
+ </object>
+ <reference key="parent" ref="1015540943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">522</int>
+ <reference key="object" ref="857791556"/>
+ <reference key="parent" ref="887276643"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">527</int>
+ <reference key="object" ref="261477617"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="574730139"/>
+ </object>
+ <reference key="parent" ref="1015540943"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">528</int>
+ <reference key="object" ref="574730139"/>
+ <reference key="parent" ref="261477617"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">536</int>
+ <reference key="object" ref="240545061"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="573233790"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">GalleryView</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">537</int>
+ <reference key="object" ref="573233790"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="300259137"/>
+ <reference ref="445821140"/>
+ </object>
+ <reference key="parent" ref="240545061"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">5</int>
+ <reference key="object" ref="68821434"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="442259745"/>
+ </object>
+ <reference key="parent" ref="0"/>
+ <string key="objectName">Window</string>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">6</int>
+ <reference key="object" ref="442259745"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="109597301"/>
+ </object>
+ <reference key="parent" ref="68821434"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">7</int>
+ <reference key="object" ref="109597301"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="387030229"/>
+ <reference ref="664773226"/>
+ </object>
+ <reference key="parent" ref="442259745"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">137</int>
+ <reference key="object" ref="664773226"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="239316494"/>
+ <reference ref="60291071"/>
+ <reference ref="371122794"/>
+ <reference ref="597164431"/>
+ <reference ref="950269879"/>
+ <reference ref="943334524"/>
+ <reference ref="530084779"/>
+ <reference ref="553805234"/>
+ <reference ref="511774165"/>
+ <reference ref="140247589"/>
+ </object>
+ <reference key="parent" ref="109597301"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">500</int>
+ <reference key="object" ref="239316494"/>
+ <reference key="parent" ref="664773226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">498</int>
+ <reference key="object" ref="511774165"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="645491960"/>
+ </object>
+ <reference key="parent" ref="664773226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">499</int>
+ <reference key="object" ref="645491960"/>
+ <reference key="parent" ref="511774165"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">138</int>
+ <reference key="object" ref="60291071"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="843634421"/>
+ </object>
+ <reference key="parent" ref="664773226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">462</int>
+ <reference key="object" ref="843634421"/>
+ <reference key="parent" ref="60291071"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">18</int>
+ <reference key="object" ref="371122794"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="710721070"/>
+ </object>
+ <reference key="parent" ref="664773226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">461</int>
+ <reference key="object" ref="710721070"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="263556285"/>
+ </object>
+ <reference key="parent" ref="371122794"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">19</int>
+ <reference key="object" ref="263556285"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="474936008"/>
+ <reference ref="465499750"/>
+ <reference ref="712846521"/>
+ <reference ref="95855543"/>
+ </object>
+ <reference key="parent" ref="710721070"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">20</int>
+ <reference key="object" ref="474936008"/>
+ <reference key="parent" ref="263556285"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">21</int>
+ <reference key="object" ref="465499750"/>
+ <reference key="parent" ref="263556285"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">22</int>
+ <reference key="object" ref="712846521"/>
+ <reference key="parent" ref="263556285"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">23</int>
+ <reference key="object" ref="95855543"/>
+ <reference key="parent" ref="263556285"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">9</int>
+ <reference key="object" ref="597164431"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="457524196"/>
+ </object>
+ <reference key="parent" ref="664773226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">460</int>
+ <reference key="object" ref="457524196"/>
+ <reference key="parent" ref="597164431"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">360</int>
+ <reference key="object" ref="950269879"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="87551637"/>
+ </object>
+ <reference key="parent" ref="664773226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">466</int>
+ <reference key="object" ref="87551637"/>
+ <reference key="parent" ref="950269879"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">357</int>
+ <reference key="object" ref="943334524"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="624236720"/>
+ </object>
+ <reference key="parent" ref="664773226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">465</int>
+ <reference key="object" ref="624236720"/>
+ <reference key="parent" ref="943334524"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">169</int>
+ <reference key="object" ref="530084779"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="49643720"/>
+ </object>
+ <reference key="parent" ref="664773226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">464</int>
+ <reference key="object" ref="49643720"/>
+ <reference key="parent" ref="530084779"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">140</int>
+ <reference key="object" ref="553805234"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="487568130"/>
+ </object>
+ <reference key="parent" ref="664773226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">463</int>
+ <reference key="object" ref="487568130"/>
+ <reference key="parent" ref="553805234"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">136</int>
+ <reference key="object" ref="387030229"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="739969881"/>
+ <reference ref="758028067"/>
+ <reference ref="706605497"/>
+ <reference ref="800292040"/>
+ <reference ref="681115975"/>
+ <reference ref="447167783"/>
+ </object>
+ <reference key="parent" ref="109597301"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">495</int>
+ <reference key="object" ref="739969881"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1009076064"/>
+ </object>
+ <reference key="parent" ref="387030229"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">496</int>
+ <reference key="object" ref="1009076064"/>
+ <reference key="parent" ref="739969881"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">216</int>
+ <reference key="object" ref="758028067"/>
+ <reference key="parent" ref="387030229"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">167</int>
+ <reference key="object" ref="706605497"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="945436340"/>
+ </object>
+ <reference key="parent" ref="387030229"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">468</int>
+ <reference key="object" ref="945436340"/>
+ <reference key="parent" ref="706605497"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">493</int>
+ <reference key="object" ref="800292040"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="1013776364"/>
+ </object>
+ <reference key="parent" ref="387030229"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">494</int>
+ <reference key="object" ref="1013776364"/>
+ <reference key="parent" ref="800292040"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">413</int>
+ <reference key="object" ref="681115975"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="323509275"/>
+ </object>
+ <reference key="parent" ref="387030229"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">470</int>
+ <reference key="object" ref="323509275"/>
+ <reference key="parent" ref="681115975"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">484</int>
+ <reference key="object" ref="447167783"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="979637046"/>
+ </object>
+ <reference key="parent" ref="387030229"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">485</int>
+ <reference key="object" ref="979637046"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="271704379"/>
+ </object>
+ <reference key="parent" ref="447167783"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">486</int>
+ <reference key="object" ref="271704379"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="585870225"/>
+ </object>
+ <reference key="parent" ref="979637046"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">489</int>
+ <reference key="object" ref="585870225"/>
+ <reference key="parent" ref="271704379"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">546</int>
+ <reference key="object" ref="300259137"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="569706565"/>
+ </object>
+ <reference key="parent" ref="573233790"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">547</int>
+ <reference key="object" ref="569706565"/>
+ <reference key="parent" ref="300259137"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">577</int>
+ <reference key="object" ref="445821140"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="34214668"/>
+ <reference ref="355872151"/>
+ <reference ref="798730592"/>
+ </object>
+ <reference key="parent" ref="573233790"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">578</int>
+ <reference key="object" ref="34214668"/>
+ <reference key="parent" ref="445821140"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">579</int>
+ <reference key="object" ref="355872151"/>
+ <reference key="parent" ref="445821140"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">574</int>
+ <reference key="object" ref="798730592"/>
+ <reference key="parent" ref="445821140"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">581</int>
+ <reference key="object" ref="140247589"/>
+ <object class="NSMutableArray" key="children">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <reference ref="441029368"/>
+ </object>
+ <reference key="parent" ref="664773226"/>
+ </object>
+ <object class="IBObjectRecord">
+ <int key="objectID">582</int>
+ <reference key="object" ref="441029368"/>
+ <reference key="parent" ref="140247589"/>
+ </object>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="flattenedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>-1.IBPluginDependency</string>
+ <string>-2.IBPluginDependency</string>
+ <string>-3.IBPluginDependency</string>
+ <string>-3.ImportedFromIB2</string>
+ <string>136.IBPluginDependency</string>
+ <string>136.ImportedFromIB2</string>
+ <string>137.IBPluginDependency</string>
+ <string>137.ImportedFromIB2</string>
+ <string>138.IBPluginDependency</string>
+ <string>138.ImportedFromIB2</string>
+ <string>140.IBPluginDependency</string>
+ <string>140.ImportedFromIB2</string>
+ <string>167.IBPluginDependency</string>
+ <string>167.ImportedFromIB2</string>
+ <string>169.IBPluginDependency</string>
+ <string>169.ImportedFromIB2</string>
+ <string>18.IBPluginDependency</string>
+ <string>18.ImportedFromIB2</string>
+ <string>19.IBPluginDependency</string>
+ <string>19.ImportedFromIB2</string>
+ <string>20.IBPluginDependency</string>
+ <string>20.ImportedFromIB2</string>
+ <string>21.IBPluginDependency</string>
+ <string>21.ImportedFromIB2</string>
+ <string>216.IBPluginDependency</string>
+ <string>216.ImportedFromIB2</string>
+ <string>22.IBPluginDependency</string>
+ <string>22.ImportedFromIB2</string>
+ <string>23.IBPluginDependency</string>
+ <string>23.ImportedFromIB2</string>
+ <string>357.IBPluginDependency</string>
+ <string>357.ImportedFromIB2</string>
+ <string>360.IBPluginDependency</string>
+ <string>360.ImportedFromIB2</string>
+ <string>387.IBEditorWindowLastContentRect</string>
+ <string>387.IBPluginDependency</string>
+ <string>387.IBWindowTemplateEditedContentRect</string>
+ <string>387.ImportedFromIB2</string>
+ <string>388.IBPluginDependency</string>
+ <string>388.ImportedFromIB2</string>
+ <string>389.IBPluginDependency</string>
+ <string>389.ImportedFromIB2</string>
+ <string>391.IBPluginDependency</string>
+ <string>391.ImportedFromIB2</string>
+ <string>393.IBPluginDependency</string>
+ <string>393.ImportedFromIB2</string>
+ <string>395.IBPluginDependency</string>
+ <string>395.ImportedFromIB2</string>
+ <string>397.IBPluginDependency</string>
+ <string>397.ImportedFromIB2</string>
+ <string>399.IBPluginDependency</string>
+ <string>399.ImportedFromIB2</string>
+ <string>401.IBPluginDependency</string>
+ <string>401.ImportedFromIB2</string>
+ <string>403.IBPluginDependency</string>
+ <string>403.ImportedFromIB2</string>
+ <string>405.IBPluginDependency</string>
+ <string>405.ImportedFromIB2</string>
+ <string>407.IBPluginDependency</string>
+ <string>407.ImportedFromIB2</string>
+ <string>409.IBPluginDependency</string>
+ <string>409.ImportedFromIB2</string>
+ <string>413.IBPluginDependency</string>
+ <string>413.ImportedFromIB2</string>
+ <string>484.IBPluginDependency</string>
+ <string>485.IBPluginDependency</string>
+ <string>486.IBEditorWindowLastContentRect</string>
+ <string>486.IBPluginDependency</string>
+ <string>489.IBPluginDependency</string>
+ <string>493.IBPluginDependency</string>
+ <string>494.IBPluginDependency</string>
+ <string>495.IBPluginDependency</string>
+ <string>496.IBPluginDependency</string>
+ <string>498.IBPluginDependency</string>
+ <string>499.IBPluginDependency</string>
+ <string>5.IBEditorWindowLastContentRect</string>
+ <string>5.IBPluginDependency</string>
+ <string>5.IBWindowTemplateEditedContentRect</string>
+ <string>5.ImportedFromIB2</string>
+ <string>5.windowTemplate.hasMinSize</string>
+ <string>5.windowTemplate.minSize</string>
+ <string>500.IBPluginDependency</string>
+ <string>501.IBEditorWindowLastContentRect</string>
+ <string>501.IBPluginDependency</string>
+ <string>501.IBWindowTemplateEditedContentRect</string>
+ <string>501.NSWindowTemplate.visibleAtLaunch</string>
+ <string>502.IBPluginDependency</string>
+ <string>503.IBPluginDependency</string>
+ <string>504.IBPluginDependency</string>
+ <string>507.IBPluginDependency</string>
+ <string>508.IBPluginDependency</string>
+ <string>509.IBPluginDependency</string>
+ <string>510.IBPluginDependency</string>
+ <string>511.IBPluginDependency</string>
+ <string>512.IBPluginDependency</string>
+ <string>513.IBPluginDependency</string>
+ <string>514.IBPluginDependency</string>
+ <string>515.IBPluginDependency</string>
+ <string>521.IBPluginDependency</string>
+ <string>522.IBPluginDependency</string>
+ <string>527.IBPluginDependency</string>
+ <string>528.IBPluginDependency</string>
+ <string>536.IBEditorWindowLastContentRect</string>
+ <string>536.IBPluginDependency</string>
+ <string>536.IBWindowTemplateEditedContentRect</string>
+ <string>536.NSWindowTemplate.visibleAtLaunch</string>
+ <string>537.IBPluginDependency</string>
+ <string>546.IBPluginDependency</string>
+ <string>547.IBPluginDependency</string>
+ <string>574.IBPluginDependency</string>
+ <string>581.IBPluginDependency</string>
+ <string>582.IBPluginDependency</string>
+ <string>6.IBPluginDependency</string>
+ <string>6.ImportedFromIB2</string>
+ <string>7.CustomClassName</string>
+ <string>7.IBPluginDependency</string>
+ <string>7.ImportedFromIB2</string>
+ <string>9.IBPluginDependency</string>
+ <string>9.ImportedFromIB2</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <integer value="1" id="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>{{351, 386}, {455, 195}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{351, 386}, {455, 195}}</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{682, 774}, {382, 23}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{258, 642}, {548, 406}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{258, 642}, {548, 406}}</string>
+ <reference ref="5"/>
+ <reference ref="5"/>
+ <string>{213, 107}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{127, 600}, {679, 358}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{127, 600}, {679, 358}}</string>
+ <reference ref="8"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{91, 762}, {480, 327}}</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>{{91, 762}, {480, 327}}</string>
+ <reference ref="8"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.imagekit.ibplugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>AnselExportPluginBox</string>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ <string>com.apple.InterfaceBuilder.CocoaPlugin</string>
+ <reference ref="5"/>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="unlocalizedProperties">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <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>
+ <object class="NSArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ </object>
+ </object>
+ <nil key="sourceID"/>
+ <int key="maxID">583</int>
+ </object>
+ <object class="IBClassDescriber" key="IBDocument.Classes">
+ <object class="NSMutableArray" key="referencedPartialClassDescriptions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="IBPartialClassDescription">
+ <string key="className">AnselExportController</string>
+ <string key="superclassName">NSObject</string>
+ <object class="NSMutableDictionary" key="actions">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>clickCancelConnect:</string>
+ <string>clickServer:</string>
+ <string>clickViewGallery:</string>
+ <string>closeGalleryView:</string>
+ <string>closeServerList:</string>
+ <string>doAddServer:</string>
+ <string>doCancelAddServer:</string>
+ <string>removeServer:</string>
+ <string>showNewGallery:</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ <string>id</string>
+ </object>
+ </object>
+ <object class="NSMutableDictionary" key="outlets">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <object class="NSMutableArray" key="dict.sortedKeys">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>browserView</string>
+ <string>closeGalleryView</string>
+ <string>defaultImageView</string>
+ <string>firstView</string>
+ <string>galleryCombo</string>
+ <string>mCancelConnect</string>
+ <string>mExportMgr</string>
+ <string>mImageCountLabel</string>
+ <string>mMakeNewServerDefault</string>
+ <string>mNewGalleryButton</string>
+ <string>mServerSheetHostURL</string>
+ <string>mServerSheetPassword</string>
+ <string>mServerSheetServerNickName</string>
+ <string>mServerSheetUsername</string>
+ <string>mServersPopUp</string>
+ <string>mSettingsBox</string>
+ <string>mSizePopUp</string>
+ <string>mviewGallerySheet</string>
+ <string>newServerSheet</string>
+ <string>serverListPanel</string>
+ <string>serverTable</string>
+ <string>spinner</string>
+ <string>statusLabel</string>
+ <string>viewGallery</string>
+ </object>
+ <object class="NSMutableArray" key="dict.values">
+ <bool key="EncodedWithXMLCoder">YES</bool>
+ <string>IKImageBrowserView</string>
+ <string>NSButton</string>
+ <string>NSImageView</string>
+ <string>NSControl</string>
+ <string>NSComboBox</string>
+ <string>NSButton</string>
+ <string>id</string>
+ <string>NSTextField</string>
+ <string>NSButton</string>
+ <string>NSButton</string>
+ <string>NSTextField</string>
+ <string>NSSecureTextField</string>
+ <string>NSTextField</string>
+ <string>NSTextField</string>
+ <string>NSPopUpButton</string>
+ <string>NSBox</string>
+ <string>NSPopUpButton</string>
+ <string>NSWindow</string>
+ <string>NSWindow</string>
+ <string>NSPanel</string>
+ <string>NSTableView</string>
+ <string>NSProgressIndicator</string>
+ <string>NSTextField</string>
+ <string>NSButton</string>
+ </object>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">AnselExportController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">AnselExportController</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">AnselExportPluginBox</string>
+ <string key="superclassName">NSBox</string>
+ <object class="NSMutableDictionary" key="outlets">
+ <string key="NS.key.0">mPlugin</string>
+ <string key="NS.object.0">id</string>
+ </object>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">AnselExportPluginBox.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">AnselExportPluginBox</string>
+ <string key="superclassName">NSBox</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBUserSource</string>
+ <string key="minorKey"/>
+ </object>
+ </object>
+ <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">IBProjectSource</string>
+ <string key="minorKey">TURAnsel.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">TURAnselGallery.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">TURAnselGalleryPanelController.h</string>
+ </object>
+ </object>
+ <object class="IBPartialClassDescription">
+ <string key="className">NSObject</string>
+ <object class="IBClassDescriptionSource" key="sourceIdentifier">
+ <string key="majorKey">IBProjectSource</string>
+ <string key="minorKey">xmlrpc-1.5.1/XMLRPCConnection.h</string>
+ </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>
+ </object>
+ <int key="IBDocument.localizationMode">0</int>
+ <string key="IBDocument.LastKnownRelativeProjectPath">../iPhoto2Ansel.xcodeproj</string>
+ <int key="IBDocument.defaultPropertyAccessControl">3</int>
+ </data>
+</archive>
--- /dev/null
+<?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>LprojCompatibleVersion</key>
+ <string>80311.10.58</string>
+ <key>LprojLocale</key>
+ <string>en</string>
+ <key>LprojRevisionLevel</key>
+ <string>1</string>
+ <key>LprojVersion</key>
+ <string>80411.10.29</string>
+</dict>
+</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>ApertureToAnselExportPlugin</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.yourcompany.export.ApertureToAnselExportPlugin</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>ApertureToAnselExportPlugin</string>
+ <key>CFBundlePackageType</key>
+ <string>BNDL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+ <key>LSHasLocalizedDisplayName</key>
+ <true/>
+ <key>NSPrincipalClass</key>
+ <string>ApertureToAnselExportPlugin</string>
+ <key>ProPlugDictionaryVersion</key>
+ <string>1.0</string>
+ <key>ProPlugDynamicRegistration</key>
+ <false/>
+ <key>ProPlugPlugInGroupList</key>
+ <array>
+ <dict>
+ <key>groupName</key>
+ <string>Export</string>
+ <key>uuid</key>
+ <string>616BA321-B4C2-49DF-8FD8-2E3392D2D240</string>
+ </dict>
+ </array>
+ <key>ProPlugPlugInList</key>
+ <array>
+ <dict>
+ <key>className</key>
+ <string>ApertureToAnselExportPlugin</string>
+ <key>displayName</key>
+ <string>ApertureToAnselExportPlugin</string>
+ <key>group</key>
+ <string>616BA321-B4C2-49DF-8FD8-2E3392D2D240</string>
+ <key>helpURL</key>
+ <string></string>
+ <key>protocolNames</key>
+ <array>
+ <string>ApertureExportPlugIn</string>
+ </array>
+ <key>infoString</key>
+ <string>infoString</string>
+ <key>uuid</key>
+ <string>C4369CA3-A511-4D33-8417-61D15CE507C4</string>
+ </dict>
+ </array>
+ <key>ProPlugProtocolList</key>
+ <array>
+ <dict>
+ <key>protocolName</key>
+ <string>ApertureExportManager</string>
+ <key>versions</key>
+ <array>
+ <integer>1</integer>
+ </array>
+ </dict>
+ </array>
+</dict>
+</plist>
--- /dev/null
+//
+// TURAnsel.h
+// myXMLTest
+//
+// Created by Michael Rubinsky on 10/31/08.
+// Copyright 2008 __MyCompanyName__. All rights reserved.
+//
+#import <Cocoa/Cocoa.h>
+@class TURAnselGallery, XMLRPCResponse;
+
+typedef enum {
+ PERMS_SHOW = 2,
+ PERMS_READ = 4,
+ PERMS_EDIT = 8,
+ PERMS_DELETE = 16
+} HORDE_PERMS;
+
+typedef enum {
+ TURAnselStateDisconnected = 0,
+ TURAnselStateConnected,
+ TURAnselStateError,
+ TURAnselStateCancelled
+} TURAnselState;
+
+
+@interface NSObject (TURAnselDelegate)
+- (void)TURAnselDidInitialize;
+- (void)TURAnselHadError: (NSError *)error;
+@end
+
+@interface TURAnsel : NSObject {
+ NSString *userAgent;
+ NSString *rpcEndPoint;
+ NSString *username;
+ NSString *password;
+ NSMutableArray *galleryList;
+ TURAnselState state;
+ id delegate;
+ NSLock *lock;
+}
+
+@property (readwrite, retain) NSString *rpcEndPoint;
+@property (readwrite, retain) NSString *username;
+@property (readwrite, retain) NSString *password;
+
+- (id)initWithConnectionParameters: (NSDictionary *)params;
+- (void)connect;
+- (TURAnselGallery *)getGalleryById: (NSString *)galleryId;
+- (TURAnselGallery *)getGalleryByIndex: (NSInteger)index;
+- (XMLRPCResponse *)callRPCMethod: (NSString *)methodName withParams: (NSArray *)params;
+- (NSDictionary *)createNewGallery: (NSDictionary *)params;
+- (void)cancel;
+
+// Getters/setters
+- (void) setState: (TURAnselState)state;
+- (TURAnselState)state;
+- (id)delegate;
+- (void)setDelegate:(id)newDelegate;
+@end
--- /dev/null
+//
+// TURAnsel.m
+// AnselCocoaToolkit
+//
+// Created by Michael Rubinsky on 10/31/08.
+// Copyright 2008 Michael Rubinsky <mrubinsk@horde.org>
+//
+
+#import <Foundation/Foundation.h>
+#import <XMLRPC/XMLRPC.h>
+#import "TURXMLConnection.h"
+#import "TURAnsel.h"
+#import "TURAnselGallery.h"
+
+@interface TURAnsel (PrivateAPI)
+- (void)doLogin;
+@end
+
+@implementation TURAnsel
+
+@synthesize rpcEndPoint;
+@synthesize username;
+@synthesize password;
+
+#pragma mark init
+- (id)initWithConnectionParameters: (NSDictionary *)params
+{
+ [super init];
+ galleryList = [[NSMutableArray alloc] init];
+
+ // Initialize the connection properties, KVC style
+ [self setValue:[params objectForKey:@"endpoint"]
+ forKey: @"rpcEndPoint"];
+ [self setValue: [params objectForKey:@"username"]
+ forKey: @"username"];
+ [self setValue: [params objectForKey:@"password"]
+ forKey: @"password"];
+ [self setValue: @"The Ansel Cocoa XML-RPC Client"
+ forKey: @"userAgent"];
+ return self;
+}
+
+#pragma mark Instance Methods
+/**
+ * Initial connection to the Ansel server
+ * Authenticate and fill our cache with the available galleries for uploading to
+ */
+- (void)connect
+{
+ [self doLogin];
+ if (state == TURAnselStateConnected) {
+ if ([delegate respondsToSelector:@selector(TURAnselDidInitialize)]) {
+ [delegate performSelectorOnMainThread:@selector(TURAnselDidInitialize)
+ withObject:self
+ waitUntilDone: NO];
+ }
+ }
+}
+
+- (void) cancel
+{
+ state = TURAnselStateCancelled;
+}
+
+// Fetch a gallery by id
+- (TURAnselGallery *)getGalleryById: (NSString *)galleryId
+{
+ for (TURAnselGallery *g in galleryList) {
+ if ([galleryId isEqualTo: [NSNumber numberWithInt: [g galleryId]]]) {
+ return g;
+ }
+ }
+
+ return nil;
+}
+
+// Return the gallery at the specified position in the internal storage array.
+// Needed for when we are using this class as a datasource for a UI element.
+- (TURAnselGallery *)getGalleryByIndex: (NSInteger)index
+{
+ TURAnselGallery *g = [galleryList objectAtIndex:index];
+ return g;
+}
+
+// Creates a new gallery
+// For now, only takes a gallery name, but no reason it can't take descriiption
+// and default perms etc...
+- (NSDictionary *)createNewGallery: (NSDictionary *)params
+{
+ NSArray *apiparams = [NSArray arrayWithObjects:
+ @"ansel", params, nil];
+ XMLRPCResponse *response = [self callRPCMethod: @"images.createGallery"
+ withParams: apiparams];
+ if (state != TURAnselStateError) {
+ NSDictionary *results = [NSDictionary dictionaryWithObjectsAndKeys:
+ response, @"share_id",
+ [params valueForKey: @"name"], @"attribute_name",
+ @"", @"attribute_desc",
+ [NSNumber numberWithInt: 0], @"attribute_images",
+ [NSNumber numberWithInt: 0], @"attribute_default", nil];
+ TURAnselGallery *newGallery = [[TURAnselGallery alloc] initWithObject: results
+ controller: self];
+ [galleryList addObject: newGallery];
+ //[attributes release];
+ return results;
+ }
+
+ // If we have an error, tell the world
+ // *really* need to give these errors real numbers.....
+ if ([delegate respondsToSelector:@selector(TURAnselHadError:)]) {
+ NSError *error = [NSError errorWithDomain:@"TURAnsel"
+ code:3
+ userInfo:[NSDictionary dictionaryWithObjectsAndKeys: @"Could not create gallery.", @"message", nil]];
+ [delegate TURAnselHadError:error];
+ }
+
+ return nil;
+}
+
+
+// Call an arbitrary RPC method on the Horde server.
+- (XMLRPCResponse *)callRPCMethod: (NSString *)methodName
+ withParams: (NSArray *)params
+{
+ NSLog(@"Initiating connection for %@", methodName);
+
+ // Get a URL object
+ NSURL *url = [NSURL URLWithString: [self valueForKey: @"rpcEndPoint"]];
+ XMLRPCRequest *request = [[XMLRPCRequest alloc]initWithHost: url];
+ [request setUserAgent: [self valueForKey:@"userAgent"]];
+ [request setMethod: methodName withParameters: params];
+
+ NSDictionary *credentials = [[NSDictionary alloc] initWithObjectsAndKeys:
+ [self valueForKey:@"username"], @"username",
+ [self valueForKey:@"password"], @"password", nil];
+
+ TURXMLConnection *connection = [[TURXMLConnection alloc]
+ initWithXMLRPCRequest: request
+ withCredentials:credentials];
+
+ // Don't move on until we have a response - this blocks the thread until
+ // that happens. We should have some kind of timeout here...
+ while ([connection isRunning]) {
+ if (state == TURAnselStateCancelled) {
+ [connection cancel];
+ }
+ NSDate *loopDate = [[NSDate alloc] initWithTimeIntervalSinceNow:0.1];
+ [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
+ beforeDate:loopDate];
+ [loopDate release];
+ }
+
+ if ([connection hasError] == NO) {
+ XMLRPCResponse *response = [[connection response] autorelease];
+ [credentials release];
+ [connection release];
+ [request release];
+ return response;
+ } else {
+ state = TURAnselStateError;
+ NSError *error = [[connection error] retain];
+ if ([delegate respondsToSelector:@selector(TURAnselHadError:)]) {
+ [delegate TURAnselHadError:error];
+ }
+ [error autorelease];
+ [connection release];
+ [request release];
+ return nil;
+ }
+
+}
+
+#pragma mark TableView datasource
+- (int)numberOfRowsInTableView: (NSTableView *)tv
+{
+ return [galleryList count];
+}
+
+- (id)tableView: (NSTableView *)tv
+objectValueForTableColumn:(NSTableColumn *)tc
+ row: (int)rowIndex
+{
+ NSString *identifier = [tc identifier];
+ TURAnselGallery *g = [galleryList objectAtIndex:rowIndex];
+ NSString *stringValue = [g valueForKey: identifier];
+ return stringValue;
+}
+
+#pragma mark ComboBox Datasource
+
+- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox
+{
+ return [galleryList count];
+}
+
+- (id)comboBox:(NSComboBox *)aComboBox
+ objectValueForItemAtIndex:(NSInteger)index
+{
+ TURAnselGallery *g = [galleryList objectAtIndex:index];
+ NSString *stringValue = [g valueForKey:@"galleryName"];
+ return stringValue;
+}
+
+#pragma mark Getter/Setters
+- (TURAnselState) state
+{
+ return state;
+}
+-(void) setState: (TURAnselState)newstate
+{
+ state = newstate;
+}
+
+- (id)delegate {
+ return delegate;
+}
+
+- (void)setDelegate:(id)newDelegate {
+ delegate = newDelegate;
+}
+
+-(void) dealloc
+{
+ NSLog(@"TURAnsel dealloc");
+ [galleryList removeAllObjects];
+ [galleryList release];
+ [rpcEndPoint release];
+ [username release];
+ [password release];
+ [userAgent release];
+ [super dealloc];
+}
+
+#pragma mark PrivateAPI
+- (void)doLogin
+{
+ // Start out by building an array of parameters to pass to the api call.
+ // We start by asking for a list of available galleries with PERMS_EDIT.
+ // This has the side effect of authenticating for the session.
+ NSArray *params = [[NSArray alloc] initWithObjects:
+ @"ansel", // Scope
+ [NSNumber numberWithInt: PERMS_EDIT], // Perms
+ @"", // No parent
+ [NSNumber numberWithBool:YES], // allLevels
+ [NSNumber numberWithInt: 0], // Offset
+ [NSNumber numberWithInt: 0], // Count
+ [self valueForKey:@"username"], nil]; // Restrict to user (This should be an option eventually).do
+
+
+ id galleries = [self callRPCMethod:@"images.listGalleries"
+ withParams:params];
+ if (state != TURAnselStateError) {
+ state = TURAnselStateConnected;
+ for (NSString *gal in galleries) {
+ TURAnselGallery *theGallery = [[TURAnselGallery alloc] initWithObject: gal
+ controller: self];
+ [theGallery setAnselController: self];
+ [galleryList addObject: theGallery];
+ [theGallery release];
+ theGallery = nil;
+ }
+ }
+ [params release];
+}
+
+@end
--- /dev/null
+//
+// TURAnselGallery.h
+//
+// Class to wrap Ansel Gallery.
+//
+// Created by Michael Rubinsky on 10/21/08.
+// Copyright 2008 __MyCompanyName__. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+@class TURAnsel, NSURL, XMLRPCResponse;
+
+typedef enum {
+ TURAnselGalleryStateReady = 0,
+ TURAnselGalleryStateBusy
+} TURAnselGalleryState;
+
+@interface NSObject (TURAnselGalleryDelegate)
+- (void)TURAnselGalleryDidReceiveRPCResponse: (XMLRPCResponse *)response;
+- (void)TURAnselGalleryDidUploadImage: (id *)gallery;
+@end
+
+@interface TURAnselGallery : NSObject {
+ int galleryId;
+ int galleryImageCount;
+ int galleryDefaultImage;
+ NSURL *galleryDefaultImageURL;
+ NSMutableArray *imageList;
+ NSString *galleryName;
+ NSString *galleryDescription;
+ TURAnsel *anselController;
+ TURAnselGalleryState state;
+ id delegate;
+}
+@property (readonly) NSString *galleryName;
+@property (readonly) NSString *galleryDescription;
+@property (readonly) int galleryImageCount;
+@property (readwrite) int galleryDefaultImage;
+
+- (id)initWithObject:(id)galleryData controller:(TURAnsel * )controller;
+- (void)uploadImageObject: (NSDictionary *)imageParameters;
+- (bool)isBusy;
+
+// Getter / Setter
+- (void)setDelegate: (id)newDelegate;
+- (id)delegate;
+- (NSURL *)galleryDefaultImageURL;
+- (id)listImages;
+- (int)galleryId;
+- (TURAnselGalleryState) state;
+- (void)setState: (TURAnselGalleryState)theState;
+- (void)setAnselController:(TURAnsel *)newController;
+@end
\ No newline at end of file
--- /dev/null
+//
+// TURAnselGallery.m
+// Class wraps an Ansel Gallery
+//
+// Created by Michael Rubinsky on 10/21/08.
+// Copyright 2008 __MyCompanyName__. All rights reserved.
+//
+#import <Foundation/Foundation.h>
+#import "XMLRPC/XMLRPC.h"
+#import "TURXMLConnection.h"
+#import "TURAnsel.h"
+#import "TURAnselGallery.h"
+
+@interface TURAnselGallery (PrivateAPI)
+- (void)doUpload: (NSDictionary *)imageParams;
+@end
+
+@implementation TURAnselGallery
+
+@synthesize galleryDescription;
+@synthesize galleryName;
+@synthesize galleryImageCount;
+@synthesize galleryDefaultImage;
+
+#pragma mark Instance Methods --------------------------------------------------
+
+/**
+ * Init a gallery object
+ */
+- (id)initWithObject:(id)galleryData controller:(TURAnsel *)controller
+{
+ [super init];
+ [self setValue: [galleryData valueForKey:@"share_id"]
+ forKey: @"galleryId"];
+ [self setValue:[galleryData valueForKey:@"attribute_desc"]
+ forKey:@"galleryDescription"];
+ [self setValue:[galleryData valueForKey:@"attribute_name"]
+ forKey:@"galleryName"];
+ [self setValue: [galleryData valueForKey:@"attribute_images"]
+ forKey:@"galleryImageCount"];
+ [self setValue: [galleryData valueForKey:@"attribute_default"]
+ forKey:@"galleryDefaultImage"];
+ [self setAnselController: controller];
+ return self;
+}
+
+/**
+ * Requests the gallery's default image url to be fetched from the server
+ * (This information is not present in the gallery definition array returned
+ * from the images.listGalleries call).
+ */
+- (NSURL *)galleryDefaultImageURL
+{
+ if (!galleryDefaultImageURL) {
+
+ NSArray *params = [[NSArray alloc] initWithObjects:
+ @"ansel", // Scope
+ [NSNumber numberWithInt: galleryDefaultImage], // Image Id
+ @"thumb", // Thumbnail type
+ [NSNumber numberWithBool:YES], // Full path
+ nil];
+
+ [self setState:TURAnselGalleryStateBusy];
+ XMLRPCResponse *response = [anselController callRPCMethod: @"images.getImageUrl"
+ withParams: params];
+
+ if (response) {
+ galleryDefaultImageURL = [[NSURL URLWithString: [NSString stringWithFormat:@"%@", response]] retain];
+ }
+ }
+
+ return galleryDefaultImageURL;
+}
+
+/**
+ * Get the complete list of image ids and URLs
+ */
+- (id)listImages
+{
+ if (!imageList) {
+
+ NSArray *params = [[NSArray alloc] initWithObjects:
+ @"ansel", //Scope
+ [NSNumber numberWithInt: galleryId], //Gallery Id
+ [NSNumber numberWithInt: 2], //PERMS_SHOW
+ @"thumb", // Thumbnail
+ [NSNumber numberWithBool:YES], // Full path
+ nil];
+
+ [self setState:TURAnselGalleryStateBusy];
+ XMLRPCResponse *response = [anselController callRPCMethod: @"images.listImages"
+ withParams: params];
+
+ if (response) {
+ imageList = [response retain];
+ }
+ }
+
+ return imageList;
+}
+
+/**
+ * Upload the provided image to this gallery.
+ */
+- (void)uploadImageObject: (NSDictionary *)imageParameters
+{
+ [self doUpload: imageParameters];
+}
+
+- (bool) isBusy
+{
+ if (state == TURAnselGalleryStateReady) {
+ return NO;
+ } else {
+ return YES;
+ }
+}
+
+#pragma mark Getter/Setter------------------------------------------------------
+- (int)galleryId
+{
+ return galleryId;
+}
+- (void)setGalleryId:(int)id
+{
+ galleryId = id;
+}
+
+- (id)delegate
+{
+ return delegate;
+}
+- (void)setDelegate: (id)newDelegate
+{
+ delegate = newDelegate;
+}
+
+- (TURAnselGalleryState)state
+{
+ return state;
+}
+- (void)setState: (TURAnselGalleryState)theState
+{
+ state = theState;
+}
+
+- (void)setAnselController: (TURAnsel *)newController
+{
+ [anselController autorelease];
+ anselController = [newController retain];
+}
+
+- (TURAnsel *)anselController
+{
+ return anselController;
+}
+
+#pragma mark Overrides----------------------------------------------------------
+- (void)dealloc
+{
+ NSLog(@"TURAnselGallery dealloc called on Gallery %@", self);
+ [anselController release];
+ [galleryDefaultImageURL release];
+ [imageList release];
+ [super dealloc];
+}
+
+- (id)init
+{
+ [super init];
+ [self setState:TURAnselGalleryStateReady];
+ return self;
+}
+
+- (id)description
+{
+ NSString *text = [NSString stringWithFormat:@"Description: %@ Id: %d has: %d images", galleryName, galleryId, galleryImageCount];
+ return text;
+}
+
+#pragma mark PrivateAPI
+- (void)doUpload:(NSDictionary *)imageParameters
+{
+ // Need to build the XMLRPC params array now.
+ NSArray *params = [[NSArray alloc] initWithObjects:
+ @"ansel", // app
+ [NSNumber numberWithInt: galleryId], // gallery_id
+ [imageParameters valueForKey: @"data"], // image data array
+ [imageParameters valueForKey: @"default"], // set as default?
+ @"", // Additional gallery data to set?
+ @"base64", // Image data encoding
+ nil];
+
+ // Send the request up to the controller
+ [anselController callRPCMethod: @"images.saveImage"
+ withParams: params];
+
+ if ([delegate respondsToSelector:@selector(TURAnselGalleryDidUploadImage:)]) {
+ [delegate performSelectorOnMainThread: @selector(TURAnselGalleryDidUploadImage:)
+ withObject: self
+ waitUntilDone: NO];
+ }
+
+ [params release];
+}
+@end
--- /dev/null
+//
+// TURAnselGalleryPanelController.h
+// iPhoto2Ansel
+//
+// Created by Michael Rubinsky on 12/7/08.
+// Copyright 2008 __MyCompanyName__. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "TURAnsel.h"
+
+@interface NSObject (TURAnselGalleryPaneControllerDelegate)
+-(void)TURAnselGalleryPanelDidAddGallery;
+@end
+
+@interface TURAnselGalleryPanelController : NSObject {
+ // Outlets
+ IBOutlet NSTextField *galleryNameTextField;
+ IBOutlet NSTextField *gallerySlugTextField;
+ IBOutlet NSTextField *galleryDescTextField;
+ IBOutlet NSPanel *newGallerySheet;
+
+ TURAnsel *anselController;
+ NSWindow *controllerWindow;
+ id delegate;
+}
+
+// Actions
+- (IBAction)doNewGallery: (id)sender;
+- (IBAction)cancelNewGallery: (id)sender;
+- (id)initWithController: (TURAnsel *)theController;
+- (id)initWithController: (TURAnsel *)theController withGalleryName: (NSString *)galleryName;
+- (void)showSheetForWindow: (NSWindow *)theWindow;
+- (void)setDelegate: (id)theDelegate;
+@end
--- /dev/null
+//
+// TURAnselGalleryPanelController.m
+// iPhoto2Ansel
+//
+// Created by Michael Rubinsky on 12/7/08.
+// Copyright 2008 __MyCompanyName__. All rights reserved.
+//
+
+#import "TURAnselGalleryPanelController.h"
+
+@implementation TURAnselGalleryPanelController
+
+#pragma mark IBActions
+- (IBAction)cancelNewGallery: (id)sender
+{
+ [NSApp endSheet: newGallerySheet];
+ [newGallerySheet orderOut: nil];
+}
+
+- (IBAction)doNewGallery: (id)sender
+{
+ // Get Gallery Properties from the panel.
+ NSString *galleryName = [galleryNameTextField stringValue];
+ NSString *gallerySlug = [gallerySlugTextField stringValue];
+ NSString *galleryDescription = [galleryDescTextField stringValue];
+
+ if (!galleryName) {
+
+ [NSApp endSheet: newGallerySheet];
+ [newGallerySheet orderOut: nil];
+
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText:@"Gallery names cannot be empty"];
+ [alert setAlertStyle: NSCriticalAlertStyle];
+ [alert beginSheetModalForWindow: controllerWindow
+ modalDelegate: nil
+ didEndSelector: nil
+ contextInfo: nil];
+ [alert release];
+ return;
+ }
+ NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
+ galleryName, @"name",
+ gallerySlug, @"slug",
+ galleryDescription, @"desc", nil];
+
+ NSDictionary *results = [[anselController createNewGallery: params] retain];
+
+ [NSApp endSheet: newGallerySheet];
+ [newGallerySheet orderOut: nil];
+
+ if ([anselController state] != TURAnselStateError) {
+ NSAlert *alert = [[NSAlert alloc] init];
+ [alert setMessageText: @"Gallery successfully created."];
+ [alert beginSheetModalForWindow: controllerWindow
+ modalDelegate: nil
+ didEndSelector: nil
+ contextInfo: nil];
+ [alert release];
+ if ([delegate respondsToSelector:@selector(TURAnselGalleryPanelDidAddGallery)]) {
+ [delegate TURAnselGalleryPanelDidAddGallery];
+ }
+ }
+
+ [results release];
+}
+
+-(id)initWithController: (TURAnsel *)theController
+{
+ [super init];
+ anselController = [theController retain];
+ [NSBundle loadNibNamed: @"AnselGalleryPanel"
+ owner: self];
+
+ return self;
+}
+
+- (id)initWithController: (TURAnsel *)theController
+ withGalleryName: (NSString *)galleryName
+{
+
+ [super init];
+ anselController = [theController retain];
+ [NSBundle loadNibNamed: @"AnselGalleryPanel"
+ owner: self];
+
+ [galleryNameTextField setStringValue: galleryName];
+
+ return self;
+
+
+}
+
+- (void)setDelegate: (id)theDelegate
+{
+ delegate = theDelegate; // weak
+}
+
+
+- (void)showSheetForWindow: (NSWindow *)theWindow
+{
+ [controllerWindow release];
+ controllerWindow = [theWindow retain];
+ [NSApp beginSheet: newGallerySheet
+ modalForWindow: theWindow
+ modalDelegate: nil
+ didEndSelector: nil
+ contextInfo: nil];
+}
+
+- (void)dealloc
+{
+ [anselController release];
+ [controllerWindow release];
+ [super dealloc];
+}
+
+@end
--- /dev/null
+//
+// TURXMLConnection.h
+//
+// This is a thin wrapper around XMLRPCRequests to allow them to more easily
+// be run in a seperate thread then the reciever that needs to know about it's
+// progress. Done to deal with modal threads blocking the NSURLConnection
+// responses in iPhoto plugins.
+//
+// Created by Michael Rubinsky on 11/5/08.
+// Copyright 2008 __MyCompanyName__. All rights reserved.
+//
+
+#import <Cocoa/Cocoa.h>
+#import "XMLRPC/XMLRPCConnection.h"
+@class XMLRPCRequest;
+
+// Local error codes
+#define TURXML_ERR_BADAUTH 1 // Login failed
+#define TURXML_ERR_PARSE 2 // Could not parse XML
+#define TURXML_ERR_CANCEL 3 // Action cancelled
+
+@interface TURXMLConnection : XMLRPCConnection {
+ NSString *username;
+ NSString *password;
+ XMLRPCResponse *response;
+ XMLRPCConnection *connection;
+ BOOL hasError;
+ NSError *error;
+ BOOL running;
+}
+
+- (TURXMLConnection *)initWithXMLRPCRequest: (XMLRPCRequest *)request
+ withCredentials:(NSDictionary *)credentials;
+
+- (id)response;
+- (BOOL)hasError;
+- (BOOL)isRunning;
+- (NSError *)error;
+@end
--- /dev/null
+//
+// TURXMLConnection.m
+// iPhoto2Ansel
+//
+// Created by Michael Rubinsky on 11/5/08.
+// Copyright 2008 __MyCompanyName__. All rights reserved.
+//
+#import <Foundation/Foundation.h>
+#import <XMLRPC/XMLRPC.h>
+#import "TURXMLConnection.h"
+
+@implementation TURXMLConnection
+
+static NSString *ERR_DOMAIN = @"com.theupstairsroom.XMLConnection";
+
+- (TURXMLConnection *)initWithXMLRPCRequest: (XMLRPCRequest *)request
+ withCredentials: (NSDictionary *)credentials
+{
+ username = [[credentials objectForKey:@"username"] retain];
+ password = [[credentials objectForKey:@"password"] retain];
+ running = YES;
+ connection = [[XMLRPCConnection alloc] initWithXMLRPCRequest: request
+ delegate: self];
+ return self;
+}
+
+- (BOOL)isRunning
+{
+ return running;
+}
+
+- (id)response
+{
+ return response;
+}
+
+- (void)dealloc
+{
+ NSLog(@"TURXMLConnection dealloc called");
+ [username release];
+ [password release];
+ [super dealloc];
+}
+
+- (BOOL)hasError
+{
+ return hasError;
+}
+
+// Return the error object, but get rid of it.
+- (NSError *)error
+{
+ return [error autorelease];
+}
+
+#pragma mark XMLRPCConnection Delegate
+- (void)connection: (XMLRPCConnection *)xconnection
+didReceiveResponse: (XMLRPCResponse *)theResponse
+ forMethod: (NSString *)method
+{
+ NSLog(@"Received response for %@", method);
+ if (theResponse != nil) {
+ if ([theResponse isFault]) {
+ NSLog(@"Fault code: %@", [theResponse faultCode]);
+ NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
+ [theResponse faultString], @"NSLocalizedDescriptionKey", nil];
+ error = [[NSError alloc] initWithDomain: ERR_DOMAIN
+ code: [[theResponse faultCode] intValue]
+ userInfo: userInfo];
+ hasError = YES;
+ [theResponse release];
+ [xconnection cancel];
+ }
+ } else {
+ NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
+ @"Unable to parse XML in XMLRPCDelegate method", @"NSLocalizedDescriptionKey", nil];
+ error = [[NSError alloc] initWithDomain: ERR_DOMAIN
+ code: TURXML_ERR_PARSE
+ userInfo: userInfo];
+ hasError = YES;
+ [theResponse release];
+ }
+
+ response = [[theResponse responseObject] retain];
+ [theResponse release];
+ if (!hasError) {
+ // Looks like the NSURLConnection object is released somewhere upstream
+ // when there is an error.
+ [xconnection release];
+ }
+ running = NO;
+}
+
+- (void)connection: (XMLRPCConnection *)xconnection
+didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge
+ forMethod: (NSString *)method
+{
+ NSLog(@"Credentials requested in method: %@", method);
+ if ([challenge previousFailureCount] == 0) {
+ NSURLCredential *newCredential;
+ newCredential = [NSURLCredential credentialWithUser: [self valueForKey: @"username"]
+ password: [self valueForKey: @"password"]
+ persistence: NSURLCredentialPersistenceForSession];
+
+ [[challenge sender] useCredential: newCredential
+ forAuthenticationChallenge: challenge];
+ NSLog(@"Credentials sent %@", newCredential);
+ } else {
+ [[challenge sender] cancelAuthenticationChallenge: challenge];
+ NSDictionary *userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
+ @"Authentication Failed", @"NSLocalizedDescriptionKey",
+ @"Check your username and password and try again.", @"NSLocalizedRecoverySuggestionErrorKey", nil];
+
+ error = [[NSError alloc] initWithDomain: ERR_DOMAIN
+ code: TURXML_ERR_BADAUTH
+ userInfo: userInfo];
+ running = NO;
+ hasError = YES;
+ }
+}
+
+- (void)connection: (XMLRPCConnection *)xconnection
+ didFailWithError: (NSError *)xerror
+ forMethod: (NSString *)method
+{
+ error = [xerror retain];
+ hasError = YES;
+ running = NO;
+}
+
+// Set the status and tell the underlaying connection we cancelled.
+- (void) cancel
+{
+ running = NO;
+ hasError = YES;
+ error = [[NSError alloc] initWithDomain: ERR_DOMAIN
+ code: TURXML_ERR_CANCEL
+ userInfo: nil];
+ [super cancel];
+}
+
+@end
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.yourcompany.${PRODUCT_NAME:identifier}</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>FMWK</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+</dict>
+</plist>
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// NSDataAdditions.h
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import <Foundation/NSData.h>
+
+@class NSString;
+
+@interface NSData (NSDataAdditions)
+
++ (NSData *)base64DataFromString: (NSString *)string;
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// NSDataAdditions.m
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import "NSDataAdditions.h"
+
+@implementation NSData (NSDataAdditions)
+
++ (NSData *)base64DataFromString: (NSString *)string {
+ unsigned long ixtext, lentext;
+ unsigned char ch, input[4], output[3];
+ short i, ixinput;
+ Boolean flignore, flendtext = false;
+ const char *temporary;
+ NSMutableData *result;
+
+ if (string == nil) {
+ return [NSData data];
+ }
+
+ ixtext = 0;
+
+ temporary = [string UTF8String];
+
+ lentext = [string length];
+
+ result = [NSMutableData dataWithCapacity: lentext];
+
+ ixinput = 0;
+
+ while (true) {
+ if (ixtext >= lentext) {
+ break;
+ }
+
+ ch = temporary[ixtext++];
+
+ flignore = false;
+
+ if ((ch >= 'A') && (ch <= 'Z')) {
+ ch = ch - 'A';
+ } else if ((ch >= 'a') && (ch <= 'z')) {
+ ch = ch - 'a' + 26;
+ } else if ((ch >= '0') && (ch <= '9')) {
+ ch = ch - '0' + 52;
+ } else if (ch == '+') {
+ ch = 62;
+ } else if (ch == '=') {
+ flendtext = true;
+ } else if (ch == '/') {
+ ch = 63;
+ } else {
+ flignore = true;
+ }
+
+ if (!flignore) {
+ short ctcharsinput = 3;
+ Boolean flbreak = false;
+
+ if (flendtext) {
+ if (ixinput == 0) {
+ break;
+ }
+
+ if ((ixinput == 1) || (ixinput == 2)) {
+ ctcharsinput = 1;
+ } else {
+ ctcharsinput = 2;
+ }
+
+ ixinput = 3;
+
+ flbreak = true;
+ }
+
+ input[ixinput++] = ch;
+
+ if (ixinput == 4) {
+ ixinput = 0;
+
+ output[0] = (input[0] << 2) | ((input[1] & 0x30) >> 4);
+ output[1] = ((input[1] & 0x0F) << 4) | ((input[2] & 0x3C) >> 2);
+ output[2] = ((input[2] & 0x03) << 6) | (input[3] & 0x3F);
+
+ for (i = 0; i < ctcharsinput; i++) {
+ [result appendBytes: &output[i] length: 1];
+ }
+ }
+
+ if (flbreak) {
+ break;
+ }
+ }
+ }
+
+ return result;
+}
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// NSStringAdditions.h
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import <Foundation/NSString.h>
+
+@class NSData;
+
+@interface NSString (NSStringAdditions)
+
++ (NSString *)base64StringFromData: (NSData *)data length: (NSInteger)length;
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// NSStringAdditions.m
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import "NSDataAdditions.h"
+
+/* Base64 Encoding Table */
+static char base64EncodingTable[64] = {
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+ 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+ 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
+};
+
+@implementation NSString (NSStringExtensions)
+
++ (NSString *)base64StringFromData: (NSData *)data length: (NSInteger)length {
+ unsigned long ixtext, lentext;
+ long ctremaining;
+ unsigned char input[3], output[4];
+ short i, charsonline = 0, ctcopy;
+ const unsigned char *raw;
+ NSMutableString *result;
+
+ lentext = [data length];
+
+ if (lentext < 1) {
+ return @"";
+ }
+
+ result = [NSMutableString stringWithCapacity: lentext];
+
+ raw = [data bytes];
+
+ ixtext = 0;
+
+ while (true) {
+ ctremaining = lentext - ixtext;
+
+ if (ctremaining <= 0) {
+ break;
+ }
+
+ for (i = 0; i < 3; i++) {
+ unsigned long ix = ixtext + i;
+
+ if (ix < lentext) {
+ input[i] = raw[ix];
+ } else {
+ input[i] = 0;
+ }
+ }
+
+ output[0] = (input[0] & 0xFC) >> 2;
+ output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4);
+ output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6);
+ output[3] = input[2] & 0x3F;
+
+ ctcopy = 4;
+
+ switch (ctremaining) {
+ case 1:
+ ctcopy = 2;
+ break;
+ case 2:
+ ctcopy = 3;
+ break;
+ }
+
+ for (i = 0; i < ctcopy; i++) {
+ [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]];
+ }
+
+ for (i = ctcopy; i < 4; i++) {
+ [result appendString: @"="];
+ }
+
+ ixtext += 3;
+ charsonline += 4;
+
+ if (length > 0) {
+ if (charsonline >= length) {
+ charsonline = 0;
+
+ [result appendString: @"\n"];
+ }
+ }
+ }
+
+ return result;
+}
+
+@end
--- /dev/null
+<?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>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIconFile</key>
+ <string></string>
+ <key>CFBundleIdentifier</key>
+ <string>com.divisiblebyzero.XMLRPC</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>${PRODUCT_NAME}</string>
+ <key>CFBundlePackageType</key>
+ <string>FMWK</string>
+ <key>CFBundleSignature</key>
+ <string>ZERO</string>
+ <key>CFBundleVersion</key>
+ <string>1.5.1</string>
+ <key>NSPrincipalClass</key>
+ <string></string>
+ </dict>
+</plist>
--- /dev/null
+== License
+
+= The Cocoa XML-RPC Framework is distributed under the MIT License:
+
+Copyright 2008 Eric Czarny <eczarny@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
--- /dev/null
+/* ENGLISH */
+
+NSHumanReadableCopyright = "Cocoa XML-RPC Framework © 2008 Divisible by Zero";
--- /dev/null
+== The Cocoa XML-RPC Framework
+
+The Cocoa XML-RPC Framework is a simple, and lightweight, XML-RPC client
+framework written in Objective-C.
+
+== Requirements
+
+The Cocoa XML-RPC Framework has been built, and designed, for OS X 10.4 or
+later. The framework relies on NSURLConnection and NSURLRequest for HTTP
+transport, and NSXMLDocument for parsing XML-RPC responses.
+
+This version of the framework will not work with the iPhone SDK.
+
+== Usage
+
+The following examples of the Cocoa XML-RPC Framework assume that the included
+XML-RPC test server are running. The test server can be found under:
+
+ XMLRPC\Tools\xmlrpc-server
+
+The XML-RPC test server is written in Java and utilizes the Apache XML-RPC
+server library. To start the server simply call Ant from the same directory
+where the build.xml file is located:
+
+ ant <target>
+
+The target is optional, omitting this argument will execute the default
+target (the default target is "run"). The following targets are available:
+
+ - compile
+ - jar
+ - run
+ - clean
+
+More information on the XML-RPC test server can be found below.
+
+= Asynchronous
+
+Making an asynchronous XML-RPC request is probably the best way to communicate
+with an XML-RPC server. After creating an XMLRPCConnection the XML-RPC request
+is sent to the XML-RPC server in the background. This allows the requesting
+application to continue performing other functions.
+
+Sending an asynchronous XML-RPC request is simple:
+
+- (void)sendRequest {
+ NSURL *URL = [NSURL URLWithString: @"http://127.0.0.1/"];
+ XMLRPCRequest *request = [[XMLRPCRequest alloc] initWithHost: URL];
+
+ [request setMethod: @"Echo.echo" withParameter: @"Hello World!"];
+ [request setUserAgent: @"XML-RPC Example"];
+
+ XMLRPCConnection *connection = [[XMLRPCConnection alloc]
+ initWithXMLRPCRequest: request delegate: self];
+
+ if (connection == nil) {
+ NSLog(@"Connection failed.");
+ }
+}
+
+It is important to understand that the caller is responsible for releasing the
+connection and response objects at the end of the connection response and
+connection failure delegate methods. Do not attempt to release the connection
+object anywhere but within these two delegate methods.
+
+- (void)connection: (XMLRPCConnection *)connection didReceiveResponse:
+ (XMLRPCResponse *)response forMethod: (NSString *)method {
+ if (response != nil) {
+ if ([response isFault]) {
+ NSLog(@"Fault code: %@", [response faultCode]);
+ } else {
+ NSLog(@"Response object: %@", [response responseObject]);
+ }
+
+ NSLog(@"Response source: %@", [response responseSourceXML]);
+ } else {
+ NSLog(@"Unable to parse response.");
+ }
+
+ [response release];
+ [connection release];
+}
+
+= Synchronous
+
+Synchronous XML-RPC requests may be suitable in some situations. Unlike sending
+an asynchronous request, a synchronous request is made in the foreground causing
+the calling application to await an XML-RPC response.
+
+- (void)sendRequest {
+ NSURL *URL = [NSURL URLWithString: @"http://127.0.0.1/"];
+ XMLRPCRequest *request = [[[XMLRPCRequest alloc] initWithHost: URL]];
+
+ [request setMethod: @"Echo.echo" setParameter: @"Hello World!"];
+ [request setUserAgent: @"XML-RPC Example"];
+
+ XMLRPCResponse *response = [XMLRPCConnection
+ sendSynchronousXMLRPCRequest: request];
+
+ if (response != nil) {
+ if ([response isFault]) {
+ NSLog(@"Fault: %@", [response fault]);
+ } else {
+ NSLog(@"Response object: %@", [response responseObject]);
+ }
+
+ NSLog(@"Response source: %@", [response responseSourceXML]);
+ } else {
+ NSLog(@"Unable to parse response.");
+ }
+
+ [request release];
+ [response release];
+}
+
+A response will always return nil upon creation if it is unable to parse the XML
+data. However, in the case of a synchronous request, a nil response can either
+mean the response could not be parsed, or the connection failed to send the
+request.
+
+An asynchronous connection will return nil if it fails to send the request. The
+response passed to the connection:didReceiveResponse:forMethod: delegate
+method will be nil if the response object is unable to parse the XML response
+data.
+
+Also note that you may have access to the raw XML source to either the request
+and/or response. Though you may be able to extract the source from the request
+at any moment in the object's life, it is always best to get the source after
+invoking the setMethod:withParameters: or setMethod:withParameter: methods. If
+you ask for the source too early, you won't receive the fully created XML
+request source.
+
+== Using the XML-RPC test server
+
+The XML-RPC test server is a simple Java application that allows developers to
+easily develop software with Cocoa XML-RPC Framework. The test server is built
+on top of the Apache XML-RPC library.
+
+Using the test server is easy, simply call Ant from the same location as the
+build.xml file:
+
+ ant
+
+The default target is the "run" target, which will compile the Java source code,
+build the executable JAR file, and run the application. Included with the test
+server is a server.sh script, this Bash script will launch the test server (if
+it has already been built with Ant).
+
+= Creating XML-RPC server handlers
+
+The XML-RPC test server exposes the methods defined in server handlers. Each
+server handler is simply a Java class that is registered with the Apache XML-RPC
+library. Here is an example of the Echo handler provided in the distribution:
+
+ public class Echo {
+ public String echo(String message) {
+ return message;
+ }
+ }
+
+This handler simply takes a message provided in the XML-RPC request and returns
+it in the XML-RPC response. To register this handler with the XML-RPC server
+simply add it to the propertyHandlerMapping in Server.java:
+
+ import com.divisiblebyzero.xmlrpc.model.handlers.*;
+
+ ...
+
+ try {
+ propertyHandlerMapping.addHandler("Echo", Echo.class);
+
+ this.embeddedXmlRpcServer.setHandlerMapping(propertyHandlerMapping);
+ } catch (Exception e) {
+ this.controlPanel.addLogMessage(e.getMessage());
+ }
+
+The handler is now available to any incoming XML-RPC requests.
+
+== What if I find a bug, or what if I want to help?
+
+Please, contact me with any questions, comments, suggestions, or problems. I try
+to make the time to answer every request. If you find a bug, it would be
+helpful to also provide steps to reproduce the problem.
+
+Those wishing to contribute to the project should begin by obtaining a working
+copy of the trunk:
+
+ svn co http://svn.divisiblebyzero.com/xmlrpc/trunk/
+
+The trunk contains the most recent changes to the project. The modifications you
+make should then be used to create a patch. Patches should be sent to me with a
+detailed description of every change.
+
+== Acknowledgments
+
+The Base64 encoder/decoder found in NSStringAdditions and NSDataAdditions have
+been adapted from code provided by Dave Winer.
+
+The idea for this framework came from examples provided by Brent Simmons, the
+creator of NetNewsWire.
+
+== License
+
+Copyright 2008 Eric Czarny.
+
+The Cocoa XML-RPC Framework should be accompanied by a LICENSE file, this
+file contains the license relevant to this distribution. If no LICENSE exists
+please contact Eric Czarny <eczarny@gmail.com>.
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>English</string>
+ <key>CFBundleExecutable</key>
+ <string>${EXECUTABLE_NAME}</string>
+ <key>CFBundleIdentifier</key>
+ <string>com.yourcompany.XMLRPC</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundlePackageType</key>
+ <string>FMWK</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleVersion</key>
+ <string>1.0</string>
+</dict>
+</plist>
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPC.h
+//
+// Created by Eric Czarny on Wednesday, February 10, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import <XMLRPC/XMLRPCConnection.h>
+#import <XMLRPC/XMLRPCRequest.h>
+#import <XMLRPC/XMLRPCResponse.h>
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPC.pch
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#ifdef __OBJC__
+ #import <Foundation/Foundation.h>
+#endif
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPCConnection.h
+//
+// Created by Eric Czarny on Thursday, January 15, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import <Foundation/Foundation.h>
+
+@class XMLRPCRequest, XMLRPCResponse;
+
+/* XML-RPC Connection Notifications */
+extern NSString *XMLRPCSentRequestNotification;
+extern NSString *XMLRPCRequestFailedNotification;
+extern NSString *XMLRPCReceivedAuthenticationChallengeNotification;
+extern NSString *XMLRPCCancelledAuthenticationChallengeNotification;
+extern NSString *XMLRPCReceivedResponseNotification;
+
+@interface XMLRPCConnection : NSObject {
+ NSURLConnection *currentConnection;
+ NSString *currentXMLRPCMethod;
+ NSMutableData *incomingXMLData;
+ id applicationDelegate;
+}
+
+- (id)initWithXMLRPCRequest: (XMLRPCRequest *)request delegate: (id)delegate;
+
+#pragma mark -
+
++ (XMLRPCResponse *)sendSynchronousXMLRPCRequest: (XMLRPCRequest *)request;
+
+#pragma mark -
+
+- (void)cancel;
+
+@end
+
+#pragma mark -
+
+@interface NSObject (XMLRPCConnectionDelegate)
+
+- (void)connection: (XMLRPCConnection *)connection didReceiveResponse: (XMLRPCResponse *)response forMethod: (NSString *)method;
+
+- (void)connection: (XMLRPCConnection *)connection didFailWithError: (NSError *)error forMethod: (NSString *)method;
+
+- (void)connection: (XMLRPCConnection *)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge forMethod: (NSString *)method;
+
+- (void)connection: (XMLRPCConnection *)connection didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge forMethod: (NSString *)method;
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPCConnection.m
+//
+// Created by Eric Czarny on Thursday, January 15, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import "XMLRPCConnection.h"
+#import "XMLRPCRequest.h"
+#import "XMLRPCResponse.h"
+
+NSString *XMLRPCSentRequestNotification = @"XML-RPC Sent Request";
+NSString *XMLRPCRequestFailedNotification = @"XML-RPC Failed Receiving Response";
+NSString *XMLRPCReceivedAuthenticationChallengeNotification = @"XML-RPC Received Authentication Challenge";
+NSString *XMLRPCCancelledAuthenticationChallengeNotification = @"XML-RPC Cancelled Authentication Challenge";
+NSString *XMLRPCReceivedResponseNotification = @"XML-RPC Successfully Received Response";
+
+@interface XMLRPCConnection (XMLRPCConnectionPrivate)
+
+- (void)connection: (NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
+
+- (void)connection: (NSURLConnection *)connection didReceiveData: (NSData *)data;
+
+- (void)connection: (NSURLConnection *)connection didFailWithError: (NSError *)error;
+
+- (void)connection: (NSURLConnection *)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge;
+
+- (void)connection: (NSURLConnection *)connection didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge;
+
+- (void)connectionDidFinishLoading: (NSURLConnection *)connection;
+
+@end
+
+#pragma mark -
+
+@implementation XMLRPCConnection
+
+- (id)initWithXMLRPCRequest: (XMLRPCRequest *)request delegate: (id)delegate {
+ if (self = [super init]) {
+ [request retain];
+ incomingXMLData = [[NSMutableData alloc] init];
+ currentConnection = [[NSURLConnection alloc] initWithRequest: [request request] delegate: self];
+
+ applicationDelegate = delegate;
+
+ if (currentConnection != nil) {
+ currentXMLRPCMethod = [[NSString alloc] initWithString: [request method]];
+
+ [request release];
+
+ [[NSNotificationCenter defaultCenter] postNotificationName: XMLRPCSentRequestNotification object: nil];
+ } else {
+ if ([applicationDelegate respondsToSelector: @selector(connection:didFailWithError:forMethod:)]) {
+ [applicationDelegate connection: self didFailWithError: nil forMethod: [request method]];
+ }
+
+ [request release];
+
+ return nil;
+ }
+ }
+
+ return self;
+}
+
+#pragma mark -
+
++ (XMLRPCResponse *)sendSynchronousXMLRPCRequest: (XMLRPCRequest *)request {
+ NSData *data = [[[NSURLConnection sendSynchronousRequest: [request request]
+ returningResponse: nil error: nil] retain] autorelease];
+
+ [request release];
+
+ if (data != nil) {
+ return [[[XMLRPCResponse alloc] initWithData: data] autorelease];
+ }
+
+ return nil;
+}
+
+#pragma mark -
+
+- (void)cancel {
+ [currentConnection cancel];
+
+ [currentConnection release];
+}
+
+#pragma mark -
+
+- (void)dealloc {
+ [currentXMLRPCMethod release];
+ [incomingXMLData release];
+ NSLog(@"XMLRPCConnection being released");
+ [super dealloc];
+}
+
+@end
+
+#pragma mark -
+
+@implementation XMLRPCConnection (XMLRPCConnectionPrivate)
+
+- (void)connection: (NSURLConnection *)connection didReceiveResponse: (NSURLResponse *)response {
+ if([response respondsToSelector: @selector(statusCode)]) {
+ NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
+
+ if(statusCode >= 400) {
+ [connection cancel];
+
+ if ([applicationDelegate respondsToSelector: @selector(connection:didFailWithError:forMethod:)]) {
+ NSError *error = [NSError errorWithDomain: NSCocoaErrorDomain code: statusCode userInfo: nil];
+
+ [applicationDelegate connection: self didFailWithError: error forMethod: currentXMLRPCMethod];
+ }
+
+ [connection release];
+ }
+ }
+
+ [incomingXMLData setLength: 0];
+}
+
+- (void)connection: (NSURLConnection *)connection didReceiveData: (NSData *)data {
+ [incomingXMLData appendData: data];
+}
+
+- (void)connection: (NSURLConnection *)connection didFailWithError: (NSError *)error {
+ if ([applicationDelegate respondsToSelector: @selector(connection:didFailWithError:forMethod:)]) {
+ [applicationDelegate connection: self didFailWithError: error forMethod: currentXMLRPCMethod];
+ }
+
+ [[NSNotificationCenter defaultCenter] postNotificationName: XMLRPCRequestFailedNotification object: nil];
+
+ [connection release];
+}
+
+- (void)connection: (NSURLConnection *)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge {
+ if ([applicationDelegate respondsToSelector: @selector(connection:didReceiveAuthenticationChallenge:forMethod:)]) {
+ [applicationDelegate connection: self didReceiveAuthenticationChallenge: challenge forMethod: currentXMLRPCMethod];
+ }
+
+ [[NSNotificationCenter defaultCenter] postNotificationName: XMLRPCReceivedAuthenticationChallengeNotification object: nil];
+}
+
+- (void)connection: (NSURLConnection *)connection didCancelAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge {
+ if ([applicationDelegate respondsToSelector: @selector(connection:didCancelAuthenticationChallenge:forMethod:)]) {
+ [applicationDelegate connection: self didCancelAuthenticationChallenge: challenge forMethod: currentXMLRPCMethod];
+ }
+
+ [[NSNotificationCenter defaultCenter] postNotificationName: XMLRPCCancelledAuthenticationChallengeNotification object: nil];
+}
+
+- (void)connectionDidFinishLoading: (NSURLConnection *)connection {
+ XMLRPCResponse *response = [[XMLRPCResponse alloc] initWithData: incomingXMLData];
+
+ if ([applicationDelegate respondsToSelector: @selector(connection:didReceiveResponse:forMethod:)]) {
+ [applicationDelegate connection: self didReceiveResponse: response forMethod: currentXMLRPCMethod];
+ }
+
+ [[NSNotificationCenter defaultCenter] postNotificationName: XMLRPCReceivedResponseNotification object: nil];
+
+ [connection release];
+}
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPCDecoder.h
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface XMLRPCDecoder : NSObject {
+ NSXMLDocument *responseXMLDocument;
+ BOOL isFault;
+}
+
+- (id)initWithData: (NSData *)data;
+
+#pragma mark -
+
+- (id)decode;
+
+#pragma mark -
+
+- (BOOL)isFault;
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPCDecoder.m
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import "XMLRPCDecoder.h"
+#import "NSDataAdditions.h"
+
+@interface XMLRPCDecoder (XMLRPCDecoderPrivate)
+
+- (NSXMLElement *)getChildFromElement: (NSXMLElement *)element withName: (NSString *)name;
+
+#pragma mark -
+
+- (id)decodeObject: (NSXMLElement *)element;
+
+- (id)trueDecodeObject: (NSXMLElement *)element;
+
+#pragma mark -
+
+- (NSArray *)decodeArray: (NSXMLElement *)element;
+
+#pragma mark -
+
+- (NSDictionary *)decodeDictionary: (NSXMLElement *)element;
+
+#pragma mark -
+
+- (NSNumber *)decodeNumber: (NSXMLElement *)element isDouble: (BOOL)flag;
+
+- (CFBooleanRef)decodeBool: (NSXMLElement *)element;
+
+- (NSString *)decodeString: (NSXMLElement *)element;
+
+- (NSDate *)decodeDate: (NSXMLElement *)element;
+
+- (NSData *)decodeData: (NSXMLElement *)element;
+
+@end
+
+#pragma mark -
+
+@implementation XMLRPCDecoder
+
+- (id)initWithData: (NSData *)data {
+ if (data == nil) {
+ return nil;
+ }
+
+ if (self = [super init]) {
+ NSError *error = nil;
+ responseXMLDocument = [[NSXMLDocument alloc] initWithData: data options: NSXMLDocumentTidyXML error: &error];
+
+ if (responseXMLDocument == nil) {
+ if (error) {
+ NSLog(@"Encountered an XML error: %@", error);
+ }
+
+ return nil;
+ }
+
+ if (error) {
+ NSLog(@"Encountered an XML error: %@", error);
+
+ return nil;
+ }
+ }
+
+ return self;
+}
+
+#pragma mark -
+
+- (id)decode {
+ NSXMLElement *child, *root = [responseXMLDocument rootElement];
+
+ if (root == nil) {
+ return nil;
+ }
+
+ child = [self getChildFromElement: root withName: @"params"];
+
+ if (child != nil) {
+ child = [self getChildFromElement: child withName: @"param"];
+
+ if (child == nil) {
+ return nil;
+ }
+
+ child = [self getChildFromElement: child withName: @"value"];
+
+ if (child == nil) {
+ return nil;
+ }
+ } else {
+ child = [self getChildFromElement: root withName: @"fault"];
+
+ if (child == nil) {
+ return nil;
+ }
+
+ child = [self getChildFromElement: child withName: @"value"];
+
+ if (child == nil) {
+ return nil;
+ }
+
+ isFault = YES;
+ }
+
+ return [self decodeObject: child];
+}
+
+#pragma mark -
+
+- (BOOL)isFault {
+ return isFault;
+}
+
+#pragma mark -
+
+- (void)dealloc {
+ [responseXMLDocument release];
+
+ [super dealloc];
+}
+
+@end
+
+#pragma mark -
+
+@implementation XMLRPCDecoder (XMLRPCDecoderPrivate)
+
+- (NSXMLElement *)getChildFromElement: (NSXMLElement *)element withName: (NSString *)name {
+ NSArray *children = [element elementsForName: name];
+
+ if ([children count] > 0) {
+ return [children objectAtIndex: 0];
+ }
+
+ return nil;
+}
+
+#pragma mark -
+
+- (id)decodeObject: (NSXMLElement *)element {
+ NSXMLElement *child = (NSXMLElement *)[element childAtIndex: 0];
+
+ if (child != nil) {
+ return [self trueDecodeObject: child];
+ }
+
+ return nil;
+}
+
+- (id)trueDecodeObject: (NSXMLElement *)element {
+ NSString *name = [element name];
+
+ if ([name isEqualToString: @"array"]) {
+ return [self decodeArray: element];
+ } else if ([name isEqualToString: @"struct"]) {
+ return [self decodeDictionary: element];
+ } else if ([name isEqualToString: @"int"] || [name isEqualToString: @"i4"]) {
+ return [self decodeNumber: element isDouble: NO];
+ } else if ([name isEqualToString: @"double"]) {
+ return [self decodeNumber: element isDouble: YES];
+ } else if ([name isEqualToString: @"boolean"]) {
+ return (id)[self decodeBool: element];
+ } else if ([name isEqualToString: @"string"]) {
+ return [self decodeString: element];
+ } else if ([name isEqualToString: @"dateTime.iso8601"]) {
+ return [self decodeDate: element];
+ } else if ([name isEqualToString: @"base64"]) {
+ return [self decodeData: element];
+ } else {
+ return [self decodeString: element];
+ }
+
+ return nil;
+}
+
+#pragma mark -
+
+- (NSArray *)decodeArray: (NSXMLElement *)element {
+ NSXMLElement *parent = [self getChildFromElement: element withName: @"data"];
+ NSMutableArray *array = [NSMutableArray array];
+ NSInteger index;
+
+ if (parent == nil) {
+ return nil;
+ }
+
+ for (index = 0; index < [parent childCount]; index++) {
+ NSXMLElement *child = (NSXMLElement *)[parent childAtIndex: index];
+
+ if (![[child name] isEqualToString: @"value"]) {
+ continue;
+ }
+
+ id value = [self decodeObject: child];
+
+ if (value != nil) {
+ [array addObject: value];
+ }
+ }
+
+ return (NSArray *)array;
+}
+
+#pragma mark -
+
+- (NSDictionary *)decodeDictionary: (NSXMLElement *)element {
+ NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
+ NSInteger index;
+
+ for (index = 0; index < [element childCount]; index++) {
+ NSXMLElement *child, *parent = (NSXMLElement *)[element childAtIndex: index];
+
+ if (![[parent name] isEqualToString: @"member"]) {
+ continue;
+ }
+
+ child = [self getChildFromElement: parent withName: @"name"];
+
+ if (child == nil) {
+ continue;
+ }
+
+ NSString *key = [child stringValue];
+
+ child = [self getChildFromElement: parent withName: @"value"];
+
+ if (child == nil) {
+ continue;
+ }
+
+ id object = [self decodeObject: child];
+
+ if ((object != nil) && (key != nil) && ![key isEqualToString: @""]) {
+ [dictionary setObject: object forKey: key];
+ }
+ }
+
+ return (NSDictionary *)dictionary;
+}
+
+#pragma mark -
+
+- (NSNumber *)decodeNumber: (NSXMLElement *)element isDouble: (BOOL)flag {
+ if (flag) {
+ return [NSNumber numberWithDouble: [[element stringValue] intValue]];
+ }
+
+ return [NSNumber numberWithInt: [[element stringValue] intValue]];
+}
+
+- (CFBooleanRef)decodeBool: (NSXMLElement *)element {
+ if ([[element stringValue] isEqualToString: @"1"]) {
+ return kCFBooleanTrue;
+ }
+
+ return kCFBooleanFalse;
+}
+
+- (NSString *)decodeString: (NSXMLElement *)element {
+ return [element stringValue];
+}
+
+- (NSDate *)decodeDate: (NSXMLElement *)element {
+ NSCalendarDate *date = [NSCalendarDate dateWithString: [element stringValue]
+ calendarFormat: @"%Y%m%dT%H:%M:%S" locale: nil];
+
+ return date;
+}
+
+- (NSData *)decodeData: (NSXMLElement *)element {
+ return [NSData base64DataFromString: [element stringValue]];
+}
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPCEncoder.h
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface XMLRPCEncoder : NSObject {
+ NSString *currentXMLRPCMethod, *encoderSourceXML;
+ NSArray *currentXMLRPCParameters;
+}
+
+- (NSString *)encode;
+
+#pragma mark -
+
+- (void)setMethod: (NSString *)method withParameters: (NSArray *)parameters;
+
+#pragma mark -
+
+- (NSString *)method;
+- (NSArray *)parameters;
+
+#pragma mark -
+
+- (NSString *)encoderSourceXML;
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPCEncoder.m
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import "XMLRPCEncoder.h"
+#import "NSStringAdditions.h"
+
+@interface XMLRPCEncoder (XMLRPCEncoderPrivate)
+
+- (NSString *)valueTag: (NSString *)tag value: (NSString *)value;
+
+#pragma mark -
+
+- (NSString *)replaceTarget: (NSString *)target withValue: (NSString *)value inString: (NSString *)string;
+
+- (NSString *)escapeValue: (NSString *)value;
+
+#pragma mark -
+
+- (NSString *)encodeObject: (id)object;
+
+#pragma mark -
+
+- (NSString *)encodeArray: (NSArray *)array;
+
+- (NSString *)encodeDictionary: (NSDictionary *)dictionary;
+
+#pragma mark -
+
+- (NSString *)encodeBoolean: (CFBooleanRef)boolean;
+
+- (NSString *)encodeNumber: (NSNumber *)number;
+
+- (NSString *)encodeString: (NSString *)string;
+
+- (NSString *)encodeDate: (NSDate *)date;
+
+- (NSString *)encodeData: (NSData *)data;
+
+@end
+
+#pragma mark -
+
+@implementation XMLRPCEncoder
+
+- (id)init {
+ if (self = [super init]) {
+ currentXMLRPCMethod = [[NSString alloc] init];
+ encoderSourceXML = [[NSString alloc] init];
+ currentXMLRPCParameters = [[NSArray alloc] init];
+ }
+
+ return self;
+}
+
+#pragma mark -
+
+- (NSString *)encode {
+ NSMutableString *buffer = [NSMutableString stringWithString: @"<?xml version=\"1.0\"?><methodCall>"];
+
+ [buffer appendFormat: @"<methodName>%@</methodName>", currentXMLRPCMethod];
+
+ [buffer appendString: @"<params>"];
+
+ if (currentXMLRPCParameters != nil) {
+ NSEnumerator *enumerator = [currentXMLRPCParameters objectEnumerator];
+ id parameter = nil;
+
+ while (parameter = [enumerator nextObject]) {
+ [buffer appendString: @"<param>"];
+ [buffer appendString: [self encodeObject: parameter]];
+ [buffer appendString: @"</param>"];
+ }
+ }
+
+ [buffer appendString: @"</params>"];
+
+ [buffer appendString: @"</methodCall>"];
+
+ return buffer;
+}
+
+#pragma mark -
+
+- (void)setMethod: (NSString *)method withParameters: (NSArray *)parameters {
+ if (currentXMLRPCMethod != nil) {
+ [currentXMLRPCMethod release];
+ }
+
+ if (method == nil) {
+ currentXMLRPCMethod = nil;
+ } else {
+ currentXMLRPCMethod = [method retain];
+ }
+
+ if (currentXMLRPCParameters != nil) {
+ [currentXMLRPCParameters release];
+ }
+
+ if (parameters == nil) {
+ currentXMLRPCParameters = nil;
+ } else {
+ currentXMLRPCParameters = [parameters retain];
+ }
+}
+
+#pragma mark -
+
+- (NSString *)method {
+ return currentXMLRPCMethod;
+}
+
+- (NSArray *)parameters {
+ return currentXMLRPCParameters;
+}
+
+#pragma mark -
+
+- (NSString *)encoderSourceXML {
+ if (encoderSourceXML != nil) {
+ [encoderSourceXML release];
+ }
+
+ encoderSourceXML = [[self encode] retain];
+
+ return encoderSourceXML;
+}
+
+#pragma mark -
+
+- (void)dealloc {
+ [currentXMLRPCMethod release];
+ [encoderSourceXML release];
+ [currentXMLRPCParameters release];
+
+ [super dealloc];
+}
+
+@end
+
+#pragma mark -
+
+@implementation XMLRPCEncoder (XMLRPCEncoderPrivate)
+
+- (NSString *)valueTag: (NSString *)tag value: (NSString *)value {
+ return [NSString stringWithFormat: @"<value><%@>%@</%@></value>", tag, [self escapeValue: value], tag];
+}
+
+#pragma mark -
+
+- (NSString *)replaceTarget: (NSString *)target withValue: (NSString *)value inString: (NSString *)string {
+ return [[string componentsSeparatedByString: target] componentsJoinedByString: value];
+}
+
+- (NSString *)escapeValue: (NSString *)value {
+ value = [self replaceTarget: @"&" withValue: @"&" inString: value];
+ value = [self replaceTarget: @"<" withValue: @"<" inString: value];
+
+ return value;
+}
+
+#pragma mark -
+
+- (NSString *)encodeObject: (id)object {
+ if (object == nil) {
+ return nil;
+ }
+
+ if ([object isKindOfClass: [NSArray class]]) {
+ return [self encodeArray: object];
+ } else if ([object isKindOfClass: [NSDictionary class]]) {
+ return [self encodeDictionary: object];
+ } else if (((CFBooleanRef)object == kCFBooleanTrue) || ((CFBooleanRef)object == kCFBooleanFalse)) {
+ return [self encodeBoolean: (CFBooleanRef)object];
+ } else if ([object isKindOfClass: [NSNumber class]]) {
+ return [self encodeNumber: object];
+ } else if ([object isKindOfClass: [NSString class]]) {
+ return [self encodeString: object];
+ } else if ([object isKindOfClass: [NSDate class]]) {
+ return [self encodeDate: object];
+ } else if ([object isKindOfClass: [NSData class]]) {
+ return [self encodeData: object];
+ } else {
+ return [self encodeString: object];
+ }
+}
+
+#pragma mark -
+
+- (NSString *)encodeArray: (NSArray *)array {
+ NSMutableString *buffer = [NSMutableString string];
+ NSEnumerator *enumerator = [array objectEnumerator];
+
+ [buffer appendString: @"<value><array><data>"];
+
+ id object = nil;
+
+ while (object = [enumerator nextObject]) {
+ [buffer appendString: [self encodeObject: object]];
+ }
+
+ [buffer appendString: @"</data></array></value>"];
+
+ return (NSString *)buffer;
+}
+
+- (NSString *)encodeDictionary: (NSDictionary *)dictionary {
+ NSMutableString * buffer = [NSMutableString string];
+ NSEnumerator *enumerator = [dictionary keyEnumerator];
+
+ [buffer appendString: @"<value><struct>"];
+
+ NSString *key = nil;
+
+ while (key = [enumerator nextObject]) {
+ [buffer appendString: @"<member>"];
+ [buffer appendFormat: @"<name>%@</name>", key];
+ [buffer appendString: [self encodeObject: [dictionary objectForKey: key]]];
+ [buffer appendString: @"</member>"];
+ }
+
+ [buffer appendString: @"</struct></value>"];
+
+ return (NSString *)buffer;
+}
+
+#pragma mark -
+
+- (NSString *)encodeBoolean: (CFBooleanRef)boolean {
+ if (boolean == kCFBooleanTrue) {
+ return [self valueTag: @"boolean" value: @"1"];
+ } else {
+ return [self valueTag: @"boolean" value: @"0"];
+ }
+}
+
+- (NSString *)encodeNumber: (NSNumber *)number {
+ return [self valueTag: @"i4" value: [number stringValue]];
+}
+
+- (NSString *)encodeString: (NSString *)string {
+ return [self valueTag: @"string" value: string];
+}
+
+- (NSString *)encodeDate: (NSDate *)date {
+ NSString *buffer = [date descriptionWithCalendarFormat: @"%Y%m%dT%H:%M:%S"
+ timeZone: nil locale: nil];
+
+ return [self valueTag: @"dateTime.iso8601" value: buffer];
+}
+
+- (NSString *)encodeData: (NSData *)data {
+ NSString *buffer = [NSString base64StringFromData: data
+ length: [data length]];
+
+ return [self valueTag: @"base64" value: buffer];
+}
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPCRequest.h
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import <Foundation/Foundation.h>
+
+@class XMLRPCEncoder;
+
+@interface XMLRPCRequest : NSObject {
+ NSMutableURLRequest *mutableRequest;
+ XMLRPCEncoder *requestXMLEncoder;
+}
+
+- (id)initWithHost: (NSURL *)host;
+
+#pragma mark -
+
+- (void)setHost: (NSURL *)host;
+- (NSURL *)host;
+
+#pragma mark -
+
+- (void)setUserAgent: (NSString *)userAgent;
+- (NSString *)userAgent;
+
+#pragma mark -
+
+- (void)setMethod: (NSString *)method;
+
+- (void)setMethod: (NSString *)method withParameter: (id)parameter;
+
+- (void)setMethod: (NSString *)method withParameters: (NSArray *)parameters;
+
+#pragma mark -
+
+- (NSString *)method;
+- (NSArray *)parameters;
+
+#pragma mark -
+
+- (NSString *)requestSourceXML;
+
+#pragma mark -
+
+- (NSURLRequest *)request;
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPCRequest.m
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import "XMLRPCRequest.h"
+#import "XMLRPCEncoder.h"
+
+@implementation XMLRPCRequest
+
+- (id)initWithHost: (NSURL *)host {
+ if (self = [super init]) {
+ if (host != nil) {
+ mutableRequest = [[NSMutableURLRequest alloc] initWithURL: host];
+ } else {
+ mutableRequest = [[NSMutableURLRequest alloc] init];
+ }
+
+ requestXMLEncoder = [[XMLRPCEncoder alloc] init];
+ }
+
+ return self;
+}
+
+#pragma mark -
+
+- (void)setHost: (NSURL *)host {
+ [mutableRequest setURL: host];
+}
+
+- (NSURL *)host {
+ return [mutableRequest URL];
+}
+
+#pragma mark -
+
+- (void)setUserAgent: (NSString *)userAgent {
+ if ([self userAgent] == nil) {
+ [mutableRequest addValue: userAgent forHTTPHeaderField: @"User-Agent"];
+ } else {
+ [mutableRequest setValue: userAgent forHTTPHeaderField: @"User-Agent"];
+ }
+}
+
+- (NSString *)userAgent {
+ return [mutableRequest valueForHTTPHeaderField: @"User-Agent"];
+}
+
+#pragma mark -
+
+- (void)setMethod: (NSString *)method {
+ [requestXMLEncoder setMethod: method withParameters: nil];
+}
+
+- (void)setMethod: (NSString *)method withParameter: (id)parameter {
+ [requestXMLEncoder setMethod: method withParameters: [NSArray arrayWithObject: parameter]];
+}
+
+- (void)setMethod: (NSString *)method withParameters: (NSArray *)parameters {
+ [requestXMLEncoder setMethod: method withParameters: parameters];
+}
+
+#pragma mark -
+
+- (NSString *)method {
+ return [requestXMLEncoder method];
+}
+
+- (NSArray *)parameters {
+ return [requestXMLEncoder parameters];
+}
+
+#pragma mark -
+
+- (NSString *)requestSourceXML {
+ return [requestXMLEncoder encoderSourceXML];
+}
+
+#pragma mark -
+
+- (NSURLRequest *)request {
+ NSData *request = [[requestXMLEncoder encode] dataUsingEncoding: NSUTF8StringEncoding];
+ NSNumber *contentLength = [NSNumber numberWithInt: [request length]];
+
+ if (request == nil) {
+ return nil;
+ }
+
+ [mutableRequest setHTTPMethod: @"POST"];
+
+ if ([mutableRequest valueForHTTPHeaderField: @"Content-Length"] == nil) {
+ [mutableRequest addValue: @"text/xml" forHTTPHeaderField: @"Content-Type"];
+ } else {
+ [mutableRequest setValue: @"text/xml" forHTTPHeaderField: @"Content-Type"];
+ }
+
+ if ([mutableRequest valueForHTTPHeaderField: @"Content-Length"] == nil) {
+ [mutableRequest addValue: [contentLength stringValue] forHTTPHeaderField: @"Content-Length"];
+ } else {
+ [mutableRequest setValue: [contentLength stringValue] forHTTPHeaderField: @"Content-Length"];
+ }
+
+ [mutableRequest setHTTPBody: request];
+
+ return (NSURLRequest *)mutableRequest;
+}
+
+#pragma mark -
+
+- (void)dealloc {
+ [mutableRequest release];
+ [requestXMLEncoder release];
+
+ [super dealloc];
+}
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPCResponse.h
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import <Foundation/Foundation.h>
+
+@class XMLRPCDecoder;
+
+@interface XMLRPCResponse : NSObject {
+ NSData *responseXMLData;
+ NSString *responseSourceXML;
+ id responseObject;
+ BOOL isFault;
+}
+
+- (id)initWithData: (NSData *)data;
+
+#pragma mark -
+
+- (BOOL)isFault;
+
+- (NSNumber *)faultCode;
+
+- (NSString *)faultString;
+
+#pragma mark -
+
+- (id)responseObject;
+
+#pragma mark -
+
+- (NSString *)responseSourceXML;
+
+@end
--- /dev/null
+//
+// Copyright 2008 Eric Czarny <eczarny@gmail.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+// IN THE SOFTWARE.
+//
+
+//
+// Cocoa XML-RPC Framework
+// XMLRPCResponse.m
+//
+// Created by Eric Czarny on Wednesday, January 14, 2004.
+// Copyright 2008 Divisible by Zero.
+//
+
+#import "XMLRPCResponse.h"
+#import "XMLRPCDecoder.h"
+
+@implementation XMLRPCResponse
+
+- (id)initWithData: (NSData *)data
+{
+ if (data == nil) {
+ return nil;
+ }
+
+ if (self = [super init]) {
+ XMLRPCDecoder *responseXMLDecoder =[[XMLRPCDecoder alloc] initWithData: data];
+
+ if (responseXMLDecoder == nil) {
+ return nil;
+ }
+
+ responseXMLData = [[NSData alloc] initWithData: data];
+ responseSourceXML = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
+ responseObject = [[responseXMLDecoder decode] retain];
+
+ isFault = [responseXMLDecoder isFault];
+
+ [responseXMLDecoder release];
+ }
+
+ return self;
+}
+
+#pragma mark -
+
+- (BOOL)isFault {
+ return isFault;
+}
+
+- (NSNumber *)faultCode {
+ if (isFault) {
+ return [responseObject objectForKey: @"faultCode"];
+ }
+
+ return nil;
+}
+
+- (NSString *)faultString {
+ if (isFault) {
+ return [responseObject objectForKey: @"faultString"];
+ }
+
+ return nil;
+}
+
+#pragma mark -
+
+- (id)responseObject {
+ return responseObject;
+}
+
+#pragma mark -
+
+- (NSString *)responseSourceXML {
+ return responseSourceXML;
+}
+
+#pragma mark -
+
+- (void)dealloc {
+ [responseXMLData release];
+ [responseSourceXML release];
+ [responseObject release];
+
+ [super dealloc];
+}
+
+@end