#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) {
// 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];
}
}
- node.parent = self;
- node.shared = shared;
[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;
}
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