From 93a16a36ac8aa0cf90c518161a4631763b3f2ece Mon Sep 17 00:00:00 2001 From: "Michael J. Rubinsky" Date: Fri, 3 Sep 2010 15:31:37 -0400 Subject: [PATCH] Support Ansel's version 2 API --- iPhoto2Ansel/AnselExportController.h | 16 +- iPhoto2Ansel/AnselExportController.m | 18 +- iPhoto2Ansel/AnselExportPluginBox.h | 15 +- iPhoto2Ansel/AnselExportPluginBox.m | 24 +- iPhoto2Ansel/ExportImageProtocol.h | 10 +- iPhoto2Ansel/ExportPluginBoxProtocol.h | 10 +- iPhoto2Ansel/ExportPluginProtocol.h | 12 +- iPhoto2Ansel/FBProgressController.h | 46 ++-- iPhoto2Ansel/FBProgressController.m | 48 ++-- iPhoto2Ansel/NSDataAdditions.h | 16 +- iPhoto2Ansel/NSDataAdditions.m | 60 ++--- iPhoto2Ansel/NSStringAdditions.h | 16 +- iPhoto2Ansel/NSStringAdditions.m | 64 ++--- .../English.lproj/Panel.nib/designable.nib | 261 +++++++++++++++++---- .../English.lproj/Panel.nib/keyedobjects.nib | Bin 36333 -> 37874 bytes iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.h | 4 +- iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.m | 4 +- iPhoto2Ansel/TURAnselKit/TURAnsel.h | 10 +- iPhoto2Ansel/TURAnselKit/TURAnsel.m | 142 ++++++----- iPhoto2Ansel/TURAnselKit/TURAnselConstants.h | 10 +- iPhoto2Ansel/TURAnselKit/TURAnselConstants.m | 22 +- iPhoto2Ansel/TURAnselKit/TURAnselGallery.h | 4 +- iPhoto2Ansel/TURAnselKit/TURAnselGallery.m | 173 ++++++++------ .../TURAnselKit/TURAnselGalleryPanelController.h | 4 +- .../TURAnselKit/TURAnselGalleryPanelController.m | 34 +-- 25 files changed, 638 insertions(+), 385 deletions(-) diff --git a/iPhoto2Ansel/AnselExportController.h b/iPhoto2Ansel/AnselExportController.h index e253b061c..4993f690e 100644 --- a/iPhoto2Ansel/AnselExportController.h +++ b/iPhoto2Ansel/AnselExportController.h @@ -1,10 +1,11 @@ -// -// AnselExportController.h -// iPhoto2Ansel -// -// Created by Michael Rubinsky on 10/23/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// +/** + * iPhoto2Ansel + * + * Copyright 2008-2010 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ #import #import @@ -35,6 +36,7 @@ IBOutlet NSButton *mNewGalleryButton; IBOutlet NSPopUpButton *mServersPopUp; IBOutlet NSTextField *mImageCountLabel; + IBOutlet NSPopUpButton *mAnselVersion; // Gallery View IBOutlet NSButton *viewGallery; diff --git a/iPhoto2Ansel/AnselExportController.m b/iPhoto2Ansel/AnselExportController.m index d4e716554..95d6d8166 100644 --- a/iPhoto2Ansel/AnselExportController.m +++ b/iPhoto2Ansel/AnselExportController.m @@ -1,7 +1,8 @@ /** * AnselExportController.m + * iPhoto2Ansel * - * Copyright 2008 The Horde Project (http://www.horde.org) + * Copyright 2008-2010 The Horde Project (http://www.horde.org) * * @license http://opensource.org/licenses/bsd-license.php * @author Michael J. Rubinsky @@ -37,6 +38,7 @@ NSString * const TURAnselServerNickKey = @"nickname"; NSString * const TURAnselServerEndpointKey = @"endpoint"; NSString * const TURAnselServerUsernameKey = @"username"; NSString * const TURAnselServerPasswordKey = @"password"; +NSString * const TURAnselServerVersionKey = @"version"; @implementation AnselExportController @@ -266,6 +268,7 @@ NSString * const TURAnselServerPasswordKey = @"password"; [mServerSheetHostURL stringValue], TURAnselServerEndpointKey, [mServerSheetUsername stringValue], TURAnselServerUsernameKey, [mServerSheetPassword stringValue], TURAnselServerPasswordKey, + [NSNumber numberWithInt: [mAnselVersion indexOfSelectedItem] + 1] , TURAnselServerVersionKey, nil]; [anselServers addObject: newServer]; [NSApp endSheet: newServerSheet]; @@ -509,12 +512,23 @@ NSString * const TURAnselServerPasswordKey = @"password"; [self setStatusText: @"Connecting..."]; [spinner startAnimation: self]; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + + // NSDictionary objects cannot contain nil objects + NSNumber *apiversion = [currentServer objectForKey: TURAnselServerVersionKey]; + if (apiversion == nil) { + apiversion = [NSNumber numberWithInt: 1]; + } NSDictionary *p = [[NSDictionary alloc] initWithObjects: [NSArray arrayWithObjects: [currentServer objectForKey:TURAnselServerEndpointKey], [currentServer objectForKey:TURAnselServerUsernameKey], [currentServer objectForKey:TURAnselServerPasswordKey], + apiversion, nil] - forKeys: [NSArray arrayWithObjects:@"endpoint", @"username", @"password", nil]]; + forKeys: [NSArray arrayWithObjects:TURAnselServerEndpointKey, + TURAnselServerUsernameKey, + TURAnselServerPasswordKey, + TURAnselServerVersionKey, + nil]]; // Create our controller anselController = [[TURAnsel alloc] initWithConnectionParameters:p]; [anselController setDelegate:self]; diff --git a/iPhoto2Ansel/AnselExportPluginBox.h b/iPhoto2Ansel/AnselExportPluginBox.h index 9bf027a56..f1678a5c2 100644 --- a/iPhoto2Ansel/AnselExportPluginBox.h +++ b/iPhoto2Ansel/AnselExportPluginBox.h @@ -1,10 +1,11 @@ -// -// AnselExportPluginBox.h -// iPhoto2Ansel -// -// Created by Michael Rubinsky on 10/23/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// +/** + * iPhoto2Ansel + * + * Copyright 2008-2010 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ #import #import "ExportPluginProtocol.h" diff --git a/iPhoto2Ansel/AnselExportPluginBox.m b/iPhoto2Ansel/AnselExportPluginBox.m index ef325f8da..c67afcc14 100644 --- a/iPhoto2Ansel/AnselExportPluginBox.m +++ b/iPhoto2Ansel/AnselExportPluginBox.m @@ -1,14 +1,12 @@ -// -// AnselExportPluginBox.m -// iPhoto2Ansel -// -// Generic PluginBox handles Enter key presses to initiate the -// export. -// -// Created by Michael Rubinsky on 10/23/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - +/** + * AnselExportPluginBox.m + * iPhoto2Ansel + * + * Copyright 2008-2010 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ #import "AnselExportPluginBox.h" @implementation AnselExportPluginBox @@ -18,7 +16,7 @@ { NSString *keyString = [anEvent charactersIgnoringModifiers]; unichar keyChar = [keyString characterAtIndex:0]; - + switch (keyChar) { case NSFormFeedCharacter: @@ -32,7 +30,7 @@ default: break; } - + return([super performKeyEquivalent:anEvent]); } @end diff --git a/iPhoto2Ansel/ExportImageProtocol.h b/iPhoto2Ansel/ExportImageProtocol.h index d9334f619..37180dfb4 100755 --- a/iPhoto2Ansel/ExportImageProtocol.h +++ b/iPhoto2Ansel/ExportImageProtocol.h @@ -1,16 +1,16 @@ /* File: ExportImageProtocol.h - + Contains: iPhoto Plug-ins interfaces: Protocol for image exporting - + Version: Technology: iPhoto Release: 1.0 - + Copyright: © 2002-2007 by Apple Inc. All rights reserved. - + Bugs?: For bug reports, consult the following page on the World Wide Web: - + http://developer.apple.com/bugreporter/ */ diff --git a/iPhoto2Ansel/ExportPluginBoxProtocol.h b/iPhoto2Ansel/ExportPluginBoxProtocol.h index cf9f9ac39..8761d147d 100755 --- a/iPhoto2Ansel/ExportPluginBoxProtocol.h +++ b/iPhoto2Ansel/ExportPluginBoxProtocol.h @@ -1,16 +1,16 @@ /* File: ExportPluginBoxProtocol.h - + Contains: iPhoto Plug-ins interfaces: Export plugin box expected format and methods - + Version: Technology: iPhoto Release: 1.0 - + Copyright: © 2002-2007 by Apple Inc. All rights reserved. - + Bugs?: For bug reports, consult the following page on the World Wide Web: - + http://developer.apple.com/bugreporter/ */ diff --git a/iPhoto2Ansel/ExportPluginProtocol.h b/iPhoto2Ansel/ExportPluginProtocol.h index 96bdbff02..9e18ea272 100755 --- a/iPhoto2Ansel/ExportPluginProtocol.h +++ b/iPhoto2Ansel/ExportPluginProtocol.h @@ -1,16 +1,16 @@ /* File: ExportPluginProtocol.h - + Contains: iPhoto Plug-ins interfaces: Export plugin expected format and methods - + Version: Technology: iPhoto Release: 1.0 - + Copyright: © 2002-2007 by Apple Inc. All rights reserved. - + Bugs?: For bug reports, consult the following page on the World Wide Web: - + http://developer.apple.com/bugreporter/ */ @@ -88,7 +88,7 @@ typedef struct // This selector may be called from within a separate NSThread. // Perform the export with the current settings to . - // It will periodically send the selector a + // It will periodically send the selector a // progress message in the form of a pointer to a ExportPluginProgress structure. - (void)performExport:(NSString *)path; diff --git a/iPhoto2Ansel/FBProgressController.h b/iPhoto2Ansel/FBProgressController.h index 4fb61bd4d..7ae55df0c 100644 --- a/iPhoto2Ansel/FBProgressController.h +++ b/iPhoto2Ansel/FBProgressController.h @@ -2,35 +2,35 @@ * Facebook Exporter for iPhoto Software License * Copyright 2007, Facebook, Inc. * All rights reserved. - * Permission is hereby granted, free of charge, to any person or organization - * obtaining a copy of the software and accompanying documentation covered by - * this license (which, together with any graphical images included with such - * software, are collectively referred to below as the “Software”) to (a) use, - * reproduce, display, distribute, execute, and transmit the Software, (b) - * prepare derivative works of the Software (excluding any graphical images - * included with the Software, which may not be modified or altered), and (c) - * permit third-parties to whom the Software is furnished to do so, all + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (which, together with any graphical images included with such + * software, are collectively referred to below as the “Software”) to (a) use, + * reproduce, display, distribute, execute, and transmit the Software, (b) + * prepare derivative works of the Software (excluding any graphical images + * included with the Software, which may not be modified or altered), and (c) + * permit third-parties to whom the Software is furnished to do so, all * subject to the following: * - * - Redistributions of source code must retain the above copyright notice, + * - 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 + * - 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 Facebook, Inc. nor the names of its contributors may - * be used to endorse or promote products derived from this software without + * - Neither the name of Facebook, Inc. 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 + * 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. * */ diff --git a/iPhoto2Ansel/FBProgressController.m b/iPhoto2Ansel/FBProgressController.m index 30be30b43..ea1c0daa3 100644 --- a/iPhoto2Ansel/FBProgressController.m +++ b/iPhoto2Ansel/FBProgressController.m @@ -2,35 +2,35 @@ * Facebook Exporter for iPhoto Software License * Copyright 2007, Facebook, Inc. * All rights reserved. - * Permission is hereby granted, free of charge, to any person or organization - * obtaining a copy of the software and accompanying documentation covered by - * this license (which, together with any graphical images included with such - * software, are collectively referred to below as the “Software”) to (a) use, - * reproduce, display, distribute, execute, and transmit the Software, (b) - * prepare derivative works of the Software (excluding any graphical images - * included with the Software, which may not be modified or altered), and (c) - * permit third-parties to whom the Software is furnished to do so, all + * Permission is hereby granted, free of charge, to any person or organization + * obtaining a copy of the software and accompanying documentation covered by + * this license (which, together with any graphical images included with such + * software, are collectively referred to below as the “Software”) to (a) use, + * reproduce, display, distribute, execute, and transmit the Software, (b) + * prepare derivative works of the Software (excluding any graphical images + * included with the Software, which may not be modified or altered), and (c) + * permit third-parties to whom the Software is furnished to do so, all * subject to the following: * - * - Redistributions of source code must retain the above copyright notice, + * - 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 + * - 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 Facebook, Inc. nor the names of its contributors may - * be used to endorse or promote products derived from this software without + * - Neither the name of Facebook, Inc. 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 + * 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. * */ @@ -78,7 +78,7 @@ NSString* const CompleteStatus = @"Export completed!"; [progressIndicator setIndeterminate: YES]; [progressIndicator startAnimation: nil]; [self setStatus: @"Started export"]; - + [NSApp beginSheet: progressPanel modalForWindow: [fbExport window] modalDelegate: nil didEndSelector: nil contextInfo: nil]; } diff --git a/iPhoto2Ansel/NSDataAdditions.h b/iPhoto2Ansel/NSDataAdditions.h index a0f6acb1b..b745010cb 100644 --- a/iPhoto2Ansel/NSDataAdditions.h +++ b/iPhoto2Ansel/NSDataAdditions.h @@ -1,16 +1,16 @@ -// +// // 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 @@ -18,15 +18,15 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. -// +// -// +// // Cocoa XML-RPC Framework // NSDataAdditions.h -// +// // Created by Eric Czarny on Wednesday, January 14, 2004. // Copyright 2008 Divisible by Zero. -// +// #import diff --git a/iPhoto2Ansel/NSDataAdditions.m b/iPhoto2Ansel/NSDataAdditions.m index 4b3c076f4..ae898595a 100644 --- a/iPhoto2Ansel/NSDataAdditions.m +++ b/iPhoto2Ansel/NSDataAdditions.m @@ -1,16 +1,16 @@ -// +// // 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 @@ -18,15 +18,15 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. -// +// -// +// // Cocoa XML-RPC Framework // NSDataAdditions.m -// +// // Created by Eric Czarny on Wednesday, January 14, 2004. // Copyright 2008 Divisible by Zero. -// +// #import "NSDataAdditions.h" @@ -39,30 +39,30 @@ Boolean flignore, flendtext = false; const char *temporary; NSMutableData *result; - + if (string == nil) { return [NSData data]; } - + ixtext = 0; - + temporary = [string UTF8String]; - + lentext = [string length]; - + result = [NSMutableData dataWithCapacity: lentext]; - + ixinput = 0; - + while (true) { if (ixtext >= lentext) { break; } - + ch = temporary[ixtext++]; - + flignore = false; - + if ((ch >= 'A') && (ch <= 'Z')) { ch = ch - 'A'; } else if ((ch >= 'a') && (ch <= 'z')) { @@ -76,49 +76,49 @@ } else if (ch == '/') { ch = 63; } else { - flignore = true; + flignore = true; } - + if (!flignore) { short ctcharsinput = 3; Boolean flbreak = false; - + if (flendtext) { if (ixinput == 0) { break; } - + if ((ixinput == 1) || (ixinput == 2)) { ctcharsinput = 1; } else { ctcharsinput = 2; } - + ixinput = 3; - + flbreak = true; } - + input[ixinput++] = ch; - + if (ixinput == 4) { ixinput = 0; - + output[0] = (input[0] << 2) | ((input[1] & 0x30) >> 4); output[1] = ((input[1] & 0x0F) << 4) | ((input[2] & 0x3C) >> 2); output[2] = ((input[2] & 0x03) << 6) | (input[3] & 0x3F); - + for (i = 0; i < ctcharsinput; i++) { [result appendBytes: &output[i] length: 1]; } } - + if (flbreak) { break; } } } - + return result; } diff --git a/iPhoto2Ansel/NSStringAdditions.h b/iPhoto2Ansel/NSStringAdditions.h index b4776f961..2abc2200e 100644 --- a/iPhoto2Ansel/NSStringAdditions.h +++ b/iPhoto2Ansel/NSStringAdditions.h @@ -1,16 +1,16 @@ -// +// // 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 @@ -18,15 +18,15 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. -// +// -// +// // Cocoa XML-RPC Framework // NSStringAdditions.h -// +// // Created by Eric Czarny on Wednesday, January 14, 2004. // Copyright 2008 Divisible by Zero. -// +// #import diff --git a/iPhoto2Ansel/NSStringAdditions.m b/iPhoto2Ansel/NSStringAdditions.m index 22387b952..056610378 100644 --- a/iPhoto2Ansel/NSStringAdditions.m +++ b/iPhoto2Ansel/NSStringAdditions.m @@ -1,16 +1,16 @@ -// +// // 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 @@ -18,15 +18,15 @@ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS // IN THE SOFTWARE. -// +// -// +// // Cocoa XML-RPC Framework // NSStringAdditions.m -// +// // Created by Eric Czarny on Wednesday, January 14, 2004. // Copyright 2008 Divisible by Zero. -// +// #import "NSDataAdditions.h" @@ -47,72 +47,72 @@ static char base64EncodingTable[64] = { short i, charsonline = 0, ctcopy; const unsigned char *raw; NSMutableString *result; - + lentext = [data length]; - + if (lentext < 1) { return @""; } - + result = [NSMutableString stringWithCapacity: lentext]; - + raw = [data bytes]; - - ixtext = 0; - + + ixtext = 0; + while (true) { ctremaining = lentext - ixtext; - + if (ctremaining <= 0) { break; } - - for (i = 0; i < 3; i++) { + + for (i = 0; i < 3; i++) { unsigned long ix = ixtext + i; - + if (ix < lentext) { input[i] = raw[ix]; } else { input[i] = 0; } } - + output[0] = (input[0] & 0xFC) >> 2; output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4); output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6); output[3] = input[2] & 0x3F; - + ctcopy = 4; - + switch (ctremaining) { - case 1: - ctcopy = 2; + case 1: + ctcopy = 2; break; - case 2: - ctcopy = 3; + case 2: + ctcopy = 3; break; } - + for (i = 0; i < ctcopy; i++) { [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]]; } - + for (i = ctcopy; i < 4; i++) { [result appendString: @"="]; } - + ixtext += 3; charsonline += 4; - + if (length > 0) { if (charsonline >= length) { charsonline = 0; - + [result appendString: @"\n"]; } } } - + return result; } diff --git a/iPhoto2Ansel/Resources/English.lproj/Panel.nib/designable.nib b/iPhoto2Ansel/Resources/English.lproj/Panel.nib/designable.nib index a0d9f6767..6bed80b35 100644 --- a/iPhoto2Ansel/Resources/English.lproj/Panel.nib/designable.nib +++ b/iPhoto2Ansel/Resources/English.lproj/Panel.nib/designable.nib @@ -2,10 +2,10 @@ 1050 - 10B504 - 732 - 1038.2 - 437.00 + 10F569 + 762 + 1038.29 + 461.00 YES @@ -15,13 +15,14 @@ YES - 732 + 762 1.1 YES + YES @@ -51,21 +52,21 @@ 23 2 - {{196, 315}, {455, 195}} + {{196, 281}, {455, 229}} -1543503872 Add Server NSPanel {1.79769e+308, 1.79769e+308} - + 256 YES 268 - {{124, 124}, {311, 22}} + {{124, 158}, {311, 22}} YES @@ -102,7 +103,7 @@ 268 - {{17, 126}, {102, 17}} + {{17, 160}, {102, 17}} YES @@ -131,7 +132,7 @@ 268 - {{124, 92}, {311, 22}} + {{124, 126}, {311, 22}} YES @@ -148,7 +149,7 @@ 268 - {{124, 60}, {311, 22}} + {{124, 94}, {311, 22}} YES @@ -169,7 +170,7 @@ 268 - {{17, 94}, {67, 17}} + {{17, 128}, {67, 17}} YES @@ -185,7 +186,7 @@ 268 - {{17, 62}, {67, 17}} + {{17, 96}, {67, 17}} YES @@ -201,7 +202,7 @@ 268 - {{17, 158}, {102, 17}} + {{17, 192}, {102, 17}} YES @@ -217,7 +218,7 @@ 268 - {{124, 156}, {311, 22}} + {{124, 190}, {311, 22}} YES @@ -274,7 +275,7 @@ 268 - {{18, 18}, {145, 18}} + {{18, 21}, {145, 18}} YES @@ -298,8 +299,87 @@ 25 + + + 268 + {{17, 71}, {67, 17}} + + YES + + 68288064 + 272630784 + Version + + + + + + + + + 268 + {{121, 65}, {100, 26}} + + YES + + -2076049856 + 2048 + + + 109199615 + 129 + + + 400 + 75 + + + 2.x + + 1048576 + 2147483647 + 1 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + _popUpItemAction: + + + YES + + OtherViews + + YES + + + 1.x + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + + + 1 + 1 + YES + YES + 2 + + - {455, 195} + {455, 229} + {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} @@ -547,7 +627,6 @@ - QSAAAEEgAABBmAAAQZgAAA @@ -606,7 +685,7 @@ {1.79769e+308, 1.79769e+308} - + 256 YES @@ -615,7 +694,6 @@ 268 {{370, 12}, {96, 32}} - YES 67239424 @@ -730,6 +808,7 @@ NSTypedFilenamesPboardType:SGI NSTypedFilenamesPboardType:SR2 NSTypedFilenamesPboardType:SRF + NSTypedFilenamesPboardType:SRW NSTypedFilenamesPboardType:TARGA NSTypedFilenamesPboardType:TGA NSTypedFilenamesPboardType:TIF @@ -792,6 +871,7 @@ NSTypedFilenamesPboardType:sgi NSTypedFilenamesPboardType:sr2 NSTypedFilenamesPboardType:srf + NSTypedFilenamesPboardType:srw NSTypedFilenamesPboardType:targa NSTypedFilenamesPboardType:tga NSTypedFilenamesPboardType:tif @@ -803,7 +883,6 @@ {423, 337} - NO YES YES @@ -820,7 +899,6 @@ {{1, 1}, {423, 337}} - @@ -831,7 +909,6 @@ 256 {{424, 1}, {15, 337}} - _doScroller: 1 @@ -842,7 +919,6 @@ 256 {{1, 338}, {423, 15}} - 1 _doScroller: @@ -851,7 +927,6 @@ {{20, 60}, {440, 354}} - 50 @@ -861,8 +936,6 @@ {480, 413} - - {{0, 0}, {1920, 1178}} {1.79769e+308, 1.79769e+308} @@ -952,14 +1025,8 @@ 1048576 2147483647 1 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - + + _popUpItemAction: @@ -1264,8 +1331,8 @@ 1048576 2147483647 1 - - + + _popUpItemAction: 2 @@ -1283,8 +1350,8 @@ 1048576 2147483647 - - + + _popUpItemAction: @@ -1294,8 +1361,8 @@ 1048576 2147483647 - - + + _popUpItemAction: 1 @@ -1307,8 +1374,8 @@ 1048576 2147483647 - - + + _popUpItemAction: 3 @@ -1706,6 +1773,14 @@ 583 + + + mAnselVersion + + + + 641 + @@ -1760,6 +1835,8 @@ + + @@ -2411,6 +2488,58 @@ + + 626 + + + YES + + + + + + 627 + + + + + 634 + + + YES + + + + + + 635 + + + YES + + + + + + 636 + + + YES + + + + + + + 637 + + + + + 638 + + + @@ -2553,6 +2682,14 @@ 582.IBPluginDependency 6.IBPluginDependency 6.ImportedFromIB2 + 626.IBPluginDependency + 627.IBPluginDependency + 634.IBPluginDependency + 635.IBPluginDependency + 636.IBEditorWindowLastContentRect + 636.IBPluginDependency + 637.IBPluginDependency + 638.IBPluginDependency 7.CustomClassName 7.IBPluginDependency 7.ImportedFromIB2 @@ -2595,9 +2732,9 @@ - {{351, 386}, {455, 195}} + {{226, 873}, {455, 229}} com.apple.InterfaceBuilder.CocoaPlugin - {{351, 386}, {455, 195}} + {{226, 873}, {455, 229}} com.apple.InterfaceBuilder.CocoaPlugin @@ -2653,9 +2790,9 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{1069, 745}, {548, 406}} + {{433, 614}, {548, 406}} com.apple.InterfaceBuilder.CocoaPlugin - {{1069, 745}, {548, 406}} + {{433, 614}, {548, 406}} {213, 107} @@ -2697,6 +2834,14 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{336, 921}, {100, 43}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin AnselExportPluginBox com.apple.InterfaceBuilder.CocoaPlugin @@ -2720,7 +2865,7 @@ - 625 + 641 @@ -2737,6 +2882,7 @@ defaultImageView firstView galleryCombo + mAnselVersion mImageCountLabel mMakeNewServerDefault mNewGalleryButton @@ -2762,6 +2908,7 @@ NSImageView NSControl NSComboBox + NSPopUpButton NSTextField NSButton NSButton @@ -3105,6 +3252,7 @@ 0 + IBCocoaFramework com.apple.InterfaceBuilder.CocoaPlugin.macosx @@ -3118,7 +3266,22 @@ YES - ../iPhoto2Ansel.xcodeproj + ../../iPhoto2Ansel.xcodeproj 3 + + YES + + YES + NSMenuCheckmark + NSMenuMixedState + NSSwitch + + + YES + {9, 8} + {7, 2} + {15, 15} + + diff --git a/iPhoto2Ansel/Resources/English.lproj/Panel.nib/keyedobjects.nib b/iPhoto2Ansel/Resources/English.lproj/Panel.nib/keyedobjects.nib index 8eb1ec6ed3d36c1d05f5428b4b9d5267162983d7..6d91891a2082350919569ea5400646c127a9d767 100644 GIT binary patch literal 37874 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 @@ -10,7 +10,7 @@ #import #import -@interface AnselGalleryViewItem: NSObject +@interface AnselGalleryViewItem: NSObject { NSURL *image; NSString *imageID; diff --git a/iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.m b/iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.m index 42edf5b21..15aed58cc 100644 --- a/iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.m +++ b/iPhoto2Ansel/TURAnselKit/AnselGalleryViewItem.m @@ -5,7 +5,7 @@ * remote Ansel gallery in an IKImageBrowser. * * Copyright 2009-2010 The Horde Project (http://www.horde.org) - * + * * @implements IKImageBrowserItem * @license http://opensource.org/licenses/bsd-license.php * @author Michael J. Rubinsky @@ -25,7 +25,7 @@ imageID = [[theURL absoluteString] retain]; imageTitle = [theTitle retain]; imageDate = [theDate retain]; - return self; + return self; } - (void)dealloc { diff --git a/iPhoto2Ansel/TURAnselKit/TURAnsel.h b/iPhoto2Ansel/TURAnselKit/TURAnsel.h index e89702709..c3ea089c9 100644 --- a/iPhoto2Ansel/TURAnselKit/TURAnsel.h +++ b/iPhoto2Ansel/TURAnselKit/TURAnsel.h @@ -2,7 +2,7 @@ * TURAnsel * * Copyright 2009-2010 The Horde Project (http://www.horde.org) - * + * * @license http://opensource.org/licenses/bsd-license.php * @author Michael J. Rubinsky */ @@ -33,12 +33,14 @@ typedef enum { @interface TURAnsel : NSObject #else @interface TURAnsel : NSObject -#endif +#endif { NSString *userAgent; NSString *rpcEndPoint; NSString *username; NSString *password; + NSString *version; + NSMutableArray *galleryList; TURAnselState state; id delegate; @@ -48,6 +50,7 @@ typedef enum { @property (readwrite, retain) NSString *rpcEndPoint; @property (readwrite, retain) NSString *username; @property (readwrite, retain) NSString *password; +@property (readwrite, retain) NSString *version; - (id)initWithConnectionParameters: (NSDictionary *)params; - (void)connect; @@ -62,4 +65,7 @@ typedef enum { - (TURAnselState)state; - (id)delegate; - (void)setDelegate: (id)newDelegate; + +- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox; +- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index; @end diff --git a/iPhoto2Ansel/TURAnselKit/TURAnsel.m b/iPhoto2Ansel/TURAnselKit/TURAnsel.m index 31560d192..506cfacb5 100644 --- a/iPhoto2Ansel/TURAnselKit/TURAnsel.m +++ b/iPhoto2Ansel/TURAnselKit/TURAnsel.m @@ -4,7 +4,7 @@ * Main class for interacting with a remote Ansel server. * * Copyright 2009-2010 The Horde Project (http://www.horde.org) - * + * * @license http://opensource.org/licenses/bsd-license.php * @author Michael J. Rubinsky */ @@ -20,6 +20,7 @@ @synthesize rpcEndPoint; @synthesize username; @synthesize password; +@synthesize version; #pragma mark - #pragma mark init/dealloc @@ -27,9 +28,9 @@ { [super init]; galleryList = [[NSMutableArray alloc] init]; - + // Initialize the connection properties, KVC style - [self setValue:[params objectForKey:@"endpoint"] + [self setValue:[params objectForKey:@"endpoint"] forKey: @"rpcEndPoint"]; [self setValue: [params objectForKey:@"username"] forKey: @"username"]; @@ -37,24 +38,27 @@ forKey: @"password"]; [self setValue: @"The Ansel Cocoa XML-RPC Client" forKey: @"userAgent"]; - + [self setValue: [params objectForKey:@"version"] + forKey: @"version"]; + return self; } -(void) dealloc { - NSLog(@"TURAnsel dealloc"); + NSLog(@"TURAnsel dealloc"); [galleryList removeAllObjects]; [galleryList release]; [rpcEndPoint release]; [username release]; [password release]; [userAgent release]; + [version release]; [super dealloc]; } #pragma mark - #pragma mark Actions -- (void)connect +- (void)connect { [self doLogin]; } @@ -72,37 +76,45 @@ */ - (NSDictionary *)createNewGallery: (NSDictionary *)params { - NSArray *apiparams = [NSArray arrayWithObjects: @"ansel", params, nil]; - NSArray *order = [NSArray arrayWithObjects: kTURAnselAPIParamScope, kTURAnselAPIParamGaleryParams, nil]; - + NSArray *apiparams; + NSArray *order; + + if ([[self valueForKey: @"version"] intValue] == 2) { + apiparams = [NSArray arrayWithObjects: params, nil]; + order = [NSArray arrayWithObjects: kTURAnselAPIParamGalleryParams, nil]; + } else { + apiparams = [NSArray arrayWithObjects: @"ansel", params, nil]; + order = [NSArray arrayWithObjects: kTURAnselAPIParamScope, kTURAnselAPIParamGalleryParams, nil]; + } + NSDictionary *response = [self callRPCMethod: @"images.createGallery" withParams: apiparams withOrder: order]; - + if (response) { - NSNumber *gallery_id = [response objectForKey: (NSString *)kWSMethodInvocationResult]; + 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. - * + * 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 @@ -118,15 +130,15 @@ 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, @@ -140,26 +152,23 @@ (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); + rpcCall = WSMethodInvocationCreate((CFURLRef)url, (CFStringRef)methodName, kWSXMLRPCProtocol); WSMethodInvocationSetParameters(rpcCall, (CFDictionaryRef)values, (CFArrayRef)order); WSMethodInvocationSetProperty(rpcCall, kWSHTTPMessage, request); NSDictionary *result = (NSDictionary *)WSMethodInvocationInvoke(rpcCall); @@ -183,9 +192,9 @@ error = [NSError errorWithDomain: @"TURAnsel" code: [faultCode intValue] userInfo: [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat: @"There was an error contacting the Ansel server: %@, %@", resStatusLine, faultString], @"NSLocalizedDescriptionKey", nil]]; - - - } + + + } [resStatusLine release]; } else { // No response @@ -197,30 +206,36 @@ userInfo: [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat: @"There was an error contacting the Ansel server: %@", faultString], @"NSLocalizedDescriptionKey", nil]]; } - + if ([[self delegate] respondsToSelector: @selector(TURAnselHadError:)]) { [[self delegate] TURAnselHadError: error]; } [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 +/** + * Fetch a gallery by it's id. + * + * @param NSString galleryId The gallery's id. + * + * @return TURAnselGallery Then gallery object. + */ - (TURAnselGallery *)getGalleryById: (NSString *)galleryId { for (TURAnselGallery *g in galleryList) { @@ -228,13 +243,17 @@ 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. + * + * @param NSInteger index The index into the storage array. + * + * @return TURAnselGallery The galley obejct located at the specified index. */ - (TURAnselGallery *)getGalleryByIndex: (NSInteger)index { @@ -248,7 +267,6 @@ { return [galleryList count]; } - - (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index { @@ -266,11 +284,9 @@ { state = newstate; } - - (id)delegate { - return delegate; + return delegate; } - - (void)setDelegate:(id)newDelegate { delegate = newDelegate; } @@ -284,24 +300,34 @@ */ - (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]; - + NSArray *params; + NSArray *order; + + if ([[self valueForKey: @"version"] intValue] == 2) { + params = [NSArray arrayWithObjects: [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithInt: PERMS_EDIT], @"perm", + [self valueForKey:@"username"], @"filter", + nil], + nil]; + order = [NSArray arrayWithObjects: kTURAnselAPIParamSingleParameter, nil]; + } else { + // Assume it's version 1.x + params = [NSArray arrayWithObjects: + @"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. + + 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) { @@ -312,15 +338,13 @@ [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 +@end diff --git a/iPhoto2Ansel/TURAnselKit/TURAnselConstants.h b/iPhoto2Ansel/TURAnselKit/TURAnselConstants.h index 1b6a56b49..757bdeaab 100644 --- a/iPhoto2Ansel/TURAnselKit/TURAnselConstants.h +++ b/iPhoto2Ansel/TURAnselKit/TURAnselConstants.h @@ -2,14 +2,14 @@ * TURAnselConstants * * Copyright 2009-2010 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 kTURAnselAPIParamGalleryParams; extern NSString * const kTURAnselAPIParamPerms; extern NSString * const kTURAnselAPIParamParent; extern NSString * const kTURAnselAPIParamAllLevels; @@ -25,6 +25,12 @@ extern NSString * const kTURAnselAPIParamSetAsDefault; extern NSString * const kTURAnselAPIParamAdditionalData; extern NSString * const kTURAnselAPIParamEncoding; +// Constants specific to Ansel version 2 API parameters. +extern NSString * const kTURAnselAPIParamSingleParameter; +extern NSString * const kTURAnselAPIParamView; +extern NSString * const kTURAnselAPIParamFull; +extern NSString * const kTURAnselAPIParamEncoding; + // Constants for the dictionary keys used to describe/create TURAnselGallery extern NSString * const kTURAnselGalleryKeyId; extern NSString * const kTURAnselGalleryKeyName; diff --git a/iPhoto2Ansel/TURAnselKit/TURAnselConstants.m b/iPhoto2Ansel/TURAnselKit/TURAnselConstants.m index 74472bb5f..a0162b925 100644 --- a/iPhoto2Ansel/TURAnselKit/TURAnselConstants.m +++ b/iPhoto2Ansel/TURAnselKit/TURAnselConstants.m @@ -1,16 +1,18 @@ -// -// TURAnselConstants.m -// ApertureToAnselExportPlugin -// -// Created by Michael Rubinsky on 9/22/09. -// Copyright 2009 __MyCompanyName__. All rights reserved. -// +/** + * TURAnselConstants.m + * ApertureToAnselExportPlugin + * + * Copyright 2009-2010 The Horde Project (http://www.horde.org) + * + * @license http://opensource.org/licenses/bsd-license.php + * @author Michael J. Rubinsky + */ #import "TURAnselConstants.h" // Constants for the API parameter names. NSString * const kTURAnselAPIParamScope = @"scope"; -NSString * const kTURAnselAPIParamGaleryParams = @"galleryParams"; +NSString * const kTURAnselAPIParamGalleryParams = @"galleryParams"; NSString * const kTURAnselAPIParamPerms = @"perms"; NSString * const kTURAnselAPIParamParent = @"parent"; NSString * const kTURAnselAPIParamAllLevels = @"allLevels"; @@ -26,6 +28,10 @@ NSString * const kTURAnselAPIParamSetAsDefault = @"default"; NSString * const kTURAnselAPIParamAdditionalData = @"additionalData"; NSString * const kTURAnselAPIParamEncoding = @"encoding"; +NSString * const kTURAnselAPIParamSingleParameter = @"params"; +NSString * const kTURAnselAPIParamView = @"view"; +NSString * const kTURAnselAPIParamFull = @"full"; + // Ansel gallery attribtues. NSString * const kTURAnselGalleryKeyId = @"share_id"; NSString * const kTURAnselGalleryKeyName = @"attribute_name"; diff --git a/iPhoto2Ansel/TURAnselKit/TURAnselGallery.h b/iPhoto2Ansel/TURAnselKit/TURAnselGallery.h index dfb31436e..e077773cc 100644 --- a/iPhoto2Ansel/TURAnselKit/TURAnselGallery.h +++ b/iPhoto2Ansel/TURAnselKit/TURAnselGallery.h @@ -2,7 +2,7 @@ * TURAnselGallery * * Copyright 2009-2010 The Horde Project (http://www.horde.org) - * + * * @license http://opensource.org/licenses/bsd-license.php * @author Michael J. Rubinsky */ @@ -36,7 +36,7 @@ - (void)setDelegate: (id)newDelegate; - (id)delegate; - (NSURL *)galleryKeyImageURL; -- (id)listImages; +- (NSMutableArray *)listImages; - (int)galleryId; - (void)setAnselController:(TURAnsel *)newController; @end \ No newline at end of file diff --git a/iPhoto2Ansel/TURAnselKit/TURAnselGallery.m b/iPhoto2Ansel/TURAnselKit/TURAnselGallery.m index c6f945e63..75130d158 100644 --- a/iPhoto2Ansel/TURAnselKit/TURAnselGallery.m +++ b/iPhoto2Ansel/TURAnselKit/TURAnselGallery.m @@ -2,7 +2,7 @@ * TURAnselGallery.m * * Copyright 2009-2010 The Horde Project (http://www.horde.org) - * + * * @license http://opensource.org/licenses/bsd-license.php * @author Michael J. Rubinsky */ @@ -23,7 +23,7 @@ #pragma mark - #pragma mark init/dealloc /** - * Init a gallery object + * Initialize a gallery object */ - (id)initWithObject:(id)galleryData controller:(TURAnsel *)controller { @@ -35,7 +35,7 @@ [self setValue:[galleryData valueForKey: kTURAnselGalleryKeyName] forKey:@"galleryName"]; [self setValue: [galleryData valueForKey: kTURAnselGalleryKeyImages] - forKey:@"galleryImageCount"]; + forKey:@"galleryImageCount"]; [self setValue: [galleryData valueForKey: kTURAnselGalleryKeyDefaultImage] forKey:@"galleryKeyImage"]; [self setAnselController: controller]; @@ -46,16 +46,16 @@ NSLog(@"TURAnselGallery dealloc called on Gallery %@", self); [anselController release]; anselController = nil; - + [galleryKeyImageURL release]; galleryKeyImageURL = nil; - + [imageList release]; imageList = nil; - + [super dealloc]; } -- (id)description +- (id)description { NSString *text = [NSString stringWithFormat:@"Description: %@ Id: %d has: %d images", galleryName, _galleryId, galleryImageCount]; return text; @@ -66,37 +66,51 @@ /** * 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). + * from the images.listGalleries call). + * + * @return NSURL The url object */ - (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 *params; + NSArray *order; + if ([[anselController valueForKey:@"version"] intValue] == 2) { + // Version 2 API + params = [NSArray arrayWithObjects: + [NSNumber numberWithInt: galleryKeyImage], + [NSDictionary dictionaryWithObjectsAndKeys: @"thumb", kTURAnselAPIParamView, [NSNumber numberWithBool:YES], kTURAnselAPIParamFull, nil], + nil]; + order = [NSArray arrayWithObjects: kTURAnselAPIParamImageId, + kTURAnselAPIParamSingleParameter, + nil]; + } else { + params = [NSArray arrayWithObjects: + @"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]; - + 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; } } @@ -104,39 +118,46 @@ /** * Get the complete list of image ids and URLs */ -- (id)listImages +- (NSMutableArray *)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]; - + if (![imageList count]) { + NSArray *params; + NSArray *order; + +// if ([[anselController valueForKey:@"version"] intValue] == 2) { +// listImages hasn't been refactored yet in version 2 API +// } else { + params = [NSArray arrayWithObjects: + @"ansel", //Scope + [NSNumber numberWithInt: _galleryId], //Gallery Id + [NSNumber numberWithInt: 2], //PERMS_SHOW + @"thumb", // Thumbnail + [NSNumber numberWithBool:YES], // Full path + nil]; + 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]; - + if ([[anselController valueForKey:@"version"] intValue] == 2) { + // images.listImages returns a hash in version 2, not an array + imageList = [NSMutableArray arrayWithArray: [[[response objectForKey: (id)kWSMethodInvocationResult] retain] allValues]]; + } else { + imageList = [[response objectForKey: (id)kWSMethodInvocationResult] retain]; + } NSLog(@"listImages: %@", imageList); - - return imageList; } } - - return nil; + + return imageList;; } - + /** * Upload the provided image to this gallery. */ @@ -182,35 +203,47 @@ #pragma mark PrivateAPI - (void)doUpload:(NSDictionary *)imageParameters { - // Need to build the params array now. - NSArray *params = [[NSArray alloc] initWithObjects: + + NSArray *params; + NSArray *order; + + if ([[anselController valueForKey:@"version"] intValue] == 2) { + params = [NSArray arrayWithObjects: [NSNumber numberWithInt: _galleryId], + [imageParameters valueForKey: @"data"], + [NSDictionary dictionaryWithObjectsAndKeys:@"base64", kTURAnselAPIParamEncoding, nil], + nil]; + order = [NSArray arrayWithObjects: kTURAnselAPIParamGalleryId, + kTURAnselAPIParamImageData, + kTURAnselAPIParamSingleParameter, + nil]; + } else { + params = [NSArray arrayWithObjects: @"ansel", // app [NSNumber numberWithInt: _galleryId], // gallery_id - [imageParameters valueForKey: @"data"], // image data array + [imageParameters valueForKey: @"data"], // image data array [imageParameters valueForKey: @"default"], // set as default? - @"", // Additional gallery data to set? - @"base64", // Image data encoding + @"", // 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]; - } + 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/TURAnselKit/TURAnselGalleryPanelController.h b/iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.h index 2def0264e..d11d39fa1 100644 --- a/iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.h +++ b/iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.h @@ -2,7 +2,7 @@ * TURAnselGalleryPanelController * * Copyright 2009-2010 The Horde Project (http://www.horde.org) - * + * * @license http://opensource.org/licenses/bsd-license.php * @author Michael J. Rubinsky */ @@ -19,7 +19,7 @@ IBOutlet NSTextField *gallerySlugTextField; IBOutlet NSTextField *galleryDescTextField; IBOutlet NSPanel *newGallerySheet; - + // Instance members TURAnsel *_anselController; NSWindow *_controllerWindow; diff --git a/iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.m b/iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.m index 988d1b137..e7c375669 100644 --- a/iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.m +++ b/iPhoto2Ansel/TURAnselKit/TURAnselGalleryPanelController.m @@ -4,7 +4,7 @@ * Controller for handling the form that creates new remote Ansel galleries. * * Copyright 2009-2010 The Horde Project (http://www.horde.org) - * + * * @license http://opensource.org/licenses/bsd-license.php * @author Michael J. Rubinsky */ @@ -20,23 +20,23 @@ _anselController = [theController retain]; [NSBundle loadNibNamed: @"AnselGalleryPanel" owner: self]; - + return self; } - (id)initWithController: (TURAnsel *)theController - withGalleryName: (NSString *)galleryName + withGalleryName: (NSString *)galleryName { - + [super init]; _anselController = [theController retain]; [NSBundle loadNibNamed: @"AnselGalleryPanel" owner: self]; - + [galleryNameTextField setStringValue: galleryName]; - - return self; + + return self; } -- (void)dealloc +- (void)dealloc { [_anselController release]; [_controllerWindow release]; @@ -48,7 +48,7 @@ - (IBAction)cancelNewGallery: (id)sender { [NSApp endSheet: newGallerySheet]; - [newGallerySheet orderOut: nil]; + [newGallerySheet orderOut: nil]; } - (IBAction)doNewGallery: (id)sender @@ -57,17 +57,17 @@ NSString *galleryName = [galleryNameTextField stringValue]; NSString *gallerySlug = [gallerySlugTextField stringValue]; NSString *galleryDescription = [galleryDescTextField stringValue]; - + if (!galleryName) { - + [NSApp endSheet: newGallerySheet]; [newGallerySheet orderOut: nil]; - + NSAlert *alert = [[NSAlert alloc] init]; [alert setMessageText:@"Gallery names cannot be empty"]; [alert setAlertStyle: NSCriticalAlertStyle]; [alert beginSheetModalForWindow: _controllerWindow - modalDelegate: nil + modalDelegate: nil didEndSelector: nil contextInfo: nil]; [alert release]; @@ -77,12 +77,12 @@ galleryName, @"name", gallerySlug, @"slug", galleryDescription, @"desc", nil]; - + NSDictionary *results = [[_anselController createNewGallery: params] retain]; - + [NSApp endSheet: newGallerySheet]; [newGallerySheet orderOut: nil]; - + if ([_anselController state] != TURAnselStateError) { NSAlert *alert = [[NSAlert alloc] init]; [alert setMessageText: @"Gallery successfully created."]; @@ -95,7 +95,7 @@ [_delegate TURAnselGalleryPanelDidAddGallery]; } } - + [results release]; } -- 2.11.0