Blocks are uploaded using container POST.
[pithos-macos] / pithos-macos / PithosBrowserController.m
index 4ec654a..4103f61 100644 (file)
     __block BOOL result = YES;
     [rowIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop){
         PithosNode *node = [browser itemAtIndexPath:[baseIndexPath indexPathByAddingIndex:idx]];
-        if ([node class] == [PithosContainerNode class]) {
+        if (([node class] == [PithosContainerNode class]) || ([node class] == [PithosAccountNode class])) {
             result = NO;
             *stop = YES;
         }
 
 - (NSArray *)browser:(NSBrowser *)aBrowser namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination 
 forDraggedRowsWithIndexes:(NSIndexSet *)rowIndexes inColumn:(NSInteger)column {
-    NSMutableArray *names = [NSMutableArray arrayWithCapacity:[rowIndexes count]];
-    NSIndexPath *baseIndexPath = [browser indexPathForColumn:column];
-    [rowIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop){
-        PithosNode *node = [browser itemAtIndexPath:[baseIndexPath indexPathByAddingIndex:idx]];
-        
+    NSMutableArray *names = [NSMutableArray arrayWithCapacity:[draggedNodes count]];
+    for (PithosNode *node in draggedNodes) {        
         // If the node is a subdir ask if the whole tree should be downloaded
         if ([node class] == [PithosSubdirNode class]) {
             NSAlert *alert = [[[NSAlert alloc] init] autorelease];
@@ -554,7 +551,7 @@ forDraggedRowsWithIndexes:(NSIndexSet *)rowIndexes inColumn:(NSInteger)column {
                 [objectRequest startAsynchronous];
             }
         }
-    }];
+    }
     return names;
 }
 
@@ -984,20 +981,19 @@ forDraggedRowsWithIndexes:(NSIndexSet *)rowIndexes inColumn:(NSInteger)column {
         NSIndexSet *missingBlocks = [PithosFileUtilities missingBlocksForHashes:[objectRequest.userInfo objectForKey:@"hashes"]
                                                       withMissingHashesResponse:[objectRequest responseString]];
         NSUInteger missingBlockIndex = [missingBlocks firstIndex];
-        ASIPithosObjectRequest *newObjectRequest = [PithosFileUtilities updateObjectDataRequestWithContainerName:[objectRequest.userInfo objectForKey:@"containerName"]
-                                                                                                      objectName:@".upload" 
-                                                                                                       blockSize:[[objectRequest.userInfo objectForKey:@"blockSize"] unsignedIntegerValue]
-                                                                                                         forFile:[objectRequest.userInfo objectForKey:@"filePath"] 
-                                                                                               missingBlockIndex:missingBlockIndex 
-                                                                                                  sharingAccount:[objectRequest.userInfo objectForKey:@"sharingAccount"]];
-        newObjectRequest.delegate = self;
-        newObjectRequest.didFinishSelector = @selector(uploadMissingBlockFinished:);
-        newObjectRequest.didFailSelector = @selector(uploadMissingBlockFailed:);
-        newObjectRequest.userInfo = objectRequest.userInfo;
-        [(NSMutableDictionary *)(newObjectRequest.userInfo) setObject:[NSNumber numberWithUnsignedInteger:iteration] forKey:@"iteration"];
-        [(NSMutableDictionary *)(newObjectRequest.userInfo) setObject:missingBlocks forKey:@"missingBlocks"];
-        [(NSMutableDictionary *)(newObjectRequest.userInfo) setObject:[NSNumber numberWithUnsignedInteger:missingBlockIndex] forKey:@"missingBlockIndex"];
-        [newObjectRequest startAsynchronous];
+        ASIPithosContainerRequest *newContainerRequest = [PithosFileUtilities updateContainerDataRequestWithContainerName:[objectRequest.userInfo objectForKey:@"containerName"] 
+                                                                                                                blockSize:[[objectRequest.userInfo objectForKey:@"blockSize"] unsignedIntegerValue] 
+                                                                                                                  forFile:[objectRequest.userInfo objectForKey:@"filePath"] 
+                                                                                                        missingBlockIndex:missingBlockIndex 
+                                                                                                           sharingAccount:[objectRequest.userInfo objectForKey:@"sharingAccount"]];
+        newContainerRequest.delegate = self;
+        newContainerRequest.didFinishSelector = @selector(uploadMissingBlockFinished:);
+        newContainerRequest.didFailSelector = @selector(uploadMissingBlockFailed:);
+        newContainerRequest.userInfo = objectRequest.userInfo;
+        [(NSMutableDictionary *)(newContainerRequest.userInfo) setObject:[NSNumber numberWithUnsignedInteger:iteration] forKey:@"iteration"];
+        [(NSMutableDictionary *)(newContainerRequest.userInfo) setObject:missingBlocks forKey:@"missingBlocks"];
+        [(NSMutableDictionary *)(newContainerRequest.userInfo) setObject:[NSNumber numberWithUnsignedInteger:missingBlockIndex] forKey:@"missingBlockIndex"];
+        [newContainerRequest startAsynchronous];
     } else {
         [PithosFileUtilities unexpectedResponseStatusAlertWithRequest:objectRequest];
     }
@@ -1008,52 +1004,51 @@ forDraggedRowsWithIndexes:(NSIndexSet *)rowIndexes inColumn:(NSInteger)column {
     [PithosFileUtilities httpRequestErrorAlertWithRequest:objectRequest];
 }
 
-- (void)uploadMissingBlockFinished:(ASIPithosObjectRequest *)objectRequest {
-    NSLog(@"Upload of missing block completed: %@", [objectRequest url]);
-    if (objectRequest.responseStatusCode == 201) {
-        NSIndexSet *missingBlocks = [objectRequest.userInfo objectForKey:@"missingBlocks"];
-        NSUInteger missingBlockIndex = [[objectRequest.userInfo objectForKey:@"missingBlockIndex"] unsignedIntegerValue];
+- (void)uploadMissingBlockFinished:(ASIPithosContainerRequest *)containerRequest {
+    NSLog(@"Upload of missing block completed: %@", [containerRequest url]);
+    if (containerRequest.responseStatusCode == 202) {
+        NSIndexSet *missingBlocks = [containerRequest.userInfo objectForKey:@"missingBlocks"];
+        NSUInteger missingBlockIndex = [[containerRequest.userInfo objectForKey:@"missingBlockIndex"] unsignedIntegerValue];
         missingBlockIndex = [missingBlocks indexGreaterThanIndex:missingBlockIndex];
         if (missingBlockIndex == NSNotFound) {
-            NSArray *hashes = [objectRequest.userInfo objectForKey:@"hashes"];
-            ASIPithosObjectRequest *newObjectRequest = [PithosFileUtilities writeObjectDataRequestWithContainerName:[objectRequest.userInfo objectForKey:@"containerName"] 
-                                                                                                         objectName:[objectRequest.userInfo objectForKey:@"objectName"] 
-                                                                                                        contentType:[objectRequest.userInfo objectForKey:@"contentType"] 
-                                                                                                          blockSize:[[objectRequest.userInfo objectForKey:@"blockSize"] unsignedIntegerValue] 
-                                                                                                          blockHash:[objectRequest.userInfo objectForKey:@"blockHash"]
-                                                                                                            forFile:[objectRequest.userInfo objectForKey:@"filePath"] 
+            NSArray *hashes = [containerRequest.userInfo objectForKey:@"hashes"];
+            ASIPithosObjectRequest *newObjectRequest = [PithosFileUtilities writeObjectDataRequestWithContainerName:[containerRequest.userInfo objectForKey:@"containerName"] 
+                                                                                                         objectName:[containerRequest.userInfo objectForKey:@"objectName"] 
+                                                                                                        contentType:[containerRequest.userInfo objectForKey:@"contentType"] 
+                                                                                                          blockSize:[[containerRequest.userInfo objectForKey:@"blockSize"] unsignedIntegerValue] 
+                                                                                                          blockHash:[containerRequest.userInfo objectForKey:@"blockHash"]
+                                                                                                            forFile:[containerRequest.userInfo objectForKey:@"filePath"] 
                                                                                                       checkIfExists:NO 
                                                                                                              hashes:&hashes 
-                                                                                                     sharingAccount:[objectRequest.userInfo objectForKey:@"sharingAccount"]];
+                                                                                                     sharingAccount:[containerRequest.userInfo objectForKey:@"sharingAccount"]];
             newObjectRequest.delegate = self;
             newObjectRequest.didFinishSelector = @selector(uploadObjectUsingHashMapFinished:);
             newObjectRequest.didFailSelector = @selector(uploadObjectUsingHashMapFailed:);
-            newObjectRequest.userInfo = objectRequest.userInfo;
+            newObjectRequest.userInfo = containerRequest.userInfo;
             [(NSMutableDictionary *)(newObjectRequest.userInfo) removeObjectForKey:@"missingBlocks"];
             [(NSMutableDictionary *)(newObjectRequest.userInfo) removeObjectForKey:@"missingBlockIndex"];
             [newObjectRequest startAsynchronous];
         } else {
-            ASIPithosObjectRequest *newObjectRequest = [PithosFileUtilities updateObjectDataRequestWithContainerName:[objectRequest.userInfo objectForKey:@"containerName"]
-                                                                                                          objectName:@".upload" 
-                                                                                                           blockSize:[[objectRequest.userInfo objectForKey:@"blockSize"] unsignedIntegerValue]
-                                                                                                             forFile:[objectRequest.userInfo objectForKey:@"filePath"] 
+            ASIPithosContainerRequest *newContainerRequest = [PithosFileUtilities updateContainerDataRequestWithContainerName:[containerRequest.userInfo objectForKey:@"containerName"]
+                                                                                                           blockSize:[[containerRequest.userInfo objectForKey:@"blockSize"] unsignedIntegerValue]
+                                                                                                             forFile:[containerRequest.userInfo objectForKey:@"filePath"] 
                                                                                                    missingBlockIndex:missingBlockIndex 
-                                                                                                      sharingAccount:[objectRequest.userInfo objectForKey:@"sharingAccount"]];
-            newObjectRequest.delegate = self;
-            newObjectRequest.didFinishSelector = @selector(uploadMissingBlockFinished:);
-            newObjectRequest.didFailSelector = @selector(uploadMissingBlockFailed:);
-            newObjectRequest.userInfo = objectRequest.userInfo;
-            [(NSMutableDictionary *)(newObjectRequest.userInfo) setObject:[NSNumber numberWithUnsignedInteger:missingBlockIndex] forKey:@"missingBlockIndex"];
-            [newObjectRequest startAsynchronous];
+                                                                                                      sharingAccount:[containerRequest.userInfo objectForKey:@"sharingAccount"]];
+            newContainerRequest.delegate = self;
+            newContainerRequest.didFinishSelector = @selector(uploadMissingBlockFinished:);
+            newContainerRequest.didFailSelector = @selector(uploadMissingBlockFailed:);
+            newContainerRequest.userInfo = containerRequest.userInfo;
+            [(NSMutableDictionary *)(newContainerRequest.userInfo) setObject:[NSNumber numberWithUnsignedInteger:missingBlockIndex] forKey:@"missingBlockIndex"];
+            [newContainerRequest startAsynchronous];
         }
     } else {
-        [PithosFileUtilities unexpectedResponseStatusAlertWithRequest:objectRequest];
+        [PithosFileUtilities unexpectedResponseStatusAlertWithRequest:containerRequest];
     }
 }
 
-- (void)uploadMissingBlockFailed:(ASIPithosObjectRequest *)objectRequest {
+- (void)uploadMissingBlockFailed:(ASIPithosContainerRequest *)containerRequest {
     NSLog(@"Upload of missing block failed");
-    [PithosFileUtilities httpRequestErrorAlertWithRequest:objectRequest];
+    [PithosFileUtilities httpRequestErrorAlertWithRequest:containerRequest];
 }
 
 - (void)moveFinished:(ASIPithosObjectRequest *)objectRequest {