- (id)initWithPithos:(ASIPithos *)aPithos {
if ((self = [super init])) {
- self.pithos = aPithos;
+ pithos = [aPithos retain];
}
return self;
}
pithos = [aPithos retain];
[url release];
url = nil;
+ [accountRequest clearDelegatesAndCancel];
+ [accountRequest release];
+ accountRequest = nil;
+ [refreshMetadataAccountRequest clearDelegatesAndCancel];
+ [refreshMetadataAccountRequest release];
+ refreshMetadataAccountRequest = nil;
+ [applyMetadataAccountRequest clearDelegatesAndCancel];
+ [applyMetadataAccountRequest release];
+ applyMetadataAccountRequest = nil;
+ reset = YES;
}
}
- (NSArray *)children {
@synchronized(self) {
+ if (reset) {
+ [accountRequest clearDelegatesAndCancel];
+ [accountRequest release];
+ accountRequest = nil;
+ [refreshMetadataAccountRequest clearDelegatesAndCancel];
+ [refreshMetadataAccountRequest release];
+ refreshMetadataAccountRequest = nil;
+ [applyMetadataAccountRequest clearDelegatesAndCancel];
+ [applyMetadataAccountRequest release];
+ applyMetadataAccountRequest = nil;
+ [children release];
+ children = nil;
+ [newChildren release];
+ newChildren = nil;
+ self.pithosAccount = nil;
+ freshness = PithosNodeStateRefreshNeeded;
+ forcedRefresh = YES;
+ reset = NO;
+ [self postChildrenUpdatedNotificationName];
+ }
switch (freshness) {
case PithosNodeStateFresh:
break;
until:nil] retain];
if (sharingAccount)
[accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ else if (!forcedRefresh)
+ accountRequest.downloadCache = [ASIDownloadCache sharedCache];
accountRequest.delegate = self;
accountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
accountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
NSStringFromSelector(@selector(accountRequestFinished:)), @"didFinishSelector",
NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector",
nil];
- if (!forcedRefresh)
- accountRequest.downloadCache = [ASIDownloadCache sharedCache];
[[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
break;
case PithosNodeStateRefreshing:
#pragma mark ASIHTTPRequestDelegate
- (void)accountRequestFailed:(ASIPithosAccountRequest *)request {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- NSUInteger retries = [[accountRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
- if (retries > 0) {
- ASIPithosAccountRequest *newAccountRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:accountRequest];
- [(NSMutableDictionary *)(newAccountRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
- [accountRequest release];
- accountRequest = newAccountRequest;
- [[PithosUtilities prepareRequest:accountRequest priority:[[accountRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
- } else {
+ @autoreleasepool {
NSString *message;
NSError *error = [accountRequest error];
if (error)
- message = [NSString stringWithFormat:@"Account listing failed: %@", error];
+ message = [NSString stringWithFormat:@"Account listing %@ failed: %@", accountRequest.url, [error localizedDescription]];
else
- message = [NSString stringWithFormat:@"Account listing failed: (%d) %@",
- accountRequest.responseStatusCode, accountRequest.responseStatusMessage];
+ message = [NSString stringWithFormat:@"Account listing %@ failed: (%d) %@",
+ accountRequest.url, accountRequest.responseStatusCode, accountRequest.responseStatusMessage];
dispatch_async(dispatch_get_main_queue(), ^{
[[PithosActivityFacility defaultPithosActivityFacility] startAndEndActivityWithType:PithosActivityOther message:message];
});
- [newChildren release];
- newChildren = nil;
- [accountRequest release];
- accountRequest = nil;
- [containers release];
- containers = nil;
- forcedRefresh = NO;
- @synchronized(self) {
- freshness = PithosNodeStateRefreshNeeded;
+ NSUInteger retries = [[accountRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+ if (retries > 0) {
+ ASIPithosAccountRequest *newAccountRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:accountRequest];
+ [(NSMutableDictionary *)(newAccountRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+ [accountRequest release];
+ accountRequest = newAccountRequest;
+ [[PithosUtilities prepareRequest:accountRequest priority:[[accountRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
+ } else {
+ [newChildren release];
+ newChildren = nil;
+ [accountRequest release];
+ accountRequest = nil;
+ [containers release];
+ containers = nil;
+ forcedRefresh = NO;
+ @synchronized(self) {
+ freshness = PithosNodeStateRefreshNeeded;
+ }
}
}
- [pool drain];
}
- (void)accountRequestFinished:(ASIPithosAccountRequest *)request {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- NSLog(@"List account finished: %@", [accountRequest url]);
- NSLog(@"Cached: %d", [accountRequest didUseCachedResponse]);
- if (accountRequest.responseStatusCode == 200) {
- self.pithosAccount = [accountRequest account];
-
- NSArray *someContainers = [accountRequest containers];
- if (containers == nil) {
- containers = [[NSMutableArray alloc] initWithArray:someContainers];
- } else {
- [containers addObjectsFromArray:someContainers];
- }
- if ([someContainers count] < 10000) {
- if (!accountRequest.didUseCachedResponse || ([containers count] != [someContainers count]) || !children) {
- // Save new children
- NSLog(@"using newChildren");
- newChildren = [[NSMutableArray alloc] init];
- NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
- for (ASIPithosContainer *container in containers) {
- PithosContainerNode *node = [[[PithosContainerNode alloc] initWithPithos:pithos pithosContainer:container] autorelease];
- node.parent = self;
- node.shared = shared;
- node.sharingAccount = sharingAccount;
- node.inheritChildrenUpdatedNotificationName = inheritChildrenUpdatedNotificationName;
- if (children) {
- NSUInteger oldIndex = [children indexOfObject:node];
- if (oldIndex != NSNotFound) {
- // Use the same pointer value, if possible
- node = [children objectAtIndex:oldIndex];
-// node.pithosContainer = container;
- [node setLimitedPithosContainer:container];
- [keptNodes addIndex:oldIndex];
+ @autoreleasepool {
+ DLog(@"List account finished: %@", [accountRequest url]);
+ DLog(@"Cached: %d", [accountRequest didUseCachedResponse]);
+ if (accountRequest.responseStatusCode == 200) {
+ self.pithosAccount = [accountRequest account];
+
+ NSArray *someContainers = [accountRequest containers];
+ if (containers == nil) {
+ containers = [[NSMutableArray alloc] initWithArray:someContainers];
+ } else {
+ [containers addObjectsFromArray:someContainers];
+ }
+ if ([someContainers count] < 10000) {
+ if (!accountRequest.didUseCachedResponse || ([containers count] != [someContainers count]) || !children) {
+ // Save new children
+ DLog(@"using newChildren");
+ newChildren = [[NSMutableArray alloc] init];
+ NSMutableIndexSet *keptNodes = [NSMutableIndexSet indexSet];
+ for (ASIPithosContainer *container in containers) {
+ PithosContainerNode *node = [[[PithosContainerNode alloc] initWithPithos:pithos pithosContainer:container] autorelease];
+ node.parent = self;
+ node.shared = shared;
+ node.sharingAccount = sharingAccount;
+ node.inheritChildrenUpdatedNotificationName = inheritChildrenUpdatedNotificationName;
+ if (children) {
+ NSUInteger oldIndex = [children indexOfObject:node];
+ if (oldIndex != NSNotFound) {
+ // Use the same pointer value, if possible
+ node = [children objectAtIndex:oldIndex];
+ // node.pithosContainer = container;
+ [node setLimitedPithosContainer:container];
+ [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
+ [accountRequest release];
+ accountRequest = nil;
+ [containers release];
+ containers = nil;
+ forcedRefresh = NO;
+ @synchronized(self) {
+ freshness = PithosNodeStateRefreshFinished;
+ }
+ [self postChildrenUpdatedNotificationName];
+ } else {
+ [accountRequest release];
+ // Do an additional request to fetch more objects
+ accountRequest = [[ASIPithosAccountRequest listContainersRequestWithPithos:pithos
+ limit:0
+ marker:[[someContainers lastObject] name]
+ shared:shared
+ until:nil] retain];
+ if (sharingAccount)
+ [accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
+ else if (!forcedRefresh)
+ accountRequest.downloadCache = [ASIDownloadCache sharedCache];
+ accountRequest.delegate = self;
+ accountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
+ accountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
+ accountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
+ NSStringFromSelector(@selector(accountRequestFinished:)), @"didFinishSelector",
+ NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector",
+ nil];
+ [[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
}
- // Else cache was used and all results were fetched during this request, so existing children can be reused
+ } else if (accountRequest.responseStatusCode == 304) {
+ // Account is not modified, so existing children can be reused
[accountRequest release];
accountRequest = nil;
[containers release];
}
[self postChildrenUpdatedNotificationName];
} else {
- [accountRequest release];
- // Do an additional request to fetch more objects
- accountRequest = [[ASIPithosAccountRequest listContainersRequestWithPithos:pithos
- limit:0
- marker:[[someContainers lastObject] name]
- shared:shared
- until:nil] retain];
- if (sharingAccount)
- [accountRequest setRequestUserFromDefaultTo:sharingAccount withPithos:pithos];
- accountRequest.delegate = self;
- accountRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
- accountRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
- accountRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
- [NSNumber numberWithInteger:NSOperationQueuePriorityVeryHigh], @"priority",
- [NSNumber numberWithUnsignedInteger:10], @"retries",
- NSStringFromSelector(@selector(accountRequestFinished:)), @"didFinishSelector",
- NSStringFromSelector(@selector(accountRequestFailed:)), @"didFailSelector",
- nil];
- if (!forcedRefresh)
- accountRequest.downloadCache = [ASIDownloadCache sharedCache];
- [[PithosUtilities prepareRequest:accountRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
+ [self accountRequestFailed:accountRequest];
}
- } else if (accountRequest.responseStatusCode == 304) {
- // Account is not modified, so existing children can be reused
- [accountRequest release];
- accountRequest = nil;
- [containers release];
- containers = nil;
- forcedRefresh = NO;
- @synchronized(self) {
- freshness = PithosNodeStateRefreshFinished;
- }
- [self postChildrenUpdatedNotificationName];
- } else {
- [self accountRequestFailed:accountRequest];
}
- [pool drain];
}
- (void)accountMetadataRequestFinished:(ASIPithosAccountRequest *)request {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- NSLog(@"URL: %@", [request url]);
- NSLog(@"cached: %d", [request didUseCachedResponse]);
-
- if ([request isEqualTo:applyMetadataAccountRequest]) {
- @synchronized(self) {
- [applyMetadataAccountRequest release];
- applyMetadataAccountRequest = nil;
- }
- [self refreshInfo];
- } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
- self.pithosAccount = [refreshMetadataAccountRequest account];
- @synchronized(self) {
- [refreshMetadataAccountRequest release];
- refreshMetadataAccountRequest = nil;
- }
- }
- [pool drain];
-}
-
-- (void)accountMetadataRequestFailed:(ASIPithosAccountRequest *)request {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue];
- if (retries > 0) {
- ASIPithosAccountRequest *newRequest = (ASIPithosAccountRequest *)[[PithosUtilities copyRequest:request] autorelease];
- [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+ @autoreleasepool {
+ DLog(@"URL: %@", [request url]);
+ DLog(@"cached: %d", [request didUseCachedResponse]);
+
if ([request isEqualTo:applyMetadataAccountRequest]) {
@synchronized(self) {
[applyMetadataAccountRequest release];
- applyMetadataAccountRequest = newRequest;
+ applyMetadataAccountRequest = nil;
}
+ [self refreshInfo];
} else if ([request isEqualTo:refreshMetadataAccountRequest]) {
+ self.pithosAccount = [refreshMetadataAccountRequest account];
@synchronized(self) {
[refreshMetadataAccountRequest release];
- refreshMetadataAccountRequest = newRequest;
+ refreshMetadataAccountRequest = nil;
}
}
- [[PithosUtilities prepareRequest:newRequest priority:[[newRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
- } else {
- if ([request isEqualTo:applyMetadataAccountRequest]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataAccountRequest];
- });
- @synchronized(self) {
- [applyMetadataAccountRequest release];
- applyMetadataAccountRequest = nil;
+ }
+}
+
+- (void)accountMetadataRequestFailed:(ASIPithosAccountRequest *)request {
+ @autoreleasepool {
+ NSUInteger retries = [[request.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+ if (retries > 0) {
+ ASIPithosAccountRequest *newRequest = (ASIPithosAccountRequest *)[PithosUtilities copyRequest:request];
+ [(NSMutableDictionary *)(newRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+ if ([request isEqualTo:applyMetadataAccountRequest]) {
+ @synchronized(self) {
+ [applyMetadataAccountRequest release];
+ applyMetadataAccountRequest = newRequest;
+ }
+ } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
+ @synchronized(self) {
+ [refreshMetadataAccountRequest release];
+ refreshMetadataAccountRequest = newRequest;
+ }
}
- } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
- dispatch_async(dispatch_get_main_queue(), ^{
+ [[PithosUtilities prepareRequest:newRequest priority:[[newRequest.userInfo objectForKey:@"priority"] integerValue]] startAsynchronous];
+ [newRequest release];
+ } else {
+ if ([request isEqualTo:applyMetadataAccountRequest]) {
+ [PithosUtilities httpRequestErrorAlertWithRequest:applyMetadataAccountRequest];
+ @synchronized(self) {
+ [applyMetadataAccountRequest release];
+ applyMetadataAccountRequest = nil;
+ }
+ } else if ([request isEqualTo:refreshMetadataAccountRequest]) {
[PithosUtilities httpRequestErrorAlertWithRequest:refreshMetadataAccountRequest];
- });
- @synchronized(self) {
- [refreshMetadataAccountRequest release];
- refreshMetadataAccountRequest = nil;
+ @synchronized(self) {
+ [refreshMetadataAccountRequest release];
+ refreshMetadataAccountRequest = nil;
+ }
}
}
}
- [pool drain];
}
#pragma mark -
NSStringFromSelector(@selector(accountMetadataRequestFinished:)), @"didFinishSelector",
NSStringFromSelector(@selector(accountMetadataRequestFailed:)), @"didFailSelector",
nil];
- refreshMetadataAccountRequest.downloadCache = [ASIDownloadCache sharedCache];
+ if (!sharingAccount)
+ refreshMetadataAccountRequest.downloadCache = [ASIDownloadCache sharedCache];
[[PithosUtilities prepareRequest:refreshMetadataAccountRequest priority:NSOperationQueuePriorityHigh] startAsynchronous];
}
}