// PithosAccountNode.m
// pithos-macos
//
-// Copyright 2011 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 "PithosSharingAccountsNode.h"
#import "PithosAccountNode.h"
#import "ASIPithosRequest.h"
+#import "ASIPithos.h"
#import "ASIPithosAccount.h"
#import "ASIDownloadCache.h"
-#import "PithosFileUtilities.h"
+#import "PithosAccount.h"
+#import "PithosUtilities.h"
+#import "PithosActivityFacility.h"
@implementation PithosSharingAccountsNode
+@synthesize sharingAccountsRequest;
#pragma mark -
#pragma mark Object Lifecycle
-- (id)init {
- if ((self == [super init])) {
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager {
+ if ((self = [super initWithPithosAccountManager:aPithosAccountManager])) {
self.sharingAccount = @"";
}
return self;
- (void)dealloc {
[sharingAccountsRequest clearDelegatesAndCancel];
- [sharingAccountsRequest release];
- [sharingAccounts release];
- [super dealloc];
+}
+
+#pragma mark -
+#pragma mark Actions
+
+- (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 = [[ASIPithosRequest storageURLPrefix] copy];
- return url;
+ return @"@sharing accounts@";
}
- (NSArray *)children {
break;
case PithosNodeStateRefreshNeeded:
freshness = PithosNodeStateRefreshing;
- sharingAccountsRequest = [[ASIPithosRequest listSharingAccountsRequestWithLimit:0
- marker:nil] retain];
+ self.sharingAccountsRequest = [ASIPithosRequest listSharingAccountsRequestWithPithos:pithosAccountManager.pithos limit:0 marker:nil];
sharingAccountsRequest.delegate = self;
- sharingAccountsRequest.didFinishSelector = @selector(sharingAccountsRequestFinished:);
- sharingAccountsRequest.didFailSelector = @selector(sharingAccountsRequestFailed:);
- if (!forcedRefresh)
- sharingAccountsRequest.downloadCache = [ASIDownloadCache sharedCache];
- [sharingAccountsRequest startAsynchronous];
+ sharingAccountsRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
+ sharingAccountsRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
+ sharingAccountsRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
+ NSStringFromSelector(@selector(sharingAccountsRequestFinished:)), @"didFinishSelector",
+ NSStringFromSelector(@selector(sharingAccountsRequestFailed:)), @"didFailSelector",
+ nil];
+// if (!forcedRefresh)
+// sharingAccountsRequest.downloadCache = [ASIDownloadCache sharedCache];
+ [[PithosUtilities prepareRequest:sharingAccountsRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
break;
case PithosNodeStateRefreshing:
break;
case PithosNodeStateRefreshFinished:
if (newChildren) {
- [children release];
children = newChildren;
newChildren = nil;
}
- (NSString *)displayName {
if (displayName == nil)
- return [NSString stringWithString:@"sharing accounts"];
- return [[displayName copy] autorelease];
+ return @"sharing accounts";
+ return [displayName copy];
}
#pragma mark -
#pragma mark ASIHTTPRequestDelegate
-- (void)sharingAccountsRequestFinished:(ASIPithosRequest *)request {
- NSLog(@"URL: %@", [sharingAccountsRequest url]);
- NSLog(@"cached: %d", [sharingAccountsRequest didUseCachedResponse]);
-
- NSArray *someSharingAccounts = [sharingAccountsRequest sharingAccounts];
- if (sharingAccounts == nil) {
- sharingAccounts = [[NSMutableArray alloc] initWithArray:someSharingAccounts];
- } else {
- [sharingAccounts addObjectsFromArray:someSharingAccounts];
+- (void)sharingAccountsRequestFailed:(ASIPithosRequest *)request {
+ @autoreleasepool {
+ NSString *message;
+ NSError *error = [sharingAccountsRequest error];
+ if (error)
+ message = [NSString stringWithFormat:@"Sharing accounts listing %@ failed: %@",
+ sharingAccountsRequest.url, [error localizedDescription]];
+ else
+ message = [NSString stringWithFormat:@"Sharing accounts listing %@ failed: (%d) %@",
+ sharingAccountsRequest.url, sharingAccountsRequest.responseStatusCode, sharingAccountsRequest.responseStatusMessage];
+ dispatch_async(dispatch_get_main_queue(), ^{
+ [[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message];
+ });
+ NSUInteger retries = [[sharingAccountsRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+ if (retries > 0) {
+ ASIPithosRequest *newSharingAccountsRequest = (ASIPithosRequest *)[PithosUtilities copyRequest:sharingAccountsRequest];
+ [(NSMutableDictionary *)(newSharingAccountsRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+ self.sharingAccountsRequest = newSharingAccountsRequest;
+ [[PithosUtilities prepareRequest:sharingAccountsRequest priority:[[sharingAccountsRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
+ } else {
+ newChildren = nil;
+ self.sharingAccountsRequest = nil;
+ forcedRefresh = NO;
+ @synchronized(self) {
+ freshness = PithosNodeStateRefreshNeeded;
+ }
+ }
}
- if ([someSharingAccounts count] < 10000) {
- if (!sharingAccountsRequest.didUseCachedResponse || ([sharingAccounts count] != [someSharingAccounts count]) || !children) {
- // Save new children
- NSLog(@"using newChildren");
- newChildren = [[NSMutableArray alloc] init];
- NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
- for (ASIPithosAccount *account in sharingAccounts) {
- if (![account.name isEqualToString:[ASIPithosRequest authUser]]) {
- PithosAccountNode *node = [[[PithosAccountNode alloc] init] autorelease];
- node.parent = self;
- node.shared = shared;
- node.sharingAccount = account.name;
- if (children) {
- NSUInteger oldIndex = [children indexOfObject:node];
- if (oldIndex != NSNotFound) {
- // Use the same pointer value, if possible
- node = [children objectAtIndex:oldIndex];
- [keptNodes addIndex:oldIndex];
+}
+
+- (void)sharingAccountsRequestFinished:(ASIPithosRequest *)request {
+ @autoreleasepool {
+ 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 arrayWithArray:someSharingAccounts];
+ } else {
+ [sharingAccounts addObjectsFromArray:someSharingAccounts];
+ }
+ if ([someSharingAccounts count] < 10000) {
+ if (!sharingAccountsRequest.didUseCachedResponse || ([sharingAccounts count] != [someSharingAccounts count]) || !children) {
+ // Save new children
+ DLog(@"using newChildren");
+ newChildren = [[NSMutableArray alloc] init];
+ NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
+ for (ASIPithosAccount *account in sharingAccounts) {
+ if (![account.name isEqualToString:pithosAccountManager.pithos.authUser]) {
+ PithosAccountNode *node = [[PithosAccountNode alloc] initWithPithosAccountManager:pithosAccountManager];
+ node.parent = self;
+ node.shared = shared;
+ node.sharingAccount = account.name;
+ node.inheritChildrenUpdatedNotificationName = inheritChildrenUpdatedNotificationName;
+ if (children) {
+ NSUInteger oldIndex = [children indexOfObject:node];
+ if (oldIndex != NSNotFound) {
+ // Use the same pointer value, if possible
+ node = [children objectAtIndex:oldIndex];
+ [keptNodes addIndex:oldIndex];
+ }
+ }
+ [newChildren addObject:node];
}
}
- [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
+ // 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
+ self.sharingAccountsRequest = [ASIPithosRequest listSharingAccountsRequestWithPithos:pithosAccountManager.pithos
+ limit:0
+ marker:[[someSharingAccounts lastObject] name]];
+ sharingAccountsRequest.delegate = self;
+ sharingAccountsRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
+ sharingAccountsRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
+ sharingAccountsRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
+ NSStringFromSelector(@selector(sharingAccountsRequestFinished:)), @"didFinishSelector",
+ NSStringFromSelector(@selector(sharingAccountsRequestFailed:)), @"didFailSelector",
+ sharingAccounts, @"sharingAccounts",
+ nil];
+// if (!forcedRefresh)
+// sharingAccountsRequest.downloadCache = [ASIDownloadCache sharedCache];
+ [[PithosUtilities prepareRequest:sharingAccountsRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
}
- [[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
- [sharingAccountsRequest release];
- sharingAccountsRequest = nil;
- [sharingAccounts release];
- sharingAccounts = nil;
- forcedRefresh = NO;
- @synchronized(self) {
- freshness = PithosNodeStateRefreshFinished;
+ } else {
+ [self sharingAccountsRequestFailed:sharingAccountsRequest];
}
- // Notify observers that children are updated
- [[NSNotificationCenter defaultCenter] postNotificationName:@"PithosSharingAccountsNodeChildrenUpdated" object:self];
- } else {
- [sharingAccountsRequest release];
- // Do an additional request to fetch more objects
- sharingAccountsRequest = [[ASIPithosRequest listSharingAccountsRequestWithLimit:0
- marker:[[someSharingAccounts lastObject] name]] retain];
- sharingAccountsRequest.delegate = self;
- if (!forcedRefresh)
- sharingAccountsRequest.downloadCache = [ASIDownloadCache sharedCache];
- [sharingAccountsRequest startAsynchronous];
- }
-}
-
-- (void)accountRequestFailed:(ASIPithosRequest *)request {
- [PithosFileUtilities httpRequestErrorAlertWithRequest:request];
- [newChildren release];
- newChildren = nil;
- [sharingAccountsRequest release];
- sharingAccountsRequest = nil;
- [sharingAccounts release];
- sharingAccounts = nil;
- forcedRefresh = NO;
- @synchronized(self) {
- freshness = PithosNodeStateRefreshNeeded;
}
}