From 8aa8e10c814559deee44735d37da80d685481af8 Mon Sep 17 00:00:00 2001 From: Miltiadis Vasilakis Date: Sun, 17 Feb 2013 14:41:28 +0200 Subject: [PATCH] Add initial support for user catalog Keep user catalog for each account. Show displayname in preferences after authentication. Minor improvements. --- pithos-apple-common | 2 +- pithos-macos.xcodeproj/project.pbxproj | 82 +++++++ pithos-macos/PithosAccount.h | 16 +- pithos-macos/PithosAccount.m | 122 +++++++-- pithos-macos/PithosBrowserController.m | 12 +- pithos-macos/PithosPreferencesController.h | 2 + pithos-macos/PithosPreferencesController.m | 4 +- pithos-macos/PithosPreferencesController.xib | 341 +++++++++++++++++++++++--- pithos-macos/PithosSubdirNode.m | 8 +- pithos-macos/PithosSyncDaemon.m | 4 +- pithos-macos/PithosUtilities.h | 1 + pithos-macos/PithosUtilities.m | 14 +- 12 files changed, 534 insertions(+), 74 deletions(-) diff --git a/pithos-apple-common b/pithos-apple-common index 153edb5..3ebe988 160000 --- a/pithos-apple-common +++ b/pithos-apple-common @@ -1 +1 @@ -Subproject commit 153edb5ed8ef1b9f03e638c926a5b8206f4df93a +Subproject commit 3ebe98842729659a562c43de70431bb773381d3c diff --git a/pithos-macos.xcodeproj/project.pbxproj b/pithos-macos.xcodeproj/project.pbxproj index 57f80bb..a2d02d9 100644 --- a/pithos-macos.xcodeproj/project.pbxproj +++ b/pithos-macos.xcodeproj/project.pbxproj @@ -76,6 +76,18 @@ 61C65ADF1428C578002597C2 /* CountTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 61C65ADE1428C578002597C2 /* CountTransformer.m */; }; 61C65AE31428D41C002597C2 /* PolicyVersioningTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 61C65AE21428D41C002597C2 /* PolicyVersioningTransformer.m */; }; 61C65AE6142918DD002597C2 /* PithosObjectNodeInfoController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61C65AE5142918DD002597C2 /* PithosObjectNodeInfoController.m */; }; + 61D83D9F16D03B1900A1F059 /* NSObject+SBJson.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D8716D03B1900A1F059 /* NSObject+SBJson.m */; }; + 61D83DA016D03B1900A1F059 /* SBJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D8A16D03B1900A1F059 /* SBJsonParser.m */; }; + 61D83DA116D03B1900A1F059 /* SBJsonStreamParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D8C16D03B1900A1F059 /* SBJsonStreamParser.m */; }; + 61D83DA216D03B1900A1F059 /* SBJsonStreamParserAccumulator.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D8E16D03B1900A1F059 /* SBJsonStreamParserAccumulator.m */; }; + 61D83DA316D03B1900A1F059 /* SBJsonStreamParserAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D9016D03B1900A1F059 /* SBJsonStreamParserAdapter.m */; }; + 61D83DA416D03B1900A1F059 /* SBJsonStreamParserState.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D9216D03B1900A1F059 /* SBJsonStreamParserState.m */; }; + 61D83DA516D03B1900A1F059 /* SBJsonStreamWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D9416D03B1900A1F059 /* SBJsonStreamWriter.m */; }; + 61D83DA616D03B1900A1F059 /* SBJsonStreamWriterAccumulator.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D9616D03B1900A1F059 /* SBJsonStreamWriterAccumulator.m */; }; + 61D83DA716D03B1900A1F059 /* SBJsonStreamWriterState.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D9816D03B1900A1F059 /* SBJsonStreamWriterState.m */; }; + 61D83DA816D03B1900A1F059 /* SBJsonTokeniser.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D9A16D03B1900A1F059 /* SBJsonTokeniser.m */; }; + 61D83DA916D03B1900A1F059 /* SBJsonUTF8Stream.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D9C16D03B1900A1F059 /* SBJsonUTF8Stream.m */; }; + 61D83DAA16D03B1900A1F059 /* SBJsonWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D83D9E16D03B1900A1F059 /* SBJsonWriter.m */; }; 61F040F31448547000A0C788 /* FileMD5Hash.c in Sources */ = {isa = PBXBuildFile; fileRef = 61F040F11448547000A0C788 /* FileMD5Hash.c */; }; 61F04132144DB97200A0C788 /* PithosLocalObjectState.m in Sources */ = {isa = PBXBuildFile; fileRef = 61F040EE144757B500A0C788 /* PithosLocalObjectState.m */; }; 61F04133144DB97600A0C788 /* PithosSyncDaemon.m in Sources */ = {isa = PBXBuildFile; fileRef = 61F040EA144724F500A0C788 /* PithosSyncDaemon.m */; }; @@ -222,6 +234,31 @@ 61C65AE21428D41C002597C2 /* PolicyVersioningTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PolicyVersioningTransformer.m; path = "pithos-macos/PolicyVersioningTransformer.m"; sourceTree = ""; }; 61C65AE4142918DC002597C2 /* PithosObjectNodeInfoController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PithosObjectNodeInfoController.h; sourceTree = ""; }; 61C65AE5142918DD002597C2 /* PithosObjectNodeInfoController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PithosObjectNodeInfoController.m; sourceTree = ""; }; + 61D83D8616D03B1900A1F059 /* NSObject+SBJson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSObject+SBJson.h"; path = "pithos-apple-common/json-framework-3.2.0/Classes/NSObject+SBJson.h"; sourceTree = ""; }; + 61D83D8716D03B1900A1F059 /* NSObject+SBJson.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSObject+SBJson.m"; path = "pithos-apple-common/json-framework-3.2.0/Classes/NSObject+SBJson.m"; sourceTree = ""; }; + 61D83D8816D03B1900A1F059 /* SBJson.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJson.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJson.h"; sourceTree = ""; }; + 61D83D8916D03B1900A1F059 /* SBJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJsonParser.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonParser.h"; sourceTree = ""; }; + 61D83D8A16D03B1900A1F059 /* SBJsonParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SBJsonParser.m; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonParser.m"; sourceTree = ""; }; + 61D83D8B16D03B1900A1F059 /* SBJsonStreamParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJsonStreamParser.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamParser.h"; sourceTree = ""; }; + 61D83D8C16D03B1900A1F059 /* SBJsonStreamParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SBJsonStreamParser.m; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamParser.m"; sourceTree = ""; }; + 61D83D8D16D03B1900A1F059 /* SBJsonStreamParserAccumulator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJsonStreamParserAccumulator.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamParserAccumulator.h"; sourceTree = ""; }; + 61D83D8E16D03B1900A1F059 /* SBJsonStreamParserAccumulator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SBJsonStreamParserAccumulator.m; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamParserAccumulator.m"; sourceTree = ""; }; + 61D83D8F16D03B1900A1F059 /* SBJsonStreamParserAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJsonStreamParserAdapter.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamParserAdapter.h"; sourceTree = ""; }; + 61D83D9016D03B1900A1F059 /* SBJsonStreamParserAdapter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SBJsonStreamParserAdapter.m; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamParserAdapter.m"; sourceTree = ""; }; + 61D83D9116D03B1900A1F059 /* SBJsonStreamParserState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJsonStreamParserState.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamParserState.h"; sourceTree = ""; }; + 61D83D9216D03B1900A1F059 /* SBJsonStreamParserState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SBJsonStreamParserState.m; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamParserState.m"; sourceTree = ""; }; + 61D83D9316D03B1900A1F059 /* SBJsonStreamWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJsonStreamWriter.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamWriter.h"; sourceTree = ""; }; + 61D83D9416D03B1900A1F059 /* SBJsonStreamWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SBJsonStreamWriter.m; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamWriter.m"; sourceTree = ""; }; + 61D83D9516D03B1900A1F059 /* SBJsonStreamWriterAccumulator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJsonStreamWriterAccumulator.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamWriterAccumulator.h"; sourceTree = ""; }; + 61D83D9616D03B1900A1F059 /* SBJsonStreamWriterAccumulator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SBJsonStreamWriterAccumulator.m; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamWriterAccumulator.m"; sourceTree = ""; }; + 61D83D9716D03B1900A1F059 /* SBJsonStreamWriterState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJsonStreamWriterState.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamWriterState.h"; sourceTree = ""; }; + 61D83D9816D03B1900A1F059 /* SBJsonStreamWriterState.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SBJsonStreamWriterState.m; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonStreamWriterState.m"; sourceTree = ""; }; + 61D83D9916D03B1900A1F059 /* SBJsonTokeniser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJsonTokeniser.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonTokeniser.h"; sourceTree = ""; }; + 61D83D9A16D03B1900A1F059 /* SBJsonTokeniser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SBJsonTokeniser.m; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonTokeniser.m"; sourceTree = ""; }; + 61D83D9B16D03B1900A1F059 /* SBJsonUTF8Stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJsonUTF8Stream.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonUTF8Stream.h"; sourceTree = ""; }; + 61D83D9C16D03B1900A1F059 /* SBJsonUTF8Stream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SBJsonUTF8Stream.m; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonUTF8Stream.m"; sourceTree = ""; }; + 61D83D9D16D03B1900A1F059 /* SBJsonWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SBJsonWriter.h; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonWriter.h"; sourceTree = ""; }; + 61D83D9E16D03B1900A1F059 /* SBJsonWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SBJsonWriter.m; path = "pithos-apple-common/json-framework-3.2.0/Classes/SBJsonWriter.m"; sourceTree = ""; }; 61F040E9144724F500A0C788 /* PithosSyncDaemon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PithosSyncDaemon.h; sourceTree = ""; }; 61F040EA144724F500A0C788 /* PithosSyncDaemon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PithosSyncDaemon.m; sourceTree = ""; }; 61F040ED144757B500A0C788 /* PithosLocalObjectState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PithosLocalObjectState.h; sourceTree = ""; }; @@ -266,6 +303,7 @@ 610DD31A13E6BD4200ED982F /* asi-http-request */, E26038991500091D00DAC6EB /* InspectorKit Framework */, 610DD2FB13E6BB2000ED982F /* pithos-macos */, + 61D83D8416D03AA800A1F059 /* JSON Framework */, 610DD2F413E6BB2000ED982F /* Frameworks */, 610DD2F213E6BB2000ED982F /* Products */, ); @@ -468,6 +506,38 @@ name = "Value Transformers"; sourceTree = ""; }; + 61D83D8416D03AA800A1F059 /* JSON Framework */ = { + isa = PBXGroup; + children = ( + 61D83D8616D03B1900A1F059 /* NSObject+SBJson.h */, + 61D83D8716D03B1900A1F059 /* NSObject+SBJson.m */, + 61D83D8816D03B1900A1F059 /* SBJson.h */, + 61D83D8916D03B1900A1F059 /* SBJsonParser.h */, + 61D83D8A16D03B1900A1F059 /* SBJsonParser.m */, + 61D83D8B16D03B1900A1F059 /* SBJsonStreamParser.h */, + 61D83D8C16D03B1900A1F059 /* SBJsonStreamParser.m */, + 61D83D8D16D03B1900A1F059 /* SBJsonStreamParserAccumulator.h */, + 61D83D8E16D03B1900A1F059 /* SBJsonStreamParserAccumulator.m */, + 61D83D8F16D03B1900A1F059 /* SBJsonStreamParserAdapter.h */, + 61D83D9016D03B1900A1F059 /* SBJsonStreamParserAdapter.m */, + 61D83D9116D03B1900A1F059 /* SBJsonStreamParserState.h */, + 61D83D9216D03B1900A1F059 /* SBJsonStreamParserState.m */, + 61D83D9316D03B1900A1F059 /* SBJsonStreamWriter.h */, + 61D83D9416D03B1900A1F059 /* SBJsonStreamWriter.m */, + 61D83D9516D03B1900A1F059 /* SBJsonStreamWriterAccumulator.h */, + 61D83D9616D03B1900A1F059 /* SBJsonStreamWriterAccumulator.m */, + 61D83D9716D03B1900A1F059 /* SBJsonStreamWriterState.h */, + 61D83D9816D03B1900A1F059 /* SBJsonStreamWriterState.m */, + 61D83D9916D03B1900A1F059 /* SBJsonTokeniser.h */, + 61D83D9A16D03B1900A1F059 /* SBJsonTokeniser.m */, + 61D83D9B16D03B1900A1F059 /* SBJsonUTF8Stream.h */, + 61D83D9C16D03B1900A1F059 /* SBJsonUTF8Stream.m */, + 61D83D9D16D03B1900A1F059 /* SBJsonWriter.h */, + 61D83D9E16D03B1900A1F059 /* SBJsonWriter.m */, + ); + name = "JSON Framework"; + sourceTree = ""; + }; 61F040E51447217100A0C788 /* PithosSyncDaemon */ = { isa = PBXGroup; children = ( @@ -713,6 +783,18 @@ E26038AA150009E400DAC6EB /* InspectorPaneHead.m in Sources */, E26038AB150009E400DAC6EB /* NSBezierPath+StrokeExtensions.m in Sources */, E26038AC150009E400DAC6EB /* NSWindow+Geometry.m in Sources */, + 61D83D9F16D03B1900A1F059 /* NSObject+SBJson.m in Sources */, + 61D83DA016D03B1900A1F059 /* SBJsonParser.m in Sources */, + 61D83DA116D03B1900A1F059 /* SBJsonStreamParser.m in Sources */, + 61D83DA216D03B1900A1F059 /* SBJsonStreamParserAccumulator.m in Sources */, + 61D83DA316D03B1900A1F059 /* SBJsonStreamParserAdapter.m in Sources */, + 61D83DA416D03B1900A1F059 /* SBJsonStreamParserState.m in Sources */, + 61D83DA516D03B1900A1F059 /* SBJsonStreamWriter.m in Sources */, + 61D83DA616D03B1900A1F059 /* SBJsonStreamWriterAccumulator.m in Sources */, + 61D83DA716D03B1900A1F059 /* SBJsonStreamWriterState.m in Sources */, + 61D83DA816D03B1900A1F059 /* SBJsonTokeniser.m in Sources */, + 61D83DA916D03B1900A1F059 /* SBJsonUTF8Stream.m in Sources */, + 61D83DAA16D03B1900A1F059 /* SBJsonWriter.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/pithos-macos/PithosAccount.h b/pithos-macos/PithosAccount.h index 0055211..9a4e188 100644 --- a/pithos-macos/PithosAccount.h +++ b/pithos-macos/PithosAccount.h @@ -38,6 +38,7 @@ #import @class PithosSyncDaemon; @class ASIPithos; +@class ASIPithosRequest; @class PithosAccountNode; @class PithosSharingAccountsNode; @@ -64,6 +65,9 @@ // Appended to serverURL to get publicURLPrefix, default nil // Can be overriden by setting directly publicURLPrefix NSString *publicResource; + // Appended to serverURL to get userCatalogURL, default "user_catalogs" + // Can be overriden by setting directly userCatalogURL + NSString *userCatalogResource; NSString *authUser; NSString *authToken; @@ -71,6 +75,8 @@ NSString *authURL; NSString *publicURLPrefix; NSString *loginURLPrefix; + NSString *userCatalogURL; + NSMutableDictionary *userCatalog; ASIPithos *pithos; PithosAccountNode *accountNode; @@ -92,9 +98,10 @@ @property (nonatomic, strong) PithosSyncDaemon *syncDaemon; @property (nonatomic, strong) NSString *serverURL; -@property (strong) NSString *versionResource; -@property (strong) NSString *loginResource; +@property (nonatomic, strong) NSString *versionResource; +@property (nonatomic, strong) NSString *loginResource; @property (strong) NSString *publicResource; +@property (nonatomic, strong) NSString *userCatalogResource; @property (nonatomic, strong) NSString *authUser; @property (nonatomic, strong) NSString *authToken; @@ -102,6 +109,8 @@ @property (nonatomic, strong) NSString *authURL; @property (nonatomic, strong) NSString *publicURLPrefix; @property (nonatomic, strong) NSString *loginURLPrefix; +@property (nonatomic, strong) NSString *userCatalogURL; +@property (nonatomic, strong) NSMutableDictionary *userCatalog; @property (strong, readonly) ASIPithos *pithos; @property (readonly) PithosAccountNode *accountNode; @@ -116,5 +125,8 @@ syncDirectoryPath:(NSString *)aSyncDirectoryPath syncAccountsDictionary:(NSMutableDictionary *)aSyncAccountsDictionary syncSkipHidden:(BOOL)aSyncSkipHidden; +- (ASIPithosRequest *)updateUserCatalogForForDisplaynames:(NSArray *)displaynames UUIDs:(NSArray *)UUIDs; +- (NSString *)displaynameForUUID:(NSString *)UUID safe:(BOOL)safe; +- (NSString *)displaynameForUUID:(NSString *)UUID; @end diff --git a/pithos-macos/PithosAccount.m b/pithos-macos/PithosAccount.m index b271ce0..8b0894a 100644 --- a/pithos-macos/PithosAccount.m +++ b/pithos-macos/PithosAccount.m @@ -41,6 +41,7 @@ #import "ASIPithosRequest.h" #import "PithosAccountNode.h" #import "PithosSharingAccountsNode.h" +#import "PithosUtilities.h" #import "pithos_macosAppDelegate.h" @interface PithosAccount (Internal) @@ -50,8 +51,8 @@ @implementation PithosAccount @synthesize uniqueName, active, name; @synthesize syncActive, syncDirectoryPath, syncAccountsDictionary, syncSkipHidden, syncLastCompleted, syncDaemon; -@synthesize serverURL, versionResource, loginResource, publicResource; -@synthesize authUser, authToken, storageURLPrefix, authURL, loginURLPrefix, publicURLPrefix; +@synthesize serverURL, versionResource, loginResource, publicResource, userCatalogResource; +@synthesize authUser, authToken, storageURLPrefix, authURL, loginURLPrefix, publicURLPrefix, userCatalogURL, userCatalog; @synthesize pithos, accountNode, sharingAccountsNode; #pragma mark - @@ -61,15 +62,13 @@ PithosAccount *pithosAccount = [[self alloc] init]; pithosAccount.uniqueName = [NSString stringWithFormat:@"pithosAccount-%f", [NSDate timeIntervalSinceReferenceDate]]; pithosAccount.syncSkipHidden = YES; - pithosAccount.versionResource = @"v1"; - pithosAccount.loginResource = @"login"; return pithosAccount; } - (NSString *)description { - return [NSString stringWithFormat:@"uniqueName: %@, active: %d, name: %@, syncActive: %d, syncDirectoryPath: %@, syncAccountsDictionary: %@, syncSkipHidden: %d, syncLastCompleted: %@, serverURL: %@, versionResource: %@, loginResource: %@, publicResource: %@, authUser: %@, authToken: %@, storageURLPrefix: %@, authURL: %@, loginURLPrefix: %@, publicURLPrefix: %@", - uniqueName, active, name, syncActive, syncDirectoryPath, syncAccountsDictionary, syncSkipHidden, syncLastCompleted, serverURL, versionResource, loginResource, publicResource, authUser, authToken, storageURLPrefix, authURL, loginURLPrefix, publicURLPrefix]; + return [NSString stringWithFormat:@"uniqueName: %@, active: %d, name: %@, syncActive: %d, syncDirectoryPath: %@, syncAccountsDictionary: %@, syncSkipHidden: %d, syncLastCompleted: %@, serverURL: %@, versionResource: %@, loginResource: %@, publicResource: %@, userCatalogResource: %@, authUser: %@, authToken: %@, storageURLPrefix: %@, authURL: %@, loginURLPrefix: %@, publicURLPrefix: %@, userCatalogResource: %@", + uniqueName, active, name, syncActive, syncDirectoryPath, syncAccountsDictionary, syncSkipHidden, syncLastCompleted, serverURL, versionResource, loginResource, publicResource, userCatalogResource, authUser, authToken, storageURLPrefix, authURL, loginURLPrefix, publicURLPrefix, userCatalogResource]; } #pragma mark - @@ -152,8 +151,8 @@ - (NSMutableDictionary *)syncAccountsDictionary { if (!syncAccountsDictionary) { syncAccountsDictionary = [NSMutableDictionary dictionaryWithObject:[NSMutableDictionary dictionaryWithObject:[NSMutableSet set] - forKey:@"pithos"] - forKey:@""]; + forKey:@"pithos"] + forKey:@""]; } return syncAccountsDictionary; } @@ -223,6 +222,27 @@ } } +- (NSString *)versionResource { + if (!versionResource) { + versionResource = @"v1"; + } + return versionResource; +} + +- (NSString *)loginResource { + if (!loginResource) { + loginResource = @"login"; + } + return loginResource; +} + +- (NSString *)userCatalogResource { + if (!userCatalogResource) { + userCatalogResource = @"user_catalogs"; + } + return userCatalogResource; +} + - (void)setAuthUser:(NSString *)anAuthUser { if ([anAuthUser length] && ![anAuthUser isEqualToString:authUser]) { authUser = anAuthUser; @@ -248,10 +268,7 @@ - (NSString *)storageURLPrefix { if (![self urlIsValid:storageURLPrefix]) { - if (versionResource) - storageURLPrefix = [self.serverURL stringByAppendingFormat:@"/%@", versionResource]; - else - storageURLPrefix = [self.serverURL copy]; + storageURLPrefix = [self.serverURL stringByAppendingFormat:@"/%@", self.versionResource]; } return storageURLPrefix; } @@ -264,10 +281,7 @@ - (NSString *)authURL { if (![self urlIsValid:authURL]) { - if (versionResource) - authURL = [self.serverURL stringByAppendingFormat:@"/%@", versionResource]; - else - authURL = [self.serverURL copy]; + authURL = [self.serverURL stringByAppendingFormat:@"/%@", self.versionResource]; } return authURL; } @@ -296,10 +310,7 @@ - (NSString *)loginURLPrefix { if (![self urlIsValid:loginURLPrefix]) { - if (loginResource) - loginURLPrefix = [self.serverURL stringByAppendingFormat:@"/%@", loginResource]; - else - loginURLPrefix = [self.serverURL copy]; + loginURLPrefix = [self.serverURL stringByAppendingFormat:@"/%@", self.loginResource]; } return loginURLPrefix; } @@ -310,6 +321,26 @@ } } +- (NSString *)userCatalogURL { + if (![self urlIsValid:userCatalogURL]) { + userCatalogURL = [self.serverURL stringByAppendingFormat:@"/%@", self.userCatalogResource]; + } + return userCatalogURL; +} + +- (void)setUserCatalogURL:(NSString *)aUserCatalogURL { + if (![self.userCatalogURL isEqualToString:aUserCatalogURL] && [self urlIsValid:aUserCatalogURL]) { + userCatalogURL = aUserCatalogURL; + } +} + +- (NSMutableDictionary *)userCatalog { + if (!userCatalog) { + userCatalog = [NSMutableDictionary dictionary]; + } + return userCatalog; +} + - (ASIPithos *)pithos { @synchronized(self) { if (!pithos || updatePithos) { @@ -319,6 +350,7 @@ pithos.storageURLPrefix = self.storageURLPrefix; pithos.authURL = self.authURL; pithos.publicURLPrefix = self.publicURLPrefix; + pithos.userCatalogURL = self.userCatalogURL; updatePithos = NO; } } @@ -373,6 +405,8 @@ } if (sharingAccountsNode && self.sharingAccountsNode.children) { } + + [self updateUserCatalogForForDisplaynames:nil UUIDs:[NSArray arrayWithObject:authUser]]; } } @@ -402,6 +436,48 @@ } } +- (ASIPithosRequest *)updateUserCatalogForForDisplaynames:(NSArray *)displaynames UUIDs:(NSArray *)UUIDs { + ASIPithosRequest *userCatalogRequest = [ASIPithosRequest userCatalogRequestWithPithos:self.pithos + displaynames:displaynames + UUIDs:UUIDs]; + [PithosUtilities startAndWaitForRequest:userCatalogRequest]; + if (userCatalogRequest.error || ((userCatalogRequest.responseStatusCode != 200) && (userCatalogRequest.responseStatusCode != 404))) { + // Don't show alert on 404, since it can be a pre-UUID server. + [PithosUtilities httpRequestErrorAlertWithRequest:userCatalogRequest]; + } else if (userCatalogRequest.responseStatusCode == 200) { + NSDictionary *catalogs = [userCatalogRequest catalogs]; + NSDictionary *displaynameCatalog = [catalogs objectForKey:@"displayname_catalog"]; + for (NSString *displayname in displaynameCatalog) { + [self.userCatalog setObject:displayname forKey:[displaynameCatalog objectForKey:displayname]]; + } + if (UUIDs) { + NSDictionary *UUIDCatalog = [catalogs objectForKey:@"uuid_catalog"]; + for (NSString *UUID in UUIDs) { + NSString *displayname = [UUIDCatalog objectForKey:UUID]; + if (displayname) { + [self.userCatalog setObject:displayname forKey:UUID]; + } else { + [self.userCatalog removeObjectForKey:UUID]; + } + } + } + } + return userCatalogRequest; +} + +- (NSString *)displaynameForUUID:(NSString *)UUID safe:(BOOL)safe { + NSString *displayName = [userCatalog objectForKey:UUID]; + if (safe && !displayName) { + return UUID; + } else { + return displayName; + } +} + +- (NSString *)displaynameForUUID:(NSString *)UUID { + return [self displaynameForUUID:UUID safe:NO]; +} + #pragma mark - #pragma mark NSCoding @@ -421,6 +497,7 @@ self.versionResource = [decoder decodeObjectForKey:@"versionResource"]; self.loginResource = [decoder decodeObjectForKey:@"loginResource"]; self.publicResource = [decoder decodeObjectForKey:@"publicResource"]; + self.userCatalogResource = [decoder decodeObjectForKey:@"userCatalogResource"]; self.authUser = [decoder decodeObjectForKey:@"authUser"]; self.authToken = [decoder decodeObjectForKey:@"authToken"]; @@ -428,6 +505,8 @@ self.authURL = [decoder decodeObjectForKey:@"authURL"]; self.publicURLPrefix = [decoder decodeObjectForKey:@"publicURLPrefix"]; self.loginURLPrefix = [decoder decodeObjectForKey:@"loginURLPrefix"]; + self.userCatalogURL = [decoder decodeObjectForKey:@"userCatalogURL"]; + self.userCatalog = [decoder decodeObjectForKey:@"userCatalog"]; if (![authUser length] || ![authToken length] || ![self.storageURLPrefix length]) self.active = NO; @@ -452,6 +531,7 @@ [encoder encodeObject:versionResource forKey:@"versionResource"]; [encoder encodeObject:publicResource forKey:@"publicResource"]; [encoder encodeObject:loginResource forKey:@"loginResource"]; + [encoder encodeObject:loginResource forKey:@"userCatalogResource"]; [encoder encodeObject:authUser forKey:@"authUser"]; [encoder encodeObject:authToken forKey:@"authToken"]; @@ -459,6 +539,8 @@ [encoder encodeObject:authURL forKey:@"authURL"]; [encoder encodeObject:publicURLPrefix forKey:@"publicURLPrefix"]; [encoder encodeObject:loginURLPrefix forKey:@"loginURLPrefix"]; + [encoder encodeObject:userCatalogURL forKey:@"userCatalogURL"]; + [encoder encodeObject:userCatalog forKey:@"userCatalog"]; } @end diff --git a/pithos-macos/PithosBrowserController.m b/pithos-macos/PithosBrowserController.m index b743a9c..d753e9f 100644 --- a/pithos-macos/PithosBrowserController.m +++ b/pithos-macos/PithosBrowserController.m @@ -441,9 +441,7 @@ // Create pithos node ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest createOrUpdateContainerRequestWithPithos:pithos containerName:@"pithos"]; - ASINetworkQueue *networkQueue = [ASINetworkQueue queue]; - [networkQueue go]; - [networkQueue addOperations:[NSArray arrayWithObject:[PithosUtilities prepareRequest:containerRequest]] waitUntilFinished:YES]; + [PithosUtilities startAndWaitForRequest:containerRequest]; if ([containerRequest error]) { [PithosUtilities httpRequestErrorAlertWithRequest:containerRequest]; } else { @@ -454,9 +452,7 @@ // Create trash node ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest createOrUpdateContainerRequestWithPithos:pithos containerName:@"trash"]; - ASINetworkQueue *networkQueue = [ASINetworkQueue queue]; - [networkQueue go]; - [networkQueue addOperations:[NSArray arrayWithObject:[PithosUtilities prepareRequest:containerRequest]] waitUntilFinished:YES]; + [PithosUtilities startAndWaitForRequest:containerRequest]; if ([containerRequest error]) { [PithosUtilities httpRequestErrorAlertWithRequest:containerRequest]; } else { @@ -1050,9 +1046,7 @@ forDraggedRowsWithIndexes:(NSIndexSet *)rowIndexes inColumn:(NSInteger)column { if ((destinationNode.pithosContainer.blockHash == nil) || (destinationNode.pithosContainer.blockSize == 0)) { ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest containerMetadataRequestWithPithos:pithos containerName:containerName]; - ASINetworkQueue *networkQueue = [ASINetworkQueue queue]; - [networkQueue go]; - [networkQueue addOperations:[NSArray arrayWithObject:[PithosUtilities prepareRequest:containerRequest]] waitUntilFinished:YES]; + [PithosUtilities startAndWaitForRequest:containerRequest]; if ([containerRequest error]) { [PithosUtilities httpRequestErrorAlertWithRequest:containerRequest]; return NO; diff --git a/pithos-macos/PithosPreferencesController.h b/pithos-macos/PithosPreferencesController.h index 2584e7e..bccb69f 100644 --- a/pithos-macos/PithosPreferencesController.h +++ b/pithos-macos/PithosPreferencesController.h @@ -49,6 +49,7 @@ NSString *serverURL; NSString *authUser; NSString *authToken; + NSString *displayname; BOOL manual; BOOL loginEnable; BOOL loginCancelEnable; @@ -76,6 +77,7 @@ @property (nonatomic, copy) NSString *serverURL; @property (nonatomic, copy) NSString *authUser; @property (nonatomic, copy) NSString *authToken; +@property (nonatomic, copy) NSString *displayname; @property (nonatomic, assign) BOOL manual; @property (nonatomic, assign) BOOL loginEnable; @property (nonatomic, assign) BOOL loginCancelEnable; diff --git a/pithos-macos/PithosPreferencesController.m b/pithos-macos/PithosPreferencesController.m index 566be69..eb86c16 100644 --- a/pithos-macos/PithosPreferencesController.m +++ b/pithos-macos/PithosPreferencesController.m @@ -69,7 +69,7 @@ @synthesize selectedPithosAccount; @synthesize accountsArrayController; @synthesize accountRemoveEnable; -@synthesize serverURL, authUser, authToken, manual, loginEnable, loginCancelEnable; +@synthesize serverURL, authUser, authToken, displayname, manual, loginEnable, loginCancelEnable; @synthesize syncActive, syncSkipHidden, syncDirectoryPath, syncAccountsDictionary, syncApplyEnable, syncCancelEnable, syncAccountsOutlineView, syncAccountsRootFilesNodes; @synthesize groupsDictionaryController, selectedGroupMembersDictionaryController; @@ -195,6 +195,7 @@ - (void)setAuthUser:(NSString *)anAuthUser { authUser = [anAuthUser copy]; [self updateLogin]; + self.displayname = [self.selectedPithosAccount displaynameForUUID:authUser safe:NO]; } - (void)setAuthToken:(NSString *)anAuthToken { @@ -289,6 +290,7 @@ } else { [selectedPithosAccount authenticateWithServerURL:serverURL authUser:authUser authToken:authToken]; self.manual = NO; + self.displayname = [selectedPithosAccount displaynameForUUID:authUser safe:NO]; pithos_macosAppDelegate *delegate = (pithos_macosAppDelegate *)[[NSApplication sharedApplication] delegate]; [delegate savePithosAccounts:self]; if (!delegate.activated) { diff --git a/pithos-macos/PithosPreferencesController.xib b/pithos-macos/PithosPreferencesController.xib index 71fe70a..a68cecc 100644 --- a/pithos-macos/PithosPreferencesController.xib +++ b/pithos-macos/PithosPreferencesController.xib @@ -2,36 +2,36 @@ 1070 - 11D50b - 2182 - 1138.32 - 568.00 + 11G63 + 2843 + 1138.51 + 569.00 com.apple.InterfaceBuilder.CocoaPlugin - 2182 + 2843 YES - NSTabView - NSButton - NSCustomObject NSArrayController - NSTableView - NSTextField - NSWindowTemplate - NSTextFieldCell - NSButtonCell - NSTableColumn NSBox - NSView - NSOutlineView + NSButton + NSButtonCell + NSCustomObject NSDictionaryController - NSScrollView - NSTabViewItem + NSOutlineView + NSPathCell NSPathControl + NSScrollView NSScroller + NSTabView + NSTabViewItem + NSTableColumn NSTableHeaderView - NSPathCell + NSTableView + NSTextField + NSTextFieldCell + NSView + NSWindowTemplate YES @@ -82,6 +82,7 @@ 256 {118, 215} + _NS:1828 YES @@ -90,6 +91,7 @@ 256 {118, 17} + _NS:1830 @@ -190,6 +192,7 @@ {{1, 17}, {118, 215}} + _NS:1826 @@ -201,6 +204,7 @@ -2147483392 {{224, 17}, {15, 102}} + _NS:1845 @@ -213,6 +217,7 @@ -2147483392 {{1, 48.325627356767654}, {82.028970718383789, 15}} + _NS:1847 1 @@ -229,6 +234,7 @@ {{1, 0}, {118, 17}} + _NS:1831 @@ -238,6 +244,7 @@ {{20, 47}, {120, 233}} + _NS:1824 133682 @@ -252,6 +259,7 @@ 18 {{147, 37}, {265, 249}} + _NS:608 @@ -268,6 +276,7 @@ 268 {{14, 183}, {41, 14}} + YES @@ -291,6 +300,7 @@ 266 {{60, 181}, {168, 19}} + YES @@ -319,6 +329,7 @@ 266 {{60, 123}, {168, 19}} + YES @@ -337,7 +348,8 @@ 266 {{60, 96}, {168, 19}} - + + YES -1267597759 @@ -350,17 +362,37 @@ + + + 266 + {{60, 69}, {168, 19}} + + + + YES + + -1536033215 + 272761920 + + + + YES + + + + 268 {{14, 125}, {41, 14}} + YES 68288064 71304192 - User: + UUID: YES @@ -368,11 +400,31 @@ + + + 268 + {{14, 71}, {41, 14}} + + + + YES + + 68288064 + 71304192 + User: + + + YES + + + + 268 {{14, 98}, {41, 14}} + YES @@ -391,6 +443,7 @@ 268 {{14, 150}, {86, 14}} + YES @@ -409,6 +462,7 @@ -2147483634 {{-3, 170}, {251, 5}} + {0, 0} @@ -430,8 +484,9 @@ 268 - {{57, 72}, {63, 18}} + {{57, 45}, {63, 18}} + YES @@ -460,7 +515,8 @@ 289 {{161, 4}, {72, 28}} - + + YES -2080244224 @@ -486,6 +542,7 @@ 289 {{91, 4}, {72, 28}} + YES @@ -506,6 +563,7 @@ {{10, 33}, {245, 203}} + _NS:610 @@ -602,7 +660,6 @@ 289 {{161, 4}, {72, 28}} - YES -2080244224 @@ -724,7 +781,7 @@ 256 {209, 95} - + _NS:13 YES @@ -876,7 +933,7 @@ {{17, 40}, {211, 113}} - + _NS:9 133682 @@ -1326,6 +1383,7 @@ 292 {{20, 19}, {20, 20}} + _NS:2510 YES @@ -1350,6 +1408,7 @@ 292 {{39, 19}, {20, 20}} + _NS:2510 YES @@ -1372,6 +1431,7 @@ {425, 300} + {{0, 0}, {1280, 778}} @@ -2415,6 +2475,37 @@ 893 + + + value: displayname + + + + + + value: displayname + value + displayname + + YES + + YES + NSConditionallySetsEditable + NSContinuouslyUpdatesValue + NSValidatesImmediately + + + YES + + + + + + 2 + + + 905 + @@ -2588,6 +2679,8 @@ + + @@ -3159,6 +3252,35 @@ + + 894 + + + YES + + + + Token + + + 895 + + + + + 898 + + + YES + + + + + + 899 + + + @@ -3266,6 +3388,10 @@ 881.IBPluginDependency 888.IBPluginDependency 889.IBPluginDependency + 894.IBPluginDependency + 895.IBPluginDependency + 898.IBPluginDependency + 899.IBPluginDependency YES @@ -3370,6 +3496,10 @@ 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 @@ -3384,9 +3514,164 @@ - 893 + 905 + + + + YES + + GroupAndGroupMemberFormatter + NSFormatter + + IBProjectSource + ./Classes/GroupAndGroupMemberFormatter.h + + + + NonEmptyStringFormatter + NSFormatter + + IBProjectSource + ./Classes/NonEmptyStringFormatter.h + + + + PithosPreferencesController + NSWindowController + + YES + + YES + addAccount: + groupsApply: + groupsRevert: + login: + loginCancel: + removeAccount: + syncApply: + syncCancel: + syncRefresh: + + + YES + id + id + id + id + id + id + id + id + id + + + + YES + + YES + addAccount: + groupsApply: + groupsRevert: + login: + loginCancel: + removeAccount: + syncApply: + syncCancel: + syncRefresh: + + + YES + + addAccount: + id + + + groupsApply: + id + + + groupsRevert: + id + + + login: + id + + + loginCancel: + id + + + removeAccount: + id + + + syncApply: + id + + + syncCancel: + id + + + syncRefresh: + id + + + + + YES + + YES + accountsArrayController + groupsDictionaryController + selectedGroupMembersDictionaryController + syncAccountsOutlineView + + + YES + NSArrayController + NSDictionaryController + NSDictionaryController + NSOutlineView + + + + YES + + YES + accountsArrayController + groupsDictionaryController + selectedGroupMembersDictionaryController + syncAccountsOutlineView + + + YES + + accountsArrayController + NSArrayController + + + groupsDictionaryController + NSDictionaryController + + + selectedGroupMembersDictionaryController + NSDictionaryController + + + syncAccountsOutlineView + NSOutlineView + + + + + IBProjectSource + ./Classes/PithosPreferencesController.h + + + - 0 IBCocoaFramework diff --git a/pithos-macos/PithosSubdirNode.m b/pithos-macos/PithosSubdirNode.m index 7fbbb03..ce4263f 100644 --- a/pithos-macos/PithosSubdirNode.m +++ b/pithos-macos/PithosSubdirNode.m @@ -247,9 +247,7 @@ static NSImage *sharedIcon = nil; ASIPithosObjectRequest *request = [ASIPithosObjectRequest objectMetadataRequestWithPithos:pithos containerName:pithosContainer.name objectName:prefix]; - ASINetworkQueue *networkQueue = [ASINetworkQueue queue]; - [networkQueue go]; - [networkQueue addOperations:[NSArray arrayWithObject:[PithosUtilities prepareRequest:request]] waitUntilFinished:YES]; + [PithosUtilities startAndWaitForRequest:request]; if ([request error]) { alert = [[NSAlert alloc] init]; [alert setMessageText:@"HTTP Request Error"]; @@ -268,9 +266,7 @@ static NSImage *sharedIcon = nil; request = [ASIPithosObjectRequest deleteObjectRequestWithPithos:pithos containerName:pithosContainer.name objectName:prefix]; - ASINetworkQueue *networkQueue = [ASINetworkQueue queue]; - [networkQueue go]; - [networkQueue addOperations:[NSArray arrayWithObject:[PithosUtilities prepareRequest:request]] waitUntilFinished:YES]; + [PithosUtilities startAndWaitForRequest:request]; if ([request error]) { alert = [[NSAlert alloc] init]; [alert setMessageText:@"HTTP Request Error"]; diff --git a/pithos-macos/PithosSyncDaemon.m b/pithos-macos/PithosSyncDaemon.m index 35c1a3d..a382462 100644 --- a/pithos-macos/PithosSyncDaemon.m +++ b/pithos-macos/PithosSyncDaemon.m @@ -382,6 +382,7 @@ pithos.storageURLPrefix = [aPithos.storageURLPrefix copy]; pithos.authURL = [aPithos.authURL copy]; pithos.publicURLPrefix = [aPithos.publicURLPrefix copy]; + pithos.userCatalogURL = [aPithos.userCatalogURL copy]; } if (aPithos && (![aPithos.authUser isEqualToString:pithos.authUser] || @@ -396,7 +397,8 @@ pithos.storageURLPrefix = [aPithos.storageURLPrefix copy]; pithos.authURL = [aPithos.authURL copy]; pithos.publicURLPrefix = [aPithos.publicURLPrefix copy]; - } + pithos.userCatalogURL = [aPithos.userCatalogURL copy]; + } } #pragma mark - diff --git a/pithos-macos/PithosUtilities.h b/pithos-macos/PithosUtilities.h index 4cfc65c..2bbae93 100644 --- a/pithos-macos/PithosUtilities.h +++ b/pithos-macos/PithosUtilities.h @@ -162,5 +162,6 @@ + (ASIPithosRequest *)prepareRequest:(ASIPithosRequest *)request priority:(NSOperationQueuePriority)priority; + (ASIPithosRequest *)prepareRequest:(ASIPithosRequest *)request; + (ASIPithosRequest *)copyRequest:(ASIPithosRequest *)request; ++ (void)startAndWaitForRequest:(ASIPithosRequest *)request; @end diff --git a/pithos-macos/PithosUtilities.m b/pithos-macos/PithosUtilities.m index b691748..91de07d 100644 --- a/pithos-macos/PithosUtilities.m +++ b/pithos-macos/PithosUtilities.m @@ -993,9 +993,7 @@ objectName:objectName]; if (sharingAccount) [objectRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos]; - ASINetworkQueue *networkQueue = [ASINetworkQueue queue]; - [networkQueue go]; - [networkQueue addOperations:[NSArray arrayWithObject:[self prepareRequest:objectRequest]] waitUntilFinished:YES]; + [self startAndWaitForRequest:objectRequest]; if (error != NULL) { *error = [objectRequest error]; if (*error) { @@ -1064,9 +1062,7 @@ until:nil]; if (sharingAccount) [containerRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos]; - ASINetworkQueue *networkQueue = [ASINetworkQueue queue]; - [networkQueue go]; - [networkQueue addOperations:[NSArray arrayWithObject:[self prepareRequest:containerRequest]] waitUntilFinished:YES]; + [self startAndWaitForRequest:containerRequest]; if ([containerRequest error]) { [self httpRequestErrorAlertWithRequest:containerRequest]; return nil; @@ -1293,4 +1289,10 @@ return newRequest; } ++ (void)startAndWaitForRequest:(ASIPithosRequest *)request { + ASINetworkQueue *networkQueue = [ASINetworkQueue queue]; + [networkQueue go]; + [networkQueue addOperations:[NSArray arrayWithObject:[self prepareRequest:request]] waitUntilFinished:YES]; +} + @end -- 1.7.10.4