Refactor use of pithos objects to accommodate
[pithos-macos] / pithos-macos / PithosSharingAccountsNode.m
index a04650d..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])) {
-        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];