Support multiple accounts. Bug fixes. Improve concurrency.
[pithos-macos] / pithos-macos / PithosAccountNode.m
index 5a171b7..7f581af 100644 (file)
@@ -81,6 +81,15 @@ static NSImage *sharedIcon = nil;
 #pragma mark -
 #pragma mark Properties
 
+- (void)setPithos:(ASIPithos *)aPithos {
+    if (aPithos && ![aPithos isEqualTo:pithos]) {
+        [pithos release];
+        pithos = [aPithos retain];
+        [url release];
+        url = nil;
+    }
+}
+
 - (NSString *)url {
     if (url == nil)
         url = [[NSString alloc] initWithFormat:@"%@%@", 
@@ -298,17 +307,39 @@ static NSImage *sharedIcon = nil;
 
 - (void)accountMetadataRequestFailed:(ASIPithosAccountRequest *)request {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    if ([request isEqualTo:applyMetadataAccountRequest]) {
-        [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataAccountRequest];
-        @synchronized(self) {
-            [applyMetadataAccountRequest release];
-            applyMetadataAccountRequest = nil;
+    NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+    if (retries > 0) {
+        ASIPithosAccountRequest *newRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:request];
+        [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+        if ([request isEqualTo:applyMetadataAccountRequest]) {
+            @synchronized(self) {
+                [applyMetadataAccountRequest release];
+                applyMetadataAccountRequest = newRequest;
+            }
+        } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
+            @synchronized(self) {
+                [refreshMetadataAccountRequest release];
+                refreshMetadataAccountRequest = newRequest;
+            }
         }
-    } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
-        [PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataAccountRequest];
-        @synchronized(self) {
-            [refreshMetadataAccountRequest release];
-            refreshMetadataAccountRequest = nil;
+        [[PithosUtilities prepareRequest:newRequest priority:[[newRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
+    } else {
+        if ([request isEqualTo:applyMetadataAccountRequest]) {
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataAccountRequest];
+            });
+            @synchronized(self) {
+                [applyMetadataAccountRequest release];
+                applyMetadataAccountRequest = nil;
+            }
+        } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataAccountRequest];
+            });
+            @synchronized(self) {
+                [refreshMetadataAccountRequest release];
+                refreshMetadataAccountRequest = nil;
+            }
         }
     }
     [pool drain];