Reset state of root nodes when pithos is set. Send verbose messages on all node listi...
[pithos-macos] / pithos-macos / PithosAccountNode.m
index fed83ed..34b6e8d 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;
@@ -158,6 +188,16 @@ static NSImage *sharedIcon = nil;
 
 - (void)accountRequestFailed:(ASIPithosAccountRequest *)request {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+    NSString *message;
+    NSError *error = [accountRequest error];
+    if (error)
+        message = [NSString stringWithFormat:@"Account listing %@ failed: %@", accountRequest.url, [error localizedDescription]];
+    else
+        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];
+    });
     NSUInteger retries = [[accountRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
     if (retries > 0) {
         ASIPithosAccountRequest *newAccountRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:accountRequest];
@@ -166,16 +206,6 @@ static NSImage *sharedIcon = nil;
         accountRequest = newAccountRequest;
         [[PithosUtilities prepareRequest:accountRequest priority:[[accountRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
     } else {
-        NSString *message;
-        NSError *error = [accountRequest error];
-        if (error)
-            message = [NSString stringWithFormat:@"Account listing failed: %@", error];
-        else
-            message = [NSString stringWithFormat:@"Account listing failed: (%d) %@", 
-                       accountRequest.responseStatusCode, accountRequest.responseStatusMessage];
-        dispatch_async(dispatch_get_main_queue(), ^{
-            [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message];
-        });
         [newChildren release];
         newChildren = nil;
         [accountRequest release];