// PithosAccountNode.m
// pithos-macos
//
-// Copyright 2011-2012 GRNET S.A. All rights reserved.
+// Copyright 2011-2013 GRNET S.A. All rights reserved.
//
// Redistribution and use in source and binary forms, with or
// without modification, are permitted provided that the following
#import "ASIPithos.h"
#import "ASIPithosAccount.h"
#import "ASIDownloadCache.h"
+#import "PithosAccount.h"
#import "PithosUtilities.h"
#import "PithosActivityFacility.h"
@implementation PithosSharingAccountsNode
-@synthesize pithos;
+@synthesize sharingAccountsRequest;
#pragma mark -
#pragma mark Object Lifecycle
-- (id)initWithPithos:(ASIPithos *)aPithos {
- if ((self = [super init])) {
- pithos = aPithos;
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager {
+ if ((self = [super initWithPithosAccountManager:aPithosAccountManager])) {
self.sharingAccount = @"";
}
return self;
}
#pragma mark -
-#pragma mark Properties
+#pragma mark Actions
-- (void)setPithos:(ASIPithos *)aPithos {
- if (aPithos && ![aPithos isEqualTo:pithos]) {
- pithos = aPithos;
- url = nil;
- [sharingAccountsRequest clearDelegatesAndCancel];
- sharingAccountsRequest = nil;
- reset = YES;
- }
+- (void)reset {
+ [sharingAccountsRequest clearDelegatesAndCancel];
+ self.sharingAccountsRequest = nil;
+ children = nil;
+ newChildren = nil;
+ freshness = PithosNodeStateRefreshNeeded;
+ forcedRefresh = YES;
+ [self postChildrenUpdatedNotificationName];
+ [self children];
}
+#pragma mark -
+#pragma mark Properties
+
- (NSString *)url {
- if (url == nil)
- url = [pithos.storageURLPrefix copy];
- return url;
+ return @"@sharing accounts@";
}
- (NSArray *)children {
@synchronized(self) {
- if (reset) {
- [sharingAccountsRequest clearDelegatesAndCancel];
- sharingAccountsRequest = nil;
- children = nil;
- newChildren = nil;
- freshness = PithosNodeStateRefreshNeeded;
- forcedRefresh = YES;
- reset = NO;
- [self postChildrenUpdatedNotificationName];
- }
switch (freshness) {
case PithosNodeStateFresh:
break;
case PithosNodeStateRefreshNeeded:
freshness = PithosNodeStateRefreshing;
- sharingAccountsRequest = [ASIPithosRequest listSharingAccountsRequestWithPithos:pithos limit:0 marker:nil];
+ self.sharingAccountsRequest = [ASIPithosRequest listSharingAccountsRequestWithPithos:pithosAccountManager.pithos limit:0 marker:nil];
sharingAccountsRequest.delegate = self;
sharingAccountsRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
sharingAccountsRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
if (retries > 0) {
ASIPithosRequest *newSharingAccountsRequest = (ASIPithosRequest *)[PithosUtilities copyRequest:sharingAccountsRequest];
[(NSMutableDictionary *)(newSharingAccountsRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
- sharingAccountsRequest = newSharingAccountsRequest;
+ self.sharingAccountsRequest = newSharingAccountsRequest;
[[PithosUtilities prepareRequest:sharingAccountsRequest priority:[[sharingAccountsRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
} else {
newChildren = nil;
- sharingAccountsRequest = nil;
- sharingAccounts = nil;
+ self.sharingAccountsRequest = nil;
forcedRefresh = NO;
@synchronized(self) {
freshness = PithosNodeStateRefreshNeeded;
DLog(@"List sharing accounts finished: %@", [sharingAccountsRequest url]);
DLog(@"Cached: %d", [sharingAccountsRequest didUseCachedResponse]);
if (sharingAccountsRequest.responseStatusCode == 200) {
+ NSMutableArray *sharingAccounts = [sharingAccountsRequest.userInfo objectForKey:@"sharingAccounts"];
NSArray *someSharingAccounts = [sharingAccountsRequest sharingAccounts];
if (sharingAccounts == nil) {
- sharingAccounts = [[NSMutableArray alloc] initWithArray:someSharingAccounts];
+ sharingAccounts = [NSMutableArray arrayWithArray:someSharingAccounts];
} else {
[sharingAccounts addObjectsFromArray:someSharingAccounts];
}
newChildren = [[NSMutableArray alloc] init];
NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
for (ASIPithosAccount *account in sharingAccounts) {
- if (![account.name isEqualToString:pithos.authUser]) {
- PithosAccountNode *node = [[PithosAccountNode alloc] initWithPithos:pithos];
+ if (![account.name isEqualToString:pithosAccountManager.pithos.authUser]) {
+ PithosAccountNode *node = [[PithosAccountNode alloc] initWithPithosAccountManager:pithosAccountManager];
node.parent = self;
node.shared = shared;
node.sharingAccount = account.name;
}]] makeObjectsPerformSelector:@selector(pithosNodeWillBeRemoved)];
}
// Else cache was used and all results were fetched during this request, so existing children can be reused
- sharingAccountsRequest = nil;
- sharingAccounts = nil;
+ // Update user catalog even if cache was used
+ NSMutableArray *sharingAccountsNames = [NSMutableArray arrayWithCapacity:sharingAccounts.count];
+ for (ASIPithosAccount *account in sharingAccounts) {
+ [sharingAccountsNames addObject:account.name];
+ }
+ [pithosAccountManager updateUserCatalogForDisplaynames:nil UUIDs:sharingAccountsNames];
+ self.sharingAccountsRequest = nil;
forcedRefresh = NO;
@synchronized(self) {
freshness = PithosNodeStateRefreshFinished;
[self postChildrenUpdatedNotificationName];
} else {
// Do an additional request to fetch more objects
- sharingAccountsRequest = [ASIPithosRequest listSharingAccountsRequestWithPithos:pithos
- limit:0
- marker:[[someSharingAccounts lastObject] name]];
+ self.sharingAccountsRequest = [ASIPithosRequest listSharingAccountsRequestWithPithos:pithosAccountManager.pithos
+ limit:0
+ marker:[[someSharingAccounts lastObject] name]];
sharingAccountsRequest.delegate = self;
sharingAccountsRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
sharingAccountsRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
[NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority",
[NSNumber numberWithUnsignedInteger:10], @"retries",
NSStringFromSelector(@selector(sharingAccountsRequestFinished:)), @"didFinishSelector",
- NSStringFromSelector(@selector(sharingAccountsRequestFailed:)), @"didFailSelector",
+ NSStringFromSelector(@selector(sharingAccountsRequestFailed:)), @"didFailSelector",
+ sharingAccounts, @"sharingAccounts",
nil];
// if (!forcedRefresh)
// sharingAccountsRequest.downloadCache = [ASIDownloadCache sharedCache];