From fd6a0d47591ca120d2b7b0a3b598c55a80088728 Mon Sep 17 00:00:00 2001 From: "Michael J. Rubinsky" Date: Fri, 25 Sep 2009 12:42:49 -0400 Subject: [PATCH] Refactor iPhoto2Ansel to use the new AnselKit code, tweak some project properties, etc... --- iPhoto2Ansel/AnselExportController.h | 22 +- iPhoto2Ansel/AnselExportController.m | 161 ++--- .../English.lproj/Panel.nib/keyedobjects.nib | Bin 33207 -> 0 bytes iPhoto2Ansel/Info.plist | 8 +- .../{xmlrpc-1.5.1/Additions => }/NSDataAdditions.h | 0 .../{xmlrpc-1.5.1/Additions => }/NSDataAdditions.m | 0 .../Additions => }/NSStringAdditions.h | 0 .../Additions => }/NSStringAdditions.m | 0 .../PackageBuilder.pmdoc/01iphoto-contents.xml | 1 - iPhoto2Ansel/PackageBuilder.pmdoc/01iphoto.xml | 1 - iPhoto2Ansel/PackageBuilder.pmdoc/index.xml | 1 - .../AnselGalleryPanel.nib/designable.nib | 0 .../AnselGalleryPanel.nib/keyedobjects.nib | Bin .../English.lproj/AnselServers.nib/designable.nib | 0 .../AnselServers.nib/keyedobjects.nib | Bin .../English.lproj/InfoPlist.strings | Bin .../English.lproj/Panel.nib/designable.nib | 791 ++++++++++++++------- .../English.lproj/Panel.nib/keyedobjects.nib | Bin 0 -> 36334 bytes .../English.lproj}/ProgressSheet.nib/classes.nib | 0 .../English.lproj}/ProgressSheet.nib/info.nib | 0 .../ProgressSheet.nib/keyedobjects.nib | Bin iPhoto2Ansel/Resources/iPhoto2Ansel.icns | Bin 0 -> 90380 bytes iPhoto2Ansel/Resources/iPhotoPluginIcon.png | Bin 0 -> 21235 bytes iPhoto2Ansel/Resources/iPhotoPluginIcon.psd | Bin 0 -> 115901 bytes iPhoto2Ansel/TURAnsel.m | 266 ------- iPhoto2Ansel/TURAnselGallery.m | 206 ------ .../{ => TURAnselKit}/AnselGalleryViewItem.h | 16 +- .../{ => TURAnselKit}/AnselGalleryViewItem.m | 28 +- .../AnselGalleryPanel.nib/designable.nib | 744 +++++++++++++++++++ .../AnselGalleryPanel.nib/keyedobjects.nib | Bin 0 -> 8534 bytes iPhoto2Ansel/{ => TURAnselKit}/TURAnsel.h | 25 +- iPhoto2Ansel/TURAnselKit/TURAnsel.m | 315 ++++++++ iPhoto2Ansel/TURAnselKit/TURAnselConstants.h | 33 + iPhoto2Ansel/TURAnselKit/TURAnselConstants.m | 34 + iPhoto2Ansel/{ => TURAnselKit}/TURAnselGallery.h | 39 +- iPhoto2Ansel/TURAnselKit/TURAnselGallery.m | 216 ++++++ .../TURAnselGalleryPanelController.h | 25 +- .../TURAnselGalleryPanelController.m | 100 +-- iPhoto2Ansel/TURAnselKit/TURAnselKit.h | 6 + iPhoto2Ansel/TURAnselServersPanelController.h | 16 - iPhoto2Ansel/TURAnselServersPanelController.m | 14 - iPhoto2Ansel/TURXMLConnection.h | 39 - iPhoto2Ansel/TURXMLConnection.m | 142 ---- iPhoto2Ansel/XMLRPC-Info.plist | 20 - .../iPhoto2Ansel.xcodeproj/project.pbxproj | 433 +++-------- iPhoto2Ansel/master_Source_ImageResizer.h | 39 - iPhoto2Ansel/xmlrpc-1.5.1/Info.plist | 27 - iPhoto2Ansel/xmlrpc-1.5.1/LICENSE | 23 - .../Languages/English.lproj/Localizable.strings | 3 - iPhoto2Ansel/xmlrpc-1.5.1/README | 208 ------ iPhoto2Ansel/xmlrpc-1.5.1/XMLRPC.h | 33 - iPhoto2Ansel/xmlrpc-1.5.1/XMLRPC.pch | 33 - iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCConnection.h | 73 -- iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCConnection.m | 189 ----- iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCDecoder.h | 48 -- iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCDecoder.m | 305 -------- iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCEncoder.h | 53 -- iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCEncoder.m | 285 -------- iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCRequest.h | 73 -- iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCRequest.m | 142 ---- iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCResponse.h | 60 -- iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCResponse.m | 105 --- 62 files changed, 2204 insertions(+), 3197 deletions(-) delete mode 100644 iPhoto2Ansel/English.lproj/Panel.nib/keyedobjects.nib rename iPhoto2Ansel/{xmlrpc-1.5.1/Additions => }/NSDataAdditions.h (100%) rename iPhoto2Ansel/{xmlrpc-1.5.1/Additions => }/NSDataAdditions.m (100%) rename iPhoto2Ansel/{xmlrpc-1.5.1/Additions => }/NSStringAdditions.h (100%) rename iPhoto2Ansel/{xmlrpc-1.5.1/Additions => }/NSStringAdditions.m (100%) delete mode 100644 iPhoto2Ansel/PackageBuilder.pmdoc/01iphoto-contents.xml delete mode 100644 iPhoto2Ansel/PackageBuilder.pmdoc/01iphoto.xml delete mode 100644 iPhoto2Ansel/PackageBuilder.pmdoc/index.xml rename iPhoto2Ansel/{ => Resources}/English.lproj/AnselGalleryPanel.nib/designable.nib (100%) rename iPhoto2Ansel/{ => Resources}/English.lproj/AnselGalleryPanel.nib/keyedobjects.nib (100%) rename iPhoto2Ansel/{ => Resources}/English.lproj/AnselServers.nib/designable.nib (100%) rename iPhoto2Ansel/{ => Resources}/English.lproj/AnselServers.nib/keyedobjects.nib (100%) rename iPhoto2Ansel/{ => Resources}/English.lproj/InfoPlist.strings (100%) rename iPhoto2Ansel/{ => Resources}/English.lproj/Panel.nib/designable.nib (82%) create mode 100644 iPhoto2Ansel/Resources/English.lproj/Panel.nib/keyedobjects.nib rename iPhoto2Ansel/{ => Resources/English.lproj}/ProgressSheet.nib/classes.nib (100%) rename iPhoto2Ansel/{ => Resources/English.lproj}/ProgressSheet.nib/info.nib (100%) rename iPhoto2Ansel/{ => Resources/English.lproj}/ProgressSheet.nib/keyedobjects.nib (100%) create mode 100644 iPhoto2Ansel/Resources/iPhoto2Ansel.icns create mode 100644 iPhoto2Ansel/Resources/iPhotoPluginIcon.png create mode 100644 iPhoto2Ansel/Resources/iPhotoPluginIcon.psd delete mode 100644 iPhoto2Ansel/TURAnsel.m delete mode 100644 iPhoto2Ansel/TURAnselGallery.m rename iPhoto2Ansel/{ => TURAnselKit}/AnselGalleryViewItem.h (71%) rename iPhoto2Ansel/{ => TURAnselKit}/AnselGalleryViewItem.m (65%) create mode 100644 iPhoto2Ansel/TURAnselKit/English.lProj/AnselGalleryPanel.nib/designable.nib create mode 100644 iPhoto2Ansel/TURAnselKit/English.lProj/AnselGalleryPanel.nib/keyedobjects.nib rename iPhoto2Ansel/{ => TURAnselKit}/TURAnsel.h (72%) create mode 100644 iPhoto2Ansel/TURAnselKit/TURAnsel.m create mode 100644 iPhoto2Ansel/TURAnselKit/TURAnselConstants.h create mode 100644 iPhoto2Ansel/TURAnselKit/TURAnselConstants.m rename iPhoto2Ansel/{ => TURAnselKit}/TURAnselGallery.h (52%) create mode 100644 iPhoto2Ansel/TURAnselKit/TURAnselGallery.m rename iPhoto2Ansel/{ => TURAnselKit}/TURAnselGalleryPanelController.h (67%) rename iPhoto2Ansel/{ => TURAnselKit}/TURAnselGalleryPanelController.m (68%) create mode 100644 iPhoto2Ansel/TURAnselKit/TURAnselKit.h delete mode 100644 iPhoto2Ansel/TURAnselServersPanelController.h delete mode 100644 iPhoto2Ansel/TURAnselServersPanelController.m delete mode 100644 iPhoto2Ansel/TURXMLConnection.h delete mode 100644 iPhoto2Ansel/TURXMLConnection.m delete mode 100644 iPhoto2Ansel/XMLRPC-Info.plist delete mode 100644 iPhoto2Ansel/master_Source_ImageResizer.h delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/Info.plist delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/LICENSE delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/Languages/English.lproj/Localizable.strings delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/README delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPC.h delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPC.pch delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCConnection.h delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCConnection.m delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCDecoder.h delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCDecoder.m delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCEncoder.h delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCEncoder.m delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCRequest.h delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCRequest.m delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCResponse.h delete mode 100644 iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCResponse.m diff --git a/iPhoto2Ansel/AnselExportController.h b/iPhoto2Ansel/AnselExportController.h index 0a098c6c0..29c1d4400 100644 --- a/iPhoto2Ansel/AnselExportController.h +++ b/iPhoto2Ansel/AnselExportController.h @@ -14,17 +14,6 @@ @class FBProgressController; @class TURNewGalleryController; -// User defaults keys -extern NSString * const TURAnselServersKey; -extern NSString * const TURAnselExportSize; -extern NSString * const TURAnselDefaultServerKey; - -// Server property keys -extern NSString * const TURAnselServerNickKey; -extern NSString * const TURAnselServerEndpointKey; -extern NSString * const TURAnselServerUsernameKey; -extern NSString * const TURAnselServerPasswordKey; - @interface AnselExportController : NSObject { // Export manager passed in from iPhoto @@ -42,7 +31,6 @@ extern NSString * const TURAnselServerPasswordKey; IBOutlet NSImageView *defaultImageView; IBOutlet NSButton *mNewGalleryButton; IBOutlet NSPopUpButton *mServersPopUp; - IBOutlet NSButton *mCancelConnect; IBOutlet NSTextField *mImageCountLabel; // Gallery View @@ -52,7 +40,6 @@ extern NSString * const TURAnselServerPasswordKey; IBOutlet IKImageBrowserView *browserView; NSMutableArray *browserData; - // New Server sheet IBOutlet NSWindow *newServerSheet; IBOutlet NSTextField *mServerSheetHostURL; @@ -60,7 +47,6 @@ extern NSString * const TURAnselServerPasswordKey; IBOutlet NSSecureTextField *mServerSheetPassword; IBOutlet NSTextField *mServerSheetServerNickName; IBOutlet NSButton *mMakeNewServerDefault; - // Server list IBOutlet NSPanel *serverListPanel; @@ -84,11 +70,6 @@ extern NSString * const TURAnselServerPasswordKey; TURAnsel *anselController; TURAnselGallery *currentGallery; int currentImageCount; - - // Remembers the selected server before it changes. Used to reselect the - // proper server if necessary when server panels are closed. - int mIndexOfPreviouslySelectedServer; - } @property (readwrite, retain) TURAnselGallery *currentGallery; @@ -101,8 +82,7 @@ extern NSString * const TURAnselServerPasswordKey; - (IBAction) doAddServer: (id)sender; - (IBAction) doCancelAddServer: (id)sender; - (IBAction) clickServer: (id)sender; -- (IBAction) clickCancelConnect: (id)sender; - +- (void) doSwapImage: (id)theImage; - (IBAction) clickViewGallery: (id)sender; - (IBAction) closeGalleryView: (id)sender; diff --git a/iPhoto2Ansel/AnselExportController.m b/iPhoto2Ansel/AnselExportController.m index 0e127c69d..dcdd36102 100644 --- a/iPhoto2Ansel/AnselExportController.m +++ b/iPhoto2Ansel/AnselExportController.m @@ -1,16 +1,16 @@ -// -// AnselExportController.m -// iPhoto2Ansel -// -// Created by Michael Rubinsky on 10/23/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// -#import "TURAnsel.h"; -#import "TURAnselGallery.h"; +/** + * AnselExportController.m + * + * Copyright 2008 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ +#import "TURAnselKit.h" #import "AnselExportController.h"; -#import "TURAnselGalleryPanelController.h"; #import "FBProgressController.h"; -#import "AnselGalleryViewItem.h"; +#import "NSStringAdditions.h"; +#import "NSDataAdditions.h"; @interface AnselExportController (PrivateAPI) - (void)showNewServerSheet; @@ -42,7 +42,8 @@ NSString * const TURAnselServerPasswordKey = @"password"; @synthesize currentGallery; -#pragma mark Overrides +#pragma mark - +#pragma mark init/dealloc /** * Set up UI defaults */ @@ -88,18 +89,18 @@ NSString * const TURAnselServerPasswordKey = @"password"; -(void)dealloc { //anselController is released from the AnselController delegate method. + NSLog(@"dealloc"); [progressController release]; [anselServers release]; [currentServer release]; [browserData release]; [super dealloc]; } - -#pragma mark Getter Setters - (NSWindow *)window { return [mExportMgr window]; } +#pragma mark - #pragma mark Actions - (IBAction)clickViewGallery: (id)sender { @@ -107,9 +108,6 @@ NSString * const TURAnselServerPasswordKey = @"password"; [self setStatusText: @"Getting image list..."]; NSMutableArray *images = [currentGallery listImages]; if ([images count] == 0) { - //TODO: Show a panel showing there are no images? Or just disable the - // view gallery button? - [spinner stopAnimation: self]; [self setStatusText: @"Connected" withColor: [NSColor greenColor]]; return; @@ -117,7 +115,7 @@ NSString * const TURAnselServerPasswordKey = @"password"; for (NSDictionary *image in images) { NSString *caption = [image objectForKey:@"caption"]; - if (caption == nil) { + if (caption == (NSString *)[NSNull null] || [caption length] == 0) { caption = [image objectForKey:@"filename"]; } @@ -196,6 +194,7 @@ NSString * const TURAnselServerPasswordKey = @"password"; // Action sent by the server pop up menu - (IBAction)clickServer: (id)sender { + NSLog(@"clickServer"); // Are we set to "none" now? if ([mServersPopUp indexOfSelectedItem] == 0) { [self disconnect]; @@ -214,6 +213,38 @@ NSString * const TURAnselServerPasswordKey = @"password"; [self doConnect]; } } +- (void)clickGallery +{ + [self setStatusText: @"Loading gallery data..."]; + [[self window] flushWindow]; + + [spinner startAnimation: self]; + int row = [galleryCombo indexOfSelectedItem]; + [currentGallery setDelegate:nil]; + [currentGallery autorelease]; + currentGallery = [[anselController getGalleryByIndex:row] retain]; + [currentGallery setDelegate: self]; + [mImageCountLabel setStringValue:[NSString stringWithFormat: @"Image Count: %d", [currentGallery galleryImageCount]]]; + + // Obtain and properly size the image for screen + NSImage *theImage = [[NSImage alloc] initWithContentsOfURL: [currentGallery galleryKeyImageURL]]; + NSSize imageSize; + imageSize.width = [[theImage bestRepresentationForDevice:nil] pixelsWide]; + imageSize.height = [[theImage bestRepresentationForDevice:nil] pixelsHigh]; + [theImage setScalesWhenResized:YES]; + [theImage setSize:imageSize]; + [self doSwapImage: theImage]; + [theImage autorelease]; +} + +- (void)doSwapImage: (id)theImage +{ + [self setStatusText: @"Connected" withColor: [NSColor greenColor]]; + [defaultImageView setImage: theImage]; + [self canExport]; + [viewGallery setEnabled: YES]; + [spinner stopAnimation: self]; +} - (IBAction) closeServerList: (id)sender { @@ -225,7 +256,6 @@ NSString * const TURAnselServerPasswordKey = @"password"; // Server setup sheet -(IBAction)doAddServer: (id)sender { - // TODO: Sanity checks NSDictionary *newServer = [[NSDictionary alloc] initWithObjectsAndKeys: [mServerSheetServerNickName stringValue], TURAnselServerNickKey, [mServerSheetHostURL stringValue], TURAnselServerEndpointKey, @@ -260,11 +290,7 @@ NSString * const TURAnselServerPasswordKey = @"password"; [newServerSheet orderOut: nil]; } -- (IBAction) clickCancelConnect: (id)sender -{ - [anselController cancel]; -} - +#pragma mark - #pragma mark ExportPluginProtocol // Initialize - (id)initWithExportImageObj:(id )obj @@ -341,7 +367,6 @@ NSString * const TURAnselServerPasswordKey = @"password"; { } - // Export was clicked in the UI // Do any preperations/validations and call our own privatePerformExport // (We don't want the iPhoto progress controller). @@ -355,6 +380,7 @@ NSString * const TURAnselServerPasswordKey = @"password"; { } +#pragma mark - #pragma mark Progress (We don't use these) - (ExportPluginProgress *)progress { @@ -379,6 +405,7 @@ NSString * const TURAnselServerPasswordKey = @"password"; return @"iPhoto2Ansel Export Plugin v1.0"; } +#pragma mark - #pragma mark PrivateAPI - (void) showNewServerSheet { @@ -425,6 +452,7 @@ NSString * const TURAnselServerPasswordKey = @"password"; - (void)updateServersPopupMenu { + NSLog(@"updateServersPopupMenu"); [mServersPopUp removeAllItems]; [mServersPopUp addItemWithTitle:@"(None)"]; for (NSDictionary *server in anselServers) { @@ -449,8 +477,12 @@ NSString * const TURAnselServerPasswordKey = @"password"; // Make sure we clean up from any previous connection -(void)disconnect { - [galleryCombo deselectItemAtIndex: [galleryCombo indexOfSelectedItem]]; + NSLog(@"Disconnect"); + NSLog(@"%d", [galleryCombo indexOfSelectedItem]); [galleryCombo setDelegate: nil]; + if ([galleryCombo indexOfSelectedItem] >= 0) { + [galleryCombo deselectItemAtIndex: [galleryCombo indexOfSelectedItem]]; + } [galleryCombo setDataSource: nil]; [galleryCombo reloadData]; [galleryCombo setEnabled: NO]; @@ -765,6 +797,7 @@ NSString * const TURAnselServerPasswordKey = @"password"; [statusLabel setTextColor: [NSColor blackColor]]; } +#pragma mark - #pragma mark TURAnselDelegate // The ansel controller is initialized, populate the gallery data @@ -783,6 +816,7 @@ NSString * const TURAnselServerPasswordKey = @"password"; - (void)TURAnselHadError: (NSError *)error { // Stop the spinner + NSLog(@"TURAnselHadError"); [spinner stopAnimation: self]; [self disconnect]; [mServersPopUp setEnabled: true]; @@ -809,8 +843,9 @@ NSString * const TURAnselServerPasswordKey = @"password"; [alert release]; } +#pragma mark - #pragma mark TURAnselGalleryDelegate -- (void)TURAnselGalleryDidUploadImage: (TURAnselGallery *)gallery { +- (void)TURAnselGalleryDidUploadImage: (id *)gallery { if (++currentImageCount == [mExportMgr imageCount] || cancelExport == YES) { [currentGallery setDelegate:nil]; [currentGallery release]; @@ -818,37 +853,17 @@ NSString * const TURAnselServerPasswordKey = @"password"; [anselController release]; [galleryCombo setDelegate:nil]; } -} +} +#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]]; +{ + NSLog(@"comboBoxSelectionDidChange"); + [self clickGallery]; } +#pragma mark - #pragma mark TURAnselGalleryPanel Notifications - (void)TURAnselGalleryPanelDidAddGallery { @@ -857,19 +872,20 @@ NSString * const TURAnselServerPasswordKey = @"password"; [galleryCombo selectItemAtIndex: [galleryCombo numberOfItems] - 1]; } -#pragma mark export notifications +#pragma mark - +#pragma mark ExportController notifications - (void)exportWindowWillClose: (NSNotification *)notification { - [mServersPopUp selectItemAtIndex: 0]; + NSLog(@"exportWindowWIllClose"); [self disconnect]; + [mServersPopUp selectItemAtIndex: 0]; [[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:) @@ -883,11 +899,6 @@ NSString * const TURAnselServerPasswordKey = @"password"; [self updateServersPopupMenu]; - // Register for notifications - [[NSNotificationCenter defaultCenter] addObserver: self - selector: @selector(NSPopUpWillPopUp:) - name:@"NSPopUpButtonWillPopUpNotification" - object: nil]; if ([anselServers count] == 0) { [self showNewServerSheet]; } else { @@ -912,7 +923,6 @@ NSString * const TURAnselServerPasswordKey = @"password"; } } } - - (void)sizeChoiceWillChange: (NSNotification *)notification { NSInteger newSize = [mSizePopUp selectedTag]; @@ -921,35 +931,12 @@ NSString * const TURAnselServerPasswordKey = @"password"; [userPrefs synchronize]; } -#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 NSTableView Datasource -- (int)numberOfRowsInTableView:(NSTableView *)aTableView -{ - return [anselServers count]; -} - -- (id)tableView:(NSTableView *)aTableView -objectValueForTableColumn:(NSTableColumn *)aTableColumn - row:(int)rowIndex -{ - return [[anselServers objectAtIndex: rowIndex] objectForKey: [aTableColumn identifier]]; -} - -#pragma mark +#pragma mark - #pragma mark IKImageBrowserView Datasource methods - (NSUInteger)numberOfItemsInImageBrowser:(IKImageBrowserView *) aBrowser { return [browserData count]; } - - (id)imageBrowser:(IKImageBrowserView *) aBrowser itemAtIndex:(NSUInteger)index { return [browserData objectAtIndex:index]; diff --git a/iPhoto2Ansel/English.lproj/Panel.nib/keyedobjects.nib b/iPhoto2Ansel/English.lproj/Panel.nib/keyedobjects.nib deleted file mode 100644 index 206fbbe34e9a7189b56af902b65bd7abc08fb288..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33207 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 gczURODzmKf>4>ny4!~g&Q diff --git a/iPhoto2Ansel/Info.plist b/iPhoto2Ansel/Info.plist index cc62ba9be..113f68d6c 100644 --- a/iPhoto2Ansel/Info.plist +++ b/iPhoto2Ansel/Info.plist @@ -6,10 +6,8 @@ English CFBundleExecutable ${EXECUTABLE_NAME} - CFBundleIconFile - CFBundleIdentifier - com.theupstairsroom.iphoto2ansel + org.horde.export.iphoto2ansel CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -24,5 +22,9 @@ Panel NSPrincipalClass AnselExportController + NSHumanReadableCopyright + 2008 - 2009 The Horde Project (http://www.horde.org) + CFBundleIconFile + iPhoto2Ansel diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/Additions/NSDataAdditions.h b/iPhoto2Ansel/NSDataAdditions.h similarity index 100% rename from iPhoto2Ansel/xmlrpc-1.5.1/Additions/NSDataAdditions.h rename to iPhoto2Ansel/NSDataAdditions.h diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/Additions/NSDataAdditions.m b/iPhoto2Ansel/NSDataAdditions.m similarity index 100% rename from iPhoto2Ansel/xmlrpc-1.5.1/Additions/NSDataAdditions.m rename to iPhoto2Ansel/NSDataAdditions.m diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/Additions/NSStringAdditions.h b/iPhoto2Ansel/NSStringAdditions.h similarity index 100% rename from iPhoto2Ansel/xmlrpc-1.5.1/Additions/NSStringAdditions.h rename to iPhoto2Ansel/NSStringAdditions.h diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/Additions/NSStringAdditions.m b/iPhoto2Ansel/NSStringAdditions.m similarity index 100% rename from iPhoto2Ansel/xmlrpc-1.5.1/Additions/NSStringAdditions.m rename to iPhoto2Ansel/NSStringAdditions.m diff --git a/iPhoto2Ansel/PackageBuilder.pmdoc/01iphoto-contents.xml b/iPhoto2Ansel/PackageBuilder.pmdoc/01iphoto-contents.xml deleted file mode 100644 index 3aa192b3c..000000000 --- a/iPhoto2Ansel/PackageBuilder.pmdoc/01iphoto-contents.xml +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/iPhoto2Ansel/PackageBuilder.pmdoc/01iphoto.xml b/iPhoto2Ansel/PackageBuilder.pmdoc/01iphoto.xml deleted file mode 100644 index e28bd7dec..000000000 --- a/iPhoto2Ansel/PackageBuilder.pmdoc/01iphoto.xml +++ /dev/null @@ -1 +0,0 @@ -com.horde.iphoto2anselExportPlugin.iphoto2ansel.pkg1/Users/mrubinsk/Library/Application Support/iPhoto/Plugins/iPhoto2Ansel.iPhotoExporter/Library/Application Support/iPhoto/PluginsparentrequireAuthorizationinstallTo.pathinstallTo.isAbsoluteTypeinstallTo01iphoto-contents.xml/CVS$/\.svn$/\.cvsignore$/\.cvspass$/\.DS_Store$ \ No newline at end of file diff --git a/iPhoto2Ansel/PackageBuilder.pmdoc/index.xml b/iPhoto2Ansel/PackageBuilder.pmdoc/index.xml deleted file mode 100644 index f592cde88..000000000 --- a/iPhoto2Ansel/PackageBuilder.pmdoc/index.xml +++ /dev/null @@ -1 +0,0 @@ -iPhoto2Ansel Export Plugin/Users/mrubinsk/Desktop/iPhoto2Ansel Export Plugin.pkgcom.horde01iphoto.xmlproperties.titleproperties.userDomainproperties.anywhereDomain \ No newline at end of file diff --git a/iPhoto2Ansel/English.lproj/AnselGalleryPanel.nib/designable.nib b/iPhoto2Ansel/Resources/English.lproj/AnselGalleryPanel.nib/designable.nib similarity index 100% rename from iPhoto2Ansel/English.lproj/AnselGalleryPanel.nib/designable.nib rename to iPhoto2Ansel/Resources/English.lproj/AnselGalleryPanel.nib/designable.nib diff --git a/iPhoto2Ansel/English.lproj/AnselGalleryPanel.nib/keyedobjects.nib b/iPhoto2Ansel/Resources/English.lproj/AnselGalleryPanel.nib/keyedobjects.nib similarity index 100% rename from iPhoto2Ansel/English.lproj/AnselGalleryPanel.nib/keyedobjects.nib rename to iPhoto2Ansel/Resources/English.lproj/AnselGalleryPanel.nib/keyedobjects.nib diff --git a/iPhoto2Ansel/English.lproj/AnselServers.nib/designable.nib b/iPhoto2Ansel/Resources/English.lproj/AnselServers.nib/designable.nib similarity index 100% rename from iPhoto2Ansel/English.lproj/AnselServers.nib/designable.nib rename to iPhoto2Ansel/Resources/English.lproj/AnselServers.nib/designable.nib diff --git a/iPhoto2Ansel/English.lproj/AnselServers.nib/keyedobjects.nib b/iPhoto2Ansel/Resources/English.lproj/AnselServers.nib/keyedobjects.nib similarity index 100% rename from iPhoto2Ansel/English.lproj/AnselServers.nib/keyedobjects.nib rename to iPhoto2Ansel/Resources/English.lproj/AnselServers.nib/keyedobjects.nib diff --git a/iPhoto2Ansel/English.lproj/InfoPlist.strings b/iPhoto2Ansel/Resources/English.lproj/InfoPlist.strings similarity index 100% rename from iPhoto2Ansel/English.lproj/InfoPlist.strings rename to iPhoto2Ansel/Resources/English.lproj/InfoPlist.strings diff --git a/iPhoto2Ansel/English.lproj/Panel.nib/designable.nib b/iPhoto2Ansel/Resources/English.lproj/Panel.nib/designable.nib similarity index 82% rename from iPhoto2Ansel/English.lproj/Panel.nib/designable.nib rename to iPhoto2Ansel/Resources/English.lproj/Panel.nib/designable.nib index 51473bc3e..3ce07275d 100644 --- a/iPhoto2Ansel/English.lproj/Panel.nib/designable.nib +++ b/iPhoto2Ansel/Resources/English.lproj/Panel.nib/designable.nib @@ -1,11 +1,24 @@ - + 1050 - 9J61 - 672 - 949.46 - 353.00 + 10B504 + 732 + 1038.2 + 437.00 + + YES + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.imagekit.ibplugin + + + YES + 732 + 1.1 + + YES @@ -16,6 +29,15 @@ com.apple.imagekit.ibplugin com.apple.InterfaceBuilder.CocoaPlugin + + YES + + YES + + + YES + + YES @@ -35,7 +57,7 @@ Add Server NSPanel - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 256 @@ -53,7 +75,7 @@ LucidaGrande - 1.300000e+01 + 13 1044 @@ -96,7 +118,7 @@ controlColor 3 - MC42NjY2NjY2OQA + MC42NjY2NjY2NjY3AA @@ -281,7 +303,7 @@ {455, 195} {{0, 0}, {1920, 1178}} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 23 @@ -291,7 +313,7 @@ Servers NSPanel - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 256 @@ -309,7 +331,7 @@ Done LucidaGrande - 1.100000e+01 + 11 3100 @@ -354,12 +376,12 @@ YES nickname - 1.010000e+02 - 4.000000e+01 - 1.000000e+03 + 101 + 40 + 1000 - 75628032 - 0 + 75628096 + 2048 Server Name @@ -394,12 +416,12 @@ username - 1.410000e+02 - 4.000000e+01 - 1.000000e+03 + 141 + 40 + 1000 - 75628032 - 0 + 75628096 + 2048 Login Name @@ -421,12 +443,12 @@ endpoint - 3.750000e+02 - 1.000000e+01 - 3.402823e+38 + 375 + 10 + 3.4028229999999999e+38 - 75628032 - 0 + 75628096 + 2048 URL @@ -452,8 +474,8 @@ - 3.000000e+00 - 2.000000e+00 + 3 + 2 6 @@ -464,12 +486,15 @@ MC41AA - 1.700000e+01 + 17 -700448768 + + 4 15 0 YES + 0 {{1, 17}, {626, 247}} @@ -486,8 +511,8 @@ _doScroller: - 1.000000e+00 - 1.947368e-01 + 1 + 0.19473679999999999 @@ -497,7 +522,7 @@ 1 _doScroller: - 9.984051e-01 + 0.99840510000000005 @@ -570,7 +595,7 @@ {679, 358} {{0, 0}, {1920, 1178}} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 23 @@ -580,7 +605,7 @@ Window NSPanel - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 256 @@ -621,56 +646,72 @@ 18 YES - + YES Apple PDF pasteboard type Apple PICT pasteboard type Apple PNG pasteboard type Apple URL pasteboard type NSFilenamesPboardType - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6Jy5TR0knA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6JzhCUFMnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0JNUGYnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0VQU0YnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0ZQaXgnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0dJRmYnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0lDTyAnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J0pQRUcnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1BERiAnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1BJQ1QnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1BOR2YnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1BOVEcnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1RJRkYnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J1RQSUMnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J2pwMiAnA - TlNUeXBlZEZpbGVuYW1lc1Bib2FyZFR5cGU6J3F0aWYnA + NSTypedFilenamesPboardType:'.SGI' + NSTypedFilenamesPboardType:'8BPS' + NSTypedFilenamesPboardType:'BMP ' + NSTypedFilenamesPboardType:'BMPf' + NSTypedFilenamesPboardType:'EPSF' + NSTypedFilenamesPboardType:'FPix' + NSTypedFilenamesPboardType:'GIFf' + NSTypedFilenamesPboardType:'ICO ' + NSTypedFilenamesPboardType:'JPEG' + NSTypedFilenamesPboardType:'PDF ' + NSTypedFilenamesPboardType:'PICT' + NSTypedFilenamesPboardType:'PNGf' + NSTypedFilenamesPboardType:'PNTG' + NSTypedFilenamesPboardType:'TIFF' + NSTypedFilenamesPboardType:'TPIC' + NSTypedFilenamesPboardType:'icns' + NSTypedFilenamesPboardType:'jp2 ' + NSTypedFilenamesPboardType:'qtif' + NSTypedFilenamesPboardType:3FR + NSTypedFilenamesPboardType:3fr + NSTypedFilenamesPboardType:ARW NSTypedFilenamesPboardType:BMP NSTypedFilenamesPboardType:CR2 NSTypedFilenamesPboardType:CRW NSTypedFilenamesPboardType:CUR NSTypedFilenamesPboardType:DCR NSTypedFilenamesPboardType:DNG + NSTypedFilenamesPboardType:EFX NSTypedFilenamesPboardType:EPI NSTypedFilenamesPboardType:EPS NSTypedFilenamesPboardType:EPSF NSTypedFilenamesPboardType:EPSI + NSTypedFilenamesPboardType:ERF NSTypedFilenamesPboardType:EXR NSTypedFilenamesPboardType:FAX + NSTypedFilenamesPboardType:FFF NSTypedFilenamesPboardType:FPIX NSTypedFilenamesPboardType:FPX + NSTypedFilenamesPboardType:G3 NSTypedFilenamesPboardType:GIF NSTypedFilenamesPboardType:HDR NSTypedFilenamesPboardType:ICNS NSTypedFilenamesPboardType:ICO + NSTypedFilenamesPboardType:JFAX + NSTypedFilenamesPboardType:JFX NSTypedFilenamesPboardType:JP2 + NSTypedFilenamesPboardType:JPE NSTypedFilenamesPboardType:JPEG + NSTypedFilenamesPboardType:JPF NSTypedFilenamesPboardType:JPG NSTypedFilenamesPboardType:MAC + NSTypedFilenamesPboardType:MOS NSTypedFilenamesPboardType:MRW NSTypedFilenamesPboardType:NEF + NSTypedFilenamesPboardType:NRW NSTypedFilenamesPboardType:ORF NSTypedFilenamesPboardType:PCT NSTypedFilenamesPboardType:PDF + NSTypedFilenamesPboardType:PEF NSTypedFilenamesPboardType:PIC NSTypedFilenamesPboardType:PICT NSTypedFilenamesPboardType:PNG @@ -678,44 +719,61 @@ NSTypedFilenamesPboardType:PNTG NSTypedFilenamesPboardType:PS NSTypedFilenamesPboardType:PSD + NSTypedFilenamesPboardType:PWL NSTypedFilenamesPboardType:QTI NSTypedFilenamesPboardType:QTIF NSTypedFilenamesPboardType:RAF + NSTypedFilenamesPboardType:RAW NSTypedFilenamesPboardType:RGB + NSTypedFilenamesPboardType:RW2 + NSTypedFilenamesPboardType:RWL NSTypedFilenamesPboardType:SGI + NSTypedFilenamesPboardType:SR2 NSTypedFilenamesPboardType:SRF NSTypedFilenamesPboardType:TARGA NSTypedFilenamesPboardType:TGA NSTypedFilenamesPboardType:TIF NSTypedFilenamesPboardType:TIFF NSTypedFilenamesPboardType:XBM + NSTypedFilenamesPboardType:arw NSTypedFilenamesPboardType:bmp NSTypedFilenamesPboardType:cr2 NSTypedFilenamesPboardType:crw NSTypedFilenamesPboardType:cur NSTypedFilenamesPboardType:dcr NSTypedFilenamesPboardType:dng + NSTypedFilenamesPboardType:efx NSTypedFilenamesPboardType:epi NSTypedFilenamesPboardType:eps NSTypedFilenamesPboardType:epsf NSTypedFilenamesPboardType:epsi + NSTypedFilenamesPboardType:erf NSTypedFilenamesPboardType:exr NSTypedFilenamesPboardType:fax + NSTypedFilenamesPboardType:fff NSTypedFilenamesPboardType:fpix NSTypedFilenamesPboardType:fpx + NSTypedFilenamesPboardType:g3 NSTypedFilenamesPboardType:gif NSTypedFilenamesPboardType:hdr NSTypedFilenamesPboardType:icns NSTypedFilenamesPboardType:ico + NSTypedFilenamesPboardType:jfax + NSTypedFilenamesPboardType:jfx NSTypedFilenamesPboardType:jp2 + NSTypedFilenamesPboardType:jpe NSTypedFilenamesPboardType:jpeg + NSTypedFilenamesPboardType:jpf NSTypedFilenamesPboardType:jpg NSTypedFilenamesPboardType:mac + NSTypedFilenamesPboardType:mos NSTypedFilenamesPboardType:mrw NSTypedFilenamesPboardType:nef + NSTypedFilenamesPboardType:nrw NSTypedFilenamesPboardType:orf NSTypedFilenamesPboardType:pct NSTypedFilenamesPboardType:pdf + NSTypedFilenamesPboardType:pef NSTypedFilenamesPboardType:pic NSTypedFilenamesPboardType:pict NSTypedFilenamesPboardType:png @@ -723,11 +781,16 @@ NSTypedFilenamesPboardType:pntg NSTypedFilenamesPboardType:ps NSTypedFilenamesPboardType:psd + NSTypedFilenamesPboardType:pwl NSTypedFilenamesPboardType:qti NSTypedFilenamesPboardType:qtif NSTypedFilenamesPboardType:raf + NSTypedFilenamesPboardType:raw NSTypedFilenamesPboardType:rgb + NSTypedFilenamesPboardType:rw2 + NSTypedFilenamesPboardType:rwl NSTypedFilenamesPboardType:sgi + NSTypedFilenamesPboardType:sr2 NSTypedFilenamesPboardType:srf NSTypedFilenamesPboardType:targa NSTypedFilenamesPboardType:tga @@ -747,10 +810,11 @@ YES NO NO - 1.000000e+02 - 1.000000e+02 + YES + 100 + 100 - + {{1, 1}, {423, 251}} @@ -767,8 +831,8 @@ _doScroller: - 1.000000e+00 - 9.636363e-01 + 1 + 0.9636363 @@ -778,7 +842,7 @@ 1 _doScroller: - 5.060241e-01 + 0.50602409999999998 {{20, 60}, {440, 268}} @@ -795,7 +859,7 @@ {{0, 0}, {1920, 1178}} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} 15 @@ -809,7 +873,7 @@ View - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} {213, 107} @@ -841,6 +905,7 @@ 268 {{15, 71}, {81, 17}} + 2 YES 68288064 @@ -848,7 +913,7 @@ Server LucidaGrande - 1.200000e+01 + 12 16 @@ -861,6 +926,7 @@ 268 {{76, 66}, {382, 26}} + 2 YES -2076049856 @@ -910,6 +976,7 @@ 268 {{77, 33}, {117, 17}} + 2 YES 68288064 @@ -927,15 +994,17 @@ {{439, 33}, {16, 16}} + 2 28938 - 1.600000e+01 - 1.000000e+02 + 16 + 100 268 {{15, 37}, {43, 16}} + 2 YES 68288064 @@ -947,37 +1016,15 @@ - - - 268 - {{367, 32}, {65, 16}} - - YES - - 67239424 - 134479872 - Cancel - - LucidaGrande - 9.000000e+00 - 3614 - - - -2038284033 - 129 - - - 200 - 25 - - {{1, 1}, {480, 94}} + 2 {{7, 253}, {482, 110}} + 2 {0, 0} 67239424 @@ -1011,18 +1058,23 @@ 268 {{135, 165}, {92, 32}} + 2 YES 67239424 134479872 Create New - + + LucidaGrande + 9 + 3614 + -2038284033 129 LucidaGrande - 9.000000e+00 + 9 16 @@ -1036,6 +1088,7 @@ 268 {{18, 143}, {211, 26}} + 2 YES 611450433 @@ -1062,10 +1115,10 @@ YES - - 1.200000e+01 - 1.000000e+01 - 1.000000e+03 + + 12 + 10 + 1000 75628032 0 @@ -1091,11 +1144,11 @@ - 3.000000e+00 - 2.000000e+00 + 3 + 2 - 1.900000e+01 + 19 tableViewAction: -767524864 @@ -1104,6 +1157,7 @@ 15 0 YES + 0 @@ -1113,6 +1167,7 @@ 268 {{15, 173}, {103, 16}} + 2 YES 68288064 @@ -1129,7 +1184,7 @@ 268 YES - + YES Apple PDF pasteboard type Apple PICT pasteboard type @@ -1139,40 +1194,27 @@ NeXT TIFF v4.0 pasteboard type - {{258, 59}, {214, 118}} + {{250, 37}, {214, 142}} + YES + 2 YES - 130560 + 67239424 33554432 0 0 - 0 + 1 YES YES - - - 268 - {{258, 175}, {158, 16}} - - YES - - 68288064 - 272630784 - Gallery Default Image - - - - - - 256 - {{15, 121}, {114, 17}} + {{15, 64}, {114, 17}} + 2 YES 67239424 @@ -1187,8 +1229,9 @@ 256 - {{15, 93}, {130, 26}} + {{15, 36}, {130, 26}} + 2 YES -2076049856 @@ -1199,7 +1242,7 @@ 1 LucidaGrande - 1.300000e+01 + 13 16 @@ -1276,8 +1319,9 @@ 268 - {{256, 7}, {96, 28}} + {{13, 115}, {96, 28}} + 2 YES 604110336 @@ -1298,6 +1342,7 @@ 12 {{237, 30}, {5, 161}} + 2 {0, 0} 67239424 @@ -1318,8 +1363,9 @@ 268 - {{258, 42}, {207, 17}} + {{250, 14}, {207, 17}} + 2 YES 68288064 @@ -1334,10 +1380,12 @@ {{1, 1}, {480, 197}} + 2 - {{14, 36}, {482, 213}} + {{7, 36}, {482, 213}} + 2 {0, 0} 67239424 @@ -1359,10 +1407,12 @@ {{2, 2}, {510, 373}} + 2 {{17, 16}, {514, 390}} + 2 {0, 0} 67239424 @@ -1384,10 +1434,11 @@ {548, 406} + 2 {{0, 0}, {1920, 1178}} {213, 129} - {3.40282e+38, 3.40282e+38} + {1.79769e+308, 1.79769e+308} @@ -1539,22 +1590,6 @@ - mCancelConnect - - - - 525 - - - - clickCancelConnect: - - - - 526 - - - mMakeNewServerDefault @@ -1671,9 +1706,7 @@ YES 0 - - YES - + @@ -1681,7 +1714,7 @@ -2 - RmlsZSdzIE93bmVyA + File's Owner -1 @@ -2077,14 +2110,13 @@ YES - - - - - + + + + @@ -2186,20 +2218,6 @@ - 360 - - - YES - - - - - - 466 - - - - 357 @@ -2246,7 +2264,6 @@ YES - @@ -2256,20 +2273,6 @@ - 495 - - - YES - - - - - - 496 - - - - 216 @@ -2406,10 +2409,8 @@ YES - + YES - -1.IBPluginDependency - -2.IBPluginDependency -3.IBPluginDependency -3.ImportedFromIB2 136.IBPluginDependency @@ -2439,9 +2440,11 @@ 23.IBPluginDependency 23.ImportedFromIB2 357.IBPluginDependency + 357.IBViewIntegration.shadowBlurRadius + 357.IBViewIntegration.shadowColor + 357.IBViewIntegration.shadowOffsetHeight + 357.IBViewIntegration.shadowOffsetWidth 357.ImportedFromIB2 - 360.IBPluginDependency - 360.ImportedFromIB2 387.IBEditorWindowLastContentRect 387.IBPluginDependency 387.IBWindowTemplateEditedContentRect @@ -2472,6 +2475,25 @@ 409.ImportedFromIB2 413.IBPluginDependency 413.ImportedFromIB2 + 460.IBPluginDependency + 461.IBPluginDependency + 462.IBPluginDependency + 463.IBPluginDependency + 464.IBPluginDependency + 465.IBPluginDependency + 468.IBPluginDependency + 470.IBPluginDependency + 472.IBPluginDependency + 473.IBPluginDependency + 474.IBPluginDependency + 475.IBPluginDependency + 476.IBPluginDependency + 477.IBPluginDependency + 478.IBPluginDependency + 479.IBPluginDependency + 480.IBPluginDependency + 481.IBPluginDependency + 482.IBPluginDependency 484.IBPluginDependency 485.IBPluginDependency 486.IBEditorWindowLastContentRect @@ -2479,8 +2501,6 @@ 489.IBPluginDependency 493.IBPluginDependency 494.IBPluginDependency - 495.IBPluginDependency - 496.IBPluginDependency 498.IBPluginDependency 499.IBPluginDependency 5.IBEditorWindowLastContentRect @@ -2506,6 +2526,8 @@ 513.IBPluginDependency 514.IBPluginDependency 515.IBPluginDependency + 516.IBPluginDependency + 517.IBPluginDependency 521.IBPluginDependency 522.IBPluginDependency 527.IBPluginDependency @@ -2518,6 +2540,9 @@ 546.IBPluginDependency 547.IBPluginDependency 574.IBPluginDependency + 577.IBPluginDependency + 578.IBPluginDependency + 579.IBPluginDependency 581.IBPluginDependency 582.IBPluginDependency 6.IBPluginDependency @@ -2531,72 +2556,78 @@ YES com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + + + + + + {{351, 386}, {455, 195}} com.apple.InterfaceBuilder.CocoaPlugin - + {{351, 386}, {455, 195}} + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - - {{351, 386}, {455, 195}} + com.apple.InterfaceBuilder.CocoaPlugin - {{351, 386}, {455, 195}} - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{682, 774}, {382, 23}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -2605,17 +2636,29 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{258, 642}, {548, 406}} com.apple.InterfaceBuilder.CocoaPlugin - {{258, 642}, {548, 406}} - - + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{682, 774}, {382, 23}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{1069, 745}, {548, 406}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1069, 745}, {548, 406}} + + {213, 107} com.apple.InterfaceBuilder.CocoaPlugin {{127, 600}, {679, 358}} com.apple.InterfaceBuilder.CocoaPlugin {{127, 600}, {679, 358}} - + + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -2632,10 +2675,11 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{91, 762}, {480, 327}} com.apple.InterfaceBuilder.CocoaPlugin - {{91, 762}, {480, 327}} - + {{33, 581}, {480, 327}} + com.apple.InterfaceBuilder.CocoaPlugin + {{33, 581}, {480, 327}} + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -2643,19 +2687,20 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + AnselExportPluginBox com.apple.InterfaceBuilder.CocoaPlugin - + com.apple.InterfaceBuilder.CocoaPlugin - + YES - - YES - + YES @@ -2663,15 +2708,13 @@ YES - - YES - + YES - 583 + 625 @@ -2681,9 +2724,8 @@ NSObject YES - + YES - clickCancelConnect: clickServer: clickViewGallery: closeGalleryView: @@ -2703,19 +2745,17 @@ id id id - id YES - + YES browserView closeGalleryView defaultImageView firstView galleryCombo - mCancelConnect mExportMgr mImageCountLabel mMakeNewServerDefault @@ -2742,7 +2782,6 @@ NSImageView NSControl NSComboBox - NSButton id NSTextField NSButton @@ -2808,40 +2847,298 @@ NSObject IBProjectSource - TURAnsel.h + TURAnselKit/TURAnsel.h NSObject IBProjectSource - TURAnselGallery.h + TURAnselKit/TURAnselGallery.h NSObject IBProjectSource - TURAnselGalleryPanelController.h + TURAnselKit/TURAnselGalleryPanelController.h NSObject - IBProjectSource - xmlrpc-1.5.1/XMLRPCConnection.h + IBUserSource + + + + + + YES + + IKImageBrowserView + NSView + + YES + + YES + _dataSource + _delegate + _dragDestinationDelegate + _horizontalScroller + _verticalScroller + + + YES + id + id + id + NSScroller + NSScroller + + + + IBFrameworkSource + ImageKit.framework/Headers/IKImageBrowserView.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h NSObject - IBUserSource - + IBFrameworkSource + Foundation.framework/Headers/NSArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObjectScripting.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSPortCoder.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptClassDescription.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptObjectSpecifiers.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSScriptWhoseTests.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLDownload.h + + + + NSObject + + + + NSObject + + IBFrameworkSource + ImageKit.framework/Headers/IKSaveOptions.h + + + + NSObject + + IBFrameworkSource + ImageKit.framework/Headers/ImageKitDeprecated.h + + + + NSObject + + IBFrameworkSource + PDFKit.framework/Headers/PDFDocument.h + + + + NSObject + + IBFrameworkSource + PDFKit.framework/Headers/PDFView.h + + + + NSObject + + IBFrameworkSource + QuartzComposer.framework/Headers/QCCompositionParameterView.h + + + + NSObject + + IBFrameworkSource + QuartzComposer.framework/Headers/QCCompositionPickerView.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CIImageProvider.h + + + + NSObject + + IBFrameworkSource + QuartzFilters.framework/Headers/QuartzFilterManager.h + + + + NSObject + + IBFrameworkSource + QuickLookUI.framework/Headers/QLPreviewPanel.h 0 + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES ../iPhoto2Ansel.xcodeproj 3 diff --git a/iPhoto2Ansel/Resources/English.lproj/Panel.nib/keyedobjects.nib b/iPhoto2Ansel/Resources/English.lproj/Panel.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..600548e660dbeee08495eca379d6693caf440537 GIT binary patch literal 36334 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

NEZu400(4%V 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 literal 0 HcmV?d00001 diff --git a/iPhoto2Ansel/ProgressSheet.nib/classes.nib b/iPhoto2Ansel/Resources/English.lproj/ProgressSheet.nib/classes.nib similarity index 100% rename from iPhoto2Ansel/ProgressSheet.nib/classes.nib rename to iPhoto2Ansel/Resources/English.lproj/ProgressSheet.nib/classes.nib diff --git a/iPhoto2Ansel/ProgressSheet.nib/info.nib b/iPhoto2Ansel/Resources/English.lproj/ProgressSheet.nib/info.nib similarity index 100% rename from iPhoto2Ansel/ProgressSheet.nib/info.nib rename to iPhoto2Ansel/Resources/English.lproj/ProgressSheet.nib/info.nib diff --git a/iPhoto2Ansel/ProgressSheet.nib/keyedobjects.nib b/iPhoto2Ansel/Resources/English.lproj/ProgressSheet.nib/keyedobjects.nib similarity index 100% rename from iPhoto2Ansel/ProgressSheet.nib/keyedobjects.nib rename to iPhoto2Ansel/Resources/English.lproj/ProgressSheet.nib/keyedobjects.nib diff --git a/iPhoto2Ansel/Resources/iPhoto2Ansel.icns b/iPhoto2Ansel/Resources/iPhoto2Ansel.icns new file mode 100644 index 0000000000000000000000000000000000000000..c52d91d296d28fdfc08630c5e071ff84afaeb2b8 GIT binary patch literal 90380 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 literal 0 HcmV?d00001 diff --git a/iPhoto2Ansel/Resources/iPhotoPluginIcon.psd b/iPhoto2Ansel/Resources/iPhotoPluginIcon.psd new file mode 100644 index 0000000000000000000000000000000000000000..30bc3d47de7913860faf45035ef3bced0a0f7d5e GIT binary patch literal 115901 zcmeFa2Yi&p)<6F2ZnD`;ZzLqN5I{r;>4bzPRiiZNsE8p65J@8mRRP7`P_QD>6a^Jj zq!*=0C%xBA-`;zD{@>Y++7TcCVS9e%#&p08h8dhk+8`6+wc zKoU2uY1G&?*-6REQ}aR=r!Gy)933h@eKs^CEoF4*yx6G`Q?n5I&@iHUUouw`0CZGhpmntmX)(KJTg8$K0G2SJSr*- zDZ+BsX67ZW3CqkK&;g_q&cxK*+`LJv0Q6QR@0&As_S)>!@R_N(Su1mrQzxxT z&CI)9Q&eOWusn5Y!o;lPl^KXjoH(Wf%PCpOX(q9TTmh>VPnjEEl>KR$AD+=NLZCJi6a3HFYxe*!x_Ck?cfl>U#l<32$D zRPYmNxp`SRYwZNo)vtC+nw7fZ?ofhlLJH|=c8bVO%E?V7y)!zrvwONos0$LwWAEjJ zq+~)%V{(&LrKXGuzbou^rMmLn%9M5=Y)AebwmV?ok@c_PuU?j#IR*nOJ`8_Rv9lv1 z5~5=gA|t~hViF=EI;&|<_18dhvzFwoPRdCgw-f|8reiG6=p?+53A18CrY0q)WfDT{ zgm`zBzXqMWEGctoYRZ`K&WxP__huOt-qADvkv$gW=&_VPcg%lsk468Rdn`5~GQu&& zR^|P3T=8#Z(EpAr#tct@-tm8fD|Yb8yTx0ljJ`)4b|k$+7wR0wc0qVY_}}SBd1*^- zYh!mQIwZ!fBi$)HN0HD3$ZtrLB)i;<92Neju-ihQBmI0LhtpTu(?b`*6CO$4x3b@#t((U zJ2WaT2494Yh#49i9f5Bo+z1~LJv1tQ_|WKx$f41ZBk+wM8XJXgbQHn>CoTeCq>Ur~ zSj6KS9TOcjGAd@oxbYF=Vuwc$kDC|~A2&XB{Dhd;aS<`Y<09fCqdF^oSIur!`yZnN z=!_56ckiMCq)wQcm6En(?Zl+K)O!?_yN2XFDeu5GiJ6d-nglIxc2-vUpY)TsVW5wD z6WuR=YG)l{!y<-V$HK%Jt`#+?n>D z?t;`cX@4;kNz9*zA_+~Hkd>a5GYj*;)G@04t7^LKl^mxaU_XwoKo0Jue zAxqw*lxPfP@N5wx@}Yg*z^agvVjf;|6Ik0&L@+hN9&nnXoJ4j&5kF%&Fk z=Cbj?qI1ajRRd>sOXNvfv)agsVj{GU0tZ?j>Cbj?qI1a zjRRd>sOXNvfv)agsVj{GU0tZ?j>Cbj?qI1ajRRd>sOXNvfv)agsVj{GU0tZ?j>Cbj z?qI1ajRRd>sOXNvfv)agsVj{GU0tZ?j>Cbj?qI1ajRRd>sOXNvfv)agsVj{GU0tZ? zj>Cbj?qI1ajRRd>sOXNvfv)agsVj{GU0tZ?j>Cbj?qI1ajRRd>sOXNvfv)agsVj{G zU0tZ?j>Cbj?qI1ajRRd>sOXNvfv)agsVj{GU0tZ?j>Cbj?qI1ajRRd>sOXNvfv)ag zsVj{GU0tZ?j^lyoa=m?;Luw|Da9EAA8tf-Qutemvhd#d`J|jJ3Rca3T(az{l99|F_ zlA4)}A7N!K9UVGn_T;b;_TwG;Pn<^4@JZ7`Lpo19AjdM0Us|Nv4@*G8-0&GWS=p&M zd26QtY8WyMOUX;YZ!|`A6mwU-5So&foHxdmJ8F6A+A%n9;TEv$9Q@jR*o>s5sgv!$ z<`_0(>JwQxY3s7^W5RU&E^kygNsnx|vfn>{UK%;{Vpwv=Z^t_GaPiB0fM0rVaR|yt z%0!Vl zsK2c*PNK+5ot&Pu^iHVg`c(A782qZQ(`iR&cqc|jg?FME<#d;R?)WKcXJK7kbYJTG z{}1)tr)h*vI+2H8YIQpQwnH2Q)WOZ}!+>TbC#8c&{9hxUdz#h7bU-x@p3}u&xc?)b zGZ%6Yzd`)JD6#I-v@X(d$g6)qUUee)p7HsAMP~g)^SWrr!F~uTI@OzQv!C3Ri)VLe zz1d07!WX4wF3DQdp~-YlaNVVrj!SuQWo}+-3JIKF;)SIPeu@%muse^&E>&3pCysD$X~gvgk?^!x|b`F@K2Z4LDvP5%zMzk~4a z2>n;O6rn+PF}o=>~4|tUj)a+-Jf>j?+$j*u6@GVF}v#G+5ZylqWcoT zt6}JvK^XV6q>S4$?c3b!zJ%Y&7P`r8hh=9Bn~{~9H_LuH=AE{V2ae$XJ;!}e6A886 zGF4>8~6A;1V9h7Nf%=;=&>#XGg{*#Kb2=5C5mw z;-4n&|69_UlbQ7YMxy@*(AWdo`WLLxA=d9_zIz~3_^agg#0ZPaNLYU*j327 zU*}}MOAm^O7#4+TR`(XRVEtZ&Dc_W=sI8OU^p8KypVPWqU zPoHhKRoqdnE{n&5%J_3LJ9Wo)}2-Cn+-*rYy-5|v5iQrY;QL#4uJN88LoCe;FC0iz3o0%QeH>6J*U?0 zeu4^LvIH^dc(XfVZ-wmH_GMQ{6k-_EGkABVA+2CgVYfrHkd}DZAqm2VCI5wEM_K4is*Bxb@h>BJ3U~1|GYg)Sk46;KfcaP95n9z7WQItmAv@ zMhMdD6m`32f{B+k2d@sC5O3!V6NKi{s2S8UDvQd)cLtSCt)!MBER#wEm1N<+y$pMv zJ71lBM8aOdm)ux!*K=or&WKwTCf>}I>FM}Kn$O0~44Emp(-*&(4BxGMGn4Zo;j=em zc2;&sdRFFA`0dY>)FpX$`p4&GW!&=Ht1%O26yEZ`f(-0joCKMgJ2!nwE_{r;%5k>G zA=npR7rQ5M;vKMEmgZ!w%)Tp#jhzU%>L4|9Wd`!NPnt!bV+|Hz@Ovb!%*%Q_H8V8_ z95e+16uDvGR$|wV#3Y2oBxWoP!M}fZ`&l?TbM~b9vr*J7Bk{QP?QxZ9sw z|2jPPz8M~FZXTW<-kzS`{+^zm{^aH9-;u?qI{@f&ln)2Zd4u5J*1cSkZPCaW{jn_@UISWG9TvkRN!%yN%Lqz}uf zzi*`TxTll+LRY*R#rEH_=g{~81AELozc@N3XH)S6mqA-+DVmhYxv>FX|N7cP6F;7v zGU>uMdBX!s<}|0O4!?e}bY+Wr^59SQzH#K!KgwD)-yXeG-lmF8>Qzp$Bo|oF(RfWHI2)I& zh-w;q>71Y8^-qMeKK<}z({#_xYx{i~l;XZRPGFw?5oP0OS{KZ!seSIb%035OwryJf z{g9%>ai2w+V#H17&7YLa+?qJ>lf5W(EM26X{gLc&$@di#rG9Q>>dtIcRrdL4!+R4q zj7{Vjf}hMtU0S($7323p&x@w(dqhFujc>9V$Es$2UvVSs+OcEr^cua{;#5+*3?{|)*g2yxXuE-0_xdhR)H zRaJ4#Yx~n*I-6+Z{eEQTEV@|R`_&P;x3?u9F+TFq(B)6PE?Yju^4KHduP033FvrzP z@QCV#EaR_*X3>-Ls?TM=wBh45*+s9f;;m+TT^av%-*b%@CiA%-JD%w4Iyd3iT=CF| z%S`^rbDlG2MW$Xk{CLBc{D8U7t4|**-aRK_#%UquGyACRcGv8H|?-(n4(-T?citJ0gHUD ztKVALcl)-dzoV(SKm1($)5*>IM=nT9-6uG`x@g|6vJFR%ZFyr_#*{r@vzOPN4mqxO z+qk`fr}<&bQ#*RTutGg*{$B1^BU-|e!;4+n$6xZBQ?`8W0Y&S^FTajH5FBu1*E{{r z9ax0s3~Yb4NS(QAVOd$!qt^%2&2KqUzU8>((M1-XywWG$Fk5seV_PAP3Q=4on=9;A1rr*W}i?Y8O zQ+ED%nNz@Ab@i_8tEO9B=WTvY@_yZG8Q)esn>O&b68`9V{b*j|)%jBcr~UqY)_l?Q z8{!4yO5$qtl*@7BsYjAGe6Ufm^60u0 zyFPw?YS6jk3H!tLtB)vj8`SfbYadR^I~{#U{88|A*`aeUEjcWFmoJd#_SI7PtX;3H zSmC8yW!ygI=4Dp&#fvmGa^t760|OUr9wk{_SHv@`PCotFf%6*=W_VG@HPiF@wT)eB zRi-_y>G9@|bgAa%uCF&N?<;vRYV+h_6IPe6T={v7zNYQyN7XN0JCc4qOC^43Lv!Wc zee8y9<)`M1J7GTc*7W@o=Eqz;_|2O~*1LZeXRDk2>%tE{E72Zo^bv@42h1Hf*o8eEzKI$%@BE-)L%U z`|!(GdMq5KXsfM=eFhMxzYVbf0483jgQ=Z z`AYhf+xm*d@w^>Je>cs2Yoh7G_16+s&;4c2*7L`{dh3hS{C<-f_UMk$l;&vv^(zbh zh|yTq9ayd&dgEYu%s}0r^szdS4qj`;4t-LQbzwC&@0}SXR4GlARW^A-PJPs->y( zzh&l)Jy2P{vtdhF?V{Sg`I<$Ex@U@d^ZQL-H0`o!gSOvAW8K;$_eH~=xO`%HV)n{S zuO43~d9(cJnd+2xYybG@OriMmN^|;PzwcZ=;Ft1#T(orQ@I9LE_Zb%zRQ=|+fA&+# zpL@@GVb^Q#1)sSRE;0vcUmH}hzJKnqn=4L8JZ#g-bBB%NDEn;7Zi)WX#fv4fZJc$L z_tmOnzb%+=@{qOdd$suSSr-bgU+Mcn57v9HJZ74_*zy6dVxh~7ODjjLY-%~w@Kf@o z=|`3=c-po$pQc`~)%1`&x9-)Rwq ztF2Qf$5~o`e`503;k&+#Kc;$V&GNSwy(OGZQ{z^AZ#w=#pJ88}`8+zV@4`7pUj6-g zt)=a`jnOp4U0nC;4?&wv!j;LrPc8ppCuh)ZQ^m&D4-1EmI@9pY`|XkM2i4CSI5O>J z3FEuzKYr~sbH$FZ zS4MqYah5LA#>Hj7@p!mj8THyx$-qO!30scHvScTJ92dE4)ZTr&j_pZZwK(ON^9Q-l zUn|bfu8~i@v2*EU)0Jnpm;RF9qj~1=^6g80t~S1}aWTx@V3Mk`tCzp(DdcHzagJ|jmO_^MWo`_sRrM$h1+Z^z9SbNTjs9$(EJ#X|H*_UtrQa4uc+mGR27}l$O-i#i)CYKwe z;5jYz64BIxw9P+OzE-L->Aa+Khf8`rx;{3>+HawG;nOc~+?)J-&Do~Fr{B;{5ZT!4 z*H7^CpY!n(*$0~nB6_>^ldiB<4%_&%CQfrbY-Nw?jfrapmd`#VS^D8i{XR4n?km$r zTbZH_KeuY#fBN9PjWhQbf2Q-A^VYWBqh8glpKR7WdS-Kc^Q#v}(A4ntK`uA8`q9*B zYwPCx1E(&XIQEM^?ZbDQH~f-tDq(+qdYrUJr1``5J&I0W-Qsdey;1qjoC81atGV#( zoUFq^jjO{39=5&v`L-*v#gV6M9-E(895gP}6k^U6#g#wx-f!&RpKDBB5iG4cqRd=& zcF2J@k1y}Vdd2n168794BQ_u1xn=D`r#2?^j$8NHhIaYQ<-dvNee=SSlm*N8k9;=8 zEo(r{IbQxx8^1bCQ>=rY6MA0S^y8atL)IAl)un#<-=_7vQhHqb`Gy`R14jn-8+80= z`=Uv~W5(tV9&BO9$&a4hdt4Cq(~ize;l>7cyi^=Ov=Gj;Fol<%%gUmkbzY*XK>x_LB}8P;#!w5xL$dQ)}$ z^#Plwn{28l)3n1rf9=x`7p`@_a4KCJ$6OtMMVPg^^reGyhy2lSx%`(|o3Fa>eynJH zzj;}f^jzA^0&*>$He~&BNICJdiXUN=S z>mBok>W;Z_fBW2zSf%XqKrd<>l>&3qVwfjG?l4H@+D%j0Napu9DMF|T)GR870PH9s zl$5|2HgziX2pk;Bh2d+zPnFnLDMm2mY)?v2iy6JT+%Ga7zLf^kZAPTsJVoqjIgBW~ zo6O-qdMnLtmLk*Fz4#VUu9jCQ3f9Y8{~vgPB1JB1Ou%1MYzQuEwBH;A^W1JmN4dn# zx|`Vr|CQaWE_bJejm==)sw3=qx7)$!d%GQshwf|#lhFx-F^qW|HmYuaU{kPLAngB% zWx{K>J=}nw!=xq7oIDdg2?-yUIguF9ZsPlAL!SMn+HsR--DzK;CSy~}ea&v2=0Ac% zlFDv!n{)6@V!5RN(Y9sadxDa4Pj-LjmVzBrxuNjH%6*e<%}R=nN6Jac*0 zo&NOP>?ODS&UX08=>+~=n9E(3LCWZ&retg(g`YfRaNfouhg>3zt%XSlB^BVNC#_A* znT`9VQnFSq9#`^ntZdV1tGyme*5nWtK=R)EU<}xEzl8rAC?|qTw*w^6pifCS-oXB# zPj6!%2&WjMND4gN#=grGQn`>wd#gJzPk4a~H3gVo3#OGrg-|e9+v9Ix9qq}n`)_02 zj<);r+;yRm+5)m>OWH)9hgWD}?Vxfvs_4vTVoAMJh!UqZoz0&_aB?i2+#KQ?y7rL-r1T=LlCA6@&ft&s4Qq4;8@ z4uX=R#&lra*}mH2yqaL$c^$#JbFbT2Cj;|;OzW`^#5&g1{s!xIEBAjq*4y{ph4pib zemBd1H!B_+w$1X;M(%Fl6)ScBjh|QP|IUx2$N$^<-O=O!g*_ff1yH>yf650E)dQ>l z{_qD-q4@NGp6O)|^+BjV;ykdn+wt*$n|!?NA0Nc|Vq!}2_ORyR`g(s#tvIdf*unKNy80Gq|ULEWId-2?iMc{Y2^n$>I8te77g z;?KE36;J`*p%c^I*?shnn?*&1MMe1+e%blj^HD)A1(@eL`^3HcYmHJxJBtc-EgI-l zM3qoZ%+S}$%@Ud=JwDa77y-yN<;l!C&)=E2l z8s_4}sGuq-XQ$XV&bQfGX=h!{FRQ~Dl~gsw?wj#TjoM;srr9=&vhs(t&}yoVVtdWo zT_`cx>JVy@6zzT9zm969+}OP$CeN5M>)k8OdRqnUVKcN{+r4qqJDZj-emc^-of1%P zgXV46efnx)WleRRqJZ`=$Ye@sTT5->#UD04;U}WR6#Jp&`)}0COlN3ktF-FO+ao2E zlww6}zAQXUvovKp9+OdWisiBTis>hsS&+_DPzs6}uvPUV8o9<Zlhonfddi4)_nx%!plBEEY`pNn z!r{Iq%0f9a{71dGvvwN_y|k{c86iynHD#aBjFzW~hY?-!G0iBNWOonv9q#iHc6ZP( zaG!a^?)Kac_t62w&2)a-fXsV>>>kEyIXqju&6Js9EN=dkW}4r0vwLP#!J}U5V)slc z`jmF!FNM-$B?+T0!P~F^^IyBS|4Deur$VQ+QdWxPLayTxYJ^S_U z`CJ9^6in;cJ2=1|W8h&VC6Pv4+G zFRlxdi3l$e(RaczL>w5|HzXK!2K-w&9_|;j>r2|@>zLjH`Ud!T*|;_i2ax&?33>D* z^H(&-`pK}~149D6J#Czh7=U`@O*LY4?>yRPKtD9IGp65wkin}2h!L+H-0z;4(1A

o8^Bmpju@<$hTc_9zX1dL&%A<|@@EGOLZxq&!}SUb4tY3a;&H@W zpV9xJenIvan!zP#?in&9WaL3a{q}hO!Tovy1%$v{T{xb;J%OBK{5}on$BNZrK*ut8b9Mk0Eh?*#&Lml&qlej*e)Jkem%X1?X~Tp-K=Nlhx82e_4eSfSvCxRS2oAZ z)7!@{VA3JuH?*5>|3rWPK$OenVwhVgHx{Xvx4*AP+;;J|w7dATD4)PUKQExc1+2kB zxxwM;h9qm>=(H35ABb%hbez~fKQO0 zFKCL(VVWruHpg&W*sh+wy?S^~`c`s~_E4Xg;n%a5kB6HplCVrj;>ln-1CE!EU!cdM zn;Wga(4Nx0qdWt9`FN7LI5Qb0N>8~nU9cU=!#l{Y&+;PUVThLYE#aO$eKCGqT%4GC zFm`t)hwFkS2lw=wc35?kcDFXH4e<;1_H=c1X0f!CmhxbMIiaNBzJ9SgKhQ)d+av# zIoh>-Q)I6Ie;+Q`o(wY1l|d@!8_+BE)s_piYk789ub${H7bdnNOGqr&)zhzM;GopY zf6&}Z3;Xv7@NsiAc%%|EB$>x$BYdz6ZM*^FkY(Vmgx>&Y1PouY>3TFcTs z**@rGW+TNz92hTl0CYmGPK7?|2MXoxkhT<~VF79sBknJ*C8_l%|Uk#)@+?<`6wNQPy zEN8ZxCo^zula&u9*SN&P34@PW4NZvyqIGq4eXhtRq&c?yS*~2t?kcLBa$&MT+@pRm zifI?iFR^Slt~0BGDnq!li!*D$`wA(|R&Rd@4Pll+KV!4lPEP*I>f|(AvNG7&$pxxe zF~w#u*-q|>7nC%+VzCd4&195Ng%q3V%y5p~qtVdL7oOxYoR~$>5NZ6U`mAczLlgTk z2AlU7g;*1CX0j-+`PYrKvtr9YZ0O5}h6yMXbJTvLg?4USfeqozo78nu5=Di+*=D1e z*B5ZFQdcPs#H9DKLdoIrm#IIXKW#WO`;y(U_>=LMplnd9|MHVXEy0fETxtbu-!EYC zXfdqd*+`v5&7qz{%o=JHtl_Kfc&|WwI?~Oh=2Hu)MX=t^!4CPSsp-^AEITDqPr{-* z1=j1Q;7Y`M8a2rtGL?E9p_7qr7E;f|hvb<;O+~sV5H|rf__46cjiwUtjiW|T@%RqM zhqz;@C@KQG&>y9SK(8MJ&AvbM_gkGo>{Q)g@rFX z^TI{m*#qT;i?;3Avvzm>Ya1I*f6{(*nOI(1QA~Wm76<2t_|M>4N_Kz=bEFL&r+0&;43n`0N+|&emS}y6n`|n>S198k-xNns~g%W?pIG_3LFt*@^IxFki0&4+aFJ+GP9+RAI;xA0mT>gyXC>gt+G-rV&s6x+RV zoAJuUD^)f1t-RI-L0c<6?QML1TRUGM610liTiek6QBe=|Hz3(p+wv+ z6-q>Mxk4h6DdcjQL@tp?CF0VL3so|OMkQ;julx0d|0$O$`e^w4Pp(}$cd4MZzFj7g z$W=;hSia^he^|cLEH8mB*rPXEUf8H`;(v5ShB;CE=uzY3d*Z0E1RzGI8#5D1^v)~34phWhf#>dLCBMnUuSy+60} z>T9bi%VouHW?FJB3kOX-CM_x?T%fAC?27|ce5tsl4kMtdvZ}hip^4Wn63Ns?n~i4K z#D$Gk+Sg_>nhZw0MyFQkjRtruh;+)oDm3B$0JB!5R7l#J+uE9&np<1jL`s9z!250Q zO+iCVO+%BAzV`fhOQL0d=;J5o_WFv_3J_$=>HSwlMw+(iwMvOps!++)Y7L-SFay!n zHPJSU&A?GgmEiUYnan2lfQeVBG8ip3y0J__T5U7x4F;n|X*AQ`R!PCH7i5hfDX~gH zpPV(tGQ%>~Cv1mFE#fy;mDkobx12jsCbvlFhpd`*32j!ZBtnn``KT2Nuyut@4vLUT z^=4YwEH&C>0IDdvS|n<#6Npthm7G5Ota-U*iSM)9#VS6eOjCV*9j~qQTDj0Dr~OP? zg-~VFNQEF;iCij|$dz)Nf+-W@?ID&+g(8vKrV|QfTC0loHL1l7m3#@mU93d&6yK9g)(gf#{Oz>GuXFSVmjcj>&tw%ET8- z06{8g;WhH1G4OcJ;AB!U1iMr$23Hfx46wd8w(?uRa>USS#AGxi8tJ(~EfErP~&6HQyK z7Nc6Jk^#dqi=38uD>NVryy2g%DB49{!)vOC!f0z@wzdgu?c6qgJ22SFZxdKroq6>wjZKgrAy%`+Vl^5J zI*l5-k4mjai3Yt=tx;>Gw)Sn4d!SG^7k{t#^C(nilUn6ZXyh6R)C3WzPJzm4O(uih zXhEss>KYyoOcbRy@R}Q&Tbt~-XlrR`26Js`LTF9B3N1C6%tpOYYtwkBAl4*0lfgpR zzRISiHBKVBW&x~aR%#rB+4nnIDv(RXq^)ul`dzI6o5jdbsuXIq)}YrJ4Hm1U7HTW6 zmRH?~vN7tL8;Q!?z~j|hd3~CydG%Obk%Gw>FqrjPC_YL^RgKYXvY2doSDjX;(g2V2 zjZtKw!!@waW}60dDU(QTayJD~0j$bJ0+H0F7^78cbm$hX)l^kb2kok|wzj5@SKCm7 zX#p5xeJxN>S6dB1RSVvGt=M2QTC8S+R;^K}q*9&DOj{UcgH_K}>!E_7(3@jPp>!zc zZKIkm#`r>^ESXXxvuU3-XysxI1Eor-RHK$UTL1fzDsWaX?8?g8%G!#`Y6yoa@F4ig zYbz^it17B051lpI^k$=0hce{~wH|b3F=Gf31ncx@s#H#298OB*_6}Yx*F(ub$I96< zAV#fH*>rsjT7^^~0Z}Wp8jadwJh|&eRdFc_E~%`jtguzm6`^ocSHpu(RasGK#f|UI z0hcrjfmA32 zXI9A7x~t!vuWfE9E4W#Bqp+Z~sHC*4thA)KxTv(C;6{F72~Q|&x%tBlvkDAWs?=M- z;DJ~(q=-%LhW;V!SFWXZ_pulFWTBNW#W(?KIWjexqy{Q%`e=+4gH9>{dC3&IvY&se zlj>D%ysF~sH?Lp6dGp$hf}1yPT)SSFUtZfTwVCBD=T5d5Y%-=&Z8Fh4Y-Y0sV~w;A zSR+(xw7l12mY=urGR;Wxynqf8B%nS=i$(;-kl~SXWShcITq%8kIhin-B z5>bbuNN8K722uMOEM}0qNh9YABdN(0)@=8zJ&y?2^qt>Dr^1of3_)N;96uR}_M$*PB7v(dB$Q&Oq0xI|_a zq6k4rtyCe==x7({6SP@x&_UK{xpF;pWic&Cb+Y5g?KO>}O)3{kEs(-m@DtFx5x6wj ztY%NptXUy~!cbG$2p%ejvDIi4RJRC43X7I@F#n^vKf%T!vWkglC&L~UI; zYsE^w1PZGF{E5`EC}f%r4OtJwnaxl$%yd7CqODohUSD2O z-zp+n4X^}!itB4DD%u1>sEAmLK<&-IpN5EOEm(|{J~hOMwO*Imm6jGh)Om~C*^Uy0 zO--TKUC>rD{-DP6u^D7M9?_8Ns>+MX%Zs7G+=s}qn z*z|FG0o>SgbgPie7l3s(#<>Bsf_9pjsJxzbH}S!#+nV@-Hi&F9pKfP03gwW0fhG&- zN4?oj?OIHZF}YIFd-{@E`-L4dwO}G9loAaa^@h%+GV3YuTBgYi;&QXG+=1v#Pzf3Qk# zK>}HT5!z5GTI&f&Ks;t?^bssR096Lcwf}coUQ097M=?eot?~lpkfwnbnE}W`sswup zA9B>w3<4xI(yH`YR0#u>-XB6S?Ql4KzfwWp;SA>w=#YK;b1AeAzJQA73s6lOC5 z+Q&wCw;3@84aPHcBr@?8tF7<#FraY(?pZD3y5^=9XzLv!LM2zKv}%i*;@!kq0+z|5uEOXB3j!c; zLlXuLsg;urXal!%#@qn|5L%X$-)^dz<3w6VGn}c2y5|ss8GaT(?!=ORG}q;Ug6z7p4zL!AXEVzMO714^Nu z;S0_QU}m$@UMmspPk6r_Qw9~lfu$n3)W&C;PDYT5aRc8H)|XYnTHa>kQ=oNkg<1>Q z38EtUH{l8dRYE)Cvs%!vUMjU#hS>+eV4kM?;UNNs?Z3XUw!FL!sKPW$U^lb?qiQ82 ziG^vkhnC@kTCV}RY!LHJhZj^&2 zAn`@KWH+*%U_jWn4JAKpn;D{>3%lwF3j@46pb1v z#+Y$Qgu?c=rsirnZw`)7F#=+6-!IzoVM43LB&G#+A(*g0xZvMtHIz5AlM%CLlLi&U z3=g6Q{R+g|^!{2Xbqb|SCW3*ep`ls1?_m(G9in$$eN|C@X$|H@u%I+UKas$E0d}E9 zK8{w89<{*!t+lf;3Ec~Q1a%1_2on%6AF)^_bOKgBf!L8Sg+52n^yM@|vkN5W#Qhz>gdgD=;G1 z;B*GizF3TU^ChL3?qsJ)(7^Y~YRbxMns_k(3);YXWD+oFoe^qK7X$@?07AfWia~>^ z42)zgV%53XObNE5^z_coZv_F>!HA2d5C}@OR)?f_0`Mai6byBP4#qpBnBOW>{S+sn zL{x9?j5DIzlA1ifEx`o7OZ0lTXo7ELxkAv(u)IUT?30E1~kbHW=^mO=8McgBFStfO;^L(uN1d6TO}KUuo(uK8LZIv`NA^jr}eF{ zyTBkQhfxl60i8q-wymIjOgfBmwH#(s7{4t19AAb2Ir}j2~U?nV*CQ>lj^(x`F(Pc^4728GydCtA4Y^ZK%Y;1uB2=x!k5Ku!5FrFAu zsEYQ6!e@ka1WR@jp@Kd;#jOq7ZF_RYd?RnGfUONH8BpVuFlP`BL}NNjic^z(dV^6* zh(O$`vmT6Rw_@swua;*lO|H2j`k*a(t{#kk!^1`^H=w3!j_%@*Xc*4 z&0r`^os3ig3!Dk&U!q>=QB7pSVw_TiTvF4G7d#uO2FicfmSz!p5r#$kSeIk^3h8ck z#$*`T473*n0)&BFrhrL9p*`|g1GWMA2COL-HxLz3B(mFdU~U2XhiVTq9Ht>Y7TSW5 z45kYfBND2m+lP`ZLQ(A5N1L0m;?>*&LooO<^cPGk^=7D9n3&Ndml^qp)expxiMHX5 zUS$7Jc#pt$Y~NfFWYjQ-M`NmT0sxEyzzQl(&B| zs1jS221V|y#a4>e#&&62JJb-F9QDPdL7|3;SuU2taxCS&9Y}UDar`!vw=~qX^Pt?& z*qLpU`ydJVz;4c$V9rsr+^rlt%{gw1&bQRnw>7}U8_= zr+%#Q$FNArYlFdBB7pUsn8mTG$d~f@V(H<>SY$I)ALf9q%>vS;P++h&54$rMR=c3J zT_yaq53>YY;k_AwIYkm4RxCg(0xaXBR2NvqHBD~>F^aKED$r}@Ss|~sh1Y*Fj@b3+6j~{iP}H1=vUB#~AQly|BI>W?quW{I zpGG+6W8ai_;F9aI=GunZYWzurpGP^}q^?n3ZciSN3oFa3s(7-Jb)h|+Z(>80CntUj zPhNF{C%*DpZ|A;jdl2=JNscF>S>YeFqKdZ4Yy7%5rSVvTs3iY|3(M%KH0_JNMZ^bN^k9j!jvPO<9gj zS-1D)IyPlFHf1?BWjQuwIW}cEHf1?BWjQuwIW}cEHf1?BWjQuwIW}cEHf1?BWjQuw zIW}cEHf1?BWjQuwIW}cEHf1?BWjQuwIW}cEHf1?BWjQuwIW}cEHf7y?YL?@qEXPS% zj+3$;dAAcU&G${(Iu%ZNF%oTqRC?A`q<0nP%d>8i{akS#e$RPSWZKxbvWXV zZ)RI?@SU^o;@|1R9u{19$?o}vgtlG_vEURvX7E;%4R-*Ku;3^@X6P33LvYg{sDL%#Qb&MQ` zXu0TT#qotKR-f>ajmn2VljJtMNT^vEW_opxR0Ct zWD!m?WNO}UvQaXM<(Aq?j_oyl;cUZMmQ2sgR&oUAaa_cV%ef!i7R0^HU-!p;?0G-B`?bzEi@1+*68WGO~iBB6P|~MzoRFfLmu$-=)Y1+Jm0&+d0M}K+qX1Y8j1Ujr2CmG>m zu@b6r;y6?PbG(6gnZtfJw9`!f=7DY%Pcg@vTZO+Mgmz&ip@A^vgG@ETtsARUm47h+Ji@)H<@Yf zg=y)nIQ6%5mZzA6GJ<}^g{9o{W2o`xY4hngClPMcV7l+b{SBNmqbTa(L-dye1tiQF z&A=_}V@Mk^-sr_gZd_%$uHH&te;f#8x&#NbBMf(pzfeYBm;fT68Lc?woHgO}&oTAH z5x#6NlQ@_`zPK9}7p}WH)#3_nj&I_$h{`vYf1DCJEO_INC&!Q9(l~8>?CW1m3jX$& z4>IP3Q`s#~dCl|p@FY)nQYSjkO?3AnPd8HYCWjq=i_=ZmneAK7(%-xJk>_tp1(;wEotFLbbjvFEyISB=fSBn<3BNJu8!=vpC3PtJP%C0`GqCt6ekj? zUf+o)&nM4=QXhJCeL>sSNOo|C)|qc6Mzv$`Da+q_6rIQzBl!#NeAe%nJjlU z(+Llga&dMKWcM8~&2pIy#&CD)onvO6Fnsr@XQ;n3i_La&rg}_FocYwSwWC((3&S4? z3b-rvD<922Z~Y;x$D;#rN3@fZGmH7;XWxC9F>hneX>oN@>cC!iqz?DZ`uT$G=z=d9tXf?Y$KP@2K~HkjS0J)^A>%6~gv#VmbBb(8#3?(FG@tDOh*b@OESZW5?#ip#5tf8U{L*fgLk z^(V6*`-N^;KYwjn5ar9^`f^=7x_IO2D9Ww(;Dnbm zADaKhlk<-kEp|ybPd9w|{-K(~yJMUf9jVuEZE1ez`IM~ZA7Q$MPg?Z$(RpLHf6ym# zpP^|sHBV6aZDGa!-EYt25I#6{NZDRf(dyYtmX7tNJR`?1`QqXS4`&o?@(j-|q0c_- zv7x%~y91j)+deNB3B7m2cP%zcZGKI``LEYq zxpM8prx!fu)pKc+Xyc4|FGM;yOS=Qqc6T8S zJs!7xPx{jabthDD(*L;ik|G*n{+Gr#<8H#w#zn=jpu%t9vaYR{@#l>A3iTps&@B& zh{@723%OUm+m&cu(Ggr6V`S zUwl|_c+1VdFI`SJ>Vn|9^*>^+opfOHzB5VJOF2r^oUu3?)&I5eQFh7I36qZyoqs*RrpIG~yky!9d%4=E(W@OJzW5kMdWHN3|z@E6mO*Ikjxx+4w`lh@nf8|GFA? zYv;11OC8+4)9GS&|CNwiC5DtV=FE*RwAZtqrd@hcb?hKIIQ3G@uUk@YB-|>ks$*CF7C`7T;FYwWpHJ8k zHSgJDNG?zqv+K^otp}1Xoc?)Z>h+`xx#iDpehdCahlp3wUS6I7KMEC<`T03lj&Dkq z-e0{x_T2H!>n`58a3N;P;z%$(;e~ryZx<+X7*96r1h zeX@AS__c94)VdSPb|2lhbJg+-cM`t#M{tC9q!G8rX!fjbi?;ufQj~va<&J&3eqD1Q z^{;7QV&mVE#%e{pV0p24)apzDM2i$w52|x1byQh8jWBiRu z!SR{D?Am=gZf$o*Jn>y=JiHvHl$g@SPTibHL9Y#(vG?G~qw_-vV1vG2nhiyZ?lRL*lY8@Qm1JZcpqAhR!`~vjvK0c&zzisJ<-B8~v4Lyj%A%~4c3lj84 z!rX`sJ!f_!APygp#`*+7wrWal+Af57`+&Xf2etUP^m4iaz10PABQ>4;QE6P)nT2Rt z`zA^3=SQXSBYR&w9Qa1~!_sc>a&Hqh&b68Fhoxcd1O)i_Hcg&aXMC_Gj!iH7EPf^Y z;cI`)e*FKvFJP9*tN(>BkiRaewZ1^3=EZed5Wu}k&uh6@dft$Qo=ph5$D?_ z&ak;PzQBzs{kyvLopM@#(LU6#t+sdkI?NY16V$1XS8$)De~NQk;S0Ej4(k{?bm2D# zc@JCR3*b5idi0yKZN&jrVJmzAPdBGd6TjW`)9xzf=X2rp{(8Ui1={$#j#>ZH&zpDW zNx%4zH}%pNaCUb0Bznx;wQAbvFB5ei_XY3{ZZ1v^NQapdL-39fJ9QuQ1?n{4fiK|b zM8p$FUfx6;9`XFP@zIBTf$BL9&Ljfn3*Zo<1Idl(<1<9_;sd@wY7duCZ=wU-Wr%q1 z&K)8;hEES1%B_5#FYwrw+SR>%8_XAgtCMX+=j?#T zyATOT=;W;jHvjPXlzFRf$&PG%+ZQmi|DH80nCJpNhL;~~Fhs2S^ZfCR%T_L5kYIhX zu7xi!G{aQCdGxHI4lbUK1Y(e%iwn+iPHgOs)oa##J#Mj)x&O_zPtA?Gj#Af-m@~s4 z=i%h!N^)?Ci0Xm&+kAS%_Kn|;Z9AErx4T2&%aLDmXxj_Z)9)vIGcODwIy#4Rb90Rt zF>iKHq}`7Pcdwl=;IpLCtZ8q2frJLhh0n&#pVI-dHw1T_J~3q2yq>Z7C*|Ptu z$@`wNA72^x+7~#HoKA}sKj`u_Q{Pa^Ihn02hhgUVJ?p{w_>13!`GYSoV>So9_wDGY z$Y2uU)pO*?uXb#S2wt1G*vn(|@7Wg?Z>pAD+nkX5EbZGbzQlY1rYdFnxG|v)h*Rjm z*~@>}ynmYG(5sxE`;FfnmwM%S1LZ~f{<5;l)APRh7V`y!n@5b9+>wCq*sss9xf}NU z{&NT7K2h10O&7B+T`VJ~Kd7g$YoES2KW6+S@CEcshDA+k=j7O7`rK(>{q)xf2=w)_P6r&1{`gy9yfd3?8U1$9Xy|2ME!HvA^wXUzde6gl{IJXnd51<7k68d z`Ny4yS#WLe1vVOJ>lS|X-Kw>R($X@@3%?3Tc(G$&dEV3N^FRC%mvnfjQ@bUX&)iPB zw{PY0<=_iwwR^r^v}*hQxTK4@`8&JJiN5%-==zN!>f^YyH%9VZN$BrEf zzCevFYy0;DN-Q!>t7+d2G)+*=#YJv;l?q&~fS_r`pI z#^UYsmu)|NC->ToN2wb({=P5n-0wGPi&E3hrJgubowNGjgY#RX2K9%R-4|f({%YO9 zv#Ck3$?3=EPgwm6B=gU`SBvhaXB^p?bZGR#8*#%z2%YWHO};?-_AT3fIdE|A-c4VA7yIBw`q4et zp5IK*Jh^G<#4Qz>bGsoP5q4?t1v(a?_kQ_t(~e)ZZCEsO?xv)x*HaJfyq0$<>)ws{ zU6{Hr-rC(Qn4{pqyCv%hW4xRajxq^9uhau>v@bC*}rc3(ikJHK@P>?xDR zezs=y>SGsTPH)|K>3+(^gdNMUZD@GmUe??03$V2DpHCh)W>nO7dslt?*ZDJlZdiLU z?`BTijP~GzHkY>h0u(fU+@PURQB!}~{Ka>Fo<6pJ^_s*-dFgBW!<24u?U%kl!jN{o z#?1SA`QlmMA33^z&+6|l=B9qz%oliB6U^!bUm#;t@Q{hqW-VOs)y7@>cmJ~XNXF@z z&3%EF(pW*@3q1Xz)6l3X^QNu&Yva~^J9eK=JutF`FVIYy@S}jft!tmrQ$}qsi=OlA z?tSNyH$}Ge1zt)w`2wZp^WA$68FyNpHEiboBWF*28xFU?=GJ{PY0MW$AJS&@RrG2b z@6Y$2-#6LgZC{|7H0BHBMs-d>WBU1$ChXlY@LgZvr8MRWfG=Qr7IjehS2*|redhFd zk1z02+TQudR_*h&#ss@B;1vL)_l_^nLV7tvhTiUsxH>kS{88z5e1VTjgD;TW!Wa0U z^m~1Q4@$q+7x>iIjF7R)B0riu?fvxie7O#A)$Q*@)BuQHl7ufS_ zG3P*g#Iw_R!l*)tR8M&ThV4X73WV z#uxAi=o9J}Ic3^r*5lUr0--+cT}FL9{fFA3*7yP*q~L**XOH>vIeX4Lc)h>gFMR>W zAYbRmS<@yB8h=yy)dG0EPx_@V;OOM$PIMjmRaA%Ifv0pkeu39}q#-UK`^*(jaCLSh z;)4hGbjK4yHfv5_fY&?H5Ep3j1)Llm2t<;bD;|6Smj$K|`T~@>L`Nb4v)2g(5&`Ex zbafe~$p4Tp5a}G~MZ_Ej2ZEcQhl`7EPxr_=@_T&&>%|DyHX%-SH^adxxP3@)XuGa{ zy>r>``U2OUTGL1S1^Phz84s1gd3WsAz2D%-PHlU{D*o6K@pfFG;pCM50Ypav-oeEK zG_!Byppj#T_wC*;{8#kZmX2?vmwSURK;1BWQh%bOD-rMD<>Bg#BXx=zJG5`l&S9=o z%niSHejTB(`vUcA222|34I3{+h^jb;bPB?|_8b)1y+fFr!!%yOzUIC_zVXS*Q8UK- zBSaF(E5yk$G@?gWKfG)Eu8@Ds_w&r!XEVKC#-C=61 zaA5cDK9IZHix9E5LPmKogotk%%U{74*cvr_+#p}X!6&q1uZdklNA-7e3-8(nj7Cya znnM0GFa9g%S8;*H!tVx+8{f$hA^HYK446E^x5My`P9!J4a1X?FVWsSO<)!q@rQs0I zu=@hpUk@GL-QNMqjp*2C!sHOoe#62^1Q%~l$Ib^O#+*Y}3(Br9Td=Un7f7Bwazr2j zA$qs%J8DGK%wCSc!$t-Q&>WclB@%>E6BXh_MsLjOyiv3u@oSkATd6 zfTqtmRA2triJQ;wK93J=+Y$2x4$m6k=MmU*h~ysBY4Wl10@lM7%M#Atda}IB%ACKS7Ckrx8*Fx8 z;QQetCQY3@G%~VVr*Jof=-TUVT0sdtY17{+S58KGcUy7$!lNsB2Y*=kJ?0CjH&2;3 zdHnD`J-c^m<4Zu=?kcXyzE9y4rQOK5_|^OkQ!e~{F+VAHE5sS?zQFI(hmRgTqHo7G zZA0C0-D34MiN|xO+=4sFcaQX)^81N1`--w|9+@;@!UVf7kUVGjgo#7DwE<~2pY^Qg zCyt%YVbE{hPPlhy)Vjjl9SNoJXQuV<*RLP=0@3D2%SKHa+rLXhMEhX(h)vOdrl*|B z;ndu?nRq=Wj`noJu@?!yjTwqXufZ4iQNx6ZGNga69uaN)oZHOVd*?;s(QIbfoomqv zIlMcQzP@&LdGD~1m^AnTGvvl!2M-twUELNAHlI-_AOD@bX_1m)yTJ zDh%J*E{*vDZ1ni}!9)9XYa8J0;yL3+dEUMANA8wA$hsTz%c>c_Qt!;~j(9XlW4=Hk znmBJT2nYK3xQ8ssdi3bl$wS$Nw;nvnNjZ3f6Wcd@@GEJ%FM!_sx>uKW!G6B}9zlyT zbF(x4*nj8o%_lS#N5(i9LKryYm9*U#Fcqwf2oDYL3k-7hTXOmC^@|5~W#!$vT1cyS z_`NIQ)CIhfrkY^Bz*;$DLzsU^U{GkFW6+A!YnS48{c_`J=9RSFt1!3@yl^k2?Y;n8 zx!vEtO`EU~Ut;*G#MHzyJGNda$bOPCx8rMHpy}FnU!Vrv6BN+CU08?@spHzX_;W`$ zZ_ap;e|__yH@-lVG}y8D@G|sx2e0sU9m2hcoj0C8^Vi`GKV>}2{4VHCT;OF*Fsm1Q zfwaNyZ90YrdN>c>ef0R@eVdMF#eL@4EH3a;8fydbf;Dfpcbj&he#D{scI`U4@AsIi zN26N$0!=l+qzOL?>FfQ1+j%3CA1BP;|ND^(89(=a%NJ;pZt?}nEXPBGJcz3$cSp@V zdg4Ot^0sgL0&k=-Um&@MgZH24jdp%t{gL>`bjaG?a;N`gy|HV9FM!_d>-;Ag*U#5+ z+8_IdI>DH{R~mB#Fkj$t?=AAaAV5nm(}j)ous@HrHI2O~l7IS77Z^4J;JcVU1T^nu?PZqN^Y z2f%Oant>pR9r1#4NC-)Z;P6B);OPiB7au$iz)A?th!BY*cFykPC;&JVA!tTd2Q%X6 zybk5uTiXV*8`}^P!GA0F&M*RoY}#N$@r|)=*kMQa-4YaiFq&Y2u-`TtfB>t85XA5W zo^;g$Vo%57tq9J0j};(&KRaPx5b$Gbtnf|sTtHFb{13x7woE?^nT0!`0aRkubT}OF zCnN=?Pa;Y%aF$=5#flQ?OI>|O!~;@sr<(-BS1smSP=~sNq$eCWmKiKT%m^;oWJMjU zM#!2BI5Pe;q7*yWpR7W0$Nb?F!9fSv-f_ES07jG@Zi4~ie8+8BU_TgoUxm6D5(c?< zUm9Jeu9~OEB)zXHQKIqQ>8u7Lz{3g#7!c>cV1GA9SUbb=;n5%qB!-5ccY}?H^Pe$i z_iy`g(c}YsfXnI65lx6Q+k|RmLME9FDV&MMhH9G3ra^HP{&3}dmKt^9pIBEsA?M(2U>*CTRf|C);X3 z2%+7M3gBeZS?uJtDUkFTZ_DXofKkTzFL@}jK`v+AVHjL|hbvH1oN%=sMu3RxxTQh^ zP&=IIgdV|-Du8b!Kk1>X9q@gAXF=cL(mdgdbu#!O*Tn#xNN|~OO$UFy7zW4NUxrWO z)ds`}X{+zUXZdy=g8M-UpYq*|hylT^mSCfLJqUz{K7k(6#rHR1$GxtBjA%0)_Bqpt zIv6NB+TtvbIv%$|jGa6LKK%lTogJ+5C(Aso*cUTv;dDcK0GzyDZGy!1!do+)5x5rK z^Awf>S`!}tEhqk>HJ}a_&Y=iT5S&?KLJ8_~U2!l=+9p7M(tnx+UEmjIHlhx?`*ZyO zrHUskrNTGrOS_>Fi)cF3iI%uDs?V^ECD;(vT!SHU$lIF3K5g+GpZHX*JMEHk1f-OY#tap1cCL<~ku^d7Q0?rTTrJvY!FJOB>23&5)&IXUzI_LHE5E`iNH z68v`o?d1(R%>T7s!?4leNIRrG(gEp)bU`}8=Qf}ngY6Pcl9;w^1IIfe5q6ml@HrfG zVUupee)_{Tec;+I_EPW&z5*c12#ycAqm`f^oCDl&0#G+75y6?@?+)KD?qpYy&I3kx z8xe=d_{SSPFbJtb+g)k1J|(Z_uQqV??@uJ5^>D2 zi>XWfEr=swa9nEY-e8;<78r3&YN4U~^7#v?m(o)b&f8+}m$rhgG$7tf;^U%Y<6_RAJr{lceEfxtyj6V(dVNRFD56(oJ+iXY&_Waj^R;1EOygli*H8sMO(CgQbxw5w96SOaS2!A=127T z@|QE|DPI#Xy%6T{Q*wNCOj7!pP0N>W{{6z0#JG&uU5AseUP;bO=xsnEaD?EVo!STc zyL8@{5)+enasT*GAD__fpYKY#1pDikFC|7tUpfa^ZEw8e&_f4zZ1{1}_h%BLV^jW$ z0)^q>)MimkT6|n=^tm(1X)9sPd*KMZG9O*LbU7tCAvQW8aXIKiSJ#QBF2$XTj=qp_ ztRIF}c6Zy5aV_;?QgU2Obn>~0dc=9`=}XWFsmb3#tKfTl_`*XMQ{&H{kBLb+K2(P| zjy;_k6Q8y}QU};yS5lAfPo$*8MaLwc7_LP~^OKWf(>A&2U`U;v2mKs-F+Mu+++_H| ze|>6P${*dZyNaXt#6J>a;u62nAjHAPQ{q!MV7*J~c_2A9b$c+#5*MY$rk(Gh2PHsU zoE(>Yax^A+Dmgy!2m7&J$I@exS7;DY@cOj4gg-hMKrIkgU5iQjbEpP!oRxebHg5k& z5~eIjz5ciqo4DRhi#QL4o{CF2v91qj4EVx%MS5&P>{nXEHS&*(F)^_TiH8?;Bv|1q z$Iy*w@z9)+pliDQo@$G6j*d^huzPkO4uJ|eJ4`;C9vdB-d~5{NuHP{jr)XOoDKX{Z z8gJ}-*LK@4C&RJ$)MF!IZFo7%h)ar&Nk~h*l6o!Y`d}PRk2p+=yA&O5iy_9QoLT4( z)$!`QBQ-ucKJMpDzwSSBK5nuz9_B*C-pldl;*wKRphJ_kPHyW#B)Ilmn*eo9JT)Y^ zZA7pBqdGf*U|9FlSL4#ITsn8;LP~66M$FFTb7n6&crg`*Flk>Xm@Rk$4!Spt_;p%l z(uuW`1}wgi9v`2Uc_}G5?MhlKOoW8xE=H(%i1)JHUkvcaBi=Jkq$Qq@NldwPF%CvO zIw5){*28$;HqI8r+hNep7vf+MU`r$p3W-@|01fPb3tgWa2Yq$nVrptiV)TXRVMb7& zUPI0&#>B=ZB`2Rfost-ne8j_q9S!&;CH6w%?xhPRjNX=#7@NG%1S-<|%apjpw9nn} zIHb*%jHLLu_RuvVgf#GU!o}2SFf^pF4QZ)~n;q>(eYYj0B~5X#Af&(_E+@o{gik_* z_(goih4FY$Ext?AZk`UqS+Roy&fbd~g$Hfo^<`#sAGnYZad7?V#r4sksXS&)4Fo9x z;?QNo-obddAv(E$)`h0BZ!kXp6Sa$}<__^gS+i&AYX%oLqNm_`olh9I33#r)PG<+cmFON=-p| zP42CV@~Wbef{Mz8PIk>ZGp{XkL#64``*(x>9EL zXuD?hI?3SHR9BHp3JS>2=7VmT`>4J+zp$q2H)s{6c_X%5CD)eb=NA@K-=7MaY2Kr{ z!V+rc5WD7e8gl4CZEbNuVRg^(`PcA8=!x3mn%e{I znm1r!Rz+b+>jPKdOv91wkN2?~?iwVR2=}&7XTVY2FT}sHKJE+*zP(2H&W$7CM!X z%TiW^Hz{7yqNnvm1w~caGxdn)==+p{!h)jW;&KY*55T;E4cRS@UR6+7SXy&$mJ#tH zepd{Cl~HS1HEb1kGNyOk7Z=kD^9$fC%CpU3nBMJsp{}%`v^f4uQpU{}C5zoKz1t_9 zQJP;$uC1vqq>`h*>EcUr@ErPQWlcdr<)g{%yY(3{?(=>wnBE07Ys-Q; z=W58sOH_Y*JFh$@;p=v(9$K8x&nl zC4UQM5vlF(w2Gox@CkJ6x>82zSKtPdf_GB+k2*Ff-f_%X2|5anQ3yq+h_ z?9V~*daqp42Ap6}wEa(|O~k`9XE+y+Ce7;*-Z%Jtnin&9o#5d>Z!k@RnXy7(>6W7=N9cJwM!Zp3&+8CnN z{>JoulgSHD-{A-ZK4$LXz_}!Px)bcSE}rB}fQC2*hIr!bwyuMBpc^#Af#eqy;Dj9^ z5`2S$+^`NH`3D4ef?ftg*V#WXzzuo|I~M5UAi~UCPyfI`PwZai2y*_;b`4A-`33j~ zc!0Cvh;xFYf$ne^3<`IDIM0hjba8R_hojzL5`#&F^9JDnKVMq_;%D>6`#FQ{YeXPc z0EYtuY=KsPe4rNrQ?!V?&L0iHdy!y}ao96~V7P*q#oro$`nv@L!KrYgb8z z1e~jXfDJm)7U&fa7#I)`807CtbaeCb4GeV01i}bjP&;UVzn6!Hmyds-e?XAGw=X6e z7(l`vkLw6QD0q4VNAd}Tx(E0;Lo^D2Y2I)eTn#P>=Qx4RL~u^NKHeT4ZthTP{{Ua7 zMrfA<_D2BJ01d#oL;s_Q6DcSpC?E*Ru>!ISn>lzFzd#E#(9a1|n|aDL#X zyWpJt0f{F(3iKvoDwT*MdHP{x;h}KQhHhBZyl|LG zh1z>#7j%Zh4qi}aA2eba2`-4KPL@>bA`I#e4LD!!HV@>fG0roq5&^cQ zVIZ)QK>!?Y6XP5`1N6{J#KVAX01&*O`A}3KbP042rY{jE3mkFu!=`b7 zH_Rz8Qeo2;F6iUo=Irc^eR9W+;&HBlwg6X%yuz-xec}@_6-p#Q4+MgF3|(RizI337(D zhj(!StsnrU z($8+czSM7^l z)*|!Z*edw63Eo?ft;o+W-`kPx$Yx{>@-4CwS&wW$HX^H$ACVv6KlWY&fBl54gX7qF z8{s#0g>CS2JMs&>cObiv-|X*S;jf=TVm(Oz1n(b^705CueGxJr-gA)8kQvByWD2|| zArq1D$Y^8~G7M@x5b2BbMtUG!!M5%QT0R^!ejw;{576kZb^1%){@-u+HfUp0yLbK{ z*6y`1VoQxNn0u*6tnf^EdlAZ%3NOdp(@B7G}x+JL8R60%35E_lDWv zZnqt<8PEaV{&3T2q9njJ(XcHqjEE=0X-s8vcU1OK70pp>Svp|%1Pj#}WMzM@Cj**W)f9u_wk zE!G0G1P!oAq#_yn#gnIbd5@nwe)6=0BM~YaZN+FA8qz2cmz9?lSJGH)Rzm}m$zn6B z%1X&xnZ#O(R-oZFwXmE_r<4>`mX?&4mz9^7l)%qYGNrt_QqWiiBF^%{dP+rE4VhA7 ztM#t0t)~HMLdMEGEZRj#i?sja8EBs#+R_L9eIT=-%}-2A#%$pEL%8Udbiv zY!xUOwwx_B_1t<|J)Fe|q%+w}E|aF`qhoemBlt$`=D*s4$p+SSTqRnw?+E|bd; z^0@Hk^8^AOUmz3hSrhB}G92CYZ?nRP0j7``_MZrx>xq!PYNBo!+ZKnWyQDim_5LMoL>B~>TO)N-X( ztq_aUCMwE7$2V$q3W;1H<%$$ysY0#Nv94#)M0%}KDv^oBQn6Gn5sQQpnM|!U>!szf zWjei1qf*IbVlGo_fQw4x8a)>kpkZUv6-I*ZTd@I}xPu~H|isgTN0C#$Ghh#H{nz=I(6 z6^UV(SoC^EEtN{CsH&qBm2#x09Ca|2J};@Xl_C{3N>DAeuAa`~@c3M@R3w#4-Xa#efk~s*P{`E)9!skPMcLK*(WpSPUk;mQqtwU0zgDQ&rZeK$U2FTYh=b z)8e9H*t4jj)YaEBSzMq>67YpG6$~KE4~-2aHL6u|rCe&2k)(39TCO%&!R|4``GHV# zv4AURV6&j&G-_29r2-aLRh0r&qn#RsB~QWEEh(+6B-c=C>#6lj8dO~d>|pk*MlfS;6yy($bR3(hBVAG!}!- z=5hHj&H|}T=^$0eYuO@{P}rbVSrj;_*d_@U!8BnqpdTnTR7!OP)U}{aT#;8H(&|tn z+QA~_S3ax|s!E>}JS!?KEw88qO+bb9%HlS_g+&6H(xz~bDusD~0ZPL?zcexcvh51H59&(nV^6m^|R+paXq=BvX)txdcU;rMR`dD40jFH#_*;$@EdqMSg<0A zLZ?&K-rVeEZ!ZAE!$d1Yl)ZCy3Bp26g@SzMk#tkxTCHg$EL2Iy!&n_JOFycM;X zQKyC+ippYZ)X8nqwxHv<+y)w*L9c#KDu+4-R$PRjKvrIcEy`Lp`D{k5KqlePU+3i+9K^M|a5zixll_)$*liqed+i!EC_Z8l@6+ zq*AVc$sm^*8c`8jW&-u#WmS^%%f&pJP@>kW6=;DFyQq()P^uQlWx@tJoyO!<6;z8% z3e?xEQ;O6!txN>dRjQCFqzaY7ro_u7@Y7wQkcq@%jZH5S$#qsW>SNYO7&QW^fG<%& z>yK943Q-ZA`F`Oo_@q;CxCE>INt`4;tRWfXi!YXA8 z_*@&uhc8!%#0rhp1hWNt+N>ymP`?=+URZ_l;PN85QmKGC^92I95wn?~KiLcpo6DD| z%~mUF7Qh7La<~GvNQhk)N{3%I0Zu5e3H=)cT#k^%H$%wTYB6b4YB_YS+@e6`o=PoD z2!jDw8C6QOo({JtGup1C6cxaIT%iPgt5QhC&{LRpm&;{Jy1f9$# zq=32A2xSs$%b-lTO=eY0)+)48xYdebvMHfrIg(VJRu3Atpu%V~S*(plokpuv%Vc`22%kn{Q9-s!V*pzQN~V;dwx*H| zs3zN_5lCQtLCFNUN-MYN78${|f_0!$t5h1jPOnD|5B}pk4*IeZ^bucgfHun%Xe9-0 zw3qB+K+X4+1~3y~locd7^pZxcw&}x-I;Bh~h1sprX|)=QDLcNXwxSAjdSwlzhGMHh zDIMTLT^;-Z?^<$s6{RTUk=bU@L)%menI4cjsMXf!D>2EHRb+}p*KB_e_T^hQemrfCf8I`s;jFg z6tcCN@R5WLL0~W%rMVa-5x-ESQ7NHL=!*sv)(DjBX3*QvCpRBxsm9x9#h8(9r{dw!oAJ{xd+@WM!f}nQDYUzU?o9+N69tNM2#No z8of+lZZzs;LYRDVrJj5>mnJi)dCXd{@F22KTu@Y6TvP;MfRgHZzRcFB;5^Fa7;SRA zN@F&o!8Q}6tcfQ{nhi!W%xjY+Ph!)X>;>BlE@rg2&?c4$!6FCiM6QCBVAc2=)w#cB zko8uhPAvtUsg)Jouakf==VOxdSyXCGIaq0MXRV|1WWcHA(x{<5r0CTWrP^#lL#*bi z>Q{72*=n^)tCCuEIdY2*ls2@s59kLYTKUWdDnlv;GqEnEL;-6-tuY$pN1S`l_>0zP zHER_Dp;W^!E$6``11ry@(}7w6E6>@;E1}2~Vg=}KG(=xVe@)hu2Lr0s!jjBYHtGyU zds#Mo_8@(xOMhMUR@(LKQOPYMn}ivhuVB9ZV3g ze$dWFgI-~l-Ik~XQZRBkQ`-aPWZZ2ftR17^XAE}|wNKO72zH8xMaAdJIkj~H4Hz&m z-9d-BTFfSsltF>pyb=&+VPNkt$26msDyvm%6_~=yGpdv}Fwbph1XiFyaffH*N#TAk zzCP#>09uA5!<00zH(;2SWpnwMj%sUB^4M}dy_!PjiZQ#%014bRDha)wLg5KTN}vPu zZRD_9vQsghX>AH;8Jhppq*Ce)My$jxu*$#~&aSs`1mG7a6ziuP1Gvoa%dkcn>+FD; z!C3}qqXm3%qnydajB#3Rb$NAl1^5T>X0Uhyp-6AjgI^-feVgM-bV~`1l%oYjCZ$pj zped}8dZkREy<32CMVKohqYYb&fpG?%6E-|p+=Ry2skRwVH?silW4s1|kOvk-qX6X- zSR#c*hjwhFmA=c5byE#qnHtTl)PvJzvJW7%P9>9RA3Zg5z?&1vaEv>clF1$?Roy2yRB~RnCM7X)MW*Qgbf&0 zSZ||2A>v6W*CetA5$I$I>~>J1-bPLh{5D@*9lNYw$gp%1IQb?ytTCAh%-^oHl^>!N zqdkE=6Pq}TB@!uK7S_jTPzt#s+VuuG8*^_(V7f7GGo=$P8|V>6;%XqMw?!) zfs(o#IprTDCF8%4%7iHYHj6K4YFG$rwLoDao``vqrec+q)iU@nJ+cSbVO;^uVOQ&9_#}1M;Oh>RB{zspUvjOb`j`l2yPf{hCWIWm(R|sRx_3_SoG7c z2mijjzSBqWVS`oxP!n&nVzZEu|4~Xb=H;vhXlb^MM-bYJ8;I&bk*EYLj^Oq)Ei2S1 zctF4Y1BP|#@d{tZI%zBBNiqoNyFb_XYs&?k)1N8BI0f#5Dmxq8?2dW?R z0zdn%j@iG%TVS=|r7@Q;?4CP#aWlAD=q3%62b)U;{ZGVfdmfjg_w&Hx6e^9- zp;(E1R0<)po}GJBO9uZ0q!k&S3So4KMDM02r8bhS3EltXI(Hw|tV_GX4dkqip6`XWtI%Pc=KYS<62 zFn?ozQh{DIxEU?xy4efu;JNiBoHe(_7+sFz^E>ECO$IyI~xSAC=9;RHLZaM&>&w6YOKWq|%Ur&XkPr_GHriNuwxd->h#b|6dhz# z7jauhop&yQVW4N$v09YrYA=&spOL4mrrQ{vTp>Mk@&G#)a!Rh+2n}`DH<}tPwe#$# z$PuUX=x{3rxvqN7Yb6O^dlVK z=?n%G%9kG+i2*uSPOAqWMh(W5LEqT;bfz8K+2h+{Fl6oR&ALi`4>6z>4SSmx@bpcN z@mUs)3d`or(0b{WLLRe*nRiJclcy6F+m>=JH&`Qq2qzaMl#v?{8?B^);*p#-R?J>JR z09vs$l~!L_Lx-&eI_wW#=xIm4elv%mf>HK0Vjj=o!LM+ziwDoRt~a5>iyz%?CI4Yc z4OgA{1lAHLN9ae;8a6Z%ik1ucOcpt{f>l{l11LHgS5W(1yC!t)goSKutaXhRqi#<> z3}!pc4zvBd&o-(OwP0=mwd`gq85Lt0eEH>k77V!EAcAwjlY(BCi}(yWCG7>Pic(!) z3xm$R(DfC3cf!(Q9kw@aG1q?c3dTDggYot~b{F=RV5W;%cUsBOc)Cu=yHvq#;7jBx z?EVfX8@6a+`wcd8GV&Tq0UcRQqjSo>?DQHOJbp|H7bdz%cdly-gz%Uzcfx)Sw7{sy zRke=uaW_TG%AkojBIzq5Hv|kBuyQ$E-tC)=O4wznrZF0hwta~^?uFrw2h2ZvFF)`1 zzFk^EkNeDqZDpvw)$pwT6^EqF()EKJl7FmxRI6ZJ<%+oy=z0VAM_AR@fbYO(OCDY3 z0f8d9zOJ@%YD+ltlp!Od2DI(<63#rdbMIdL29E0N(gjQ~Z1BwGcUwV8xp`v_ovq5r zwF!t)Z0`?FwW3=rCZk#@6)4Cl^xE>0Dr!w#?YDhC0+EhbaPHvtwM%AA{2JSHhQclM zEC0-JxpMDwu8@249uoqE3UKY=f$ZNWx^5w@ZlF)skN zyA)E1sy_W*9i^OHUtI?*I~}6dB|N`2XVlvu@knZuIcY`vSs;%0G2YHoEADYQf~T1@ zIp1C&wnm{q*nKs@UXxnFlL~KVfLlwZ)YcuGx91K6Het$FMB4G^F0b+D6L(@w#B74T z)|&etqy9X!={a94$hjtx^QEvWY=n532{mDRZAOz$CF6=!dFjOrN;R1RT7<%LULm8-QnD9&QUinCeG&^`zT3f0wV z59?|m3QJ?snNXfc{eYOekSAAR zgJ-saAFW3ttwy~Lg3^2`JM#|2<3T^e&4DWvitE2xXb0j4cN;TlxE+Y!H3?|sv9?*z zo|2pF4{?{y$rcEtHCHNC0vUKz*z<-u2q^Znf(;DIf+vvP&!kYv)zk(igl>gA!5>j} zWPem*Ddq1W7_@&&AJ(gKx~m^h-_Lrw?w3-IM4g|>l=5JkRR{Yxun~^-w7|w0bRMrk zT9R7M1!MsY0)NnVS%d8l3M^p3&P(DD`=bIs!}DKFt?6niu6{3D>Y9UO7@Ygp*+M?n zYevY-08SnR9H0o;tD>Yo71vi%Sh&^?%kOmtknv}uVg9m+bKo>O?(Z$9n zeILc@$_q@cUUfSMPzd1a8Vr!^L5X&=8o{;ZJob z0udQ@8t7b6&QR=0h@}h&Y8V=|x5vTr5Yrpr4hE)AN8@$TYXaB5=i3Qf*KK>j<64C2 zFJQ}14!ge)vzMc&B?9U#6A3xb)5vN{J*$DsVt>~M9;jHu2JC^s*r*Y*#^T+gl0>UQ)v5-a7N$-jlnQCNV`ywD204D*#Oi`>PUE zf_AXMyjMvD!up$c6+8+An%LD@hZmd?!xp~DV1SsB2Gm`RrG~JH(a;E?IQvvE zqv4u6c3#=ECq`}Y_cOPZhy-R;)*~+LgTr2?Rfr1FcG#*^!p215U;sN>+L!C&e z*B{H+RJyIf4X_+=Erk+7SZ3@wQMlnXqM*MPJk)CyDoITpUuLenS*HYG3bc@i z^3X7=Nw1ZQm4fVRY%$D8h|~c%1+D`-x!@%<676?QxKfA>yEz;B5 zJf#eRMg}VvzOkIe=c2%7_8SBSc3)L;ad4UG`SfH?toMT?=a zERzhuT?Lq8QXT6?xlyLj!+t>n+JKINZDySYH1LBgj)(>J5$qnrwwY3^gebQGHd75c z_yOSsgT8^Q)+ivVB#>z zMzAh*1}of|4G?nFL3kO^M1@%@lN^+zm4PzQE>H)!9Lmmk!D#>_1nkjD1X#zyUC5}# z?zM0UBg9Z4{w6q5USHiOh)GFj;;4IKcb>%d39^MK7^aF{}_0ODQ>fEq#kO|3KN zbr7D>$>9zLAydm%#6p%|+xU(tD=<{qEpt-m#zKq9*9YeVSnh9|;r3NCy z3W)*&zOsfpR8*sb5~*k%>R~e(f!e(8dM$@R<1@j9LZt}A-U2}!dqdnCqXn0dZ;4RA zE}5-$Xf14PnjuPW72V9|(C9n{L~>Cf5u*99ZD>_^$VD45+2cH&9-9sn0E9(YO>h@2y2TM2XraMuT`gi#S;;&~n&mx0)I?&vK*!z_9=bjn%+mf!$&#y{E94tbk}M zMT22Fn=5WJM1aqNyK4iRUJu5^GYD$}ZmtAuO@AxOyIU@2*E8zt;Ga~KU5#n860`{Q zg^giVUamq^Q(arjlvm$mfst4Q_&sm1&#mQmSc=*rrld3>A9Qm^ojk$vn%CKngInd$lxci;3u%)C$Qirupr!T zK7j>4fdwH52@gQZKY;~5fdxN-1wVlW>sYW61-M`~7~}v?WHRYi<|nYAP7f$W@XQT> zLK@FDus~uplsz^!@gqz=Ch`zZA6sEZAoJ%o(r2g1~EXdPM8Mf^YK16t@N}*b`_{ zCcFX*VpJ)g{cEt`o7^)MtpE!Sy9OLABVK|9?KCX&{w-MWP5K&ktH6Q_F@~4XO<+Mg z$IFO+4;Flr1V`2?u;8B>4gf-Mv1v<@sd+D=L{e*XMno#xm{X})X~ zSn%!qJFNr@{)}%fA8-e%9)@K0dDrqn+G7HpRJ zr=pc$!THTedE97cdw(1(`2NH}HLV2;zD@Qs_9a*_eAGK&!Kx4C9cpMTSnwV4pl@ca zn%cPskOz%z2^OsQaMq%?!GZ%m1QvXkiD>h{(RL=HpQpV63pRcvo%?67;NWI_QZwIx1s62YN)3GrEcnlvs8Uk?87w$@ z;%l0!&zpk*G=?V&A@_l?KE30z=EyIt#u)(wP3+9cKWWFEx>|b*onL*H3ti}GE3LR)K-H9 z?F?bxv;+%&W+w}K1r{8Xb4S|Bd|ww@4;P$lXCZ3|7o1}!BpZmq1)Fel02gd!?y&R! z0xxLiI-B1TFW5wTHn(?kykKD~Gm$0y3%uYoJEPi|W_ZErP0VV?r?kKeK5S)Pv((n( z1$)^!+qSmA3yy!q-nJv^6<+X8D|4i!{R_NcmnKfQFPq~9M`Pr0Q!#S5?*}!53*KsF z(zOKUyKup6?}rO^dqq0;MKicy3-Y-^&ESHqOyhR0wQ#}6*OYeiUc&{uwIH_ptQlNT z-MX}Jd*6WzZhJpmusL1cu$OSbek~dE`n`b*(pr;d?${5lgbTK0;ae0nX7s=g!(X!S zO@XHsMvwozpIbAyU@NlL{k*xgaKRBDVfO3!KDgjNCc#_1ueET&kFW)HdlxQvOa4z8 z_2#x3E;trw2*-8nJ$d4aw`mBMzXcckcv`+KH{S;r?D#&o;J~gCcDUf&*{`?_onCSq zwtx#(eKfV-xgT==1GwM-J8h!NYud!Q&EbN%AIlDS`2BFfwjYHH&cOH>-QMsqc5ML{ z%+h~2zu@+R{{dWZ&`YAnt>1iMCwlyOb_=+m?1Kpkzx)s2f*bAhk>TCPOd4yakL=e1 zF39~*dc%4D7A`o$&PO>0gA0zf6H@kT4i}`oKQZE_e+d^HZl||gXom|%*$FOpw1f*L zyeFaJx_<>1+=OvuzJv>o!00juzXcb3PZq{i{{k*J1Ebx11s5EHQEyIc0T+BXZR48O z!v#lR{GG4if)jwnvl(1a{5r>D{33gf$IaVY4Hp~^G@x(bg5$kf!Ubzy<%7)oc^Q@u za_yh3gbQvSKPdQvaKWamk&m*@EZcv6|MKMjC*Xqi)RH#j-una>`~(;L1Q+}S7yQI6_=#Ka6Sv?e zZoyC7f}gkrKXD6w;uieGE%=FB@DsP-Tik;Gm%#3DFS!M8Oz6?kx!cG;b&p%aEf_NX4YwfV&~f}HZb9{#ps>zv zzFlVT61D~|=udKvdJPwZoIKuUa6w1N@iX)#TyQ&<=*M;M zzvULhh5ER68TIw_A8IRG0T=A*4=IGYHNgefV`+rEX8&urpa&^<;N;n3zI@Jm-WqN} z$bu5!7HNkIuC*sAiul)XLB}9p=g3*pCJh>YQ`IWCAmj}S^z4Me1;1&^f%IFe;DU}$ zZtg_ap@!z9!PVK3hz}mz(;ZI; z*{o?LT+jz{(ggaryFpeX$bu8-9riJ9!6vw%lcNKHNOFT5GmzkQf$2SP!4QnzgDl`olmfjXRo&) zg3h&7){7CYZ9<#~P=Zr%`;g$!c3u5?=W^c#2nIrw|6Ml0*Xgg^A^nxtgjG}9x%?&4~^ba6967UW#9*#J~H*(O(vBUdzZx{Y6T1~5N6_a4dN0M@Rwgd-KHw>TD zpXlgH#5;I-xH{uVoubAL?c1|+nClcX`|9nFF$snciQfJp?YoD$zDn)o+O9`LpnJ>I zUM<0a^=k%98taX?k%&$Xc;}E#L3r1mgCe_k2y=6o#w&<<7aZ924U=Hsu(vXV1=*Pd zXSIX0T`!Y_5!^jmfCFocPgahaG2S0iG?BbQoE$?VdUW-}ySDGz!Jp{+d1mdi1Mh+Z z{eYzGC6nN{Gko7<8*}&YeT5Ai;f19fa|rZvZh;Ksi({q_pEf!Wad7wa>lx|OeQlBSZ&)~q;NtD+*!iHum~-fA zLD|i#Y{NSgf=jh~o=X^hM_`$vJd-r?m-rH5rd7jrBVFKTk#prB}FoAzt8?P8Jki$jivuneft>Kw0I^(ijtHk_GP? zVgf5hcI_R&G1lhI+k|)N-nnBdHD>m58WpJDA#vM)IhXPmE>1d@dTi_VCMX0=Ft1k& ze@`K31|>a#Ym5neQx?_Z8e;{8LR{s>eB74i4 zU-oYMDLp&>Wif$5Q7>7p&)yglC@J?5dTn4sOkhq;!a#@9-YmHH+nu{~>KN)xk`|Nh zgEo_Hon9OhyD&E8_W86e`wr)Beg#aRMOFoDUxx`KBo09hr~?uPtq|UjLNHxC9_;Y; z4C>q~vQt<{>t=ew=n?Q~#Qf8_(}pbAy(gz&@r;aww6w(SFAoXylZ6Kjb&x>1jzUl` zNf5##&Dnd^GYF>CoaquA(C)3Ckzws#YY|{3HD=!)i}JIs{yco>`qg_ghc)};!15zG zhqk{0B9N(5HqlV#@odyN+oB@KtY3GV_687xaG$`uJp7F~!o%rEkToZ6Wp(*x2T9#(i2nPLAG@u{o zGj^}jXEgq0`cvk>irTro!#Z^eZ{y?iv}v%wHIL43h&^!eMpnwk)cI|C&Rx9Xo1EmN z`Lmvb0-BqK0?Mk7YEXUjsmB2lvhrg@o$_PgJ5Nai3*8$Bghh0JBhU#ItMy~99$UO< z*@4SNN&D9SG^gVi*$1br&t13jvy3K41I^Eq20m4j>?f&7vR>`N+X{5Onk1z+X;lnE zD*PId2Br_~7}=#=Ge18si^gwU+=6YJmmVlSzb9$KkKeB?Jo4qDY zK+TI3DtnmpTpbFqZ^Sdwz+IJBU=M%2U8^8Jr;%|E_&VkIhM4_V@=_Ax)*mQIi5#4` z@{4bqKmi6cK^oZk1+tetK=#u0JPI(m{PDEV;81w3odQSsM<2{TxH=}K;Ml(8CEspe z*nLRa)JxvhGRR0bG7~3uMjkbZFCLPQ7*^{5~)9U%D zd54lyzn?m?&$Npvlbgf>0@! zdv|9Sp8k32{{s7S$wH-iPNU)Ul4Pl_5ldiV`QTMS8{KXhlkT?w;Bk?$PHUIte7%!XV(7A z&F{V6B<#=s#Vmo6xU9guDZ&1HKwK5q1vP~I6^UP&Omm}8aww@SOP&3 z*@KR%V+jn9)L*T?gZ(9hYMed}fn!2v#>CG1W?XFY+R?87`}2@wWIw8B32ZBA$#!iB z`+JhnPv>;mjKmw?%$O1L&D`&I$9(?su)nrCP^5hd`|AL@w7s6O1eO+!FO~qdtu>@YIjkTFMVpQpoX(MA6$FCXtvar9gtyK81 z7qJ9x3{vVAh?)CVe)`>pm=P}x`+cHsS6L z3HCR7(3C$4`+JnRt}3;TCGd~J{)$V*qyN8H0{?{l{mByeCrjY}ElVJp`SdRb=`e+o za=zYY;K26=4(!|BL@Mwsl#R4%lUK(NzKD*V7#%%kP>9P&XQ5Nbr1kFh>D>6_BPZ)b zfe$CH{raP}7V0F*gLf;TQ}&H+ z*jaP|kazTe9~m#AVx%H%t-JT@ zJz(DP>;H0}6E&cIm=*tzujYO=>f`=xv^PL`UFG-w^!NiO^3H=s-o0E=^Y|{%Se6uD z%FEpLj~<4bAP-Oak4nfXx?7zl5>M`2NShOO8jlSdC5eg$1#3E$p}R<-nRvW< zmx$+%#_ytXgqs#uY==%p6Xob0!tr@ETScs-S2?Oc3aa_IiUd(vd*W}wnhNv~5rp5s zdHWx45{a73rNi25AEL+5Z+pb}owwJCMAhM#58LY>BT$^jjNv2KURni}9-Zv00t;@8 zE?6pJ#r>rS*6z#_5zCK|!#;-~oY7hiTM{9h)?5yAaS%@Sk-|7J=P_hnZ;>O|#Bzwl zYO7E+!alyfOvGzutK>+(3lOQCM9Gne{AHr@w@)yH*GLK59);-TC{!Qy+7HpQeGmdo z`&y(>BGWc7oa}@!*`TBmx2$%#s7w!rsg{y}g`8dqmc2oURMem+h)~c7`}{VTwt6F) zlua~)p&{3ni$t6aF%$+u#gLd{6zH9T6(U(Z&xA3gY<1HL0=;ztj1Q*k6)c6zNePOk zP{_|8H}`pq!_6le+DmRUpB%#9ITuT%S4g z0@pGD9FM;B(wU?xq#QIwYfV;T(DK^VB7G;?1s@!rd3eEQ^8LCJJim?cw3zGis1UB8 zXx?NsxuVO!b!E82V)fu@C=NrEn9;wWv<*;&567o}q9Yd{RDM zayq;21Luw~r^^b>r(sT?-Fw&@Sgp^#}7Kxpk9U-tgZl8w-oSZ_w(}ig!hSZtJLrq zNpoU$1-im^g7;vgS2IsDjFi-7H)1K8)0<%wgX3z~h?@Ofp+hi^G|ezDin3cLSX`bh zW&C2Tm?qE3&n#+Sr^HqmGlN+>JzU$>bs@G6>8 zNKRHkQX1Z1*0$Q{UJp`mKM!)51-({7lZsl{AXt)Caax_h6!Bx#52ET(LN}vPfO_E_ zk+grP6jHmiM!hC9u5^>AE?wSMCkO@}hJu3aqz0)V!17vyk@K5&af_%foaU>u$O#x) zQ4I++xRRt>Q2p=AKxLwp#pBiP-SqyqufDDaSp(>Ch9tXlZON+=YS=mF9w zU_*nNtWHD7nsRq44BDBY4#6VTMB(@0gn`f6BqZ>#cmz$oo+`2j``fHg0!#;X4^AT% zr&O$lw^+P}ojxF{YIjDM%vNb3DDZMPx?oHhhSOUdUj6qzIV7?btHNz&LC2~n><%1s zq5|5-!naQQTdOM5MfTUP+Q7>W9Rpis8JvqOEK!!%n`|L7iw}$J*)Lk!%rIXRt|&#N zl9ypQgIVw!cI=4A9R1MC!=zKGDEt>Yiby})9fla5A+Squ z!-2Mttd>BLsgJISba`ALQnQfjBKifv2VP38LVUJ3O(f6x2Zz zLr4`vC<@R&!7jlIe7?JPM!0rV`1t79y1^T`-_hLCnd bURhF?BPbK@T+`Fu%aj8jFYS^Eci(>l3ptsG literal 0 HcmV?d00001 diff --git a/iPhoto2Ansel/TURAnsel.m b/iPhoto2Ansel/TURAnsel.m deleted file mode 100644 index 6681495c4..000000000 --- a/iPhoto2Ansel/TURAnsel.m +++ /dev/null @@ -1,266 +0,0 @@ -// -// TURAnsel.m -// AnselCocoaToolkit -// -// Created by Michael Rubinsky on 10/31/08. -// Copyright 2008 Michael Rubinsky -// - -#import -#import -#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 diff --git a/iPhoto2Ansel/TURAnselGallery.m b/iPhoto2Ansel/TURAnselGallery.m deleted file mode 100644 index 4522b2281..000000000 --- a/iPhoto2Ansel/TURAnselGallery.m +++ /dev/null @@ -1,206 +0,0 @@ -// -// TURAnselGallery.m -// Class wraps an Ansel Gallery -// -// Created by Michael Rubinsky on 10/21/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// -#import -#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 diff --git a/iPhoto2Ansel/AnselGalleryViewItem.h b/iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.h similarity index 71% rename from iPhoto2Ansel/AnselGalleryViewItem.h rename to iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.h index e0eece1ff..41ba61d68 100644 --- a/iPhoto2Ansel/AnselGalleryViewItem.h +++ b/iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.h @@ -1,10 +1,12 @@ -// -// AnselGalleryViewItem.h -// iPhoto2Ansel -// -// Created by Michael Rubinsky on 5/7/09. -// Copyright 2009 __MyCompanyName__. All rights reserved. -// +/** + * AnselGalleryViewItem + * + * Copyright 2009 The Horde Project (http://www.horde.org) + * + * @implements IKImageBrowserItem + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ #import #import diff --git a/iPhoto2Ansel/AnselGalleryViewItem.m b/iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.m similarity index 65% rename from iPhoto2Ansel/AnselGalleryViewItem.m rename to iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.m index e792d14dd..a27b41b5c 100644 --- a/iPhoto2Ansel/AnselGalleryViewItem.m +++ b/iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.m @@ -1,13 +1,15 @@ -// -// AnselGalleryViewItem.m -// iPhoto2Ansel -// -// Implementation of the IKImageBrowserItem protocol - -// Created by Michael Rubinsky on 5/7/09. -// Copyright 2009 __MyCompanyName__. All rights reserved. -// - +/** + * AnselGalleryViewItem.m + * + * Implements the IKImageBrowserItem protocol for displaying images from a + * remote Ansel gallery in an IKImageBrowser. + * + * Copyright 2009 The Horde Project (http://www.horde.org) + * + * @implements IKImageBrowserItem + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ #import "AnselGalleryViewItem.h" @implementation AnselGalleryViewItem @@ -25,7 +27,6 @@ imageDate = [theDate retain]; return self; } - - (void)dealloc { [image release]; @@ -49,18 +50,19 @@ - (id)imageRepresentation { - return [[image retain] autorelease]; + return image; } #pragma mark #pragma mark Optional methods. - (NSString *)imageTitle { + NSLog(@"imageTitle: %@", imageTitle); return imageTitle; } - - (NSString *)imageSubtitle { + NSLog(@"imageSubtitle: %@", [imageDate description]); return [imageDate description]; } diff --git a/iPhoto2Ansel/TURAnselKit/English.lProj/AnselGalleryPanel.nib/designable.nib b/iPhoto2Ansel/TURAnselKit/English.lProj/AnselGalleryPanel.nib/designable.nib new file mode 100644 index 000000000..aab13b850 --- /dev/null +++ b/iPhoto2Ansel/TURAnselKit/English.lProj/AnselGalleryPanel.nib/designable.nib @@ -0,0 +1,744 @@ + + + + 1050 + 9F33 + 672 + 949.34 + 352.00 + + YES + + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + TURAnselGalleryPanelController + + + FirstResponder + + + NSApplication + + + 19 + 2 + {{797, 724}, {267, 276}} + -536866816 + New Gallery + NSPanel + + {3.40282e+38, 3.40282e+38} + + + 256 + + YES + + + 268 + {{20, 219}, {227, 22}} + + YES + + -1804468671 + 272630784 + + + LucidaGrande + 1.300000e+01 + 1044 + + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + 3 + MAA + + + + + + + 268 + {{17, 240}, {88, 16}} + + YES + + 68288064 + 272630784 + Gallery Name + + LucidaGrande + 1.200000e+01 + 16 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2OQA + + + + 6 + System + controlTextColor + + + + + + + 268 + {{17, 195}, {73, 16}} + + YES + + 68288064 + 272630784 + Gallery Slug + + + + + + + + + 268 + {{20, 174}, {227, 22}} + + YES + + -1804468671 + 272630784 + + + + YES + + + + + + + 268 + {{20, 103}, {227, 47}} + + YES + + -1805517311 + 272629760 + + + + YES + + + + + + + 268 + {{17, 150}, {124, 16}} + + YES + + 68288064 + 272630784 + Gallery Description + + + + + + + + + 268 + {{116, 12}, {68, 32}} + + YES + + 67239424 + 134217728 + Cancel + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{184, 12}, {69, 32}} + + YES + + 67239424 + 134217728 + Save + + + -2038284033 + 129 + + + 200 + 25 + + + + + 268 + {{20, 56}, {230, 26}} + + YES + + 879885888 + 272630784 + + + + YES + + + 5 + YES + + + + 274 + {15, 0} + + + YES + + YES + + + 1.200000e+01 + 1.000000e+01 + 1.000000e+03 + + 75628032 + 0 + + + + 3 + MC4zMzMzMzI5OQA + + + + + 338820672 + 1024 + + + YES + + 6 + System + controlBackgroundColor + + + + + 3 + YES + + + + 3.000000e+00 + 2.000000e+00 + + + 6 + System + gridColor + + 3 + MC41AA + + + 1.900000e+01 + tableViewAction: + -767524864 + + + + 1 + 15 + 0 + YES + + + + + + 268 + {{17, 79}, {88, 16}} + + YES + + 68288064 + 272630784 + Gallery Parent + + + + + + + + {267, 276} + + + {{0, 0}, {1920, 1178}} + {3.40282e+38, 3.40282e+38} + + + + + YES + + + newGallerySheet + + + + 43 + + + + doNewGallery: + + + + 48 + + + + galleryDescTextField + + + + 49 + + + + galleryNameTextField + + + + 50 + + + + gallerySlugTextField + + + + 51 + + + + cancelNewGallery: + + + + 53 + + + + + YES + + 0 + + YES + + + + + + -2 + + + RmlsZSdzIE93bmVyA + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + YES + + + + + + 2 + + + YES + + + + + + + + + + + + + + + 3 + + + YES + + + + + + 4 + + + + + 5 + + + YES + + + + + + 6 + + + + + 7 + + + YES + + + + + + 8 + + + + + 9 + + + YES + + + + + + 10 + + + + + 11 + + + YES + + + + + + 12 + + + + + 13 + + + YES + + + + + + 14 + + + + + 15 + + + YES + + + + + + 16 + + + + + 17 + + + YES + + + + + + 18 + + + + + 19 + + + YES + + + + + + 20 + + + + + 21 + + + YES + + + + + + 22 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 1.IBWindowTemplateEditedContentRect + 1.NSWindowTemplate.visibleAtLaunch + 1.WindowOrigin + 1.editorWindowContentRectSynchronizationRect + 10.IBPluginDependency + 11.IBPluginDependency + 12.IBPluginDependency + 13.IBPluginDependency + 14.IBPluginDependency + 15.IBPluginDependency + 16.IBPluginDependency + 17.IBPluginDependency + 18.IBPluginDependency + 19.IBPluginDependency + 2.IBPluginDependency + 20.IBPluginDependency + 21.IBPluginDependency + 22.IBPluginDependency + 3.IBPluginDependency + 4.IBPluginDependency + 5.IBPluginDependency + 6.IBPluginDependency + 7.IBPluginDependency + 8.IBPluginDependency + 9.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{177, 722}, {267, 276}} + com.apple.InterfaceBuilder.CocoaPlugin + {{177, 722}, {267, 276}} + + {196, 240} + {{357, 418}, {480, 270}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + YES + + YES + + + YES + + + + + YES + + YES + + + YES + + + + 53 + + + + YES + + NSObject + + IBProjectSource + TURAnsel.h + + + + NSObject + + IBProjectSource + TURAnselGallery.h + + + + NSObject + + IBProjectSource + TURAnselGalleryPanelController.h + + + + NSObject + + IBProjectSource + xmlrpc-1.5.1/XMLRPCConnection.h + + + + TURAnselGalleryPanelController + NSObject + + YES + + YES + cancelNewGallery: + doNewGallery: + + + YES + id + id + + + + YES + + YES + delegate + galleryDescTextField + galleryNameTextField + gallerySlugTextField + newGallerySheet + + + YES + id + NSTextField + NSTextField + NSTextField + NSPanel + + + + + + + 0 + ../iPhoto2Ansel.xcodeproj + 3 + + diff --git a/iPhoto2Ansel/TURAnselKit/English.lProj/AnselGalleryPanel.nib/keyedobjects.nib b/iPhoto2Ansel/TURAnselKit/English.lProj/AnselGalleryPanel.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..b318b79b4e71905692c4335cc75b8f273c22ce6a GIT binary patch literal 8534 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 literal 0 HcmV?d00001 diff --git a/iPhoto2Ansel/TURAnsel.h b/iPhoto2Ansel/TURAnselKit/TURAnsel.h similarity index 72% rename from iPhoto2Ansel/TURAnsel.h rename to iPhoto2Ansel/TURAnselKit/TURAnsel.h index b18c86fb4..b1997fa43 100644 --- a/iPhoto2Ansel/TURAnsel.h +++ b/iPhoto2Ansel/TURAnselKit/TURAnsel.h @@ -1,12 +1,13 @@ -// -// TURAnsel.h -// myXMLTest -// -// Created by Michael Rubinsky on 10/31/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// +/** + * TURAnsel + * + * Copyright 2009 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ #import -@class TURAnselGallery, XMLRPCResponse; +@class TURAnselGallery; typedef enum { PERMS_SHOW = 2, @@ -19,10 +20,10 @@ typedef enum { TURAnselStateDisconnected = 0, TURAnselStateConnected, TURAnselStateError, - TURAnselStateCancelled + TURAnselStateCancelled, + TURAnselStateWaiting } TURAnselState; - @interface NSObject (TURAnselDelegate) - (void)TURAnselDidInitialize; - (void)TURAnselHadError: (NSError *)error; @@ -47,7 +48,7 @@ typedef enum { - (void)connect; - (TURAnselGallery *)getGalleryById: (NSString *)galleryId; - (TURAnselGallery *)getGalleryByIndex: (NSInteger)index; -- (XMLRPCResponse *)callRPCMethod: (NSString *)methodName withParams: (NSArray *)params; +- (NSDictionary *)callRPCMethod: (NSString *)methodName withParams: (NSArray *)params withOrder: (NSArray *)order; - (NSDictionary *)createNewGallery: (NSDictionary *)params; - (void)cancel; @@ -55,5 +56,5 @@ typedef enum { - (void) setState: (TURAnselState)state; - (TURAnselState)state; - (id)delegate; -- (void)setDelegate:(id)newDelegate; +- (void)setDelegate: (id)newDelegate; @end diff --git a/iPhoto2Ansel/TURAnselKit/TURAnsel.m b/iPhoto2Ansel/TURAnselKit/TURAnsel.m new file mode 100644 index 000000000..56ad2f77d --- /dev/null +++ b/iPhoto2Ansel/TURAnselKit/TURAnsel.m @@ -0,0 +1,315 @@ +/** + * TURAnsel.m + * + * Main class for interacting with a remote Ansel server. + * + * Copyright 2009 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ +#import +#import "TURAnselKit.h" + +@interface TURAnsel (PrivateAPI) +- (void)doLogin; +@end + +@implementation TURAnsel + +@synthesize rpcEndPoint; +@synthesize username; +@synthesize password; + +#pragma mark - +#pragma mark init/dealloc +- (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; +} +-(void) dealloc +{ + NSLog(@"TURAnsel dealloc"); + [galleryList removeAllObjects]; + [galleryList release]; + [rpcEndPoint release]; + [username release]; + [password release]; + [userAgent release]; + [super dealloc]; +} + +#pragma mark - +#pragma mark Actions +- (void)connect +{ + [self doLogin]; +} +- (void) cancel +{ + state = TURAnselStateCancelled; +} + +/** + * Create a new gallery on the Ansel server. + * + * @param NSDictionary params A dictionary of parameters for the new gallery. + * + * @return NSDictionary A dictionary describing the new gallery + */ +- (NSDictionary *)createNewGallery: (NSDictionary *)params +{ + NSArray *apiparams = [NSArray arrayWithObjects: @"ansel", params, nil]; + NSArray *order = [NSArray arrayWithObjects: kTURAnselAPIParamScope, kTURAnselAPIParamGaleryParams, nil]; + + NSDictionary *response = [self callRPCMethod: @"images.createGallery" + withParams: apiparams + withOrder: order]; + + if (response) { + NSNumber *gallery_id = [response objectForKey: (NSString *)kWSMethodInvocationResult]; + NSDictionary *results = [NSDictionary dictionaryWithObjectsAndKeys: + gallery_id, kTURAnselGalleryKeyId, + [params valueForKey: @"name"], kTURAnselGalleryKeyName, + @"", kTURAnselGalleryKeyDescription, + [NSNumber numberWithInt: 0], kTURAnselGalleryKeyImages, + [NSNumber numberWithInt: 0], kTURAnselGalleryKeyDefaultImage, nil]; + + TURAnselGallery *newGallery = [[TURAnselGallery alloc] initWithObject: results + controller: self]; + [galleryList addObject: newGallery]; + [newGallery release]; + + return results; + } + + return nil; +} + + +/** + * Entry point for calling RPC methods on the Horde server. + * + * @param NSString methodName The method to call (e.g. images.listGalleries) + * @param NSArray params All the method's parameters + * @param NSArray order Keys for the params array, needed because of how + * WSMethodInvocationSetParameters is used. (The keys are + * disregarded by Horde, but needed to ensure they get + * sent in the correct order by WS. + * + * The invocationCallback function is called on completion, which in turn will + * call the methodCompletionCallback with the results + */ +- (NSDictionary *)callRPCMethod: (NSString *)methodName + withParams: (NSArray *) params + withOrder: (NSArray *) order +{ + NSLog(@"Initiating connection for %@", methodName); + + // Get a URL object + NSURL *url = [NSURL URLWithString: [self valueForKey: @"rpcEndPoint"]]; + NSDictionary *values = [NSDictionary dictionaryWithObjects: params forKeys:order]; + + // Credentials + NSString *user = [self valueForKey:@"username"]; + NSString *pass = [self valueForKey:@"password"]; + + if (user != nil && [user length] && pass != nil && [pass length]) { + // Create a custom http request with authorization + CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, + (CFStringRef)@"POST", + (CFURLRef)url, + kCFHTTPVersion1_1); + // Add auth creds to request. + Boolean success = CFHTTPMessageAddAuthentication(request, + NULL, + (CFStringRef)user, + (CFStringRef)pass, + kCFHTTPAuthenticationSchemeBasic, + false); + + NSLog(@"Results adding credentials to request: %d", success); + if (!success) { + NSLog(@"Unable to authenticate"); + + if ([[self delegate] respondsToSelector: @selector(TURAnselHadError:)]) { + NSError *error = [NSError errorWithDomain:@"TURAnsel" + code: 1 + userInfo:[NSDictionary dictionaryWithObjectsAndKeys: @"Authentication failure.", @"message", nil]]; + + [[self delegate] TURAnselHadError: error]; + } + + return nil; + + } else { + // Build a new invocation + [self setState:TURAnselStateWaiting]; + WSMethodInvocationRef rpcCall; + rpcCall = WSMethodInvocationCreate((CFURLRef)url, (CFStringRef)methodName, kWSXMLRPCProtocol); + WSMethodInvocationSetParameters(rpcCall, (CFDictionaryRef)values, (CFArrayRef)order); + WSMethodInvocationSetProperty(rpcCall, kWSHTTPMessage, request); + NSDictionary *result = (NSDictionary *)WSMethodInvocationInvoke(rpcCall); + CFRelease(request); + // Check out the results + if (WSMethodResultIsFault((CFDictionaryRef) result)) { + + NSError *error; + + CFHTTPMessageRef response = (CFHTTPMessageRef)[result objectForKey:(id)kWSHTTPResponseMessage]; + int resStatusCode = CFHTTPMessageGetResponseStatusCode(response); + NSString *resStatusLine = (NSString *)CFHTTPMessageCopyResponseStatusLine(response); + if (resStatusCode == 401) { + error = [NSError errorWithDomain: @"TURAnsel" + code: resStatusCode + userInfo: [NSDictionary dictionaryWithObjectsAndKeys: resStatusLine, @"NSLocalizedDescriptionKey", nil]]; + } else { + NSNumber *faultCode = [result objectForKey: (NSString *)kWSFaultCode]; + NSString *faultString = [result objectForKey: (NSString *)kWSFaultString]; + NSLog(@"faultCode: %@ faultString: %@", faultCode, faultString); + error = [NSError errorWithDomain: @"TURAnsel" + code: [faultCode intValue] + userInfo: [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat: @"%@, %@", resStatusLine, faultString], @"NSLocalizedDescriptionKey", nil]]; + + + } + if ([[self delegate] respondsToSelector: @selector(TURAnselHadError:)]) { + [[self delegate] TURAnselHadError: error]; + } + [resStatusLine release]; + [result autorelease]; + return nil; + } + + CFHTTPMessageRef response = (CFHTTPMessageRef)[result objectForKey:(id)kWSHTTPResponseMessage]; + int resStatusCode = CFHTTPMessageGetResponseStatusCode(response); + NSLog(@"ResponseCode: %d", resStatusCode); + [self setState:TURAnselStateConnected]; + return [result autorelease]; + } + } + + NSLog(@"No authentication information present."); + return nil; + +} + +#pragma mark - +#pragma mark Setters/Getters +// 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; +} + +#pragma mark -- +#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; +} + +#pragma mark PrivateAPI +/** + * Perform initial contact with Ansel server. Retrieves the list of galleries + * available for the selected server. + * + * @return void + */ +- (void)doLogin +{ + 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). + + NSArray *order = [NSArray arrayWithObjects: kTURAnselAPIParamScope, kTURAnselAPIParamPerms, + kTURAnselAPIParamParent, kTURAnselAPIParamAllLevels, + kTURAnselAPIParamOffset, kTURAnselAPIParamCount, + kTURAnselAPIParamUserOnly, nil]; + + NSDictionary *results = [self callRPCMethod: @"images.listGalleries" + withParams: params + withOrder: order]; + + if (results) { + NSDictionary *galleries = [results objectForKey: (id)kWSMethodInvocationResult]; + for (NSString *gal in galleries) { + TURAnselGallery *theGallery = [[TURAnselGallery alloc] initWithObject: gal + controller: self]; + [theGallery setAnselController: self]; + [galleryList addObject: theGallery]; + [theGallery release]; + theGallery = nil; + } + + if ([delegate respondsToSelector:@selector(TURAnselDidInitialize)]) { + [delegate performSelectorOnMainThread:@selector(TURAnselDidInitialize) + withObject:self + waitUntilDone: NO]; + } + + } + + [params release]; +} +@end \ No newline at end of file diff --git a/iPhoto2Ansel/TURAnselKit/TURAnselConstants.h b/iPhoto2Ansel/TURAnselKit/TURAnselConstants.h new file mode 100644 index 000000000..ef64dc77a --- /dev/null +++ b/iPhoto2Ansel/TURAnselKit/TURAnselConstants.h @@ -0,0 +1,33 @@ +/** + * TURAnselConstants + * + * Copyright 2009 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ + +// Constants for the API parameter names. +extern NSString * const kTURAnselAPIParamScope; +extern NSString * const kTURAnselAPIParamGaleryParams; +extern NSString * const kTURAnselAPIParamPerms; +extern NSString * const kTURAnselAPIParamParent; +extern NSString * const kTURAnselAPIParamAllLevels; +extern NSString * const kTURAnselAPIParamOffset; +extern NSString * const kTURAnselAPIParamCount; +extern NSString * const kTURAnselAPIParamUserOnly; +extern NSString * const kTURAnselAPIParamImageId; +extern NSString * const kTURAnselAPIParamGalleryId; +extern NSString * const kTURAnselAPIParamThumbnailStyle; +extern NSString * const kTURAnselAPIParamFullPath; +extern NSString * const kTURAnselAPIParamImageData; +extern NSString * const kTURAnselAPIParamSetAsDefault; +extern NSString * const kTURAnselAPIParamAdditionalData; +extern NSString * const kTURAnselAPIParamEncoding; + +// Constants for the dictionary keys used to describe/create TURAnselGallery +extern NSString * const kTURAnselGalleryKeyId; +extern NSString * const kTURAnselGalleryKeyName; +extern NSString * const kTURAnselGalleryKeyDescription; +extern NSString * const kTURAnselGalleryKeyImages; +extern NSString * const kTURAnselGalleryKeyDefaultImage; diff --git a/iPhoto2Ansel/TURAnselKit/TURAnselConstants.m b/iPhoto2Ansel/TURAnselKit/TURAnselConstants.m new file mode 100644 index 000000000..74472bb5f --- /dev/null +++ b/iPhoto2Ansel/TURAnselKit/TURAnselConstants.m @@ -0,0 +1,34 @@ +// +// TURAnselConstants.m +// ApertureToAnselExportPlugin +// +// Created by Michael Rubinsky on 9/22/09. +// Copyright 2009 __MyCompanyName__. All rights reserved. +// + +#import "TURAnselConstants.h" + +// Constants for the API parameter names. +NSString * const kTURAnselAPIParamScope = @"scope"; +NSString * const kTURAnselAPIParamGaleryParams = @"galleryParams"; +NSString * const kTURAnselAPIParamPerms = @"perms"; +NSString * const kTURAnselAPIParamParent = @"parent"; +NSString * const kTURAnselAPIParamAllLevels = @"allLevels"; +NSString * const kTURAnselAPIParamOffset = @"offset"; +NSString * const kTURAnselAPIParamCount = @"count"; +NSString * const kTURAnselAPIParamUserOnly = @"userOnly"; +NSString * const kTURAnselAPIParamImageId = @"imageId"; +NSString * const kTURAnselAPIParamGalleryId = @"galleryId"; +NSString * const kTURAnselAPIParamThumbnailStyle = @"thumbnailStyle"; +NSString * const kTURAnselAPIParamFullPath = @"fullPath"; +NSString * const kTURAnselAPIParamImageData = @"imageData"; +NSString * const kTURAnselAPIParamSetAsDefault = @"default"; +NSString * const kTURAnselAPIParamAdditionalData = @"additionalData"; +NSString * const kTURAnselAPIParamEncoding = @"encoding"; + +// Ansel gallery attribtues. +NSString * const kTURAnselGalleryKeyId = @"share_id"; +NSString * const kTURAnselGalleryKeyName = @"attribute_name"; +NSString * const kTURAnselGalleryKeyDescription = @"attribute_desc"; +NSString * const kTURAnselGalleryKeyImages = @"attribute_images"; +NSString * const kTURAnselGalleryKeyDefaultImage = @"attribute_default"; \ No newline at end of file diff --git a/iPhoto2Ansel/TURAnselGallery.h b/iPhoto2Ansel/TURAnselKit/TURAnselGallery.h similarity index 52% rename from iPhoto2Ansel/TURAnselGallery.h rename to iPhoto2Ansel/TURAnselKit/TURAnselGallery.h index c8a4bf84d..5eff4e79b 100644 --- a/iPhoto2Ansel/TURAnselGallery.h +++ b/iPhoto2Ansel/TURAnselKit/TURAnselGallery.h @@ -1,53 +1,42 @@ -// -// TURAnselGallery.h -// -// Class to wrap Ansel Gallery. -// -// Created by Michael Rubinsky on 10/21/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - +/** + * TURAnselGallery + * + * Copyright 2009 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ #import -@class TURAnsel, NSURL, XMLRPCResponse; - -typedef enum { - TURAnselGalleryStateReady = 0, - TURAnselGalleryStateBusy -} TURAnselGalleryState; +@class TURAnsel, NSURL; @interface NSObject (TURAnselGalleryDelegate) -- (void)TURAnselGalleryDidReceiveRPCResponse: (XMLRPCResponse *)response; - (void)TURAnselGalleryDidUploadImage: (id *)gallery; @end @interface TURAnselGallery : NSObject { - int galleryId; + int _galleryId; int galleryImageCount; - int galleryDefaultImage; - NSURL *galleryDefaultImageURL; + int galleryKeyImage; + NSURL *galleryKeyImageURL; 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; +@property (readwrite) int galleryKeyImage; - (id)initWithObject:(id)galleryData controller:(TURAnsel * )controller; - (void)uploadImageObject: (NSDictionary *)imageParameters; -- (bool)isBusy; // Getter / Setter - (void)setDelegate: (id)newDelegate; - (id)delegate; -- (NSURL *)galleryDefaultImageURL; +- (NSURL *)galleryKeyImageURL; - (id)listImages; - (int)galleryId; -- (TURAnselGalleryState) state; -- (void)setState: (TURAnselGalleryState)theState; - (void)setAnselController:(TURAnsel *)newController; @end \ No newline at end of file diff --git a/iPhoto2Ansel/TURAnselKit/TURAnselGallery.m b/iPhoto2Ansel/TURAnselKit/TURAnselGallery.m new file mode 100644 index 000000000..9397b107d --- /dev/null +++ b/iPhoto2Ansel/TURAnselKit/TURAnselGallery.m @@ -0,0 +1,216 @@ +/** + * TURAnselGallery.m + * + * Copyright 2009 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ +#import +#import "TURAnselKit.h" + +@interface TURAnselGallery (PrivateAPI) +- (void)doUpload: (NSDictionary *)imageParams; +@end + +@implementation TURAnselGallery + +@synthesize galleryDescription; +@synthesize galleryName; +@synthesize galleryImageCount; +@synthesize galleryKeyImage; + +#pragma mark - +#pragma mark init/dealloc +/** + * Init a gallery object + */ +- (id)initWithObject:(id)galleryData controller:(TURAnsel *)controller +{ + [super init]; + [self setValue: [galleryData valueForKey: kTURAnselGalleryKeyId] + forKey: @"galleryId"]; + [self setValue:[galleryData valueForKey: kTURAnselGalleryKeyDescription] + forKey:@"galleryDescription"]; + [self setValue:[galleryData valueForKey: kTURAnselGalleryKeyName] + forKey:@"galleryName"]; + [self setValue: [galleryData valueForKey: kTURAnselGalleryKeyImages] + forKey:@"galleryImageCount"]; + [self setValue: [galleryData valueForKey: kTURAnselGalleryKeyDefaultImage] + forKey:@"galleryKeyImage"]; + [self setAnselController: controller]; + return self; +} +- (void)dealloc +{ + NSLog(@"TURAnselGallery dealloc called on Gallery %@", self); + [anselController release]; + anselController = nil; + + [galleryKeyImageURL release]; + galleryKeyImageURL = nil; + + [imageList release]; + imageList = nil; + + [super dealloc]; +} +- (id)description +{ + NSString *text = [NSString stringWithFormat:@"Description: %@ Id: %d has: %d images", galleryName, _galleryId, galleryImageCount]; + return text; +} + +#pragma mark - +#pragma mark Actions +/** + * Requests the gallery's key 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 *)galleryKeyImageURL +{ + if (galleryKeyImageURL) { + return galleryKeyImageURL; + } else { + NSArray *params = [[NSArray alloc] initWithObjects: + @"ansel", // Scope + [NSNumber numberWithInt: galleryKeyImage], // Image Id + @"thumb", // Thumbnail type + [NSNumber numberWithBool:YES], // Full path + nil]; + + NSArray *order = [NSArray arrayWithObjects: kTURAnselAPIParamScope, + kTURAnselAPIParamImageId, + kTURAnselAPIParamThumbnailStyle, + kTURAnselAPIParamFullPath, nil]; + + NSDictionary *response = [anselController callRPCMethod: @"images.getImageUrl" + withParams: params + withOrder: order]; + + if (response) { + NSDictionary *url = [response objectForKey:(id)kWSMethodInvocationResult]; + [galleryKeyImageURL autorelease]; + galleryKeyImageURL = [[NSURL URLWithString: [NSString stringWithFormat: @"%@", url]] retain]; + NSLog(@"galleryKeyImageURL: %@", galleryKeyImageURL); + return galleryKeyImageURL; + } + + return nil; + } +} + +/** + * 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]; + NSArray *order = [NSArray arrayWithObjects: kTURAnselAPIParamScope, + kTURAnselAPIParamGalleryId, + kTURAnselAPIParamPerms, + kTURAnselAPIParamThumbnailStyle, + kTURAnselAPIParamFullPath, nil]; + + NSDictionary *response = [anselController callRPCMethod: @"images.listImages" + withParams: params + withOrder: order]; + if (response) { + [imageList autorelease]; + imageList = [[response objectForKey: (id)kWSMethodInvocationResult] retain]; + + NSLog(@"listImages: %@", imageList); + + return imageList; + } + } + + return nil; +} + +/** + * Upload the provided image to this gallery. + */ +- (void)uploadImageObject: (NSDictionary *)imageParameters +{ + [self doUpload: imageParameters]; +} + +#pragma mark - +#pragma mark Getter/Setter +- (int)galleryId +{ + return _galleryId; +} + +- (void)setGalleryId:(int)id +{ + _galleryId = id; +} + +- (id)delegate +{ + return delegate; +} + +- (void)setDelegate: (id)newDelegate +{ + delegate = newDelegate; +} + +- (void)setAnselController: (TURAnsel *)newController +{ + [anselController autorelease]; + anselController = [newController retain]; +} + +- (TURAnsel *)anselController +{ + return anselController; +} + +#pragma mark - +#pragma mark PrivateAPI +- (void)doUpload:(NSDictionary *)imageParameters +{ + // Need to build the 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]; + NSArray *order = [NSArray arrayWithObjects: kTURAnselAPIParamScope, + kTURAnselAPIParamGalleryId, + kTURAnselAPIParamImageData, + kTURAnselAPIParamSetAsDefault, + kTURAnselAPIParamAdditionalData, + kTURAnselAPIParamEncoding, nil]; + + // Send the request up to the controller + NSDictionary *result = [anselController callRPCMethod: @"images.saveImage" + withParams: params + withOrder: order]; + + if (result) { + if ([delegate respondsToSelector:@selector(TURAnselGalleryDidUploadImage:)]) { + [delegate performSelectorOnMainThread: @selector(TURAnselGalleryDidUploadImage:) + withObject: self + waitUntilDone: NO]; + } + } + + [params release]; +} +@end diff --git a/iPhoto2Ansel/TURAnselGalleryPanelController.h b/iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.h similarity index 67% rename from iPhoto2Ansel/TURAnselGalleryPanelController.h rename to iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.h index 9e2f612b2..b0a8f2e66 100644 --- a/iPhoto2Ansel/TURAnselGalleryPanelController.h +++ b/iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.h @@ -1,13 +1,13 @@ -// -// TURAnselGalleryPanelController.h -// iPhoto2Ansel -// -// Created by Michael Rubinsky on 12/7/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - +/** + * TURAnselGalleryPanelController + * + * Copyright 2009 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ #import -#import "TURAnsel.h" +#import "TURAnselKit.h" @interface NSObject (TURAnselGalleryPaneControllerDelegate) -(void)TURAnselGalleryPanelDidAddGallery; @@ -20,9 +20,10 @@ IBOutlet NSTextField *galleryDescTextField; IBOutlet NSPanel *newGallerySheet; - TURAnsel *anselController; - NSWindow *controllerWindow; - id delegate; + // Instance members + TURAnsel *_anselController; + NSWindow *_controllerWindow; + id _delegate; } // Actions diff --git a/iPhoto2Ansel/TURAnselGalleryPanelController.m b/iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.m similarity index 68% rename from iPhoto2Ansel/TURAnselGalleryPanelController.m rename to iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.m index baff799ba..09aa6c5ae 100644 --- a/iPhoto2Ansel/TURAnselGalleryPanelController.m +++ b/iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.m @@ -1,15 +1,49 @@ -// -// TURAnselGalleryPanelController.m -// iPhoto2Ansel -// -// Created by Michael Rubinsky on 12/7/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - +/** + * TURAnselGalleryPanelController.m + * + * Controller for handling the form that creates new remote Ansel galleries. + * + * Copyright 2009 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ #import "TURAnselGalleryPanelController.h" @implementation TURAnselGalleryPanelController +#pragma mark - +#pragma mark init/dealloc +-(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)dealloc +{ + [_anselController release]; + [_controllerWindow release]; + [super dealloc]; +} + +#pragma mark - #pragma mark IBActions - (IBAction)cancelNewGallery: (id)sender { @@ -32,7 +66,7 @@ NSAlert *alert = [[NSAlert alloc] init]; [alert setMessageText:@"Gallery names cannot be empty"]; [alert setAlertStyle: NSCriticalAlertStyle]; - [alert beginSheetModalForWindow: controllerWindow + [alert beginSheetModalForWindow: _controllerWindow modalDelegate: nil didEndSelector: nil contextInfo: nil]; @@ -44,63 +78,38 @@ gallerySlug, @"slug", galleryDescription, @"desc", nil]; - NSDictionary *results = [[anselController createNewGallery: params] retain]; + NSDictionary *results = [[_anselController createNewGallery: params] retain]; [NSApp endSheet: newGallerySheet]; [newGallerySheet orderOut: nil]; - if ([anselController state] != TURAnselStateError) { + if ([_anselController state] != TURAnselStateError) { NSAlert *alert = [[NSAlert alloc] init]; [alert setMessageText: @"Gallery successfully created."]; - [alert beginSheetModalForWindow: controllerWindow + [alert beginSheetModalForWindow: _controllerWindow modalDelegate: nil didEndSelector: nil contextInfo: nil]; [alert release]; - if ([delegate respondsToSelector:@selector(TURAnselGalleryPanelDidAddGallery)]) { - [delegate TURAnselGalleryPanelDidAddGallery]; + 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 + _delegate = theDelegate; // weak } - (void)showSheetForWindow: (NSWindow *)theWindow { - [controllerWindow release]; - controllerWindow = [theWindow retain]; + [_controllerWindow release]; + _controllerWindow = [theWindow retain]; [NSApp beginSheet: newGallerySheet modalForWindow: theWindow modalDelegate: nil @@ -108,11 +117,4 @@ contextInfo: nil]; } -- (void)dealloc -{ - [anselController release]; - [controllerWindow release]; - [super dealloc]; -} - @end diff --git a/iPhoto2Ansel/TURAnselKit/TURAnselKit.h b/iPhoto2Ansel/TURAnselKit/TURAnselKit.h new file mode 100644 index 000000000..b580fe6ed --- /dev/null +++ b/iPhoto2Ansel/TURAnselKit/TURAnselKit.h @@ -0,0 +1,6 @@ +#import "TURAnselConstants.h" +#import "TURAnsel.h" +#import "TURAnselGallery.h" +#import "TURAnselGalleryPanelController.h" +#import "AnselGalleryViewItem.h" + diff --git a/iPhoto2Ansel/TURAnselServersPanelController.h b/iPhoto2Ansel/TURAnselServersPanelController.h deleted file mode 100644 index 7e1d64eda..000000000 --- a/iPhoto2Ansel/TURAnselServersPanelController.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// TURAnselServersPanelController.h -// iPhoto2Ansel -// -// Created by Michael Rubinsky on 12/14/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - -#import - - -@interface TURAnselServersPanelController : NSObject { - -} - -@end diff --git a/iPhoto2Ansel/TURAnselServersPanelController.m b/iPhoto2Ansel/TURAnselServersPanelController.m deleted file mode 100644 index b00a797ac..000000000 --- a/iPhoto2Ansel/TURAnselServersPanelController.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// TURAnselServersPanelController.m -// iPhoto2Ansel -// -// Created by Michael Rubinsky on 12/14/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - -#import "TURAnselServersPanelController.h" - - -@implementation TURAnselServersPanelController - -@end diff --git a/iPhoto2Ansel/TURXMLConnection.h b/iPhoto2Ansel/TURXMLConnection.h deleted file mode 100644 index bb8b354ab..000000000 --- a/iPhoto2Ansel/TURXMLConnection.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// 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 -#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 diff --git a/iPhoto2Ansel/TURXMLConnection.m b/iPhoto2Ansel/TURXMLConnection.m deleted file mode 100644 index 58a73db6d..000000000 --- a/iPhoto2Ansel/TURXMLConnection.m +++ /dev/null @@ -1,142 +0,0 @@ -// -// TURXMLConnection.m -// iPhoto2Ansel -// -// Created by Michael Rubinsky on 11/5/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// -#import -#import -#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"); - } 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 diff --git a/iPhoto2Ansel/XMLRPC-Info.plist b/iPhoto2Ansel/XMLRPC-Info.plist deleted file mode 100644 index 3e59a1acf..000000000 --- a/iPhoto2Ansel/XMLRPC-Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - com.yourcompany.XMLRPC - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleSignature - ???? - CFBundleVersion - 1.0 - - diff --git a/iPhoto2Ansel/iPhoto2Ansel.xcodeproj/project.pbxproj b/iPhoto2Ansel/iPhoto2Ansel.xcodeproj/project.pbxproj index dba546165..c93cd3df4 100644 --- a/iPhoto2Ansel/iPhoto2Ansel.xcodeproj/project.pbxproj +++ b/iPhoto2Ansel/iPhoto2Ansel.xcodeproj/project.pbxproj @@ -7,56 +7,28 @@ 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 */; }; - B00EF55A0EF5DD5900A9D71C /* AnselServers.nib in Resources */ = {isa = PBXBuildFile; fileRef = B00EF5580EF5DD5900A9D71C /* AnselServers.nib */; }; - B00EF5670EF5E22900A9D71C /* TURAnselServersPanelController.m in Sources */ = {isa = PBXBuildFile; fileRef = B00EF5660EF5E22900A9D71C /* TURAnselServersPanelController.m */; }; - B04FC1A90EEB4A2B008EEB0E /* AnselGalleryPanel.nib in Resources */ = {isa = PBXBuildFile; fileRef = B04FC1A70EEB4A2B008EEB0E /* AnselGalleryPanel.nib */; }; B06C1E030EB1644600BFAFCB /* AnselExportPluginBox.m in Sources */ = {isa = PBXBuildFile; fileRef = B06C1E020EB1644600BFAFCB /* AnselExportPluginBox.m */; }; B06C1E060EB164D900BFAFCB /* AnselExportController.m in Sources */ = {isa = PBXBuildFile; fileRef = B06C1E050EB164D900BFAFCB /* AnselExportController.m */; }; - B06C1E3D0EB17E3700BFAFCB /* Panel.nib in Resources */ = {isa = PBXBuildFile; fileRef = B06C1E3C0EB17E3700BFAFCB /* Panel.nib */; }; - B07D42700EC230B100B59765 /* TURAnsel.m in Sources */ = {isa = PBXBuildFile; fileRef = B07D426D0EC230B100B59765 /* TURAnsel.m */; }; - B07D42710EC230B100B59765 /* TURAnselGallery.m in Sources */ = {isa = PBXBuildFile; fileRef = B07D426F0EC230B100B59765 /* TURAnselGallery.m */; }; - B07D44F70EC2AEC700B59765 /* TURXMLConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = B07D44F60EC2AEC700B59765 /* TURXMLConnection.m */; }; + B08394CD106D1078001B5E29 /* AnselGalleryPanel.nib in Resources */ = {isa = PBXBuildFile; fileRef = B08394C0106D1077001B5E29 /* AnselGalleryPanel.nib */; }; + B08394CE106D1078001B5E29 /* AnselServers.nib in Resources */ = {isa = PBXBuildFile; fileRef = B08394C2106D1077001B5E29 /* AnselServers.nib */; }; + B08394CF106D1078001B5E29 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = B08394C4106D1077001B5E29 /* InfoPlist.strings */; }; + B08394D0106D1078001B5E29 /* Panel.nib in Resources */ = {isa = PBXBuildFile; fileRef = B08394C6106D1077001B5E29 /* Panel.nib */; }; + B08394D1106D1078001B5E29 /* ProgressSheet.nib in Resources */ = {isa = PBXBuildFile; fileRef = B08394C8106D1077001B5E29 /* ProgressSheet.nib */; }; + B08394D2106D1078001B5E29 /* iPhoto2Ansel.icns in Resources */ = {isa = PBXBuildFile; fileRef = B08394CA106D1077001B5E29 /* iPhoto2Ansel.icns */; }; B0B666750FB34604009459D5 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0B666730FB34604009459D5 /* Quartz.framework */; }; B0B666760FB34604009459D5 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0B666740FB34604009459D5 /* QuartzCore.framework */; }; - B0B6669B0FB357B3009459D5 /* AnselGalleryViewItem.m in Sources */ = {isa = PBXBuildFile; fileRef = B0B6669A0FB357B3009459D5 /* AnselGalleryViewItem.m */; }; - B0BFBC780ED5B2AB006581A5 /* XMLRPC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B0BFBC700ED5B221006581A5 /* XMLRPC.framework */; }; - B0BFBC7B0ED5B2B2006581A5 /* XMLRPC.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = B0BFBC700ED5B221006581A5 /* XMLRPC.framework */; }; - B0BFBC970ED5B32B006581A5 /* NSDataAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = B0BFBC810ED5B32B006581A5 /* NSDataAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B0BFBC980ED5B32B006581A5 /* NSDataAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B0BFBC820ED5B32B006581A5 /* NSDataAdditions.m */; }; - B0BFBC990ED5B32B006581A5 /* NSStringAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = B0BFBC830ED5B32B006581A5 /* NSStringAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B0BFBC9A0ED5B32B006581A5 /* NSStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B0BFBC840ED5B32B006581A5 /* NSStringAdditions.m */; }; - B0BFBC9C0ED5B32B006581A5 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B0BFBC870ED5B32B006581A5 /* Localizable.strings */; }; - B0BFBC9D0ED5B32B006581A5 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = B0BFBC890ED5B32B006581A5 /* LICENSE */; }; - B0BFBC9E0ED5B32B006581A5 /* README in Resources */ = {isa = PBXBuildFile; fileRef = B0BFBC8A0ED5B32B006581A5 /* README */; }; - B0BFBC9F0ED5B32B006581A5 /* XMLRPC.h in Headers */ = {isa = PBXBuildFile; fileRef = B0BFBC8B0ED5B32B006581A5 /* XMLRPC.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B0BFBCA00ED5B32B006581A5 /* XMLRPC.pch in Headers */ = {isa = PBXBuildFile; fileRef = B0BFBC8C0ED5B32B006581A5 /* XMLRPC.pch */; settings = {ATTRIBUTES = (Public, ); }; }; - B0BFBCA10ED5B32B006581A5 /* XMLRPCConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = B0BFBC8D0ED5B32B006581A5 /* XMLRPCConnection.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B0BFBCA20ED5B32B006581A5 /* XMLRPCConnection.m in Sources */ = {isa = PBXBuildFile; fileRef = B0BFBC8E0ED5B32B006581A5 /* XMLRPCConnection.m */; }; - B0BFBCA30ED5B32B006581A5 /* XMLRPCDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B0BFBC8F0ED5B32B006581A5 /* XMLRPCDecoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B0BFBCA40ED5B32B006581A5 /* XMLRPCDecoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B0BFBC900ED5B32B006581A5 /* XMLRPCDecoder.m */; }; - B0BFBCA50ED5B32B006581A5 /* XMLRPCEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = B0BFBC910ED5B32B006581A5 /* XMLRPCEncoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B0BFBCA60ED5B32B006581A5 /* XMLRPCEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = B0BFBC920ED5B32B006581A5 /* XMLRPCEncoder.m */; }; - B0BFBCA70ED5B32B006581A5 /* XMLRPCRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = B0BFBC930ED5B32B006581A5 /* XMLRPCRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B0BFBCA80ED5B32B006581A5 /* XMLRPCRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = B0BFBC940ED5B32B006581A5 /* XMLRPCRequest.m */; }; - B0BFBCA90ED5B32B006581A5 /* XMLRPCResponse.h in Headers */ = {isa = PBXBuildFile; fileRef = B0BFBC950ED5B32B006581A5 /* XMLRPCResponse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B0BFBCAA0ED5B32B006581A5 /* XMLRPCResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = B0BFBC960ED5B32B006581A5 /* XMLRPCResponse.m */; }; - B0C888490ED85DEA000E19FB /* ProgressSheet.nib in Resources */ = {isa = PBXBuildFile; fileRef = B0C888480ED85DEA000E19FB /* ProgressSheet.nib */; }; B0C8884E0ED85E02000E19FB /* FBProgressController.m in Sources */ = {isa = PBXBuildFile; fileRef = B0C8884D0ED85E02000E19FB /* FBProgressController.m */; }; - B0CCED420EEC6E810012D3D3 /* TURAnselGalleryPanelController.m in Sources */ = {isa = PBXBuildFile; fileRef = B0CCED410EEC6E810012D3D3 /* TURAnselGalleryPanelController.m */; }; + B0FF4D4A106B283D00A8C14B /* AnselGalleryViewItem.m in Sources */ = {isa = PBXBuildFile; fileRef = B0FF4D3E106B283D00A8C14B /* AnselGalleryViewItem.m */; }; + B0FF4D4B106B283D00A8C14B /* AnselGalleryPanel.nib in Resources */ = {isa = PBXBuildFile; fileRef = B0FF4D40106B283D00A8C14B /* AnselGalleryPanel.nib */; }; + B0FF4D4C106B283D00A8C14B /* TURAnsel.m in Sources */ = {isa = PBXBuildFile; fileRef = B0FF4D42106B283D00A8C14B /* TURAnsel.m */; }; + B0FF4D4D106B283D00A8C14B /* TURAnselConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = B0FF4D44106B283D00A8C14B /* TURAnselConstants.m */; }; + B0FF4D4E106B283D00A8C14B /* TURAnselGallery.m in Sources */ = {isa = PBXBuildFile; fileRef = B0FF4D46106B283D00A8C14B /* TURAnselGallery.m */; }; + B0FF4D4F106B283D00A8C14B /* TURAnselGalleryPanelController.m in Sources */ = {isa = PBXBuildFile; fileRef = B0FF4D48106B283D00A8C14B /* TURAnselGalleryPanelController.m */; }; + B0FF4D54106B284C00A8C14B /* NSDataAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B0FF4D51106B284C00A8C14B /* NSDataAdditions.m */; }; + B0FF4D55106B284C00A8C14B /* NSStringAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = B0FF4D53106B284C00A8C14B /* NSStringAdditions.m */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - B0BFBCBF0ED5B440006581A5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 089C1669FE841209C02AAC07 /* Project object */; - proxyType = 1; - remoteGlobalIDString = B0BFBC6F0ED5B221006581A5; - remoteInfo = XMLRPC; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXCopyFilesBuildPhase section */ B0BFBC7E0ED5B2D3006581A5 /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; @@ -64,7 +36,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - B0BFBC7B0ED5B2B2006581A5 /* XMLRPC.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -72,16 +43,9 @@ /* Begin PBXFileReference section */ 089C1672FE841209C02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; - 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 32DBCF630370AF2F00C91783 /* iPhoto2Ansel_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iPhoto2Ansel_Prefix.pch; sourceTree = ""; }; 8D5B49B6048680CD000E48DA /* iPhoto2Ansel.iPhotoExporter */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = iPhoto2Ansel.iPhotoExporter; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B00EF5590EF5DD5900A9D71C /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/AnselServers.nib; sourceTree = ""; }; - B00EF5650EF5E22900A9D71C /* TURAnselServersPanelController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnselServersPanelController.h; sourceTree = ""; }; - B00EF5660EF5E22900A9D71C /* TURAnselServersPanelController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnselServersPanelController.m; sourceTree = ""; }; - B03D3B590ED5BB3800CF5B92 /* XMLRPC-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "XMLRPC-Info.plist"; sourceTree = SOURCE_ROOT; }; - B04FC1A80EEB4A2B008EEB0E /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/AnselGalleryPanel.nib; sourceTree = ""; }; B06C1E010EB1644600BFAFCB /* AnselExportPluginBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnselExportPluginBox.h; sourceTree = ""; }; B06C1E020EB1644600BFAFCB /* AnselExportPluginBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnselExportPluginBox.m; sourceTree = ""; }; B06C1E040EB164D900BFAFCB /* AnselExportController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnselExportController.h; sourceTree = ""; }; @@ -89,42 +53,33 @@ B06C1E070EB1652100BFAFCB /* ExportPluginProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExportPluginProtocol.h; sourceTree = ""; }; B06C1E080EB1652100BFAFCB /* ExportPluginBoxProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExportPluginBoxProtocol.h; sourceTree = ""; }; B06C1E090EB1652100BFAFCB /* ExportImageProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExportImageProtocol.h; sourceTree = ""; }; - B06C1E3C0EB17E3700BFAFCB /* Panel.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Panel.nib; path = English.lproj/Panel.nib; sourceTree = ""; }; - B07D426C0EC230B100B59765 /* TURAnsel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnsel.h; sourceTree = ""; }; - B07D426D0EC230B100B59765 /* TURAnsel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnsel.m; sourceTree = ""; }; - B07D426E0EC230B100B59765 /* TURAnselGallery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnselGallery.h; sourceTree = ""; }; - B07D426F0EC230B100B59765 /* TURAnselGallery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnselGallery.m; sourceTree = ""; }; - B07D44F50EC2AEC700B59765 /* TURXMLConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURXMLConnection.h; sourceTree = ""; }; - B07D44F60EC2AEC700B59765 /* TURXMLConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURXMLConnection.m; sourceTree = ""; }; + B08394C1106D1077001B5E29 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/AnselGalleryPanel.nib; sourceTree = ""; }; + B08394C3106D1077001B5E29 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/AnselServers.nib; sourceTree = ""; }; + B08394C5106D1077001B5E29 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + B08394C7106D1077001B5E29 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Panel.nib; sourceTree = ""; }; + B08394C9106D1077001B5E29 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/ProgressSheet.nib; sourceTree = ""; }; + B08394CA106D1077001B5E29 /* iPhoto2Ansel.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = iPhoto2Ansel.icns; sourceTree = ""; }; + B08394E4106D1196001B5E29 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; B0B666730FB34604009459D5 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = /System/Library/Frameworks/Quartz.framework; sourceTree = ""; }; B0B666740FB34604009459D5 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = /System/Library/Frameworks/QuartzCore.framework; sourceTree = ""; }; - B0B666990FB357B3009459D5 /* AnselGalleryViewItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnselGalleryViewItem.h; sourceTree = ""; }; - B0B6669A0FB357B3009459D5 /* AnselGalleryViewItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnselGalleryViewItem.m; sourceTree = ""; }; - B0BFBC700ED5B221006581A5 /* XMLRPC.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = XMLRPC.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B0BFBC810ED5B32B006581A5 /* NSDataAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDataAdditions.h; sourceTree = ""; }; - B0BFBC820ED5B32B006581A5 /* NSDataAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDataAdditions.m; sourceTree = ""; }; - B0BFBC830ED5B32B006581A5 /* NSStringAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSStringAdditions.h; sourceTree = ""; }; - B0BFBC840ED5B32B006581A5 /* NSStringAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSStringAdditions.m; sourceTree = ""; }; - B0BFBC880ED5B32B006581A5 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = ""; }; - B0BFBC890ED5B32B006581A5 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - B0BFBC8A0ED5B32B006581A5 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; - B0BFBC8B0ED5B32B006581A5 /* XMLRPC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPC.h; sourceTree = ""; }; - B0BFBC8C0ED5B32B006581A5 /* XMLRPC.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPC.pch; sourceTree = ""; }; - B0BFBC8D0ED5B32B006581A5 /* XMLRPCConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPCConnection.h; sourceTree = ""; }; - B0BFBC8E0ED5B32B006581A5 /* XMLRPCConnection.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLRPCConnection.m; sourceTree = ""; }; - B0BFBC8F0ED5B32B006581A5 /* XMLRPCDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPCDecoder.h; sourceTree = ""; }; - B0BFBC900ED5B32B006581A5 /* XMLRPCDecoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLRPCDecoder.m; sourceTree = ""; }; - B0BFBC910ED5B32B006581A5 /* XMLRPCEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPCEncoder.h; sourceTree = ""; }; - B0BFBC920ED5B32B006581A5 /* XMLRPCEncoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLRPCEncoder.m; sourceTree = ""; }; - B0BFBC930ED5B32B006581A5 /* XMLRPCRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPCRequest.h; sourceTree = ""; }; - B0BFBC940ED5B32B006581A5 /* XMLRPCRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLRPCRequest.m; sourceTree = ""; }; - B0BFBC950ED5B32B006581A5 /* XMLRPCResponse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XMLRPCResponse.h; sourceTree = ""; }; - B0BFBC960ED5B32B006581A5 /* XMLRPCResponse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = XMLRPCResponse.m; sourceTree = ""; }; - B0C888480ED85DEA000E19FB /* ProgressSheet.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = ProgressSheet.nib; sourceTree = ""; }; B0C8884C0ED85E02000E19FB /* FBProgressController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FBProgressController.h; sourceTree = ""; }; B0C8884D0ED85E02000E19FB /* FBProgressController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FBProgressController.m; sourceTree = ""; }; - B0CCED400EEC6E810012D3D3 /* TURAnselGalleryPanelController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnselGalleryPanelController.h; sourceTree = ""; }; - B0CCED410EEC6E810012D3D3 /* TURAnselGalleryPanelController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnselGalleryPanelController.m; sourceTree = ""; }; + B0FF4D3D106B283D00A8C14B /* AnselGalleryViewItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnselGalleryViewItem.h; sourceTree = ""; }; + B0FF4D3E106B283D00A8C14B /* AnselGalleryViewItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnselGalleryViewItem.m; sourceTree = ""; }; + B0FF4D40106B283D00A8C14B /* AnselGalleryPanel.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; path = AnselGalleryPanel.nib; sourceTree = ""; }; + B0FF4D41106B283D00A8C14B /* TURAnsel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnsel.h; sourceTree = ""; }; + B0FF4D42106B283D00A8C14B /* TURAnsel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnsel.m; sourceTree = ""; }; + B0FF4D43106B283D00A8C14B /* TURAnselConstants.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnselConstants.h; sourceTree = ""; }; + B0FF4D44106B283D00A8C14B /* TURAnselConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnselConstants.m; sourceTree = ""; }; + B0FF4D45106B283D00A8C14B /* TURAnselGallery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnselGallery.h; sourceTree = ""; }; + B0FF4D46106B283D00A8C14B /* TURAnselGallery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnselGallery.m; sourceTree = ""; }; + B0FF4D47106B283D00A8C14B /* TURAnselGalleryPanelController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnselGalleryPanelController.h; sourceTree = ""; }; + B0FF4D48106B283D00A8C14B /* TURAnselGalleryPanelController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TURAnselGalleryPanelController.m; sourceTree = ""; }; + B0FF4D49106B283D00A8C14B /* TURAnselKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TURAnselKit.h; sourceTree = ""; }; + B0FF4D50106B284C00A8C14B /* NSDataAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSDataAdditions.h; sourceTree = ""; }; + B0FF4D51106B284C00A8C14B /* NSDataAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSDataAdditions.m; sourceTree = ""; }; + B0FF4D52106B284C00A8C14B /* NSStringAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSStringAdditions.h; sourceTree = ""; }; + B0FF4D53106B284C00A8C14B /* NSStringAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSStringAdditions.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -132,31 +87,25 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B0BFBC780ED5B2AB006581A5 /* XMLRPC.framework in Frameworks */, 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */, B0B666750FB34604009459D5 /* Quartz.framework in Frameworks */, B0B666760FB34604009459D5 /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - B0BFBC6E0ED5B221006581A5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 089C166AFE841209C02AAC07 /* iPhoto2Ansel */ = { isa = PBXGroup; children = ( - B00076DE0EBA573900A95FC0 /* AnselToolkit */, + B08394E4106D1196001B5E29 /* Info.plist */, + B08394BF106D1077001B5E29 /* Resources */, + B0FF4D5A106B288300A8C14B /* Additions */, + B0FF4D3C106B283D00A8C14B /* TURAnselKit */, B00076D20EBA568800A95FC0 /* SDK Headers */, 08FB77AFFE84173DC02AAC07 /* ExportPlugin */, 32C88E010371C26100C91783 /* Other Sources */, - 089C167CFE841241C02AAC07 /* Resources */, 089C1671FE841209C02AAC07 /* Frameworks and Libraries */, 19C28FB8FE9D52D311CA2CBB /* Products */, ); @@ -166,31 +115,15 @@ 089C1671FE841209C02AAC07 /* Frameworks and Libraries */ = { isa = PBXGroup; children = ( - B0BFBC7F0ED5B32B006581A5 /* xmlrpc-1.5.1 */, 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */, 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */, ); name = "Frameworks and Libraries"; sourceTree = ""; }; - 089C167CFE841241C02AAC07 /* Resources */ = { - isa = PBXGroup; - children = ( - B00EF5580EF5DD5900A9D71C /* AnselServers.nib */, - B04FC1A70EEB4A2B008EEB0E /* AnselGalleryPanel.nib */, - B0C888480ED85DEA000E19FB /* ProgressSheet.nib */, - B06C1E3C0EB17E3700BFAFCB /* Panel.nib */, - 8D5B49B7048680CD000E48DA /* Info.plist */, - 089C167DFE841241C02AAC07 /* InfoPlist.strings */, - ); - name = Resources; - sourceTree = ""; - }; 08FB77AFFE84173DC02AAC07 /* ExportPlugin */ = { isa = PBXGroup; children = ( - B0B666990FB357B3009459D5 /* AnselGalleryViewItem.h */, - B0B6669A0FB357B3009459D5 /* AnselGalleryViewItem.m */, B06C1E020EB1644600BFAFCB /* AnselExportPluginBox.m */, B06C1E010EB1644600BFAFCB /* AnselExportPluginBox.h */, B06C1E040EB164D900BFAFCB /* AnselExportController.h */, @@ -221,7 +154,6 @@ isa = PBXGroup; children = ( 8D5B49B6048680CD000E48DA /* iPhoto2Ansel.iPhotoExporter */, - B0BFBC700ED5B221006581A5 /* XMLRPC.framework */, ); name = Products; sourceTree = ""; @@ -231,8 +163,6 @@ children = ( B0C8884D0ED85E02000E19FB /* FBProgressController.m */, B0C8884C0ED85E02000E19FB /* FBProgressController.h */, - B07D44F50EC2AEC700B59765 /* TURXMLConnection.h */, - B07D44F60EC2AEC700B59765 /* TURXMLConnection.m */, 32DBCF630370AF2F00C91783 /* iPhoto2Ansel_Prefix.pch */, ); name = "Other Sources"; @@ -248,85 +178,59 @@ name = "SDK Headers"; sourceTree = ""; }; - B00076DE0EBA573900A95FC0 /* AnselToolkit */ = { + B08394BF106D1077001B5E29 /* Resources */ = { isa = PBXGroup; children = ( - B0CCED400EEC6E810012D3D3 /* TURAnselGalleryPanelController.h */, - B0CCED410EEC6E810012D3D3 /* TURAnselGalleryPanelController.m */, - B07D426C0EC230B100B59765 /* TURAnsel.h */, - B07D426D0EC230B100B59765 /* TURAnsel.m */, - B07D426E0EC230B100B59765 /* TURAnselGallery.h */, - B07D426F0EC230B100B59765 /* TURAnselGallery.m */, - B00EF5650EF5E22900A9D71C /* TURAnselServersPanelController.h */, - B00EF5660EF5E22900A9D71C /* TURAnselServersPanelController.m */, - ); - name = AnselToolkit; + B08394C0106D1077001B5E29 /* AnselGalleryPanel.nib */, + B08394C2106D1077001B5E29 /* AnselServers.nib */, + B08394C4106D1077001B5E29 /* InfoPlist.strings */, + B08394C6106D1077001B5E29 /* Panel.nib */, + B08394C8106D1077001B5E29 /* ProgressSheet.nib */, + B08394CA106D1077001B5E29 /* iPhoto2Ansel.icns */, + ); + path = Resources; sourceTree = ""; }; - B0BFBC7F0ED5B32B006581A5 /* xmlrpc-1.5.1 */ = { + B0FF4D3C106B283D00A8C14B /* TURAnselKit */ = { isa = PBXGroup; children = ( - B03D3B590ED5BB3800CF5B92 /* XMLRPC-Info.plist */, - B0BFBC800ED5B32B006581A5 /* Additions */, - B0BFBC860ED5B32B006581A5 /* Languages */, - B0BFBC890ED5B32B006581A5 /* LICENSE */, - B0BFBC8A0ED5B32B006581A5 /* README */, - B0BFBC8B0ED5B32B006581A5 /* XMLRPC.h */, - B0BFBC8C0ED5B32B006581A5 /* XMLRPC.pch */, - B0BFBC8D0ED5B32B006581A5 /* XMLRPCConnection.h */, - B0BFBC8E0ED5B32B006581A5 /* XMLRPCConnection.m */, - B0BFBC8F0ED5B32B006581A5 /* XMLRPCDecoder.h */, - B0BFBC900ED5B32B006581A5 /* XMLRPCDecoder.m */, - B0BFBC910ED5B32B006581A5 /* XMLRPCEncoder.h */, - B0BFBC920ED5B32B006581A5 /* XMLRPCEncoder.m */, - B0BFBC930ED5B32B006581A5 /* XMLRPCRequest.h */, - B0BFBC940ED5B32B006581A5 /* XMLRPCRequest.m */, - B0BFBC950ED5B32B006581A5 /* XMLRPCResponse.h */, - B0BFBC960ED5B32B006581A5 /* XMLRPCResponse.m */, - ); - path = "xmlrpc-1.5.1"; + B0FF4D3D106B283D00A8C14B /* AnselGalleryViewItem.h */, + B0FF4D3E106B283D00A8C14B /* AnselGalleryViewItem.m */, + B0FF4D3F106B283D00A8C14B /* English.lProj */, + B0FF4D41106B283D00A8C14B /* TURAnsel.h */, + B0FF4D42106B283D00A8C14B /* TURAnsel.m */, + B0FF4D43106B283D00A8C14B /* TURAnselConstants.h */, + B0FF4D44106B283D00A8C14B /* TURAnselConstants.m */, + B0FF4D45106B283D00A8C14B /* TURAnselGallery.h */, + B0FF4D46106B283D00A8C14B /* TURAnselGallery.m */, + B0FF4D47106B283D00A8C14B /* TURAnselGalleryPanelController.h */, + B0FF4D48106B283D00A8C14B /* TURAnselGalleryPanelController.m */, + B0FF4D49106B283D00A8C14B /* TURAnselKit.h */, + ); + path = TURAnselKit; sourceTree = ""; }; - B0BFBC800ED5B32B006581A5 /* Additions */ = { + B0FF4D3F106B283D00A8C14B /* English.lProj */ = { isa = PBXGroup; children = ( - B0BFBC810ED5B32B006581A5 /* NSDataAdditions.h */, - B0BFBC820ED5B32B006581A5 /* NSDataAdditions.m */, - B0BFBC830ED5B32B006581A5 /* NSStringAdditions.h */, - B0BFBC840ED5B32B006581A5 /* NSStringAdditions.m */, + B0FF4D40106B283D00A8C14B /* AnselGalleryPanel.nib */, ); - path = Additions; + path = English.lProj; sourceTree = ""; }; - B0BFBC860ED5B32B006581A5 /* Languages */ = { + B0FF4D5A106B288300A8C14B /* Additions */ = { isa = PBXGroup; children = ( - B0BFBC870ED5B32B006581A5 /* Localizable.strings */, + B0FF4D52106B284C00A8C14B /* NSStringAdditions.h */, + B0FF4D51106B284C00A8C14B /* NSDataAdditions.m */, + B0FF4D50106B284C00A8C14B /* NSDataAdditions.h */, + B0FF4D53106B284C00A8C14B /* NSStringAdditions.m */, ); - path = Languages; + name = Additions; sourceTree = ""; }; /* End PBXGroup section */ -/* Begin PBXHeadersBuildPhase section */ - B0BFBC6B0ED5B221006581A5 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - B0BFBC970ED5B32B006581A5 /* NSDataAdditions.h in Headers */, - B0BFBC990ED5B32B006581A5 /* NSStringAdditions.h in Headers */, - B0BFBC9F0ED5B32B006581A5 /* XMLRPC.h in Headers */, - B0BFBCA00ED5B32B006581A5 /* XMLRPC.pch in Headers */, - B0BFBCA10ED5B32B006581A5 /* XMLRPCConnection.h in Headers */, - B0BFBCA30ED5B32B006581A5 /* XMLRPCDecoder.h in Headers */, - B0BFBCA50ED5B32B006581A5 /* XMLRPCEncoder.h in Headers */, - B0BFBCA70ED5B32B006581A5 /* XMLRPCRequest.h in Headers */, - B0BFBCA90ED5B32B006581A5 /* XMLRPCResponse.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - /* Begin PBXNativeTarget section */ 8D5B49AC048680CD000E48DA /* iPhoto2Ansel */ = { isa = PBXNativeTarget; @@ -340,7 +244,6 @@ buildRules = ( ); dependencies = ( - B0BFBCC00ED5B440006581A5 /* PBXTargetDependency */, ); name = iPhoto2Ansel; productInstallPath = "$(HOME)/Library/Bundles"; @@ -348,29 +251,14 @@ productReference = 8D5B49B6048680CD000E48DA /* iPhoto2Ansel.iPhotoExporter */; productType = "com.apple.product-type.bundle"; }; - B0BFBC6F0ED5B221006581A5 /* XMLRPC */ = { - isa = PBXNativeTarget; - buildConfigurationList = B0BFBC750ED5B221006581A5 /* Build configuration list for PBXNativeTarget "XMLRPC" */; - buildPhases = ( - B0BFBC6B0ED5B221006581A5 /* Headers */, - B0BFBC6C0ED5B221006581A5 /* Resources */, - B0BFBC6D0ED5B221006581A5 /* Sources */, - B0BFBC6E0ED5B221006581A5 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = XMLRPC; - productName = XMLRPC; - productReference = B0BFBC700ED5B221006581A5 /* XMLRPC.framework */; - productType = "com.apple.product-type.framework"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 089C1669FE841209C02AAC07 /* Project object */ = { isa = PBXProject; + attributes = { + ORGANIZATIONNAME = "The Horde Project (http://www.horde.org)"; + }; buildConfigurationList = 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "iPhoto2Ansel" */; compatibilityVersion = "Xcode 3.0"; hasScannedForEncodings = 1; @@ -379,7 +267,6 @@ projectRoot = ""; targets = ( 8D5B49AC048680CD000E48DA /* iPhoto2Ansel */, - B0BFBC6F0ED5B221006581A5 /* XMLRPC */, ); }; /* End PBXProject section */ @@ -389,21 +276,13 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */, - B06C1E3D0EB17E3700BFAFCB /* Panel.nib in Resources */, - B0C888490ED85DEA000E19FB /* ProgressSheet.nib in Resources */, - B04FC1A90EEB4A2B008EEB0E /* AnselGalleryPanel.nib in Resources */, - B00EF55A0EF5DD5900A9D71C /* AnselServers.nib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B0BFBC6C0ED5B221006581A5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B0BFBC9C0ED5B32B006581A5 /* Localizable.strings in Resources */, - B0BFBC9D0ED5B32B006581A5 /* LICENSE in Resources */, - B0BFBC9E0ED5B32B006581A5 /* README in Resources */, + B0FF4D4B106B283D00A8C14B /* AnselGalleryPanel.nib in Resources */, + B08394CD106D1078001B5E29 /* AnselGalleryPanel.nib in Resources */, + B08394CE106D1078001B5E29 /* AnselServers.nib in Resources */, + B08394CF106D1078001B5E29 /* InfoPlist.strings in Resources */, + B08394D0106D1078001B5E29 /* Panel.nib in Resources */, + B08394D1106D1078001B5E29 /* ProgressSheet.nib in Resources */, + B08394D2106D1078001B5E29 /* iPhoto2Ansel.icns in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -416,71 +295,58 @@ files = ( B06C1E030EB1644600BFAFCB /* AnselExportPluginBox.m in Sources */, B06C1E060EB164D900BFAFCB /* AnselExportController.m in Sources */, - B07D42700EC230B100B59765 /* TURAnsel.m in Sources */, - B07D42710EC230B100B59765 /* TURAnselGallery.m in Sources */, - B07D44F70EC2AEC700B59765 /* TURXMLConnection.m in Sources */, B0C8884E0ED85E02000E19FB /* FBProgressController.m in Sources */, - B0CCED420EEC6E810012D3D3 /* TURAnselGalleryPanelController.m in Sources */, - B00EF5670EF5E22900A9D71C /* TURAnselServersPanelController.m in Sources */, - B0B6669B0FB357B3009459D5 /* AnselGalleryViewItem.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - B0BFBC6D0ED5B221006581A5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - B0BFBC980ED5B32B006581A5 /* NSDataAdditions.m in Sources */, - B0BFBC9A0ED5B32B006581A5 /* NSStringAdditions.m in Sources */, - B0BFBCA20ED5B32B006581A5 /* XMLRPCConnection.m in Sources */, - B0BFBCA40ED5B32B006581A5 /* XMLRPCDecoder.m in Sources */, - B0BFBCA60ED5B32B006581A5 /* XMLRPCEncoder.m in Sources */, - B0BFBCA80ED5B32B006581A5 /* XMLRPCRequest.m in Sources */, - B0BFBCAA0ED5B32B006581A5 /* XMLRPCResponse.m in Sources */, + B0FF4D4A106B283D00A8C14B /* AnselGalleryViewItem.m in Sources */, + B0FF4D4C106B283D00A8C14B /* TURAnsel.m in Sources */, + B0FF4D4D106B283D00A8C14B /* TURAnselConstants.m in Sources */, + B0FF4D4E106B283D00A8C14B /* TURAnselGallery.m in Sources */, + B0FF4D4F106B283D00A8C14B /* TURAnselGalleryPanelController.m in Sources */, + B0FF4D54106B284C00A8C14B /* NSDataAdditions.m in Sources */, + B0FF4D55106B284C00A8C14B /* NSStringAdditions.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - B0BFBCC00ED5B440006581A5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = B0BFBC6F0ED5B221006581A5 /* XMLRPC */; - targetProxy = B0BFBCBF0ED5B440006581A5 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ - 089C167DFE841241C02AAC07 /* InfoPlist.strings */ = { + B08394C0106D1077001B5E29 /* AnselGalleryPanel.nib */ = { isa = PBXVariantGroup; children = ( - 089C167EFE841241C02AAC07 /* English */, + B08394C1106D1077001B5E29 /* English */, ); - name = InfoPlist.strings; + name = AnselGalleryPanel.nib; sourceTree = ""; }; - B00EF5580EF5DD5900A9D71C /* AnselServers.nib */ = { + B08394C2106D1077001B5E29 /* AnselServers.nib */ = { isa = PBXVariantGroup; children = ( - B00EF5590EF5DD5900A9D71C /* English */, + B08394C3106D1077001B5E29 /* English */, ); name = AnselServers.nib; sourceTree = ""; }; - B04FC1A70EEB4A2B008EEB0E /* AnselGalleryPanel.nib */ = { + B08394C4106D1077001B5E29 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( - B04FC1A80EEB4A2B008EEB0E /* English */, + B08394C5106D1077001B5E29 /* English */, ); - name = AnselGalleryPanel.nib; + name = InfoPlist.strings; + sourceTree = ""; + }; + B08394C6106D1077001B5E29 /* Panel.nib */ = { + isa = PBXVariantGroup; + children = ( + B08394C7106D1077001B5E29 /* English */, + ); + name = Panel.nib; sourceTree = ""; }; - B0BFBC870ED5B32B006581A5 /* Localizable.strings */ = { + B08394C8106D1077001B5E29 /* ProgressSheet.nib */ = { isa = PBXVariantGroup; children = ( - B0BFBC880ED5B32B006581A5 /* English */, + B08394C9106D1077001B5E29 /* English */, ); - name = Localizable.strings; + name = ProgressSheet.nib; sourceTree = ""; }; /* End PBXVariantGroup section */ @@ -516,7 +382,7 @@ isa = XCBuildConfiguration; buildSettings = { DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = YES; + DEPLOYMENT_LOCATION = NO; FRAMEWORK_SEARCH_PATHS = ( "\"$(SRCROOT)/XMLRPC\"", "$(inherited)", @@ -529,6 +395,7 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Application Support/iPhoto/Plugins"; PRODUCT_NAME = iPhoto2Ansel; + VALID_ARCHS = "i386 x86_64 ppc64 ppc"; WRAPPER_EXTENSION = iPhotoExporter; }; name = Release; @@ -543,18 +410,18 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; INSTALL_PATH = ""; + ONLY_ACTIVE_ARCH = YES; PREBINDING = NO; SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk"; + VALID_ARCHS = "i386 x86_64"; }; name = Debug; }; 1DEB914008733D840010E9CD /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = ( - ppc, - i386, - ); + ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)"; + ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc"; DEPLOYMENT_LOCATION = NO; DSTROOT = /; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; @@ -563,64 +430,7 @@ INSTALL_PATH = ""; PREBINDING = NO; SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk"; - }; - name = Release; - }; - B0BFBC730ED5B221006581A5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DEPLOYMENT_LOCATION = NO; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_ENABLE_OBJC_GC = supported; - 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 = "@loader_path/../Frameworks"; - OTHER_LDFLAGS = ( - "-framework", - Foundation, - "-framework", - AppKit, - ); - PREBINDING = NO; - PRODUCT_NAME = XMLRPC; - ZERO_LINK = YES; - }; - name = Debug; - }; - B0BFBC740ED5B221006581A5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEPLOYMENT_LOCATION = NO; - DSTROOT = "/tmp/$(PROJECT_NAME).dst"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - GCC_ENABLE_OBJC_GC = supported; - 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; + VALID_ARCHS = "i386 x86_64"; }; name = Release; }; @@ -645,15 +455,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - B0BFBC750ED5B221006581A5 /* Build configuration list for PBXNativeTarget "XMLRPC" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B0BFBC730ED5B221006581A5 /* Debug */, - B0BFBC740ED5B221006581A5 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 089C1669FE841209C02AAC07 /* Project object */; diff --git a/iPhoto2Ansel/master_Source_ImageResizer.h b/iPhoto2Ansel/master_Source_ImageResizer.h deleted file mode 100644 index 6fa21fd2f..000000000 --- a/iPhoto2Ansel/master_Source_ImageResizer.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// Copyright Zach Wily -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, this -// list of conditions and the following disclaimer in the documentation and/or -// other materials provided with the distribution. -// -// - Neither the name of Zach Wily nor the names of its contributors may be used to -// endorse or promote products derived from this software without specific prior -// written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// - -#import - -@interface ImageResizer : NSObject { - -} - -+ (NSData*) getScaledImageFromData:(NSData*)data toSize:(NSSize)size; - -@end diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/Info.plist b/iPhoto2Ansel/xmlrpc-1.5.1/Info.plist deleted file mode 100644 index 84c452abb..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/Info.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIdentifier - com.divisiblebyzero.XMLRPC - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleSignature - ZERO - CFBundleVersion - 1.5.1 - NSPrincipalClass - - - diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/LICENSE b/iPhoto2Ansel/xmlrpc-1.5.1/LICENSE deleted file mode 100644 index f121be78b..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -== License - -= The Cocoa XML-RPC Framework is distributed under the MIT License: - -Copyright 2008 Eric Czarny - -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. diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/Languages/English.lproj/Localizable.strings b/iPhoto2Ansel/xmlrpc-1.5.1/Languages/English.lproj/Localizable.strings deleted file mode 100644 index afec4bd93..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/Languages/English.lproj/Localizable.strings +++ /dev/null @@ -1,3 +0,0 @@ -/* ENGLISH */ - -NSHumanReadableCopyright = "Cocoa XML-RPC Framework © 2008 Divisible by Zero"; diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/README b/iPhoto2Ansel/xmlrpc-1.5.1/README deleted file mode 100644 index c10d26d19..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/README +++ /dev/null @@ -1,208 +0,0 @@ -== 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 - -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 . diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPC.h b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPC.h deleted file mode 100644 index e1abb7267..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPC.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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 -#import -#import diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPC.pch b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPC.pch deleted file mode 100644 index e426375ca..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPC.pch +++ /dev/null @@ -1,33 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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 -#endif diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCConnection.h b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCConnection.h deleted file mode 100644 index ddd50259b..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCConnection.h +++ /dev/null @@ -1,73 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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 - -@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 diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCConnection.m b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCConnection.m deleted file mode 100644 index cb0b9afa5..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCConnection.m +++ /dev/null @@ -1,189 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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 diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCDecoder.h b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCDecoder.h deleted file mode 100644 index 4b42e9b23..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCDecoder.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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 - -@interface XMLRPCDecoder : NSObject { - NSXMLDocument *responseXMLDocument; - BOOL isFault; -} - -- (id)initWithData: (NSData *)data; - -#pragma mark - - -- (id)decode; - -#pragma mark - - -- (BOOL)isFault; - -@end diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCDecoder.m b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCDecoder.m deleted file mode 100644 index a4d68a9e0..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCDecoder.m +++ /dev/null @@ -1,305 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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 diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCEncoder.h b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCEncoder.h deleted file mode 100644 index d57af24cd..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCEncoder.h +++ /dev/null @@ -1,53 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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 - -@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 diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCEncoder.m b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCEncoder.m deleted file mode 100644 index d3b072792..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCEncoder.m +++ /dev/null @@ -1,285 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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: @""]; - - [buffer appendFormat: @"%@", currentXMLRPCMethod]; - - [buffer appendString: @""]; - - if (currentXMLRPCParameters != nil) { - NSEnumerator *enumerator = [currentXMLRPCParameters objectEnumerator]; - id parameter = nil; - - while (parameter = [enumerator nextObject]) { - [buffer appendString: @""]; - [buffer appendString: [self encodeObject: parameter]]; - [buffer appendString: @""]; - } - } - - [buffer appendString: @""]; - - [buffer appendString: @""]; - - 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: @"<%@>%@", 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: @""]; - - id object = nil; - - while (object = [enumerator nextObject]) { - [buffer appendString: [self encodeObject: object]]; - } - - [buffer appendString: @""]; - - return (NSString *)buffer; -} - -- (NSString *)encodeDictionary: (NSDictionary *)dictionary { - NSMutableString * buffer = [NSMutableString string]; - NSEnumerator *enumerator = [dictionary keyEnumerator]; - - [buffer appendString: @""]; - - NSString *key = nil; - - while (key = [enumerator nextObject]) { - [buffer appendString: @""]; - [buffer appendFormat: @"%@", key]; - [buffer appendString: [self encodeObject: [dictionary objectForKey: key]]]; - [buffer appendString: @""]; - } - - [buffer appendString: @""]; - - 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 diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCRequest.h b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCRequest.h deleted file mode 100644 index 3b0af918d..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCRequest.h +++ /dev/null @@ -1,73 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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 - -@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 diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCRequest.m b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCRequest.m deleted file mode 100644 index b0208c80a..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCRequest.m +++ /dev/null @@ -1,142 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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 diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCResponse.h b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCResponse.h deleted file mode 100644 index 71577c280..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCResponse.h +++ /dev/null @@ -1,60 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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 - -@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 diff --git a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCResponse.m b/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCResponse.m deleted file mode 100644 index 8ef331e12..000000000 --- a/iPhoto2Ansel/xmlrpc-1.5.1/XMLRPCResponse.m +++ /dev/null @@ -1,105 +0,0 @@ -// -// Copyright 2008 Eric Czarny -// -// 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 -- 2.11.0