Support multiple accounts. Bug fixes. Improve concurrency.
[pithos-macos] / pithos-macos / PithosContainerNode.m
index 0f866b3..1752a0c 100644 (file)
@@ -106,6 +106,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:@"%@/%@%@", 
@@ -413,17 +422,39 @@ static NSImage *sharedIcon = nil;
 
 - (void)containerMetadataRequestFailed:(ASIPithosContainerRequest *)request {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    if ([request isEqualTo:applyMetadataContainerRequest]) {
-        [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataContainerRequest];
-        @synchronized(self) {
-            [applyMetadataContainerRequest release];
-            applyMetadataContainerRequest = nil;
+    NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+    if (retries > 0) {
+        ASIPithosContainerRequest *newRequest = (ASIPithosContainerRequest *)[PithosUtilities copyRequest:request];
+        [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+        if ([request isEqualTo:applyMetadataContainerRequest]) {
+            @synchronized(self) {
+                [applyMetadataContainerRequest release];
+                applyMetadataContainerRequest = newRequest;
+            }
+        } else if ([request isEqualTo:refreshMetadataContainerRequest]) {
+            @synchronized(self) {
+                [refreshMetadataContainerRequest release];
+                refreshMetadataContainerRequest = newRequest;
+            }
         }
-    } else if ([request isEqualTo:refreshMetadataContainerRequest]) {
-        [PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataContainerRequest];
-        @synchronized(self) {
-            [refreshMetadataContainerRequest release];
-            refreshMetadataContainerRequest = nil;
+        [[PithosUtilities prepareRequest:newRequest priority:[[newRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
+    } else {
+        if ([request isEqualTo:applyMetadataContainerRequest]) {
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataContainerRequest];
+            });
+            @synchronized(self) {
+                [applyMetadataContainerRequest release];
+                applyMetadataContainerRequest = nil;
+            }
+        } else if ([request isEqualTo:refreshMetadataContainerRequest]) {
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataContainerRequest];
+            });
+            @synchronized(self) {
+                [refreshMetadataContainerRequest release];
+                refreshMetadataContainerRequest = nil;
+            }
         }
     }
     [pool drain];