Support multiple accounts. Bug fixes. Improve concurrency.
[pithos-macos] / pithos-macos / PithosObjectNode.m
index a3afc36..9f6f4e0 100644 (file)
 #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:@"object %@/%@/%@%@", 
 
 - (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];