@implementation PithosBrowserController
@synthesize accountNode;
-@synthesize verticalSplitView, horizontalSplitView, leftTopView, leftBottomView, outlineView, browser;
+@synthesize verticalSplitView, horizontalSplitView, leftTopView, leftBottomView, outlineView, browser, outlineViewMenu, browserMenu;
@synthesize draggedNodes, draggedParentNode;
@synthesize clipboardNodes, clipboardParentNode, clipboardCopy;
@synthesize activityTextField, activityProgressIndicator;
objectRequest.delegate = self;
objectRequest.didFinishSelector = @selector(uploadDirectoryObjectFinished:);
objectRequest.didFailSelector = @selector(uploadDirectoryObjectFailed:);
+ PithosActivity *activity = [activityFacility startActivityWithType:PithosActivityCreateDirectory
+ message:[NSString stringWithFormat:@"Creating directory '%@'", [objectRequest.userInfo valueForKey:@"fileName"]]];
+ [(NSMutableDictionary *)objectRequest.userInfo addEntriesFromDictionary:
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithBool:YES], @"refresh",
+ activity, @"activity",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
+ nil]];
[[PithosUtilities prepareRequest:objectRequest] startAsynchronous];
}
if (objectRequests) {
}
- (void)uploadDirectoryObjectFinished:(ASIPithosObjectRequest *)objectRequest {
- NSLog(@"Upload directory object completed: %@", [objectRequest url]);
+ NSLog(@"Upload directory object finished: %@", objectRequest.url);
if (objectRequest.responseStatusCode == 201) {
- NSLog(@"Directory object created: %@", [objectRequest url]);
- [self refresh:nil];
+ NSLog(@"Directory object created: %@", objectRequest.url);
+ [activityFacility endActivity:[objectRequest.userInfo objectForKey:@"activity"]
+ withMessage:[NSString stringWithFormat:@"Creating directory '%@' (finished)",
+ [objectRequest.userInfo objectForKey:@"fileName"]]];
+ for (PithosNode *node in [objectRequest.userInfo objectForKey:@"forceRefreshNodes"]) {
+ [node forceRefresh];
+ }
+ for (PithosNode *node in [objectRequest.userInfo objectForKey:@"refreshNodes"]) {
+ [node refresh];
+ }
+ if ([[objectRequest.userInfo objectForKey:@"forceRefresh"] boolValue])
+ [self forceRefresh:self];
+ else if ([[objectRequest.userInfo objectForKey:@"refresh"] boolValue])
+ [self refresh:self];
} else {
- [PithosUtilities unexpectedResponseStatusAlertWithRequest:objectRequest];
+ NSUInteger retries = [[objectRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+ if (retries > 0) {
+ ASIPithosObjectRequest *newObjectRequest = (ASIPithosObjectRequest *)[PithosUtilities copyRequest:objectRequest];
+ [(NSMutableDictionary *)(newObjectRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+ [[PithosUtilities prepareRequest:newObjectRequest] startAsynchronous];
+ } else {
+ [activityFacility endActivity:[objectRequest.userInfo objectForKey:@"activity"]
+ withMessage:[NSString stringWithFormat:@"Creating directory '%@' (failed)",
+ [objectRequest.userInfo objectForKey:@"fileName"]]];
+ [PithosUtilities unexpectedResponseStatusAlertWithRequest:objectRequest];
+ }
}
}
- (void)uploadDirectoryObjectFailed:(ASIPithosObjectRequest *)objectRequest {
- NSLog(@"Upload directory object failed");
- [PithosUtilities httpRequestErrorAlertWithRequest:objectRequest];
+ NSLog(@"Upload directory object failed: %@", objectRequest.url);
+ NSUInteger retries = [[objectRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+ if (retries > 0) {
+ ASIPithosObjectRequest *newObjectRequest = (ASIPithosObjectRequest *)[PithosUtilities copyRequest:objectRequest];
+ [(NSMutableDictionary *)(newObjectRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+ [[PithosUtilities prepareRequest:newObjectRequest] startAsynchronous];
+ } else {
+ [activityFacility endActivity:[objectRequest.userInfo objectForKey:@"activity"]
+ withMessage:[NSString stringWithFormat:@"Creating directory '%@' (failed)",
+ [objectRequest.userInfo objectForKey:@"fileName"]]];
+ [PithosUtilities httpRequestErrorAlertWithRequest:objectRequest];
+ }
}
- (void)uploadObjectUsingHashMapFinished:(ASIPithosObjectRequest *)objectRequest {
[[PithosUtilities prepareRequest:newObjectRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
} else {
[activityFacility endActivity:[objectRequest.userInfo objectForKey:@"activity"]
- withMessage:[NSString stringWithFormat:@"Moving '%@/%@' to '%@/%@' failed",
+ withMessage:[NSString stringWithFormat:@"Moving '%@/%@' to '%@/%@' (failed)",
[objectRequest.userInfo objectForKey:@"sourceContainerName"],
[objectRequest.userInfo objectForKey:@"sourceObjectName"],
[objectRequest.userInfo objectForKey:@"destinationContainerName"],
[[PithosUtilities prepareRequest:newObjectRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
} else {
[activityFacility endActivity:[objectRequest.userInfo objectForKey:@"activity"]
- withMessage:[NSString stringWithFormat:@"Copying '%@/%@' to '%@/%@' failed",
+ withMessage:[NSString stringWithFormat:@"Copying '%@/%@' to '%@/%@' (failed)",
[objectRequest.userInfo objectForKey:@"sourceContainerName"],
[objectRequest.userInfo objectForKey:@"sourceObjectName"],
[objectRequest.userInfo objectForKey:@"destinationContainerName"],
}
}
+- (void)deleteObjectFinished:(ASIPithosObjectRequest *)objectRequest {
+ NSLog(@"Delete object finished: %@", objectRequest.url);
+ if (objectRequest.responseStatusCode == 204) {
+ [activityFacility endActivity:[objectRequest.userInfo objectForKey:@"activity"]
+ withMessage:[NSString stringWithFormat:@"Deleting '%@' (finished)",
+ [objectRequest.userInfo objectForKey:@"fileName"]]];
+ for (PithosNode *node in [objectRequest.userInfo objectForKey:@"forceRefreshNodes"]) {
+ [node forceRefresh];
+ }
+ for (PithosNode *node in [objectRequest.userInfo objectForKey:@"refreshNodes"]) {
+ [node refresh];
+ }
+ if ([[objectRequest.userInfo objectForKey:@"forceRefresh"] boolValue])
+ [self forceRefresh:self];
+ else if ([[objectRequest.userInfo objectForKey:@"refresh"] boolValue])
+ [self refresh:self];
+ } else {
+ NSUInteger retries = [[objectRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+ if (retries > 0) {
+ ASIPithosObjectRequest *newObjectRequest = (ASIPithosObjectRequest *)[PithosUtilities copyRequest:objectRequest];
+ [(NSMutableDictionary *)(newObjectRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+ [[PithosUtilities prepareRequest:newObjectRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
+ } else {
+ [activityFacility endActivity:[objectRequest.userInfo objectForKey:@"activity"]
+ withMessage:[NSString stringWithFormat:@"Deleting '%@' (failed)",
+ [objectRequest.userInfo objectForKey:@"fileName"]]];
+ [PithosUtilities unexpectedResponseStatusAlertWithRequest:objectRequest];
+ }
+ }
+}
+
+- (void)deleteObjectFailed:(ASIPithosObjectRequest *)objectRequest {
+ NSLog(@"Delete object failed: %@", objectRequest.url);
+ NSUInteger retries = [[objectRequest.userInfo objectForKey:@"retries"] unsignedIntegerValue];
+ if (retries > 0) {
+ ASIPithosObjectRequest *newObjectRequest = (ASIPithosObjectRequest *)[PithosUtilities copyRequest:objectRequest];
+ [(NSMutableDictionary *)(newObjectRequest.userInfo)setObject:[NSNumber numberWithUnsignedInteger:(--retries)] forKey:@"retries"];
+ [[PithosUtilities prepareRequest:newObjectRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
+ } else {
+ [activityFacility endActivity:[objectRequest.userInfo objectForKey:@"activity"]
+ withMessage:[NSString stringWithFormat:@"Deleting '%@' (failed)",
+ [objectRequest.userInfo objectForKey:@"fileName"]]];
+ [PithosUtilities httpRequestErrorAlertWithRequest:objectRequest];
+ }
+}
+
#pragma mark -
#pragma mark NSSplitViewDelegate
dispatch_async(queue, ^{
NSString *safeObjectName = [PithosUtilities safeSubdirNameForContainerName:node.pithosContainer.name
subdirName:@"untitled folder"];
+ NSString *fileName = [safeObjectName lastPathComponent];
ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithContainerName:node.pithosContainer.name
objectName:safeObjectName
eTag:nil
metadata:nil
data:[NSData data]];
objectRequest.delegate = self;
- objectRequest.didFinishSelector = @selector(newFolderFinished:);
- objectRequest.didFailSelector = @selector(newFolderFailed:);
+ objectRequest.didFinishSelector = @selector(uploadDirectoryObjectFinished:);
+ objectRequest.didFailSelector = @selector(uploadDirectoryObjectFailed:);
+ PithosActivity *activity = [activityFacility startActivityWithType:PithosActivityCreateDirectory
+ message:[NSString stringWithFormat:@"Creating directory '%@'", fileName]];
objectRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
- node, @"node",
+ fileName, @"fileName",
+ [NSArray arrayWithObject:node], @"refreshNodes",
+ [NSNumber numberWithBool:YES], @"refresh",
+ activity, @"activity",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
nil];
[[PithosUtilities prepareRequest:objectRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
});
} else if (([node class] == [PithosSubdirNode class]) &&
- (node.pithosObject.subdir ||
- ![node.pithosObject.name hasSuffix:@"/"])) {
+ (node.pithosObject.subdir || ![node.pithosObject.name hasSuffix:@"/"])) {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSString *safeObjectName = [PithosUtilities safeSubdirNameForContainerName:node.pithosContainer.name
subdirName:[node.pithosObject.name stringByAppendingPathComponent:@"untitled folder"]];
+ NSString *fileName = [safeObjectName lastPathComponent];
ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithContainerName:node.pithosContainer.name
objectName:safeObjectName
eTag:nil
metadata:nil
data:[NSData data]];
objectRequest.delegate = self;
- objectRequest.didFinishSelector = @selector(newFolderFinished:);
- objectRequest.didFailSelector = @selector(newFolderFailed:);
+ objectRequest.didFinishSelector = @selector(uploadDirectoryObjectFinished:);
+ objectRequest.didFailSelector = @selector(uploadDirectoryObjectFailed:);
+ PithosActivity *activity = [activityFacility startActivityWithType:PithosActivityCreateDirectory
+ message:[NSString stringWithFormat:@"Creating directory '%@'", fileName]];
objectRequest.userInfo = [NSMutableDictionary dictionaryWithObjectsAndKeys:
- node, @"node",
- nil];
+ fileName, @"fileName",
+ [NSArray arrayWithObject:node], @"refreshNodes",
+ [NSNumber numberWithBool:YES], @"refresh",
+ activity, @"activity",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
+ nil];
[[PithosUtilities prepareRequest:objectRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
});
}
- (void)menuDelete:(NSMenuItem *)sender {
for (PithosNode *node in ((NSArray *)[sender representedObject])) {
if (([node class] == [PithosObjectNode class]) ||
- (([node class] == [PithosSubdirNode class]) &&
- !node.pithosObject.subdir &&
- [node.pithosObject.name hasSuffix:@"/"])) {
+ (([node class] == [PithosSubdirNode class]) && !node.pithosObject.subdir && [node.pithosObject.name hasSuffix:@"/"])) {
ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest deleteObjectRequestWithContainerName:node.pithosContainer.name
objectName:node.pithosObject.name];
objectRequest.delegate = self;
objectRequest.didFinishSelector = @selector(deleteObjectFinished:);
objectRequest.didFailSelector = @selector(deleteObjectFailed:);
+ PithosActivity *activity = [activityFacility startActivityWithType:PithosActivityDelete
+ message:[NSString stringWithFormat:@"Deleting '%@'",
+ [objectRequest.userInfo objectForKey:@"fileName"]]];
+ [(NSMutableDictionary *)(objectRequest.userInfo) addEntriesFromDictionary:
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSArray arrayWithObject:node.parent], @"forceRefreshNodes",
+ activity, @"activity",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
+ nil]];
[[PithosUtilities prepareRequest:objectRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
} else if ([node class] == [PithosSubdirNode class]) {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSArray *objectRequests = [PithosUtilities deleteObjectRequestsForSubdirWithContainerName:node.pithosContainer.name
- objectName:node.pithosObject.name];
+ objectName:node.pithosObject.name];
if (objectRequests) {
for (ASIPithosObjectRequest *objectRequest in objectRequests) {
objectRequest.delegate = self;
objectRequest.didFinishSelector = @selector(deleteObjectFinished:);
objectRequest.didFailSelector = @selector(deleteObjectFailed:);
+ PithosActivity *activity = [activityFacility startActivityWithType:PithosActivityDelete
+ message:[NSString stringWithFormat:@"Deleting '%@'",
+ [objectRequest.userInfo objectForKey:@"fileName"]]];
+ [(NSMutableDictionary *)(objectRequest.userInfo) addEntriesFromDictionary:
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSArray arrayWithObject:node.parent], @"forceRefreshNodes",
+ activity, @"activity",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
+ nil]];
[[PithosUtilities prepareRequest:objectRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
}
}
checkIfExists:NO];
if (objectRequest) {
objectRequest.delegate = self;
- objectRequest.didFinishSelector = @selector(moveToTrashFinished:);
- objectRequest.didFailSelector = @selector(moveToTrashFailed:);
+ objectRequest.didFinishSelector = @selector(moveFinished:);
+ objectRequest.didFailSelector = @selector(moveFailed:);
+ PithosActivity *activity = [activityFacility startActivityWithType:PithosActivityMove
+ message:[NSString stringWithFormat:@"Moving '%@/%@' to '%@/%@'",
+ [objectRequest.userInfo objectForKey:@"sourceContainerName"],
+ [objectRequest.userInfo objectForKey:@"sourceObjectName"],
+ [objectRequest.userInfo objectForKey:@"destinationContainerName"],
+ [objectRequest.userInfo objectForKey:@"destinationObjectName"]]];
+ [(NSMutableDictionary *)(objectRequest.userInfo) addEntriesFromDictionary:
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSArray arrayWithObject:node.parent], @"forceRefreshNodes",
+ activity, @"activity",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
+ nil]];
[[PithosUtilities prepareRequest:objectRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
}
}
if (objectRequests) {
for (ASIPithosObjectRequest *objectRequest in objectRequests) {
objectRequest.delegate = self;
- objectRequest.didFinishSelector = @selector(moveToTrashFinished:);
- objectRequest.didFailSelector = @selector(moveToTrashFailed:);
+ objectRequest.didFinishSelector = @selector(moveFinished:);
+ objectRequest.didFailSelector = @selector(moveFailed:);
+ PithosActivity *activity = [activityFacility startActivityWithType:PithosActivityMove
+ message:[NSString stringWithFormat:@"Moving '%@/%@' to '%@/%@'",
+ [objectRequest.userInfo objectForKey:@"sourceContainerName"],
+ [objectRequest.userInfo objectForKey:@"sourceObjectName"],
+ [objectRequest.userInfo objectForKey:@"destinationContainerName"],
+ [objectRequest.userInfo objectForKey:@"destinationObjectName"]]];
+ [(NSMutableDictionary *)(objectRequest.userInfo) addEntriesFromDictionary:
+ [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSArray arrayWithObject:node.parent], @"forceRefreshNodes",
+ activity, @"activity",
+ [NSNumber numberWithUnsignedInteger:10], @"retries",
+ nil]];
[[PithosUtilities prepareRequest:objectRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
}
}
}
#pragma mark -
-#pragma mark Menu Actions ASIHTTPRequestDelegate
-
-- (void)newFolderFinished:(ASIPithosObjectRequest *)objectRequest {
- if (objectRequest.responseStatusCode == 201) {
- NSLog(@"New application/directory object created: %@", [objectRequest url]);
- PithosNode *node = [objectRequest.userInfo objectForKey:@"node"];
- if (node)
- [node refresh];
- else
- [self refresh:nil];
- } else {
- [PithosUtilities unexpectedResponseStatusAlertWithRequest:objectRequest];
- }
-}
-
-- (void)newFolderFailed:(ASIPithosObjectRequest *)objectRequest {
- NSLog(@"Creation of new application/directory object failed");
- [PithosUtilities httpRequestErrorAlertWithRequest:objectRequest];
-}
-
-- (void)deleteObjectFinished:(ASIPithosObjectRequest *)objectRequest {
- if (objectRequest.responseStatusCode == 204) {
- NSLog(@"Object deleted: %@", [objectRequest url]);
- [self refresh:nil];
- } else {
- [PithosUtilities unexpectedResponseStatusAlertWithRequest:objectRequest];
- }
-}
-
-- (void)deleteObjectFailed:(ASIPithosObjectRequest *)objectRequest {
- NSLog(@"Delete of object failed");
- [PithosUtilities httpRequestErrorAlertWithRequest:objectRequest];
-}
-
-- (void)moveToTrashFinished:(ASIPithosObjectRequest *)objectRequest {
- if (objectRequest.responseStatusCode == 201) {
- NSLog(@"Object moved: %@", [objectRequest url]);
- [self refresh:nil];
- } else {
- [PithosUtilities unexpectedResponseStatusAlertWithRequest:objectRequest];
- }
-}
-
-- (void)moveToTrashFailed:(ASIPithosObjectRequest *)objectRequest {
- NSLog(@"Move of object failed");
- [PithosUtilities httpRequestErrorAlertWithRequest:objectRequest];
-}
-
-#pragma mark -
#pragma mark PithosActivityFacilityDelegate
- (void)activityUpdate:(NSDictionary *)info {