static NSImage *sharedIcon = nil;
@implementation PithosAccountNode
-@synthesize pithos, pithosAccount, translatedGroups;
+@synthesize pithos, pithosAccount, accountRequest, applyMetadataAccountRequest, refreshMetadataAccountRequest, translatedGroups;
+ (void)initialize {
if (self == [PithosAccountNode class])
}
#pragma mark -
+#pragma mark Internal
+
+- (void)updateGroups {
+ if (!pithosAccount) {
+ self.translatedGroups = [NSMutableDictionary dictionary];
+ } else if (pithosAccountManager) {
+ NSMutableSet *UUIDs = [NSMutableSet set];
+ for (NSString *groupName in pithosAccount.groups) {
+ [UUIDs addObjectsFromArray:[pithosAccount.groups objectForKey:groupName]];
+ }
+ [UUIDs removeObject:@""];
+ [UUIDs removeObject:@"*"];
+ if (UUIDs.count) {
+ [pithosAccountManager updateUserCatalogForForDisplaynames:nil UUIDs:[UUIDs allObjects]];
+ }
+
+ NSMutableDictionary *newTranslatedGroups = [NSMutableDictionary dictionaryWithCapacity:pithosAccount.groups.count];
+ for (NSString *groupName in pithosAccount.groups) {
+ NSMutableArray *groupUsers = [NSMutableArray array];
+ for (NSString *UUID in [pithosAccount.groups objectForKey:groupName]) {
+ [groupUsers addObject:[pithosAccountManager displaynameForUUID:UUID safe:YES]];
+ }
+ [newTranslatedGroups setObject:groupUsers forKey:groupName];
+ }
+ self.translatedGroups = newTranslatedGroups;
+ } else {
+ self.translatedGroups = [pithosAccount.groups copy];
+ }
+}
+
+#pragma mark -
#pragma mark Properties
- (void)setPithos:(ASIPithos *)aPithos {
pithos = aPithos;
url = nil;
[accountRequest clearDelegatesAndCancel];
- accountRequest = nil;
+ self.accountRequest = nil;
[refreshMetadataAccountRequest clearDelegatesAndCancel];
- refreshMetadataAccountRequest = nil;
+ self.refreshMetadataAccountRequest = nil;
[applyMetadataAccountRequest clearDelegatesAndCancel];
- applyMetadataAccountRequest = nil;
+ self.applyMetadataAccountRequest = nil;
reset = YES;
}
}
- (void)setPithosAccount:(ASIPithosAccount *)aPithosAccount {
- if (!aPithosAccount) {
+ if (![pithosAccount isEqualTo:aPithosAccount]) {
pithosAccount = aPithosAccount;
- self.translatedGroups = [NSMutableDictionary dictionary];
- } else if (![aPithosAccount isEqualTo:pithosAccount]) {
- pithosAccount = aPithosAccount;
- if (pithosAccountManager) {
- NSMutableArray *UUIDs = [NSMutableArray array];
- for (NSString *groupName in pithosAccount.groups) {
- [UUIDs addObjectsFromArray:[pithosAccount.groups objectForKey:groupName]];
- }
- if (UUIDs.count) {
- [pithosAccountManager updateUserCatalogForForDisplaynames:nil UUIDs:UUIDs];
- }
-
- NSMutableDictionary *newTranslatedGroups = [NSMutableDictionary dictionaryWithCapacity:pithosAccount.groups.count];
- for (NSString *groupName in pithosAccount.groups) {
- NSMutableArray *groupUsers = [NSMutableArray array];
- for (NSString *UUID in [pithosAccount.groups objectForKey:groupName]) {
- [groupUsers addObject:[pithosAccountManager displaynameForUUID:UUID safe:YES]];
- }
- [newTranslatedGroups setObject:groupUsers forKey:groupName];
- }
- self.translatedGroups = newTranslatedGroups;
- } else {
- self.translatedGroups = [pithosAccount.groups copy];
- }
+ [self updateGroups];
}
}
@synchronized(self) {
if (reset) {
[accountRequest clearDelegatesAndCancel];
- accountRequest = nil;
+ self.accountRequest = nil;
[refreshMetadataAccountRequest clearDelegatesAndCancel];
- refreshMetadataAccountRequest = nil;
+ self.refreshMetadataAccountRequest = nil;
[applyMetadataAccountRequest clearDelegatesAndCancel];
- applyMetadataAccountRequest = nil;
+ self.applyMetadataAccountRequest = nil;
children = nil;
newChildren = nil;
self.pithosAccount = nil;
break;
case PithosNodeStateRefreshNeeded:
freshness = PithosNodeStateRefreshing;
- accountRequest = [ASIPithosAccountRequest listContainersRequestWithPithos:pithos
- limit:0
- marker:nil
- shared:shared
- until:nil];
+ self.accountRequest = [ASIPithosAccountRequest listContainersRequestWithPithos:pithos
+ limit:0
+ marker:nil
+ shared:shared
+ until:nil];
if (sharingAccount)
[accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
else if (!forcedRefresh)
}
- (NSString *)displayName {
- if (displayName == nil)
- return [NSString stringWithString:(sharingAccount ? sharingAccount : @"account")];
+ if (displayName == nil) {
+ if (!sharingAccount) {
+ return @"account";
+ } else if (pithosAccountManager) {
+ return [pithosAccountManager displaynameForUUID:sharingAccount safe:YES];
+ } else {
+ return [sharingAccount copy];
+ }
+ }
return [displayName copy];
}
if (retries > 0) {
ASIPithosAccountRequest *newAccountRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:accountRequest];
[(NSMutableDictionary *)(newAccountRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
- accountRequest = newAccountRequest;
+ self.accountRequest = newAccountRequest;
[[PithosUtilities prepareRequest:accountRequest priority:[[accountRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
} else {
newChildren = nil;
- accountRequest = nil;
- containers = nil;
+ self.accountRequest = nil;
forcedRefresh = NO;
@synchronized(self) {
freshness = PithosNodeStateRefreshNeeded;
if (accountRequest.responseStatusCode == 200) {
self.pithosAccount = [accountRequest account];
+ NSMutableArray *containers = [accountRequest.userInfo objectForKey:@"containers"];
NSArray *someContainers = [accountRequest containers];
if (containers == nil) {
- containers = [[NSMutableArray alloc] initWithArray:someContainers];
+ containers = [NSMutableArray arrayWithArray:someContainers];
} else {
[containers addObjectsFromArray:someContainers];
}
node.shared = shared;
node.sharingAccount = sharingAccount;
node.inheritChildrenUpdatedNotificationName = inheritChildrenUpdatedNotificationName;
+ node.pithosAccountManager = pithosAccountManager;
if (children) {
NSUInteger oldIndex = [children indexOfObject:node];
if (oldIndex != NSNotFound) {
}]] makeObjectsPerformSelector:@selector(pithosNodeWillBeRemoved)];
}
// Else cache was used and all results were fetched during this request, so existing children can be reused
- accountRequest = nil;
- containers = nil;
+ self.accountRequest = nil;
forcedRefresh = NO;
@synchronized(self) {
freshness = PithosNodeStateRefreshFinished;
[self postChildrenUpdatedNotificationName];
} else {
// Do an additional request to fetch more objects
- accountRequest = [ASIPithosAccountRequest listContainersRequestWithPithos:pithos
- limit:0
- marker:[[someContainers lastObject] name]
- shared:shared
- until:nil];
+ self.accountRequest = [ASIPithosAccountRequest listContainersRequestWithPithos:pithos
+ limit:0
+ marker:[[someContainers lastObject] name]
+ shared:shared
+ until:nil];
if (sharingAccount)
[accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
else if (!forcedRefresh)
[NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority",
[NSNumber numberWithUnsignedInteger:10], @"retries",
NSStringFromSelector(@selector(accountRequestFinished:)), @"didFinishSelector",
- NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector",
+ NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector",
+ containers, @"containers",
nil];
[[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
}
} else if (accountRequest.responseStatusCode == 304) {
// Account is not modified, so existing children can be reused
- accountRequest = nil;
- containers = nil;
+ self.accountRequest = nil;
forcedRefresh = NO;
@synchronized(self) {
freshness = PithosNodeStateRefreshFinished;
if ([request isEqualTo:applyMetadataAccountRequest]) {
@synchronized(self) {
- applyMetadataAccountRequest = nil;
+ self.applyMetadataAccountRequest = nil;
}
[self refreshInfo];
} else if ([request isEqualTo:refreshMetadataAccountRequest]) {
self.pithosAccount = [refreshMetadataAccountRequest account];
@synchronized(self) {
- refreshMetadataAccountRequest = nil;
+ self.refreshMetadataAccountRequest = nil;
}
}
}
[(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
if ([request isEqualTo:applyMetadataAccountRequest]) {
@synchronized(self) {
- applyMetadataAccountRequest = newRequest;
+ self.applyMetadataAccountRequest = newRequest;
}
} else if ([request isEqualTo:refreshMetadataAccountRequest]) {
@synchronized(self) {
- refreshMetadataAccountRequest = newRequest;
+ self.refreshMetadataAccountRequest = newRequest;
}
}
[[PithosUtilities prepareRequest:newRequest priority:[[newRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
if ([request isEqualTo:applyMetadataAccountRequest]) {
[PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataAccountRequest];
@synchronized(self) {
- applyMetadataAccountRequest = nil;
+ self.applyMetadataAccountRequest = nil;
}
} else if ([request isEqualTo:refreshMetadataAccountRequest]) {
[PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataAccountRequest];
@synchronized(self) {
- refreshMetadataAccountRequest = nil;
+ self.refreshMetadataAccountRequest = nil;
}
}
}
}
}
if (!inexistentGroupUsers.count) {
- // create groups
+ // Create groups.
for (NSString *groupName in translatedGroups) {
NSMutableArray *groupUsers = [NSMutableArray array];
for (NSString *groupUser in [translatedGroups objectForKey:groupName]) {
}
}
} else {
- [groups setObject:[NSArray arrayWithObject:@""] forKey:@"group"];
+ for (NSString *groupName in translatedGroups) {
+ if ([[translatedGroups objectForKey:groupName] containsObject:@"*"]) {
+ [groups setObject:[NSMutableArray arrayWithObject:@"*"] forKey:groupName];
+ }
+ }
+ if (!groups.count) {
+ [groups setObject:[NSArray arrayWithObject:@""] forKey:@"group"];
+ }
}
} else {
[groups addEntriesFromDictionary:translatedGroups];
[groups setObject:[NSArray arrayWithObject:@""] forKey:@"group"];
}
- applyMetadataAccountRequest = [ASIPithosAccountRequest updateAccountMetadataRequestWithPithos:pithos
- groups:groups
- metadata:pithosAccount.metadata
- update:NO];
+ self.applyMetadataAccountRequest = [ASIPithosAccountRequest updateAccountMetadataRequestWithPithos:pithos
+ groups:groups
+ metadata:pithosAccount.metadata
+ update:NO];
applyMetadataAccountRequest.delegate = self;
applyMetadataAccountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
applyMetadataAccountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
- (void)refreshInfo {
@synchronized(self) {
if (refreshMetadataAccountRequest == nil) {
- refreshMetadataAccountRequest = [ASIPithosAccountRequest accountMetadataRequestWithPithos:pithos];
+ self.refreshMetadataAccountRequest = [ASIPithosAccountRequest accountMetadataRequestWithPithos:pithos];
refreshMetadataAccountRequest.delegate = self;
refreshMetadataAccountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
refreshMetadataAccountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);