All requests made asynchronous.
[pithos-macos] / pithos-macos / PithosAccountNode.m
index 9d5afc9..e45b6d7 100644 (file)
 #import "PithosAccountNode.h"
 #import "PithosContainerNode.h"
 #import "ASIPithosAccountRequest.h"
+#import "ASIPithosAccount.h"
 #import "ASIPithosContainer.h"
 #import "ASIDownloadCache.h"
-#import "PithosFileUtilities.h"
+#import "PithosUtilities.h"
+
+static NSImage *sharedIcon = nil;
 
 @implementation PithosAccountNode
+@synthesize pithosAccount;
+
++ (void)initialize {
+       if (self == [PithosAccountNode class])
+        sharedIcon = [[[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kUserIcon)] retain];
+}
 
 #pragma mark -
 #pragma mark Object Lifecycle
 - (void)dealloc {
     [accountRequest clearDelegatesAndCancel];
     [accountRequest release];
+    [refreshMetadataAccountRequest clearDelegatesAndCancel];
+    [refreshMetadataAccountRequest release];
+    [applyMetadataAccountRequest clearDelegatesAndCancel];
+    [applyMetadataAccountRequest release];
     [containers release];
+    [pithosAccount release];
     [super dealloc];
 }
 
 #pragma mark Properties
 
 - (NSString *)url {
-    if (url == nil) 
-        url = [[ASIPithosRequest storageURL] copy];
+    if (url == nil)
+        url = [[NSString alloc] initWithFormat:@"%@%@", 
+               (sharingAccount ? [ASIPithosRequest storageURLWithAuthUser:sharingAccount] : [ASIPithosRequest storageURL]), 
+               (shared ? @"?shared" : @"")];
     return url;
 }
 
                                                                                    marker:nil 
                                                                                    shared:shared 
                                                                                     until:nil] retain];
+                if (sharingAccount)
+                    [accountRequest setRequestUserFromDefaultTo:sharingAccount];
                 accountRequest.delegate = self;
                 accountRequest.didFinishSelector = @selector(accountRequestFinished:);
                 accountRequest.didFailSelector = @selector(accountRequestFailed:);
-                accountRequest.downloadCache = [ASIDownloadCache sharedCache];
-                [accountRequest startAsynchronous];
+                if (!forcedRefresh)
+                    accountRequest.downloadCache = [ASIDownloadCache sharedCache];
+                [[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
                 break;
             case PithosNodeStateRefreshing:
                 break;
 }
 
 - (NSString *)displayName {
-    if (displayName == nil) {
-        displayName = [[NSString alloc] initWithString:@"account"];
-    }
-    return 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 -
 - (void)accountRequestFinished:(ASIPithosAccountRequest *)request {
     NSLog(@"URL: %@", [accountRequest url]);
     NSLog(@"cached: %d", [accountRequest didUseCachedResponse]);
+
+    self.pithosAccount = [accountRequest account];
     
     NSArray *someContainers = [accountRequest containers];
     if (containers == nil) {
             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) {
                         [keptNodes addIndex:oldIndex];
                     }
                 }
-                node.parent = self;
-                node.shared = shared;
                 [newChildren addObject:node];
             }
             [[children objectsAtIndexes:
         accountRequest = nil;
         [containers release];
         containers = nil;
+        forcedRefresh = NO;
         @synchronized(self) {
             freshness = PithosNodeStateRefreshFinished;
         }
                                                                            marker:[[someContainers lastObject] name] 
                                                                            shared:shared 
                                                                             until:nil] retain];
+        if (sharingAccount)
+            [accountRequest setRequestUserFromDefaultTo:sharingAccount];
         accountRequest.delegate = self;
-        accountRequest.downloadCache = [ASIDownloadCache sharedCache];
-        [accountRequest startAsynchronous];
+        if (!forcedRefresh)
+            accountRequest.downloadCache = [ASIDownloadCache sharedCache];
+        [[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
     }
 }
 
 - (void)accountRequestFailed:(ASIPithosAccountRequest *)request {
-    [PithosFileUtilities httpRequestErrorAlertWithRequest:request];
+    [PithosUtilities httpRequestErrorAlertWithRequest:request];
     [newChildren release];
     newChildren = nil;
     [accountRequest release];
     accountRequest = nil;
     [containers release];
     containers = nil;
+    forcedRefresh = NO;
     @synchronized(self) {
         freshness = PithosNodeStateRefreshNeeded;
     }
 }
 
+- (void)accountMetadataRequestFinished:(ASIPithosAccountRequest *)request {
+    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;
+        }
+    }
+}
+
+- (void)accountMetadataRequestFailed:(ASIPithosAccountRequest *)request {
+    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;
+        }
+    }
+}
+
+#pragma mark -
+#pragma mark Info
+
+- (void)applyInfo {
+    @synchronized(self) {
+        if (applyMetadataAccountRequest == nil) {
+            NSMutableDictionary *groups = pithosAccount.groups;
+            if ([groups count] == 0)
+                groups = [NSMutableDictionary dictionaryWithObject:@"" forKey:@"group"];
+            applyMetadataAccountRequest = [[ASIPithosAccountRequest updateAccountMetadataRequestWithGroups:groups 
+                                                                                                  metadata:pithosAccount.metadata 
+                                                                                                    update:NO] retain];
+            applyMetadataAccountRequest.delegate = self;
+            applyMetadataAccountRequest.didFinishSelector = @selector(accountMetadataRequestFinished:);
+            applyMetadataAccountRequest.didFailSelector = @selector(accountMetadataRequestFailed:);
+            [[PithosUtilities prepareRequest:applyMetadataAccountRequest priority:NSOperationQueuePriorityHigh] startAsynchronous];
+        }
+    }
+}
+
+- (void)refreshInfo {
+    @synchronized(self) {
+        if (refreshMetadataAccountRequest == nil) {
+            refreshMetadataAccountRequest = [[ASIPithosAccountRequest accountMetadataRequest] retain];
+            refreshMetadataAccountRequest.delegate = self;
+            refreshMetadataAccountRequest.didFinishSelector = @selector(accountMetadataRequestFinished:);
+            refreshMetadataAccountRequest.didFailSelector = @selector(accountMetadataRequestFailed:);
+            refreshMetadataAccountRequest.downloadCache = [ASIDownloadCache sharedCache];
+            [[PithosUtilities prepareRequest:refreshMetadataAccountRequest priority:NSOperationQueuePriorityHigh] startAsynchronous];
+        }
+    }
+}
+
 @end