Revision 919cb043 pithos-macos/PithosBrowserController.m

b/pithos-macos/PithosBrowserController.m
2 2
//  PithosBrowserController.m
3 3
//  pithos-macos
4 4
//
5
// Copyright 2011 GRNET S.A. All rights reserved.
5
// Copyright 2011-2012 GRNET S.A. All rights reserved.
6 6
//
7 7
// Redistribution and use in source and binary forms, with or
8 8
// without modification, are permitted provided that the following
......
47 47
#import "FileSystemBrowserCell.h"
48 48
#import "ASINetworkQueue.h"
49 49
#import "ASIPithosRequest.h"
50
#import "ASIPithos.h"
50 51
#import "ASIPithosContainerRequest.h"
51 52
#import "ASIPithosObjectRequest.h"
52 53
#import "ASIPithosAccount.h"
......
99 100
@end
100 101

  
101 102
@interface PithosBrowserController (Private)
102
- (void)resetContainers:(NSNotification *)notification;
103 103
- (BOOL)uploadFiles:(NSArray *)filenames toNode:(PithosNode *)destinationNode;
104 104
- (BOOL)moveNodes:(NSArray *)nodes toNode:(PithosNode *)destinationNode;
105 105
- (BOOL)copyNodes:(NSArray *)nodes toNode:(PithosNode *)destinationNode;
106 106
@end
107 107

  
108 108
@implementation PithosBrowserController
109
@synthesize pithos;
109 110
@synthesize accountNode;
110 111
@synthesize verticalSplitView, horizontalSplitView, leftTopView, leftBottomView, outlineView, browser, outlineViewMenu, browserMenu;
111 112
@synthesize draggedNodes, draggedParentNode;
......
150 151
    [containersNode release];
151 152
    [accountNode release];
152 153
    [rootNode release];
154
    [pithos release];
153 155
    [super dealloc];
154 156
}
155 157

  
156
- (void)awakeFromNib {
157
    [super awakeFromNib];
158
    
158
- (void)initBrowser {
159 159
    [browser registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, NSFilesPromisePboardType, nil]];
160 160
    [browser setDraggingSourceOperationMask:(NSDragOperationCopy|NSDragOperationMove) forLocal:YES];
161 161
    [browser setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO];
......
165 165
    [outlineView setDraggingSourceOperationMask:NSDragOperationCopy forLocal:NO];
166 166
    
167 167
    [browser setCellClass:[PithosBrowserCell class]];
168
    [browser setAllowsBranchSelection:YES];
169
    [browser setAllowsMultipleSelection:YES];
170
    [browser setAllowsEmptySelection:YES];
171
    [browser setAllowsTypeSelect:YES];
168 172
    
169 173
    moveNetworkQueue = [[ASINetworkQueue alloc] init];
170 174
    moveNetworkQueue.shouldCancelAllRequestsOnFailure = NO;
......
189 193
    deleteQueue = dispatch_queue_create("gr.grnet.pithos.DeleteQueue", NULL);
190 194
    uploadQueue = dispatch_queue_create("gr.grnet.pithos.UploadQueue", NULL);
191 195
    downloadQueue = dispatch_queue_create("gr.grnet.pithos.DownloadQueue", NULL);
192
}
193

  
194
- (void)resetContainers:(NSNotification *)notification {
195
    [refreshTimer invalidate];
196
    [refreshTimer release];
197
    
198
    [moveNetworkQueue cancelAllOperations];
199
    [copyNetworkQueue cancelAllOperations];
200
    [deleteNetworkQueue cancelAllOperations];
201
    [uploadNetworkQueue cancelAllOperations];
202
    [downloadNetworkQueue cancelAllOperations];
203
    
204
    rootNode = nil;
205
    [browser loadColumnZero];
206
    [containersNodeChildren removeAllObjects];
207
    [outlineView reloadData];
208
	// Expand the folder outline view
209
    [outlineView expandItem:nil expandChildren:YES];
210
	[outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:1] byExtendingSelection:NO];
211
    
212
    // Refresh account
213
    [accountNode refresh];
214
    [mySharedNode refresh];
215
    [othersSharedNode refresh];
216
    
217
    [activityFacility reset];
218
    
219
    refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(forceRefresh:) userInfo:self repeats:YES] retain];
220
}
221

  
222
- (void)windowDidLoad {
223
    [super windowDidLoad];
224 196
    
225 197
    [activityProgressIndicator setUsesThreadedAnimation:YES];
226 198
    [activityProgressIndicator setMinValue:0.0];
227 199
    [activityProgressIndicator setMaxValue:1.0];
228 200
    activityFacility = [PithosActivityFacility defaultPithosActivityFacility];
229
    activityFacility.delegate = self;
230 201
    
231
    self.accountNode = [[[PithosAccountNode alloc] init] autorelease];
202
    self.accountNode = [[[PithosAccountNode alloc] initWithPithos:pithos] autorelease];
232 203
    containersNode = [[PithosEmptyNode alloc] initWithDisplayName:@"CONTAINERS" icon:nil];
233 204
    containersNodeChildren = [[NSMutableArray alloc] init];
234 205
    sharedNode = [[PithosEmptyNode alloc] initWithDisplayName:@"SHARED" icon:nil];
235
    mySharedNode = [[PithosAccountNode alloc] init];
206
    mySharedNode = [[PithosAccountNode alloc] initWithPithos:pithos];
236 207
    mySharedNode.displayName = @"my shared";
237 208
    mySharedNode.shared = YES;
238 209
    mySharedNode.icon = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kUserIcon)];
239
    othersSharedNode = [[PithosSharingAccountsNode alloc] init];
210
    othersSharedNode = [[PithosSharingAccountsNode alloc] initWithPithos:pithos];
240 211
    othersSharedNode.displayName = @"others shared";
241 212
    othersSharedNode.icon = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGroupIcon)];
242 213
    
......
268 239
                                             selector:@selector(pithosNodeChildrenUpdated:) 
269 240
                                                 name:@"PithosSharingAccountsNodeChildrenUpdated" 
270 241
                                               object:othersSharedNode];
271
    // Updated authentication credentials reset containers in the outline view 
272
    [[NSNotificationCenter defaultCenter] addObserver:self 
273
                                             selector:@selector(resetContainers:) 
274
                                                 name:@"PithosAuthenticationCredentialsUpdated" 
275
                                               object:nil];
276 242
    // Request for browser refresh 
277 243
    [[NSNotificationCenter defaultCenter] addObserver:self 
278 244
                                             selector:@selector(pithosBrowserRefreshNeeded:) 
279 245
                                                 name:@"PithosBrowserRefreshNeeeded" 
280
                                               object:nil];    
246
                                               object:nil];
247
}
248

  
249
- (void)resetBrowser {
250
    [refreshTimer invalidate];
251
    [refreshTimer release];
252
    
253
    [moveNetworkQueue cancelAllOperations];
254
    [copyNetworkQueue cancelAllOperations];
255
    [deleteNetworkQueue cancelAllOperations];
256
    [uploadNetworkQueue cancelAllOperations];
257
    [downloadNetworkQueue cancelAllOperations];
258
    
259
    rootNode = nil;
260
    [browser loadColumnZero];
261
    [containersNodeChildren removeAllObjects];
262
    [outlineView reloadData];
263
	// Expand the folder outline view
264
    [outlineView expandItem:nil expandChildren:YES];
265
	[outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:1] byExtendingSelection:NO];
266
    
267
    activityFacility.delegate = nil;
268
    [activityProgressIndicator setDoubleValue:1.0];
269
    [activityProgressIndicator stopAnimation:self];
270
}
271

  
272
- (void)startBrowser {
273
    accountNode.pithos = pithos;
274
    [accountNode refresh];
275
    mySharedNode.pithos = pithos;
276
    [mySharedNode refresh];
277
    othersSharedNode.pithos = pithos;
278
    [othersSharedNode refresh];
279
    
280
    [activityFacility reset];
281
    activityFacility.delegate = self;
282
    
283
    refreshTimer = [[NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(forceRefresh:) userInfo:self repeats:YES] retain];
284
}
285

  
286
- (void)setPithos:(ASIPithos *)aPithos {
287
    if (aPithos && [aPithos isNotEqualTo:pithos]) {
288
        [self resetBrowser];
289
        [pithos release];
290
        pithos = [aPithos retain];
291
        [self startBrowser];
292
    }
293
}
294

  
295
- (void)windowDidLoad {
296
    [super windowDidLoad];
297
    if (browser && !browserInitialized) {
298
        browserInitialized = YES;
299
        [self initBrowser];
300
    }
281 301
}
282 302

  
283 303
#pragma mark -
......
325 345
    BOOL refreshAccountNode = NO;
326 346
    if (!containerPithosFound) {
327 347
        // Create pithos node
328
        ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest createOrUpdateContainerRequestWithContainerName:@"pithos"];
348
        ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest createOrUpdateContainerRequestWithPithos:pithos 
349
                                                                                                            containerName:@"pithos"];
329 350
        [[PithosUtilities prepareRequest:containerRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
330 351
        while (![containerRequest isFinished]) {
331 352
            usleep(1);
......
338 359
    }
339 360
    if (!containerTrashFound) {
340 361
        // Create trash node
341
        ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest createOrUpdateContainerRequestWithContainerName:@"trash"];
362
        ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest createOrUpdateContainerRequestWithPithos:pithos 
363
                                                                                                            containerName:@"trash"];
342 364
        [[PithosUtilities prepareRequest:containerRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
343 365
        while (![containerRequest isFinished]) {
344 366
            usleep(1);
......
474 496
                destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
475 497
            NSError *error = nil;
476 498
            BOOL isDirectory;
477
            if ([PithosUtilities objectExistsAtContainerName:node.pithosContainer.name 
478
                                                  objectName:destinationObjectName 
479
                                                       error:&error 
480
                                                 isDirectory:&isDirectory 
481
                                              sharingAccount:nil]) {
499
            if ([PithosUtilities objectExistsAtPithos:pithos 
500
                                        containerName:node.pithosContainer.name 
501
                                           objectName:destinationObjectName 
502
                                                error:&error 
503
                                          isDirectory:&isDirectory 
504
                                       sharingAccount:nil]) {
482 505
                NSAlert *alert = [[[NSAlert alloc] init] autorelease];
483 506
                [alert setMessageText:@"Name Taken"];
484 507
                [alert setInformativeText:[NSString stringWithFormat:@"The name '%@' is already taken. Please choose a different name", newName]];
......
490 513
                [pool drain];
491 514
                return;
492 515
            }
493
            ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithContainerName:node.pithosContainer.name 
494
                                                                                             objectName:node.pithosObject.name 
495
                                                                               destinationContainerName:node.pithosContainer.name 
496
                                                                                  destinationObjectName:destinationObjectName 
497
                                                                                          checkIfExists:NO];
516
            ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithPithos:pithos 
517
                                                                                   containerName:node.pithosContainer.name 
518
                                                                                      objectName:node.pithosObject.name 
519
                                                                        destinationContainerName:node.pithosContainer.name 
520
                                                                           destinationObjectName:destinationObjectName 
521
                                                                                   checkIfExists:NO];
498 522
            if (objectRequest) {
499 523
                objectRequest.delegate = self;
500 524
                objectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
......
533 557
            NSString *destinationObjectName = [[node.pithosObject.name stringByDeletingLastPathComponent] stringByAppendingPathComponent:newName];
534 558
            NSError *error = nil;
535 559
            BOOL isDirectory;
536
            if ([PithosUtilities objectExistsAtContainerName:node.pithosContainer.name 
537
                                                  objectName:destinationObjectName 
538
                                                       error:&error 
539
                                                 isDirectory:&isDirectory 
540
                                              sharingAccount:nil]) {
560
            if ([PithosUtilities objectExistsAtPithos:pithos 
561
                                        containerName:node.pithosContainer.name 
562
                                           objectName:destinationObjectName 
563
                                                error:&error 
564
                                          isDirectory:&isDirectory 
565
                                       sharingAccount:nil]) {
541 566
                NSAlert *alert = [[[NSAlert alloc] init] autorelease];
542 567
                [alert setMessageText:@"Name Taken"];
543 568
                [alert setInformativeText:[NSString stringWithFormat:@"The name '%@' is already taken. Please choose a different name", newName]];
......
551 576
            }
552 577
            if (node.pithosObject.subdir)
553 578
                destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
554
            NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithContainerName:node.pithosContainer.name 
555
                                                                                         objectName:node.pithosObject.name 
556
                                                                           destinationContainerName:node.pithosContainer.name 
557
                                                                              destinationObjectName:destinationObjectName 
558
                                                                                      checkIfExists:NO];
579
            NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithPithos:pithos 
580
                                                                               containerName:node.pithosContainer.name 
581
                                                                                  objectName:node.pithosObject.name 
582
                                                                    destinationContainerName:node.pithosContainer.name 
583
                                                                       destinationObjectName:destinationObjectName 
584
                                                                               checkIfExists:NO];
559 585
            if (objectRequests) {
560 586
                for (ASIPithosObjectRequest *objectRequest in objectRequests) {
561 587
                    objectRequest.delegate = self;
......
640 666
            if (choice == NSAlertFirstButtonReturn) {
641 667
                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
642 668
                    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
643
                    NSArray *objectRequests = [PithosUtilities objectDataRequestsForSubdirWithContainerName:node.pithosContainer.name 
644
                                                                                                     objectName:node.pithosObject.name 
645
                                                                                                    toDirectory:[dropDestination path] 
646
                                                                                                  checkIfExists:YES 
647
                                                                                                 sharingAccount:node.sharingAccount];
669
                    NSArray *objectRequests = [PithosUtilities objectDataRequestsForSubdirWithPithos:pithos 
670
                                                                                       containerName:node.pithosContainer.name 
671
                                                                                          objectName:node.pithosObject.name 
672
                                                                                         toDirectory:[dropDestination path] 
673
                                                                                       checkIfExists:YES 
674
                                                                                      sharingAccount:node.sharingAccount];
648 675
                    if (objectRequests) {
649 676
                        for (__block ASIPithosObjectRequest *objectRequest in objectRequests) {
650 677
                            [names addObject:[objectRequest.userInfo objectForKey:@"fileName"]];
......
687 714
        } else {
688 715
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
689 716
                NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
690
                __block ASIPithosObjectRequest *objectRequest = [PithosUtilities objectDataRequestWithContainerName:node.pithosContainer.name 
691
                                                                                                         objectName:node.pithosObject.name 
692
                                                                                                        toDirectory:[dropDestination path] 
693
                                                                                                      checkIfExists:YES 
694
                                                                                                     sharingAccount:node.sharingAccount];
717
                __block ASIPithosObjectRequest *objectRequest = [PithosUtilities objectDataRequestWithPithos:pithos 
718
                                                                                               containerName:node.pithosContainer.name 
719
                                                                                                  objectName:node.pithosObject.name 
720
                                                                                                 toDirectory:[dropDestination path] 
721
                                                                                               checkIfExists:YES 
722
                                                                                              sharingAccount:node.sharingAccount];
695 723
                if (objectRequest) {
696 724
                    [names addObject:[objectRequest.userInfo objectForKey:@"fileName"]];
697 725
                    objectRequest.delegate = self;
......
855 883
    else
856 884
        objectNamePrefix = [NSString string];
857 885
    if ((destinationNode.pithosContainer.blockHash == nil) || (destinationNode.pithosContainer.blockSize == 0)) {
858
        ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest containerMetadataRequestWithContainerName:containerName];
886
        ASIPithosContainerRequest *containerRequest = [ASIPithosContainerRequest containerMetadataRequestWithPithos:pithos 
887
                                                                                                      containerName:containerName];
859 888
        [[PithosUtilities prepareRequest:containerRequest priority:NSOperationQueuePriorityVeryHigh] startAsynchronous];
860 889
        while (![containerRequest isFinished]) {
861 890
            usleep(1);
......
888 917
                    if (error)
889 918
                        NSLog(@"contentType detection error: %@", error);
890 919
                    NSArray *hashes = nil;
891
                    ASIPithosObjectRequest *objectRequest = [PithosUtilities writeObjectDataRequestWithContainerName:containerName 
892
                                                                                                          objectName:objectName 
893
                                                                                                         contentType:contentType 
894
                                                                                                           blockSize:blockSize 
895
                                                                                                           blockHash:blockHash 
896
                                                                                                             forFile:filePath 
897
                                                                                                       checkIfExists:YES 
898
                                                                                                              hashes:&hashes 
899
                                                                                                      sharingAccount:destinationNode.sharingAccount];
920
                    ASIPithosObjectRequest *objectRequest = [PithosUtilities writeObjectDataRequestWithPithos:pithos 
921
                                                                                                containerName:containerName 
922
                                                                                                   objectName:objectName 
923
                                                                                                  contentType:contentType 
924
                                                                                                    blockSize:blockSize 
925
                                                                                                    blockHash:blockHash 
926
                                                                                                      forFile:filePath 
927
                                                                                                checkIfExists:YES 
928
                                                                                                       hashes:&hashes 
929
                                                                                               sharingAccount:destinationNode.sharingAccount];
900 930
                    if (objectRequest) {
901 931
                        objectRequest.delegate = self;
902 932
                        objectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
......
952 982
                        NSMutableArray *filePaths = nil;
953 983
                        NSMutableArray *hashesArrays = nil;
954 984
                        NSMutableArray *directoryObjectRequests = nil;
955
                        NSArray *objectRequests = [PithosUtilities writeObjectDataRequestsWithContainerName:containerName 
956
                                                                                                     objectName:objectName 
957
                                                                                                      blockSize:blockSize 
958
                                                                                                      blockHash:blockHash 
959
                                                                                                   forDirectory:filePath 
960
                                                                                                  checkIfExists:YES 
961
                                                                                                    objectNames:&objectNames
962
                                                                                                   contentTypes:&contentTypes
963
                                                                                                      filePaths:&filePaths
964
                                                                                                   hashesArrays:&hashesArrays 
965
                                                                                        directoryObjectRequests:&directoryObjectRequests 
966
                                                                                                 sharingAccount:destinationNode.sharingAccount];
985
                        NSArray *objectRequests = [PithosUtilities writeObjectDataRequestsWithPithos:pithos 
986
                                                                                       containerName:containerName 
987
                                                                                          objectName:objectName 
988
                                                                                           blockSize:blockSize 
989
                                                                                           blockHash:blockHash 
990
                                                                                        forDirectory:filePath 
991
                                                                                       checkIfExists:YES 
992
                                                                                         objectNames:&objectNames
993
                                                                                        contentTypes:&contentTypes
994
                                                                                           filePaths:&filePaths
995
                                                                                        hashesArrays:&hashesArrays 
996
                                                                             directoryObjectRequests:&directoryObjectRequests 
997
                                                                                      sharingAccount:destinationNode.sharingAccount];
967 998
                        for (ASIPithosObjectRequest *objectRequest in directoryObjectRequests) {
968 999
                            objectRequest.delegate = self;
969 1000
                            objectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
......
1053 1084
                NSString *destinationObjectName = [objectNamePrefix stringByAppendingPathComponent:node.displayName];
1054 1085
                if ([node.pithosObject.name hasSuffix:@"/"])
1055 1086
                    destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
1056
                ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithContainerName:node.pithosContainer.name 
1057
                                                                                                     objectName:node.pithosObject.name 
1058
                                                                                       destinationContainerName:containerName 
1059
                                                                                          destinationObjectName:destinationObjectName 
1060
                                                                                                  checkIfExists:YES];
1087
                ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithPithos:pithos 
1088
                                                                                       containerName:node.pithosContainer.name 
1089
                                                                                          objectName:node.pithosObject.name 
1090
                                                                            destinationContainerName:containerName 
1091
                                                                               destinationObjectName:destinationObjectName 
1092
                                                                                       checkIfExists:YES];
1061 1093
                if (objectRequest) {
1062 1094
                    objectRequest.delegate = self;
1063 1095
                    objectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
......
1093 1125
                NSString *destinationObjectName = [objectNamePrefix stringByAppendingPathComponent:node.displayName];
1094 1126
                if (node.pithosObject.subdir)
1095 1127
                    destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
1096
                NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithContainerName:node.pithosContainer.name 
1097
                                                                                                 objectName:node.pithosObject.name 
1098
                                                                                   destinationContainerName:containerName 
1099
                                                                                      destinationObjectName:destinationObjectName 
1100
                                                                                              checkIfExists:YES];
1128
                NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithPithos:pithos 
1129
                                                                                   containerName:node.pithosContainer.name 
1130
                                                                                      objectName:node.pithosObject.name 
1131
                                                                        destinationContainerName:containerName 
1132
                                                                           destinationObjectName:destinationObjectName 
1133
                                                                                   checkIfExists:YES];
1101 1134
                if (objectRequests) {
1102 1135
                    for (ASIPithosObjectRequest *objectRequest in objectRequests) {
1103 1136
                        objectRequest.delegate = self;
......
1157 1190
                    if ([node.pithosObject.name hasSuffix:@"/"])
1158 1191
                        destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
1159 1192
                } else {
1160
                    destinationObjectName = [PithosUtilities safeObjectNameForContainerName:containerName 
1161
                                                                                 objectName:node.pithosObject.name];
1193
                    destinationObjectName = [PithosUtilities safeObjectNameForPithos:pithos 
1194
                                                                       containerName:containerName 
1195
                                                                          objectName:node.pithosObject.name];
1162 1196
                }
1163
                ASIPithosObjectRequest *objectRequest = [PithosUtilities copyObjectRequestWithContainerName:node.pithosContainer.name 
1164
                                                                                                     objectName:node.pithosObject.name 
1165
                                                                                       destinationContainerName:containerName 
1166
                                                                                          destinationObjectName:destinationObjectName 
1167
                                                                                                  checkIfExists:YES 
1168
                                                                                                 sharingAccount:node.sharingAccount];
1197
                ASIPithosObjectRequest *objectRequest = [PithosUtilities copyObjectRequestWithPithos:pithos 
1198
                                                                                       containerName:node.pithosContainer.name 
1199
                                                                                          objectName:node.pithosObject.name 
1200
                                                                            destinationContainerName:containerName 
1201
                                                                               destinationObjectName:destinationObjectName 
1202
                                                                                       checkIfExists:YES 
1203
                                                                                      sharingAccount:node.sharingAccount];
1169 1204
                if (objectRequest) {
1170 1205
                    objectRequest.delegate = self;
1171 1206
                    objectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
......
1204 1239
                    if (node.pithosObject.subdir)
1205 1240
                        destinationObjectName = [destinationObjectName stringByAppendingString:@"/"];
1206 1241
                } else {
1207
                    destinationObjectName = [PithosUtilities safeSubdirNameForContainerName:containerName 
1208
                                                                                     subdirName:node.pithosObject.name];
1242
                    destinationObjectName = [PithosUtilities safeSubdirNameForPithos:pithos 
1243
                                                                       containerName:containerName 
1244
                                                                          subdirName:node.pithosObject.name];
1209 1245
                }
1210
                NSArray *objectRequests = [PithosUtilities copyObjectRequestsForSubdirWithContainerName:node.pithosContainer.name 
1211
                                                                                                 objectName:node.pithosObject.name 
1212
                                                                                   destinationContainerName:containerName 
1213
                                                                                      destinationObjectName:destinationObjectName 
1214
                                                                                              checkIfExists:YES 
1215
                                                                                             sharingAccount:node.sharingAccount];
1246
                NSArray *objectRequests = [PithosUtilities copyObjectRequestsForSubdirWithPithos:pithos 
1247
                                                                                   containerName:node.pithosContainer.name 
1248
                                                                                      objectName:node.pithosObject.name 
1249
                                                                        destinationContainerName:containerName 
1250
                                                                           destinationObjectName:destinationObjectName 
1251
                                                                                   checkIfExists:YES 
1252
                                                                                  sharingAccount:node.sharingAccount];
1216 1253
                if (objectRequests) {
1217 1254
                    for (ASIPithosObjectRequest *objectRequest in objectRequests) {
1218 1255
                        objectRequest.delegate = self;
......
1431 1468
        }
1432 1469
        NSLog(@"object is missing hashes: %@", objectRequest.url);
1433 1470
        NSIndexSet *missingBlocks = [PithosUtilities missingBlocksForHashes:[objectRequest.userInfo objectForKey:@"hashes"]
1434
                                                  withMissingHashesResponse:[objectRequest responseString]];
1471
                                                          withMissingHashes:[objectRequest hashes]];
1435 1472
        NSUInteger blockSize = [[objectRequest.userInfo objectForKey:@"blockSize"] unsignedIntegerValue];
1436 1473
        if (totalBytes >= [missingBlocks count]*blockSize)
1437 1474
            currentBytes = totalBytes - [missingBlocks count]*blockSize;
......
1442 1479
                                currentBytes:currentBytes];
1443 1480
        });
1444 1481
        NSUInteger missingBlockIndex = [missingBlocks firstIndex];
1445
        __block ASIPithosContainerRequest *newContainerRequest = [PithosUtilities updateContainerDataRequestWithContainerName:[objectRequest.userInfo objectForKey:@"containerName"] 
1446
                                                                                                                    blockSize:blockSize 
1447
                                                                                                                      forFile:[objectRequest.userInfo objectForKey:@"filePath"] 
1448
                                                                                                            missingBlockIndex:missingBlockIndex 
1449
                                                                                                               sharingAccount:[objectRequest.userInfo objectForKey:@"sharingAccount"]];
1482
        __block ASIPithosContainerRequest *newContainerRequest = [PithosUtilities updateContainerDataRequestWithPithos:pithos 
1483
                                                                                                         containerName:[objectRequest.userInfo objectForKey:@"containerName"] 
1484
                                                                                                             blockSize:blockSize 
1485
                                                                                                               forFile:[objectRequest.userInfo objectForKey:@"filePath"] 
1486
                                                                                                     missingBlockIndex:missingBlockIndex 
1487
                                                                                                        sharingAccount:[objectRequest.userInfo objectForKey:@"sharingAccount"]];
1450 1488
        newContainerRequest.delegate = self;
1451 1489
        newContainerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
1452 1490
        newContainerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
......
1482 1520
        missingBlockIndex = [missingBlocks indexGreaterThanIndex:missingBlockIndex];
1483 1521
        if (missingBlockIndex == NSNotFound) {
1484 1522
            NSArray *hashes = [containerRequest.userInfo objectForKey:@"hashes"];
1485
            ASIPithosObjectRequest *newObjectRequest = [PithosUtilities writeObjectDataRequestWithContainerName:[containerRequest.userInfo objectForKey:@"containerName"] 
1486
                                                                                                     objectName:[containerRequest.userInfo objectForKey:@"objectName"] 
1487
                                                                                                    contentType:[containerRequest.userInfo objectForKey:@"contentType"] 
1488
                                                                                                      blockSize:blockSize 
1489
                                                                                                      blockHash:[containerRequest.userInfo objectForKey:@"blockHash"]
1490
                                                                                                        forFile:[containerRequest.userInfo objectForKey:@"filePath"] 
1491
                                                                                                  checkIfExists:NO 
1492
                                                                                                         hashes:&hashes 
1493
                                                                                                 sharingAccount:[containerRequest.userInfo objectForKey:@"sharingAccount"]];
1523
            ASIPithosObjectRequest *newObjectRequest = [PithosUtilities writeObjectDataRequestWithPithos:pithos 
1524
                                                                                           containerName:[containerRequest.userInfo objectForKey:@"containerName"] 
1525
                                                                                              objectName:[containerRequest.userInfo objectForKey:@"objectName"] 
1526
                                                                                             contentType:[containerRequest.userInfo objectForKey:@"contentType"] 
1527
                                                                                               blockSize:blockSize 
1528
                                                                                               blockHash:[containerRequest.userInfo objectForKey:@"blockHash"]
1529
                                                                                                 forFile:[containerRequest.userInfo objectForKey:@"filePath"] 
1530
                                                                                           checkIfExists:NO 
1531
                                                                                                  hashes:&hashes 
1532
                                                                                          sharingAccount:[containerRequest.userInfo objectForKey:@"sharingAccount"]];
1494 1533
            newObjectRequest.delegate = self;
1495 1534
            newObjectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
1496 1535
            newObjectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
......
1501 1540
            [(NSMutableDictionary *)(newObjectRequest.userInfo) setObject:NSStringFromSelector(@selector(uploadObjectUsingHashMapFinished:)) forKey:@"didFinishSelector"];
1502 1541
            [uploadNetworkQueue addOperation:[PithosUtilities prepareRequest:newObjectRequest priority:[[newObjectRequest.userInfo objectForKey:@"priority"] integerValue]]];
1503 1542
        } else {
1504
            __block ASIPithosContainerRequest *newContainerRequest = [PithosUtilities updateContainerDataRequestWithContainerName:[containerRequest.userInfo objectForKey:@"containerName"]
1505
                                                                                                                        blockSize:[[containerRequest.userInfo objectForKey:@"blockSize"] unsignedIntegerValue]
1506
                                                                                                                          forFile:[containerRequest.userInfo objectForKey:@"filePath"] 
1507
                                                                                                                missingBlockIndex:missingBlockIndex 
1508
                                                                                                                   sharingAccount:[containerRequest.userInfo objectForKey:@"sharingAccount"]];
1543
            __block ASIPithosContainerRequest *newContainerRequest = [PithosUtilities updateContainerDataRequestWithPithos:pithos 
1544
                                                                                                             containerName:[containerRequest.userInfo objectForKey:@"containerName"]
1545
                                                                                                                 blockSize:[[containerRequest.userInfo objectForKey:@"blockSize"] unsignedIntegerValue]
1546
                                                                                                                   forFile:[containerRequest.userInfo objectForKey:@"filePath"] 
1547
                                                                                                         missingBlockIndex:missingBlockIndex 
1548
                                                                                                            sharingAccount:[containerRequest.userInfo objectForKey:@"sharingAccount"]];
1509 1549
            newContainerRequest.delegate = self;
1510 1550
            newContainerRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
1511 1551
            newContainerRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
......
1907 1947
    if ([node class] == [PithosContainerNode class]) {
1908 1948
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
1909 1949
            NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
1910
            NSString *safeObjectName = [PithosUtilities safeSubdirNameForContainerName:node.pithosContainer.name 
1911
                                                                                subdirName:@"untitled folder"];
1950
            NSString *safeObjectName = [PithosUtilities safeSubdirNameForPithos:pithos 
1951
                                                                  containerName:node.pithosContainer.name 
1952
                                                                     subdirName:@"untitled folder"];
1912 1953
            NSString *fileName = [safeObjectName lastPathComponent];
1913
            ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithContainerName:node.pithosContainer.name 
1914
                                                                                                         objectName:safeObjectName 
1915
                                                                                                           eTag:nil 
1916
                                                                                                    contentType:@"application/directory" 
1917
                                                                                                contentEncoding:nil 
1918
                                                                                             contentDisposition:nil 
1919
                                                                                                       manifest:nil 
1920
                                                                                                        sharing:nil 
1921
                                                                                                       isPublic:ASIPithosObjectRequestPublicIgnore 
1922
                                                                                                       metadata:nil 
1923
                                                                                                           data:[NSData data]];
1954
            ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithPithos:pithos 
1955
                                                                                               containerName:node.pithosContainer.name 
1956
                                                                                                  objectName:safeObjectName 
1957
                                                                                                        eTag:nil 
1958
                                                                                                 contentType:@"application/directory" 
1959
                                                                                             contentEncoding:nil 
1960
                                                                                          contentDisposition:nil 
1961
                                                                                                    manifest:nil 
1962
                                                                                                     sharing:nil 
1963
                                                                                                    isPublic:ASIPithosObjectRequestPublicIgnore 
1964
                                                                                                    metadata:nil 
1965
                                                                                                        data:[NSData data]];
1924 1966
            objectRequest.delegate = self;
1925 1967
            objectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
1926 1968
            objectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
......
1949 1991
               (node.pithosObject.subdir || ![node.pithosObject.name hasSuffix:@"/"])) {
1950 1992
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
1951 1993
            NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
1952
            NSString *safeObjectName = [PithosUtilities safeSubdirNameForContainerName:node.pithosContainer.name 
1953
                                                                               subdirName:[node.pithosObject.name stringByAppendingPathComponent:@"untitled folder"]];
1994
            NSString *safeObjectName = [PithosUtilities safeSubdirNameForPithos:pithos 
1995
                                                                  containerName:node.pithosContainer.name 
1996
                                                                     subdirName:[node.pithosObject.name stringByAppendingPathComponent:@"untitled folder"]];
1954 1997
            NSString *fileName = [safeObjectName lastPathComponent];
1955
            ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithContainerName:node.pithosContainer.name 
1956
                                                                                                        objectName:safeObjectName 
1957
                                                                                                              eTag:nil 
1958
                                                                                                       contentType:@"application/directory" 
1959
                                                                                                   contentEncoding:nil 
1960
                                                                                                contentDisposition:nil 
1961
                                                                                                          manifest:nil 
1962
                                                                                                           sharing:nil 
1963
                                                                                                          isPublic:ASIPithosObjectRequestPublicIgnore 
1964
                                                                                                          metadata:nil 
1965
                                                                                                              data:[NSData data]];
1998
            ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest writeObjectDataRequestWithPithos:pithos 
1999
                                                                                               containerName:node.pithosContainer.name 
2000
                                                                                                  objectName:safeObjectName 
2001
                                                                                                        eTag:nil 
2002
                                                                                                 contentType:@"application/directory" 
2003
                                                                                             contentEncoding:nil 
2004
                                                                                          contentDisposition:nil 
2005
                                                                                                    manifest:nil 
2006
                                                                                                     sharing:nil 
2007
                                                                                                    isPublic:ASIPithosObjectRequestPublicIgnore 
2008
                                                                                                    metadata:nil 
2009
                                                                                                        data:[NSData data]];
1966 2010
            objectRequest.delegate = self;
1967 2011
            objectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
1968 2012
            objectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
......
2005 2049
                NSString *fileName = [node.pithosObject.name lastPathComponent];
2006 2050
                if ([node.pithosObject.name hasSuffix:@"/"])
2007 2051
                    fileName = [fileName stringByAppendingString:@"/"];
2008
                ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest deleteObjectRequestWithContainerName:node.pithosContainer.name 
2009
                                                                                                          objectName:node.pithosObject.name];
2052
                ASIPithosObjectRequest *objectRequest = [ASIPithosObjectRequest deleteObjectRequestWithPithos:pithos 
2053
                                                                                                containerName:node.pithosContainer.name 
2054
                                                                                                   objectName:node.pithosObject.name];
2010 2055
                objectRequest.delegate = self;
2011 2056
                objectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
2012 2057
                objectRequest.didFailSelector = @selector(performRequestFailedDelegateInBackground:);
......
2033 2078
        } else if ([node class] == [PithosSubdirNode class]) {
2034 2079
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
2035 2080
                NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
2036
                NSArray *objectRequests = [PithosUtilities deleteObjectRequestsForSubdirWithContainerName:node.pithosContainer.name 
2037
                                                                                               objectName:node.pithosObject.name];
2081
                NSArray *objectRequests = [PithosUtilities deleteObjectRequestsForSubdirWithPithos:pithos 
2082
                                                                                     containerName:node.pithosContainer.name 
2083
                                                                                        objectName:node.pithosObject.name];
2038 2084
                if (objectRequests) {
2039 2085
                    for (ASIPithosObjectRequest *objectRequest in objectRequests) {
2040 2086
                        objectRequest.delegate = self;
......
2074 2120
             [node.pithosObject.name hasSuffix:@"/"])) {
2075 2121
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
2076 2122
                NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
2077
                NSString *safeObjectName = [PithosUtilities safeObjectNameForContainerName:@"trash" 
2078
                                                                                    objectName:node.pithosObject.name];
2123
                NSString *safeObjectName = [PithosUtilities safeObjectNameForPithos:pithos 
2124
                                                                      containerName:@"trash" 
2125
                                                                         objectName:node.pithosObject.name];
2079 2126
                if (safeObjectName) {
2080
                    ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithContainerName:node.pithosContainer.name 
2081
                                                                                                         objectName:node.pithosObject.name 
2082
                                                                                           destinationContainerName:@"trash" 
2083
                                                                                              destinationObjectName:safeObjectName 
2084
                                                                                                      checkIfExists:NO];
2127
                    ASIPithosObjectRequest *objectRequest = [PithosUtilities moveObjectRequestWithPithos:pithos 
2128
                                                                                           containerName:node.pithosContainer.name 
2129
                                                                                              objectName:node.pithosObject.name 
2130
                                                                                destinationContainerName:@"trash" 
2131
                                                                                   destinationObjectName:safeObjectName 
2132
                                                                                           checkIfExists:NO];
2085 2133
                    if (objectRequest) {
2086 2134
                        objectRequest.delegate = self;
2087 2135
                        objectRequest.didFinishSelector = @selector(performRequestFinishedDelegateInBackground:);
......
2115 2163
        } else if ([node class] == [PithosSubdirNode class]) {
2116 2164
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
2117 2165
                NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
2118
                NSString *safeObjectName = [PithosUtilities safeSubdirNameForContainerName:@"trash" 
2119
                                                                                    subdirName:node.pithosObject.name];
2166
                NSString *safeObjectName = [PithosUtilities safeSubdirNameForPithos:pithos 
2167
                                                                      containerName:@"trash" 
2168
                                                                         subdirName:node.pithosObject.name];
2120 2169
                if (safeObjectName) {
2121
                    NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithContainerName:node.pithosContainer.name 
2122
                                                                                                     objectName:node.pithosObject.name 
2123
                                                                                       destinationContainerName:@"trash" 
2124
                                                                                          destinationObjectName:safeObjectName 
2125
                                                                                                  checkIfExists:NO];
2170
                    NSArray *objectRequests = [PithosUtilities moveObjectRequestsForSubdirWithPithos:pithos 
2171
                                                                                       containerName:node.pithosContainer.name 
2172
                                                                                          objectName:node.pithosObject.name 
2173
                                                                            destinationContainerName:@"trash" 
2174
                                                                               destinationObjectName:safeObjectName 
2175
                                                                                       checkIfExists:NO];
2126 2176
                    if (objectRequests) {
2127 2177
                        for (ASIPithosObjectRequest *objectRequest in objectRequests) {
2128 2178
                            objectRequest.delegate = self;

Also available in: Unified diff