Fix analyze errors
[pithos-macos] / pithos-macos / PithosAccountNode.m
index eba9b49..10fa3a4 100644 (file)
@@ -60,7 +60,7 @@ static NSImage *sharedIcon = nil;
 
 - (id)initWithPithos:(ASIPithos *)aPithos {
     if ((self = [super init])) {
-        self.pithos = aPithos;
+        pithos = [aPithos retain];
     }
     return self;
 }
@@ -87,6 +87,16 @@ static NSImage *sharedIcon = nil;
         pithos = [aPithos retain];
         [url release];
         url = nil;
+        [accountRequest clearDelegatesAndCancel];
+        [accountRequest release];
+        accountRequest = nil;
+        [refreshMetadataAccountRequest clearDelegatesAndCancel];
+        [refreshMetadataAccountRequest release];
+        refreshMetadataAccountRequest = nil;
+        [applyMetadataAccountRequest clearDelegatesAndCancel];
+        [applyMetadataAccountRequest release];
+        applyMetadataAccountRequest = nil;
+        reset = YES;
     }
 }
 
@@ -100,6 +110,26 @@ static NSImage *sharedIcon = nil;
 
 - (NSArray *)children {
     @synchronized(self) {
+        if (reset) {
+            [accountRequest clearDelegatesAndCancel];
+            [accountRequest release];
+            accountRequest = nil;
+            [refreshMetadataAccountRequest clearDelegatesAndCancel];
+            [refreshMetadataAccountRequest release];
+            refreshMetadataAccountRequest = nil;
+            [applyMetadataAccountRequest clearDelegatesAndCancel];
+            [applyMetadataAccountRequest release];
+            applyMetadataAccountRequest = nil;
+            [children release];
+            children = nil;
+            [newChildren release];
+            newChildren = nil;
+            self.pithosAccount = nil;
+            freshness = PithosNodeStateRefreshNeeded;
+            forcedRefresh = YES;
+            reset = NO;
+            [self postChildrenUpdatedNotificationName];
+        }
         switch (freshness) {
             case PithosNodeStateFresh:
                 break;
@@ -112,6 +142,8 @@ static NSImage *sharedIcon = nil;
                                                                                      until:nil] retain];
                 if (sharingAccount)
                     [accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+                else if (!forcedRefresh)
+                    accountRequest.downloadCache = [ASIDownloadCache sharedCache];
                 accountRequest.delegate = self;
                 accountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
                 accountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
@@ -121,8 +153,6 @@ static NSImage *sharedIcon = nil;
                                            NSStringFromSelector(@selector(accountRequestFinished:)), @"didFinishSelector", 
                                            NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector", 
                                            nil];
-                if (!forcedRefresh)
-                    accountRequest.downloadCache = [ASIDownloadCache sharedCache];
                 [[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
                 break;
             case PithosNodeStateRefreshing:
@@ -157,84 +187,118 @@ static NSImage *sharedIcon = nil;
 #pragma mark ASIHTTPRequestDelegate
 
 - (void)accountRequestFailed:(ASIPithosAccountRequest *)request {
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    NSUInteger retries = [[accountRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
-    if (retries > 0) {
-        ASIPithosAccountRequest *newAccountRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:accountRequest];
-        [(NSMutableDictionary *)(newAccountRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
-        [accountRequest release];
-        accountRequest = newAccountRequest;
-        [[PithosUtilities prepareRequest:accountRequest priority:[[accountRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
-    } else {
+    @autoreleasepool {
         NSString *message;
         NSError *error = [accountRequest error];
         if (error)
-            message = [NSString stringWithFormat:@"Account listing failed: %@", error];
+            message = [NSString stringWithFormat:@"Account listing %@ failed: %@", accountRequest.url, [error localizedDescription]];
         else
-            message = [NSString stringWithFormat:@"Account listing failed: (%d) %@", 
-                       accountRequest.responseStatusCode, accountRequest.responseStatusMessage];
+            message = [NSString stringWithFormat:@"Account listing %@ failed: (%d) %@", 
+                       accountRequest.url, accountRequest.responseStatusCode, accountRequest.responseStatusMessage];
         dispatch_async(dispatch_get_main_queue(), ^{
             [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message];
         });
-        [newChildren release];
-        newChildren = nil;
-        [accountRequest release];
-        accountRequest = nil;
-        [containers release];
-        containers = nil;
-        forcedRefresh = NO;
-        @synchronized(self) {
-            freshness = PithosNodeStateRefreshNeeded;
+        NSUInteger retries = [[accountRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+        if (retries > 0) {
+            ASIPithosAccountRequest *newAccountRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:accountRequest];
+            [(NSMutableDictionary *)(newAccountRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+            [accountRequest release];
+            accountRequest = newAccountRequest;
+            [[PithosUtilities prepareRequest:accountRequest priority:[[accountRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
+        } else {
+            [newChildren release];
+            newChildren = nil;
+            [accountRequest release];
+            accountRequest = nil;
+            [containers release];
+            containers = nil;
+            forcedRefresh = NO;
+            @synchronized(self) {
+                freshness = PithosNodeStateRefreshNeeded;
+            }
         }
     }
-    [pool drain];
 }
 
 - (void)accountRequestFinished:(ASIPithosAccountRequest *)request {
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    NSLog(@"List account finished: %@", [accountRequest url]);
-    NSLog(@"Cached: %d", [accountRequest didUseCachedResponse]);
-    if (accountRequest.responseStatusCode == 200) {
-        self.pithosAccount = [accountRequest account];
-        
-        NSArray *someContainers = [accountRequest containers];
-        if (containers == nil) {
-            containers = [[NSMutableArray alloc] initWithArray:someContainers];
-        } else {
-            [containers addObjectsFromArray:someContainers];
-        }
-        if ([someContainers count] < 10000) {
-            if (!accountRequest.didUseCachedResponse || ([containers count] != [someContainers count]) || !children) {
-                // Save new children
-                NSLog(@"using newChildren");
-                newChildren = [[NSMutableArray alloc] init];
-                NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
-                for (ASIPithosContainer *container in containers) {
-                    PithosContainerNode *node = [[[PithosContainerNode alloc] initWithPithos:pithos pithosContainer:container] autorelease];
-                    node.parent = self;
-                    node.shared = shared;
-                    node.sharingAccount = sharingAccount;
-                    node.inheritChildrenUpdatedNotificationName = inheritChildrenUpdatedNotificationName;
-                    if (children) {
-                        NSUInteger oldIndex = [children indexOfObject:node];
-                        if (oldIndex != NSNotFound) {
-                            // Use the same pointer value, if possible
-                            node = [children objectAtIndex:oldIndex];
-//                            node.pithosContainer = container;
-                            [node setLimitedPithosContainer:container];
-                            [keptNodes addIndex:oldIndex];
+    @autoreleasepool {
+        DLog(@"List account finished: %@", [accountRequest url]);
+        DLog(@"Cached: %d", [accountRequest didUseCachedResponse]);
+        if (accountRequest.responseStatusCode == 200) {
+            self.pithosAccount = [accountRequest account];
+            
+            NSArray *someContainers = [accountRequest containers];
+            if (containers == nil) {
+                containers = [[NSMutableArray alloc] initWithArray:someContainers];
+            } else {
+                [containers addObjectsFromArray:someContainers];
+            }
+            if ([someContainers count] < 10000) {
+                if (!accountRequest.didUseCachedResponse || ([containers count] != [someContainers count]) || !children) {
+                    // Save new children
+                    DLog(@"using newChildren");
+                    newChildren = [[NSMutableArray alloc] init];
+                    NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
+                    for (ASIPithosContainer *container in containers) {
+                        PithosContainerNode *node = [[[PithosContainerNode alloc] initWithPithos:pithos pithosContainer:container] autorelease];
+                        node.parent = self;
+                        node.shared = shared;
+                        node.sharingAccount = sharingAccount;
+                        node.inheritChildrenUpdatedNotificationName = inheritChildrenUpdatedNotificationName;
+                        if (children) {
+                            NSUInteger oldIndex = [children indexOfObject:node];
+                            if (oldIndex != NSNotFound) {
+                                // Use the same pointer value, if possible
+                                node = [children objectAtIndex:oldIndex];
+    //                            node.pithosContainer = container;
+                                [node setLimitedPithosContainer:container];
+                                [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)];
                 }
-                [[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
+                [accountRequest release];
+                accountRequest = nil;
+                [containers release];
+                containers = nil;
+                forcedRefresh = NO;
+                @synchronized(self) {
+                    freshness = PithosNodeStateRefreshFinished;
+                }
+                [self postChildrenUpdatedNotificationName];
+            } else {
+                [accountRequest release];
+                // Do an additional request to fetch more objects
+                accountRequest = [[ASIPithosAccountRequest listContainersRequestWithPithos:pithos 
+                                                                                     limit:0 
+                                                                                    marker:[[someContainers lastObject] name] 
+                                                                                    shared:shared 
+                                                                                     until:nil] retain];
+                if (sharingAccount)
+                    [accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+                else if (!forcedRefresh)
+                    accountRequest.downloadCache = [ASIDownloadCache sharedCache];
+                accountRequest.delegate = self;
+                accountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
+                accountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
+                accountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
+                                           [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", 
+                                           [NSNumber numberWithUnsignedInteger:10], @"retries", 
+                                           NSStringFromSelector(@selector(accountRequestFinished:)), @"didFinishSelector", 
+                                           NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector", 
+                                           nil];
+                [[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
             }
-            // Else cache was used and all results were fetched during this request, so existing children can be reused
+        } else if (accountRequest.responseStatusCode == 304) {
+            // Account is not modified, so existing children can be reused
             [accountRequest release];
             accountRequest = nil;
             [containers release];
@@ -245,104 +309,67 @@ static NSImage *sharedIcon = nil;
             }
             [self postChildrenUpdatedNotificationName];
         } else {
-            [accountRequest release];
-            // Do an additional request to fetch more objects
-            accountRequest = [[ASIPithosAccountRequest listContainersRequestWithPithos:pithos 
-                                                                                 limit:0 
-                                                                                marker:[[someContainers lastObject] name] 
-                                                                                shared:shared 
-                                                                                 until:nil] retain];
-            if (sharingAccount)
-                [accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
-            accountRequest.delegate = self;
-            accountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
-            accountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
-            accountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
-                                       [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority", 
-                                       [NSNumber numberWithUnsignedInteger:10], @"retries", 
-                                       NSStringFromSelector(@selector(accountRequestFinished:)), @"didFinishSelector", 
-                                       NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector", 
-                                       nil];
-            if (!forcedRefresh)
-                accountRequest.downloadCache = [ASIDownloadCache sharedCache];
-            [[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
+            [self accountRequestFailed:accountRequest];
         }
-    } else if (accountRequest.responseStatusCode == 304) {
-        // Account is not modified, so existing children can be reused
-        [accountRequest release];
-        accountRequest = nil;
-        [containers release];
-        containers = nil;
-        forcedRefresh = NO;
-        @synchronized(self) {
-            freshness = PithosNodeStateRefreshFinished;
-        }
-        [self postChildrenUpdatedNotificationName];
-    } else {
-        [self accountRequestFailed:accountRequest];
     }
-    [pool drain];
 }
 
 - (void)accountMetadataRequestFinished:(ASIPithosAccountRequest *)request {
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    NSLog(@"URL: %@", [request url]);
-    NSLog(@"cached: %d", [request didUseCachedResponse]);
-    
-    if ([request isEqualTo:applyMetadataAccountRequest]) {
-        @synchronized(self) {
-            [applyMetadataAccountRequest release];
-            applyMetadataAccountRequest = nil;
-        }
-        [self refreshInfo];
-    } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
-        self.pithosAccount = [refreshMetadataAccountRequest account];
-        @synchronized(self) {
-            [refreshMetadataAccountRequest release];
-            refreshMetadataAccountRequest = nil;
-        }
-    }
-    [pool drain];
-}
-
-- (void)accountMetadataRequestFailed:(ASIPithosAccountRequest *)request {
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue];
-    if (retries > 0) {
-        ASIPithosAccountRequest *newRequest = (ASIPithosAccountRequest *)[[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:applyMetadataAccountRequest]) {
             @synchronized(self) {
                 [applyMetadataAccountRequest release];
-                applyMetadataAccountRequest = newRequest;
+                applyMetadataAccountRequest = nil;
             }
+            [self refreshInfo];
         } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
+            self.pithosAccount = [refreshMetadataAccountRequest account];
             @synchronized(self) {
                 [refreshMetadataAccountRequest release];
-                refreshMetadataAccountRequest = newRequest;
+                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;
+    }
+}
+
+- (void)accountMetadataRequestFailed:(ASIPithosAccountRequest *)request {
+    @autoreleasepool {
+        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]) {
-            dispatch_async(dispatch_get_main_queue(), ^{
+            [[PithosUtilities prepareRequest:newRequest priority:[[newRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
+            [newRequest release];
+        } else {
+            if ([request isEqualTo:applyMetadataAccountRequest]) {
+                [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataAccountRequest];
+                @synchronized(self) {
+                    [applyMetadataAccountRequest release];
+                    applyMetadataAccountRequest = nil;
+                }
+            } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
                 [PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataAccountRequest];
-            });
-            @synchronized(self) {
-                [refreshMetadataAccountRequest release];
-                refreshMetadataAccountRequest = nil;
+                @synchronized(self) {
+                    [refreshMetadataAccountRequest release];
+                    refreshMetadataAccountRequest = nil;
+                }
             }
         }
     }
-    [pool drain];
 }
 
 #pragma mark -
@@ -385,7 +412,8 @@ static NSImage *sharedIcon = nil;
                                                       NSStringFromSelector(@selector(accountMetadataRequestFinished:)), @"didFinishSelector", 
                                                       NSStringFromSelector(@selector(accountMetadataRequestFailed:)), @"didFailSelector", 
                                                       nil];
-            refreshMetadataAccountRequest.downloadCache = [ASIDownloadCache sharedCache];
+            if (!sharingAccount)
+                refreshMetadataAccountRequest.downloadCache = [ASIDownloadCache sharedCache];
             [[PithosUtilities prepareRequest:refreshMetadataAccountRequest priority:NSOperationQueuePriorityHigh] startAsynchronous];
         }
     }