Use user catalog displayname when displaying an account node
[pithos-macos] / pithos-macos / PithosContainerNode.m
index 47d9a07..8336b31 100644 (file)
@@ -55,7 +55,7 @@ static NSImage *sharedIcon = nil;
 
 + (void)initialize {
        if (self == [PithosContainerNode class])
-        sharedIcon = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericHardDiskIcon)] retain];
+        sharedIcon = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericHardDiskIcon)];
 }
 
 #pragma mark -
@@ -67,7 +67,6 @@ static NSImage *sharedIcon = nil;
         self.pithosContainer = aPithosContainer;
         prefix = nil;
         self.icon = anIcon;
-        self.childrenUpdatedNotificationName = [NSString stringWithString:@"PithosContainerNodeChildrenUpdated"];
     }
     return self;
 }
@@ -88,18 +87,8 @@ static NSImage *sharedIcon = nil;
 
 - (void)dealloc {
     [containerRequest clearDelegatesAndCancel];
-    [containerRequest release];
     [refreshMetadataContainerRequest clearDelegatesAndCancel];
-    [refreshMetadataContainerRequest release];
     [applyMetadataContainerRequest clearDelegatesAndCancel];
-    [applyMetadataContainerRequest release];
-    [policyQuota release];
-    [policyVersioning release];
-    [prefix release];
-    [objects release];
-    [pithosContainer release];
-    [pithos release];
-    [super dealloc];
 }
 
 #pragma mark -
@@ -107,9 +96,7 @@ static NSImage *sharedIcon = nil;
 
 - (void)setPithos:(ASIPithos *)aPithos {
     if (aPithos && ![aPithos isEqualTo:pithos]) {
-        [pithos release];
-        pithos = [aPithos retain];
-        [url release];
+        pithos = aPithos;
         url = nil;
     }
 }
@@ -130,7 +117,7 @@ static NSImage *sharedIcon = nil;
                 break;
             case PithosNodeStateRefreshNeeded:
                 freshness = PithosNodeStateRefreshing;
-                containerRequest = [[ASIPithosContainerRequest listObjectsRequestWithPithos:pithos 
+                containerRequest = [ASIPithosContainerRequest listObjectsRequestWithPithos:pithos 
                                                                               containerName:pithosContainer.name 
                                                                                       limit:0 
                                                                                      marker:nil 
@@ -139,9 +126,11 @@ static NSImage *sharedIcon = nil;
                                                                                        path:nil 
                                                                                        meta:nil 
                                                                                      shared:shared 
-                                                                                      until:nil] retain];
+                                                                                      until:nil];
                 if (sharingAccount)
                     [containerRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+                else if (!forcedRefresh)
+                    containerRequest.downloadCache = [ASIDownloadCache sharedCache];
                 containerRequest.delegate = self;
                 containerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
                 containerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
@@ -151,15 +140,12 @@ static NSImage *sharedIcon = nil;
                                              NSStringFromSelector(@selector(containerRequestFinished:)), @"didFinishSelector", 
                                              NSStringFromSelector(@selector(containerRequestFailed:)), @"didFailSelector", 
                                              nil];
-                if (!forcedRefresh)
-                    containerRequest.downloadCache = [ASIDownloadCache sharedCache];
                 [[PithosUtilities prepareRequest:containerRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
                 break;
             case PithosNodeStateRefreshing:
                 break;
             case PithosNodeStateRefreshFinished:
                 if (newChildren) {
-                    [children release];
                     children = newChildren;
                     newChildren = nil;
                 }
@@ -172,7 +158,7 @@ static NSImage *sharedIcon = nil;
 }
 
 - (NSString *)displayName {
-    return [[pithosContainer.name copy] autorelease];
+    return [pithosContainer.name copy];
 }
 
 - (void)setDisplayName:(NSString *)aDisplayName {
@@ -181,19 +167,18 @@ static NSImage *sharedIcon = nil;
 - (NSImage *)icon {
     if (icon == nil) {
         if ([pithosContainer.name isEqualToString:@"pithos"])
-            icon = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kToolbarHomeIcon)] retain];
+            icon = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kToolbarHomeIcon)];
         else if ([pithosContainer.name isEqualToString:@"trash"])
-            icon = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kFullTrashIcon)] retain];
+            icon = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kFullTrashIcon)];
         else
-            icon = [sharedIcon retain];
+            icon = sharedIcon;
     }
     return icon;
 }
 
 - (void)setPithosContainer:(ASIPithosContainer *)aPithosContainer {
     if (![pithosContainer isEqualTo:aPithosContainer]) {
-        [pithosContainer release];
-        pithosContainer = [aPithosContainer retain];
+        pithosContainer = aPithosContainer;
     }
     if (pithosContainer.policy) {
         self.policyVersioning = [pithosContainer.policy objectForKey:@"versioning"];
@@ -222,262 +207,243 @@ static NSImage *sharedIcon = nil;
 #pragma mark ASIHTTPRequestDelegate
 
 - (void)containerRequestFailed:(ASIPithosContainerRequest *)request {
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    NSUInteger retries = [[containerRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
-    if (retries > 0) {
-        ASIPithosContainerRequest *newContainerRequest = (ASIPithosContainerRequest *)[PithosUtilities copyRequest:containerRequest];
-        [(NSMutableDictionary *)(newContainerRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
-        [containerRequest release];
-        containerRequest = newContainerRequest;
-        [[PithosUtilities prepareRequest:containerRequest priority:[[containerRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
-    } else {
+    @autoreleasepool {
         NSString *message;
         NSError *error = [containerRequest error];
         if (error)
-            message = [NSString stringWithFormat:@"Container listing failed: %@", error];
+            message = [NSString stringWithFormat:@"Container listing %@ failed: %@", containerRequest.url, [error localizedDescription]];
         else
-            message = [NSString stringWithFormat:@"Container listing failed: (%d) %@", 
-                       containerRequest.responseStatusCode, containerRequest.responseStatusMessage];
+            message = [NSString stringWithFormat:@"Container listing %@ failed: (%d) %@", 
+                       containerRequest.url, containerRequest.responseStatusCode, containerRequest.responseStatusMessage];
         dispatch_async(dispatch_get_main_queue(), ^{
             [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message];
         });
-        [newChildren release];
-        newChildren = nil;
-        [containerRequest release];
-        containerRequest = nil;
-        [objects release];
-        objects = nil;
-        forcedRefresh = NO;
-        @synchronized(self) {
-            freshness = PithosNodeStateRefreshNeeded;
+        NSUInteger retries = [[containerRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+        if (retries > 0) {
+            ASIPithosContainerRequest *newContainerRequest = (ASIPithosContainerRequest *)[PithosUtilities copyRequest:containerRequest];
+            [(NSMutableDictionary *)(newContainerRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+            containerRequest = newContainerRequest;
+            [[PithosUtilities prepareRequest:containerRequest priority:[[containerRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
+        } else {
+            newChildren = nil;
+            containerRequest = nil;
+            objects = nil;
+            forcedRefresh = NO;
+            @synchronized(self) {
+                freshness = PithosNodeStateRefreshNeeded;
+            }
         }
     }
-    [pool drain];
 }
 
 - (void)containerRequestFinished:(ASIPithosContainerRequest *)request {
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    NSLog(@"List container finished: %@", [containerRequest url]);
-    NSLog(@"Cached: %d", [containerRequest didUseCachedResponse]);
-    if (containerRequest.responseStatusCode == 200) {
-        if ((pithosContainer.blockHash == nil) || (pithosContainer.blockSize == 0)) {
-            pithosContainer.blockHash = [containerRequest blockHash];
-            pithosContainer.blockSize = [containerRequest blockSize];
-        }
-    
-        NSArray *someObjects = [containerRequest objects];
-        if (objects == nil) {
-            objects = [[NSMutableArray alloc] initWithArray:someObjects];
-        } else {
-            [objects addObjectsFromArray:someObjects];
-        }
-        if ([someObjects count] < 10000) {
-            if (!containerRequest.didUseCachedResponse || ([objects count] != [someObjects count]) || !children) {
-                // Save new children
-                NSLog(@"using newChildren");
-                newChildren = [[NSMutableArray alloc] init];
-                NSArray *objectNames = [objects valueForKey:@"name"];
-                NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
-                BOOL isSubdirNode = ([self class] == [PithosSubdirNode class]);
-                for (ASIPithosObject *object in objects) {
-                    if (!isSubdirNode || 
-                        ([object.name hasPrefix:[((PithosSubdirNode *)self).prefix stringByAppendingString:@"/"]] &&
-                         ([object.name length] > [((PithosSubdirNode *)self).prefix length] + 1))) {
-                        // The check above removes false objects due to trailing slash or same prefix
-                        if (object.subdir) {
-                            NSUInteger sameNameObjectIndex = [objectNames indexOfObject:[object.name substringToIndex:([object.name length] - 1)]];
-                            if ((sameNameObjectIndex == NSNotFound) || 
-                                ![PithosUtilities isContentTypeDirectory:[[objects objectAtIndex:sameNameObjectIndex] contentType]]) {
-                                PithosSubdirNode *node = [[[PithosSubdirNode alloc] initWithPithos:pithos 
+    @autoreleasepool {
+        DLog(@"List container finished: %@", [containerRequest url]);
+        DLog(@"Cached: %d", [containerRequest didUseCachedResponse]);
+        if (containerRequest.responseStatusCode == 200) {
+            if ((pithosContainer.blockHash == nil) || (pithosContainer.blockSize == 0)) {
+                pithosContainer.blockHash = [containerRequest blockHash];
+                pithosContainer.blockSize = [containerRequest blockSize];
+            }
+        
+            NSArray *someObjects = [containerRequest objects];
+            if (objects == nil) {
+                objects = [[NSMutableArray alloc] initWithArray:someObjects];
+            } else {
+                [objects addObjectsFromArray:someObjects];
+            }
+            if ([someObjects count] < 10000) {
+                if (!containerRequest.didUseCachedResponse || ([objects count] != [someObjects count]) || !children) {
+                    // Save new children
+                    DLog(@"using newChildren");
+                    newChildren = [[NSMutableArray alloc] init];
+                    NSArray *objectNames = [objects valueForKey:@"name"];
+                    NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
+                    BOOL isSubdirNode = ([self class] == [PithosSubdirNode class]);
+                    for (ASIPithosObject *object in objects) {
+                        if (!isSubdirNode || 
+                            ([object.name hasPrefix:[((PithosSubdirNode *)self).prefix stringByAppendingString:@"/"]] &&
+                             ([object.name length] > [((PithosSubdirNode *)self).prefix length] + 1))) {
+                            // The check above removes false objects due to trailing slash or same prefix
+                            if (object.subdir) {
+                                NSUInteger sameNameObjectIndex = [objectNames indexOfObject:[object.name substringToIndex:([object.name length] - 1)]];
+                                if ((sameNameObjectIndex == NSNotFound) || 
+                                    ![PithosUtilities isContentTypeDirectory:[[objects objectAtIndex:sameNameObjectIndex] contentType]]) {
+                                    PithosSubdirNode *node = [[PithosSubdirNode alloc] initWithPithos:pithos 
+                                                                                       pithosContainer:pithosContainer 
+                                                                                          pithosObject:object];
+                                    node.parent = self;
+                                    node.shared = shared;
+                                    node.sharingAccount = sharingAccount;
+                                    node.inheritChildrenUpdatedNotificationName = inheritChildrenUpdatedNotificationName;
+                                    node.pithosAccountManager = pithosAccountManager;
+                                    if (children) {
+                                        NSUInteger oldIndex = [children indexOfObject:node];
+                                        if (oldIndex != NSNotFound) {
+                                            // Use the same pointer value, if possible
+                                            node = [children objectAtIndex:oldIndex];
+                                            node.pithosContainer = pithosContainer;
+//                                          node.pithosObject = object;
+                                            [node setLimitedPithosObject:object];
+                                            [keptNodes addIndex:oldIndex];
+                                        }
+                                    }
+                                    if (sharingAccount)
+                                        node.pithosObject.allowedTo = @"read";
+                                    [newChildren addObject:node];
+                                }
+                            } else if ([PithosUtilities isContentTypeDirectory:object.contentType]) {
+                                PithosSubdirNode *node = [[PithosSubdirNode alloc] initWithPithos:pithos 
                                                                                    pithosContainer:pithosContainer 
-                                                                                      pithosObject:object] autorelease];
+                                                                                      pithosObject:object];
                                 node.parent = self;
                                 node.shared = shared;
                                 node.sharingAccount = sharingAccount;
+                                node.inheritChildrenUpdatedNotificationName = inheritChildrenUpdatedNotificationName;
+                                node.pithosAccountManager = pithosAccountManager;
                                 if (children) {
                                     NSUInteger oldIndex = [children indexOfObject:node];
                                     if (oldIndex != NSNotFound) {
                                         // Use the same pointer value, if possible
                                         node = [children objectAtIndex:oldIndex];
                                         node.pithosContainer = pithosContainer;
-//                                        node.pithosObject = object;
+//                                      node.pithosObject = object;
                                         [node setLimitedPithosObject:object];
                                         [keptNodes addIndex:oldIndex];
                                     }
                                 }
-                                if (sharingAccount)
-                                    node.pithosObject.allowedTo = [NSString stringWithString:@"read"];
                                 [newChildren addObject:node];
-                            }
-                        } else if ([PithosUtilities isContentTypeDirectory:object.contentType]) {
-                            PithosSubdirNode *node = [[[PithosSubdirNode alloc] initWithPithos:pithos 
-                                                                               pithosContainer:pithosContainer 
-                                                                                  pithosObject:object] autorelease];
-                            node.parent = self;
-                            node.shared = shared;
-                            node.sharingAccount = sharingAccount;
-                            if (children) {
-                                NSUInteger oldIndex = [children indexOfObject:node];
-                                if (oldIndex != NSNotFound) {
-                                    // Use the same pointer value, if possible
-                                    node = [children objectAtIndex:oldIndex];
-                                    node.pithosContainer = pithosContainer;
-//                                    node.pithosObject = object;
-                                    [node setLimitedPithosObject:object];
-                                    [keptNodes addIndex:oldIndex];
-                                }
-                            }
-                            [newChildren addObject:node];
-                        } else {
-                            PithosObjectNode *node = [[[PithosObjectNode alloc] initWithPithos:pithos 
-                                                                               pithosContainer:pithosContainer 
-                                                                                  pithosObject:object] autorelease];
-                            node.parent = self;
-                            node.shared = shared;
-                            node.sharingAccount = sharingAccount;
-                            if (children) {
-                                NSUInteger oldIndex = [children indexOfObject:node];
-                                if (oldIndex != NSNotFound) {
-                                    // Use the same pointer value, if possible
-                                    node = [children objectAtIndex:oldIndex];
-                                    node.pithosContainer = pithosContainer;
-//                                    node.pithosObject = object;
-                                    [node setLimitedPithosObject:object];
-                                    [keptNodes addIndex:oldIndex];
+                            } else {
+                                PithosObjectNode *node = [[PithosObjectNode alloc] initWithPithos:pithos 
+                                                                                   pithosContainer:pithosContainer 
+                                                                                      pithosObject:object];
+                                node.parent = self;
+                                node.shared = shared;
+                                node.sharingAccount = sharingAccount;
+                                node.inheritChildrenUpdatedNotificationName = inheritChildrenUpdatedNotificationName;
+                                node.pithosAccountManager = pithosAccountManager;
+                                if (children) {
+                                    NSUInteger oldIndex = [children indexOfObject:node];
+                                    if (oldIndex != NSNotFound) {
+                                        // Use the same pointer value, if possible
+                                        node = [children objectAtIndex:oldIndex];
+                                        node.pithosContainer = pithosContainer;
+//                                      node.pithosObject = object;
+                                        [node setLimitedPithosObject:object];
+                                        [keptNodes addIndex:oldIndex];
+                                    }
                                 }
+                                [newChildren addObject:node];                                
                             }
-                            [newChildren addObject:node];                                
                         }
                     }
+                    [[children objectsAtIndexes:
+                      [[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [children count])] indexesPassingTest:^(NSUInteger idx, BOOL *stop){
+                        if ([keptNodes containsIndex:idx])
+                            return NO;
+                        return YES;
+                    }]] makeObjectsPerformSelector:@selector(pithosNodeWillBeRemoved)];
+                }
+                // Else cache was used and all results were fetched during this request, so existing children can be reused
+                containerRequest = nil;
+                objects = nil;
+                forcedRefresh = NO;
+                @synchronized(self) {
+                    freshness = PithosNodeStateRefreshFinished;
                 }
-                [[children objectsAtIndexes:
-                  [[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [children count])] indexesPassingTest:^(NSUInteger idx, BOOL *stop){
-                    if ([keptNodes containsIndex:idx])
-                        return NO;
-                    return YES;
-                }]] makeObjectsPerformSelector:@selector(pithosNodeWillBeRemoved)];
+                [self postChildrenUpdatedNotificationName];
+            } else {
+                // Do an additional request to fetch more objects
+                containerRequest = [ASIPithosContainerRequest listObjectsRequestWithPithos:pithos 
+                                                                              containerName:pithosContainer.name 
+                                                                                      limit:0 
+                                                                                     marker:[[someObjects lastObject] name] 
+                                                                                     prefix:prefix 
+                                                                                  delimiter:@"/" 
+                                                                                       path:nil 
+                                                                                       meta:nil 
+                                                                                     shared:shared 
+                                                                                      until:nil];
+                if (sharingAccount)
+                    [containerRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+                else if (!forcedRefresh)
+                    containerRequest.downloadCache = [ASIDownloadCache sharedCache];
+                containerRequest.delegate = self;
+                containerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
+                containerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
+                containerRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
+                                             [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", 
+                                             [NSNumber numberWithUnsignedInteger:10], @"retries", 
+                                             NSStringFromSelector(@selector(containerRequestFinished:)), @"didFinishSelector", 
+                                             NSStringFromSelector(@selector(containerRequestFailed:)), @"didFailSelector", 
+                                             nil];
+                [[PithosUtilities prepareRequest:containerRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
             }
-            // Else cache was used and all results were fetched during this request, so existing children can be reused
-            [containerRequest release];
+        } else if (containerRequest.responseStatusCode == 304) {
+            // Container is not modified, so existing children can be reused
             containerRequest = nil;
-            [objects release];
             objects = nil;
             forcedRefresh = NO;
             @synchronized(self) {
                 freshness = PithosNodeStateRefreshFinished;
             }
-            if (childrenUpdatedNotificationName) {
-                // Notify observers that children are updated
-                [[NSNotificationCenter defaultCenter] postNotificationName:childrenUpdatedNotificationName object:self];
-            }
+            [self postChildrenUpdatedNotificationName];
         } else {
-            [containerRequest release];
-            // Do an additional request to fetch more objects
-            containerRequest = [[ASIPithosContainerRequest listObjectsRequestWithPithos:pithos 
-                                                                          containerName:pithosContainer.name 
-                                                                                  limit:0 
-                                                                                 marker:[[someObjects lastObject] name] 
-                                                                                 prefix:prefix 
-                                                                              delimiter:@"/" 
-                                                                                   path:nil 
-                                                                                   meta:nil 
-                                                                                 shared:shared 
-                                                                                  until:nil] retain];
-            if (sharingAccount)
-                [containerRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
-            containerRequest.delegate = self;
-            containerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
-            containerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
-            containerRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
-                                         [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", 
-                                         [NSNumber numberWithUnsignedInteger:10], @"retries", 
-                                         NSStringFromSelector(@selector(containerRequestFinished:)), @"didFinishSelector", 
-                                         NSStringFromSelector(@selector(containerRequestFailed:)), @"didFailSelector", 
-                                         nil];
-            if (!forcedRefresh)
-            containerRequest.downloadCache = [ASIDownloadCache sharedCache];
-            [[PithosUtilities prepareRequest:containerRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
+            [self containerRequestFailed:containerRequest];
         }
-    } else if (containerRequest.responseStatusCode == 304) {
-        // Container is not modified, so existing children can be reused
-        [containerRequest release];
-        containerRequest = nil;
-        [objects release];
-        objects = nil;
-        forcedRefresh = NO;
-        @synchronized(self) {
-            freshness = PithosNodeStateRefreshFinished;
-        }
-        if (childrenUpdatedNotificationName) {
-            // Notify observers that children are updated
-            [[NSNotificationCenter defaultCenter] postNotificationName:childrenUpdatedNotificationName object:self];
-        }
-    } else {
-        [self containerRequestFailed:containerRequest];
     }
-    [pool drain];
 }
 
 - (void)containerMetadataRequestFinished:(ASIPithosContainerRequest *)request {
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    NSLog(@"URL: %@", [request url]);
-    NSLog(@"cached: %d", [request didUseCachedResponse]);
-    
-    if ([request isEqualTo:applyMetadataContainerRequest]) {
-        @synchronized(self) {
-            [applyMetadataContainerRequest release];
-            applyMetadataContainerRequest = nil;
-        }
-        [self refreshInfo];
-    } else if ([request isEqualTo:refreshMetadataContainerRequest]) {
-        [[pithosNodeInfoController window] makeFirstResponder:nil];
-        self.pithosContainer = [refreshMetadataContainerRequest container];
-        @synchronized(self) {
-            [refreshMetadataContainerRequest release];
-            refreshMetadataContainerRequest = nil;
-        }
-    }
-    [pool drain];
-}
-
-- (void)containerMetadataRequestFailed:(ASIPithosContainerRequest *)request {
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue];
-    if (retries > 0) {
-        ASIPithosContainerRequest *newRequest = (ASIPithosContainerRequest *)[[PithosUtilities copyRequest:request] autorelease];
-        [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+    @autoreleasepool {
+        DLog(@"URL: %@", [request url]);
+        DLog(@"cached: %d", [request didUseCachedResponse]);
+        
         if ([request isEqualTo:applyMetadataContainerRequest]) {
             @synchronized(self) {
-                [applyMetadataContainerRequest release];
-                applyMetadataContainerRequest = newRequest;
+                applyMetadataContainerRequest = nil;
             }
+            [self refreshInfo];
         } else if ([request isEqualTo:refreshMetadataContainerRequest]) {
+            [[pithosNodeInfoController window] makeFirstResponder:nil];
+            self.pithosContainer = [refreshMetadataContainerRequest container];
             @synchronized(self) {
-                [refreshMetadataContainerRequest release];
-                refreshMetadataContainerRequest = newRequest;
+                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;
+    }
+}
+
+- (void)containerMetadataRequestFailed:(ASIPithosContainerRequest *)request {
+    @autoreleasepool {
+        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 = newRequest;
+                }
+            } else if ([request isEqualTo:refreshMetadataContainerRequest]) {
+                @synchronized(self) {
+                    refreshMetadataContainerRequest = newRequest;
+                }
             }
-        } else if ([request isEqualTo:refreshMetadataContainerRequest]) {
-            dispatch_async(dispatch_get_main_queue(), ^{
+            [[PithosUtilities prepareRequest:newRequest priority:[[newRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
+        } else {
+            if ([request isEqualTo:applyMetadataContainerRequest]) {
+                [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataContainerRequest];
+                @synchronized(self) {
+                    applyMetadataContainerRequest = nil;
+                }
+            } else if ([request isEqualTo:refreshMetadataContainerRequest]) {
                 [PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataContainerRequest];
-            });
-            @synchronized(self) {
-                [refreshMetadataContainerRequest release];
-                refreshMetadataContainerRequest = nil;
+                @synchronized(self) {
+                    refreshMetadataContainerRequest = nil;
+                }
             }
         }
     }
-    [pool drain];
 }
 
 #pragma mark -
@@ -487,14 +453,14 @@ static NSImage *sharedIcon = nil;
     @synchronized(self) {
         if (applyMetadataContainerRequest == nil) {
             [[pithosNodeInfoController window] makeFirstResponder:nil];
-            applyMetadataContainerRequest = [[ASIPithosContainerRequest updateContainerMetadataRequestWithPithos:pithos 
+            applyMetadataContainerRequest = [ASIPithosContainerRequest updateContainerMetadataRequestWithPithos:pithos 
                                                                                                    containerName:pithosContainer.name 
                                                                                                           policy:[NSDictionary dictionaryWithObjectsAndKeys:
                                                                                                                   policyVersioning, @"versioning", 
                                                                                                                   [policyQuota stringValue], @"quota", 
                                                                                                                   nil] 
                                                                                                         metadata:pithosContainer.metadata 
-                                                                                                          update:NO] retain];
+                                                                                                          update:NO];
             applyMetadataContainerRequest.delegate = self;
             applyMetadataContainerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
             applyMetadataContainerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
@@ -512,8 +478,8 @@ static NSImage *sharedIcon = nil;
 - (void)refreshInfo {
     @synchronized(self) {
         if (refreshMetadataContainerRequest == nil) {
-            refreshMetadataContainerRequest = [[ASIPithosContainerRequest containerMetadataRequestWithPithos:pithos 
-                                                                                               containerName:pithosContainer.name] retain];
+            refreshMetadataContainerRequest = [ASIPithosContainerRequest containerMetadataRequestWithPithos:pithos 
+                                                                                               containerName:pithosContainer.name];
             refreshMetadataContainerRequest.delegate = self;
             refreshMetadataContainerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
             refreshMetadataContainerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
@@ -523,7 +489,8 @@ static NSImage *sharedIcon = nil;
                                                         NSStringFromSelector(@selector(containerMetadataRequestFinished:)), @"didFinishSelector", 
                                                         NSStringFromSelector(@selector(containerMetadataRequestFailed:)), @"didFailSelector", 
                                                         nil];
-            refreshMetadataContainerRequest.downloadCache = [ASIDownloadCache sharedCache];
+            if (!sharingAccount)
+                refreshMetadataContainerRequest.downloadCache = [ASIDownloadCache sharedCache];
             [[PithosUtilities prepareRequest:refreshMetadataContainerRequest priority:NSOperationQueuePriorityHigh] startAsynchronous];
         }
     }