Support multiple accounts. Bug fixes. Improve concurrency.
[pithos-macos] / pithos-macos / PithosSubdirNode.m
index c07e3af..c8175c7 100644 (file)
@@ -41,6 +41,7 @@
 #import "ASIPithosObjectRequest.h"
 #import "ASIPithosContainer.h"
 #import "ASIPithosObject.h"
+#import "ASINetworkQueue.h"
 #import "ASIDownloadCache.h"
 #import "PithosUtilities.h"
 #import "PithosObjectNodeInfoController.h"
@@ -84,6 +85,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:@"subdir %@/%@/%@%@", 
@@ -167,17 +177,39 @@ static NSImage *sharedIcon = nil;
 
 - (void)objectRequestFailed:(ASIPithosObjectRequest *)request {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    if ([request isEqualTo:applyMetadataObjectRequest]) {
-        [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataObjectRequest];
-        @synchronized(self) {
-            [applyMetadataObjectRequest release];
-            applyMetadataObjectRequest = nil;
+    NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+    if (retries > 0) {
+        ASIPithosObjectRequest *newRequest = (ASIPithosObjectRequest *)[PithosUtilities copyRequest:request];
+        [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+        if ([request isEqualTo:applyMetadataObjectRequest]) {
+            @synchronized(self) {
+                [applyMetadataObjectRequest release];
+                applyMetadataObjectRequest = newRequest;
+            }
+        } else if ([request isEqualTo:refreshMetadataObjectRequest]) {
+            @synchronized(self) {
+                [refreshMetadataObjectRequest release];
+                refreshMetadataObjectRequest = newRequest;
+            }
         }
-    } else if ([request isEqualTo:refreshMetadataObjectRequest]) {
-        [PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataObjectRequest];
-        @synchronized(self) {
-            [refreshMetadataObjectRequest release];
-            refreshMetadataObjectRequest = nil;
+        [[PithosUtilities prepareRequest:newRequest priority:[[newRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
+    } else {
+        if ([request isEqualTo:applyMetadataObjectRequest]) {
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataObjectRequest];
+            });
+            @synchronized(self) {
+                [applyMetadataObjectRequest release];
+                applyMetadataObjectRequest = nil;
+            }
+        } else if ([request isEqualTo:refreshMetadataObjectRequest]) {
+            dispatch_async(dispatch_get_main_queue(), ^{
+                [PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataObjectRequest];
+            });
+            @synchronized(self) {
+                [refreshMetadataObjectRequest release];
+                refreshMetadataObjectRequest = nil;
+            }
         }
     }
     [pool drain];
@@ -195,10 +227,9 @@ static NSImage *sharedIcon = nil;
                 ASIPithosObjectRequest *request = [ASIPithosObjectRequest objectMetadataRequestWithPithos:pithos 
                                                                                             containerName:pithosContainer.name 
                                                                                                objectName:prefix];
-                [[PithosUtilities prepareRequest:request] startAsynchronous];
-                while (![request isFinished]) {
-                    usleep(1);
-                }
+                ASINetworkQueue *networkQueue = [ASINetworkQueue queue];
+                [networkQueue go];
+                [networkQueue addOperations:[NSArray arrayWithObject:[PithosUtilities prepareRequest:request]] waitUntilFinished:YES];
                 if ([request error]) {
                     alert = [[[NSAlert alloc] init] autorelease];
                     [alert setMessageText:@"HTTP Request Error"];
@@ -217,10 +248,9 @@ static NSImage *sharedIcon = nil;
                         request = [ASIPithosObjectRequest deleteObjectRequestWithPithos:pithos 
                                                                           containerName:pithosContainer.name 
                                                                              objectName:prefix];
-                        [[PithosUtilities prepareRequest:request] startAsynchronous];
-                        while (![request isFinished]) {
-                            usleep(1);
-                        }
+                        ASINetworkQueue *networkQueue = [ASINetworkQueue queue];
+                        [networkQueue go];
+                        [networkQueue addOperations:[NSArray arrayWithObject:[PithosUtilities prepareRequest:request]] waitUntilFinished:YES];
                         if ([request error]) {
                             alert = [[[NSAlert alloc] init] autorelease];
                             [alert setMessageText:@"HTTP Request Error"];