Shift-refresh forces no use of cache.
[pithos-macos] / pithos-macos / PithosAccountNode.m
index 049869e..14d0642 100644 (file)
 #import "ASIDownloadCache.h"
 #import "PithosFileUtilities.h"
 
+static NSImage *sharedIcon = nil;
+
 @implementation PithosAccountNode
 
++ (void)initialize {
+       if (self == [PithosAccountNode class])
+        sharedIcon = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kUserIcon)] retain];
+}
+
 #pragma mark -
 #pragma mark Object Lifecycle
 
 }
 
 #pragma mark -
+#pragma mark Properties
+
+- (NSString *)url {
+    if (url == nil)
+        url = [[NSString alloc] initWithFormat:@"%@%@", 
+               (sharingAccount ? [ASIPithosRequest storageURLWithAuthUser:sharingAccount] : [ASIPithosRequest storageURL]), 
+               (shared ? @"?shared" : @"")];
+    return url;
+}
+
+- (NSArray *)children {
+    @synchronized(self) {
+        switch (freshness) {
+            case PithosNodeStateFresh:
+                break;
+            case PithosNodeStateRefreshNeeded:
+                freshness = PithosNodeStateRefreshing;
+                accountRequest = [[ASIPithosAccountRequest listContainersRequestWithLimit:0 
+                                                                                   marker:nil 
+                                                                                   shared:shared 
+                                                                                    until:nil] retain];
+                if (sharingAccount)
+                    [accountRequest setRequestUserFromDefaultTo:sharingAccount];
+                accountRequest.delegate = self;
+                accountRequest.didFinishSelector = @selector(accountRequestFinished:);
+                accountRequest.didFailSelector = @selector(accountRequestFailed:);
+                if (!forcedRefresh)
+                    accountRequest.downloadCache = [ASIDownloadCache sharedCache];
+                [accountRequest startAsynchronous];
+                break;
+            case PithosNodeStateRefreshing:
+                break;
+            case PithosNodeStateRefreshFinished:
+                if (newChildren) {
+                    [children release];
+                    children = newChildren;
+                    newChildren = nil;
+                }
+                freshness = PithosNodeStateFresh;
+            default:
+                break;
+        }
+        return children;
+    }
+}
+
+- (NSString *)displayName {
+    if (displayName == nil)
+        return [NSString stringWithString:(sharingAccount ? sharingAccount : @"account")];
+    return [[displayName copy] autorelease];
+}
+
+- (NSImage *)icon {
+    if (icon == nil)
+        icon = [sharedIcon retain];
+    return icon;
+}
+
+#pragma mark -
 #pragma mark ASIHTTPRequestDelegate
 
 - (void)accountRequestFinished:(ASIPithosAccountRequest *)request {
             // Save new children
             NSLog(@"using newChildren");
             newChildren = [[NSMutableArray alloc] init];
+            NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
             for (ASIPithosContainer *container in containers) {
                 PithosContainerNode *node = [[[PithosContainerNode alloc] initWithPithosContainer:container] 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 = container;
+                        [keptNodes addIndex:oldIndex];
                     }
                 }
                 [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
         [accountRequest release];
         accountRequest = nil;
         [containers release];
         containers = nil;
+        forcedRefresh = NO;
         @synchronized(self) {
             freshness = PithosNodeStateRefreshFinished;
         }
         // Do an additional request to fetch more objects
         accountRequest = [[ASIPithosAccountRequest listContainersRequestWithLimit:0 
                                                                            marker:[[someContainers lastObject] name] 
-                                                                           shared:NO 
+                                                                           shared:shared 
                                                                             until:nil] retain];
+        if (sharingAccount)
+            [accountRequest setRequestUserFromDefaultTo:sharingAccount];
         accountRequest.delegate = self;
-        accountRequest.downloadCache = [ASIDownloadCache sharedCache];
+        if (!forcedRefresh)
+            accountRequest.downloadCache = [ASIDownloadCache sharedCache];
         [accountRequest startAsynchronous];
     }
 }
     accountRequest = nil;
     [containers release];
     containers = nil;
+    forcedRefresh = NO;
     @synchronized(self) {
         freshness = PithosNodeStateRefreshNeeded;
     }
 }
 
-#pragma mark -
-#pragma mark Properties
-
-- (NSString *)url {
-    if (url == nil) 
-        url = [[ASIPithosRequest storageURL] copy];
-    return url;
-}
-
-- (NSArray *)children {
-    @synchronized(self) {
-        switch (freshness) {
-            case PithosNodeStateFresh:
-                break;
-            case PithosNodeStateRefreshNeeded:
-                freshness = PithosNodeStateRefreshing;
-                accountRequest = [[ASIPithosAccountRequest listContainersRequestWithLimit:0 
-                                                                                   marker:nil 
-                                                                                   shared:NO 
-                                                                                    until:nil] retain];
-                accountRequest.delegate = self;
-                accountRequest.didFinishSelector = @selector(accountRequestFinished:);
-                accountRequest.didFailSelector = @selector(accountRequestFailed:);
-                accountRequest.downloadCache = [ASIDownloadCache sharedCache];
-                [accountRequest startAsynchronous];
-                break;
-            case PithosNodeStateRefreshing:
-                break;
-            case PithosNodeStateRefreshFinished:
-                if (newChildren) {
-                    [children release];
-                    children = newChildren;
-                    newChildren = nil;
-                }
-                freshness = PithosNodeStateFresh;
-            default:
-                break;
-        }
-        return children;
-    }
-}
-
-- (NSString *)displayName {
-    if (displayName == nil) {
-        displayName = [[NSString alloc] initWithString:@"account"];
-    }
-    return displayName;
-}
-
-- (NSImage *)icon {
-    return nil;
-}
-    
 @end