Refactor use of pithos objects to accommodate
[pithos-macos] / pithos-macos / PithosSharingAccountsNode.m
index 39d902c..68a1f5f 100644 (file)
@@ -2,7 +2,7 @@
 //  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])) {
-        self.pithos = aPithos;
+- (id)initWithPithosAccountManager:(PithosAccount *)aPithosAccountManager {
+    if ((self = [super initWithPithosAccountManager:aPithosAccountManager])) {
         self.sharingAccount = @"";
     }
     return self;
 
 - (void)dealloc {
     [sharingAccountsRequest clearDelegatesAndCancel];
-    [sharingAccountsRequest release];
-    [sharingAccounts release];
-    [pithos release];
-    [super dealloc];
 }
 
 #pragma mark -
-#pragma mark Properties
+#pragma mark Actions
 
-- (void)setPithos:(ASIPithos *)aPithos {
-    if (aPithos && ![aPithos isEqualTo:pithos]) {
-        [pithos release];
-        pithos = [aPithos retain];
-        [url release];
-        url = nil;
-    }
+- (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 {
@@ -91,7 +90,7 @@
                 break;
             case PithosNodeStateRefreshNeeded:
                 freshness = PithosNodeStateRefreshing;
-                sharingAccountsRequest = [[ASIPithosRequest listSharingAccountsRequestWithPithos:pithos limit:0 marker:nil] retain];
+                self.sharingAccountsRequest = [ASIPithosRequest listSharingAccountsRequestWithPithos:pithosAccountManager.pithos limit:0 marker:nil];
                 sharingAccountsRequest.delegate = self;
                 sharingAccountsRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
                 sharingAccountsRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
                                                    NSStringFromSelector(@selector(sharingAccountsRequestFinished:)), @"didFinishSelector", 
                                                    NSStringFromSelector(@selector(sharingAccountsRequestFailed:)), @"didFailSelector", 
                                                    nil];
-                if (!forcedRefresh)
-                    sharingAccountsRequest.downloadCache = [ASIDownloadCache sharedCache];
+//                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)sharingAccountsRequestFailed:(ASIPithosRequest *)request {
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    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"];
-        [sharingAccountsRequest release];
-        sharingAccountsRequest = newSharingAccountsRequest;
-        [[PithosUtilities prepareRequest:sharingAccountsRequest priority:[[sharingAccountsRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
-    } else {
+    @autoreleasepool {
         NSString *message;
         NSError *error = [sharingAccountsRequest error];
         if (error)
-            message = [NSString stringWithFormat:@"Sharing accounts listing failed: %@", error];
+            message = [NSString stringWithFormat:@"Sharing accounts listing %@ failed: %@", 
+                       sharingAccountsRequest.url, [error localizedDescription]];
         else
-            message = [NSString stringWithFormat:@"Sharing accounts listing failed: (%d) %@", 
-                       sharingAccountsRequest.responseStatusCode, sharingAccountsRequest.responseStatusMessage];
+            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];
         });
-        [newChildren release];
-        newChildren = nil;
-        [sharingAccountsRequest release];
-        sharingAccountsRequest = nil;
-        [sharingAccounts release];
-        sharingAccounts = nil;
-        forcedRefresh = NO;
-        @synchronized(self) {
-            freshness = PithosNodeStateRefreshNeeded;
+        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;
+            }
         }
     }
-    [pool drain];
 }
 
 - (void)sharingAccountsRequestFinished:(ASIPithosRequest *)request {
-    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
-    NSLog(@"List sharing accounts finished: %@", [sharingAccountsRequest url]);
-    NSLog(@"Cached: %d", [sharingAccountsRequest didUseCachedResponse]);
-    if (sharingAccountsRequest.responseStatusCode == 200) {
-        NSArray *someSharingAccounts = [sharingAccountsRequest sharingAccounts];
-        if (sharingAccounts == nil) {
-            sharingAccounts = [[NSMutableArray alloc] initWithArray:someSharingAccounts];
-        } else {
-            [sharingAccounts addObjectsFromArray:someSharingAccounts];
-        }
-        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:pithos.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];
+    @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)];
                 }
-                [[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 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];
             }
-            // 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 listSharingAccountsRequestWithPithos:pithos 
-                                                                                       limit:0 
-                                                                                      marker:[[someSharingAccounts lastObject] name]] retain];
-            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", 
-                                               nil];
-            if (!forcedRefresh)
-                sharingAccountsRequest.downloadCache = [ASIDownloadCache sharedCache];
-            [[PithosUtilities prepareRequest:sharingAccountsRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
+            [self sharingAccountsRequestFailed:sharingAccountsRequest];
         }
-    } else {
-        [self sharingAccountsRequestFailed:sharingAccountsRequest];
     }
-    [pool drain];
 }
 
 @end