Create application/directory for subdir, if metadata or permissions are applied.
[pithos-ios] / Classes / EditMetadataViewController.m
index aa417d1..5e73100 100644 (file)
@@ -38,6 +38,9 @@
 #import "EditMetadataViewController.h"
 #import "AccountManager.h"
 #import "UIViewController+Conveniences.h"
+#import "FolderViewController.h"
+#import "Folder.h"
+#import "PithosUtilities.h"
 
 
 
@@ -48,7 +51,7 @@
 
 @synthesize metadataKey;
 @synthesize metadataValue;
-@synthesize removeMetadataEnabled;
+@synthesize removeMetadataEnabled, objectIsFolder, folderViewController, objectIsContainer;
 
 #define kMetadata 0 
 #define kSaveMedata 1
 
 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
+
+    
     if (indexPath.section != kMetadata)
         [self.view endEditing:YES];
     
     NSIndexPath *keyCellIndexPath;
     NSIndexPath *valueCellIndexPath;
     UITableViewCell *cell;
+    
     switch (indexPath.section) {
         case kSaveMedata:
             keyCellIndexPath = [NSIndexPath indexPathForRow:0 inSection:kMetadata];
             cell = [self.tableView cellForRowAtIndexPath:keyCellIndexPath];
             UITextField *textField = [[cell.contentView subviews] objectAtIndex:0];
-            NSString *newMetadataKey = textField.text;
+            newMetadataKey = textField.text;
         
             if ([newMetadataKey length] == 0
                 || [[newMetadataKey stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0) {
             valueCellIndexPath = [NSIndexPath indexPathForRow:1 inSection:kMetadata];
             cell = [self.tableView cellForRowAtIndexPath:valueCellIndexPath];
             textField = [[cell.contentView subviews] objectAtIndex:0];
-            NSString *newMetadataValue = textField.text;
+            newMetadataValue = textField.text;
             
-            activityMessage = @"Saving metadata";
+            [object.metadata removeObjectForKey:metadataKey];
+            [object.metadata setObject:newMetadataValue forKey:newMetadataKey];
             
+            if (objectIsFolder && ![PithosUtilities isContentTypeDirectory:object.contentType]) {
+                if ([folderViewController.folder.objects objectForKey:object.name]) {
+                    NSString *alertMessage = [NSString stringWithFormat:@"In order to apply the changes in '%@', the object at the same path must be replaced. Continue?",object.name];
+                    NSString *alertTitle = @"Apply changes";
+                    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:alertTitle
+                                                                    message:alertMessage
+                                                                   delegate:self
+                                                          cancelButtonTitle:@"Cancel"
+                                                          otherButtonTitles:@"OK", nil];
+                    [alert show];
+                    return;
+                } else {
+                    activityMessage = @"Saving metadata...";
+                    activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
+                    [activityIndicatorView addToView:self.view];
+                    
+                    object.name = object.fullPath;
+                    object.contentType = @"application/directory";
+                    object.data = [NSData data];
+                    [self addNewFolderRequestObservers];
+                    [self.account.manager writeObject:self.container object:object downloadProgressDelegate:nil];  
+                    return;
+                }
+            }
+            
+            activityMessage = @"Saving metadata";
             activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
             [activityIndicatorView addToView:self.view];
 
-            [object.metadata removeObjectForKey:metadataKey];
-            [object.metadata setObject:newMetadataValue forKey:newMetadataKey];
             [self.account.manager writeObjectMetadata:container object:object];
             successObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"writeObjectMetadataSucceeded"
                                                                                 object:object
                                    [self.tableView reloadData];
                                    [activityIndicatorView removeFromSuperviewAndRelease];
                                    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
+                                   if (objectIsContainer) {
+                                       container.metadata = object.metadata;
+                                       [self.account.containers setObject:container forKey:container.name];
+                                   }
                                    [[NSNotificationCenter defaultCenter] removeObserver:successObserver];
                                }];
             
                                    self.metadataValue = @"";
                                    removeMetadataEnabled = NO;
                                    [self.tableView reloadData];
+                                   if (objectIsContainer) {
+                                       container.metadata = object.metadata;
+                                       [self.account.containers setObject:container forKey:container.name];
+                                   }
                                    [[NSNotificationCenter defaultCenter] removeObserver:successObserver];
                                }];
             
     }
 }
 
-#pragma mark - Textfield delegate
+#pragma mark - Alertview delegate
 
+- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
+{
+    if (buttonIndex == 1) {
+        NSString *activityMessage = @"Applying permissions...";
+        
+        activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
+        [activityIndicatorView addToView:self.view];
+        
+        object.name = object.fullPath;
+        object.contentType = @"application/directory";
+        object.data = [NSData data];
+        [self addNewFolderRequestObservers];
+        [self.account.manager writeObject:self.container object:object downloadProgressDelegate:nil];        
+        
+    } else {
+        [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
+    }
+}
 
+#pragma mark - Textfield delegate
 
 
 - (BOOL)textFieldShouldReturn:(UITextField *)textField
     return YES;
 }
 
+#pragma mark - add observers
+
+- (void)addNewFolderRequestObservers {
+    addFolderSuccessObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"writeObjectSucceeded" object:object 
+                                                                                  queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification)
+                                {
+                                    Folder *newFolder = [[Folder alloc] init];
+                                    newFolder.name = [[object.name componentsSeparatedByString:@"/"] lastObject];
+                                    newFolder.parent = folderViewController.folder;
+                                    newFolder.sharing = folderViewController.folder.sharing;
+                                    newFolder.metadata = object.metadata;
+                                    [folderViewController.folder.folders setObject:newFolder forKey:newFolder.name];
+                                    [activityIndicatorView removeFromSuperviewAndRelease];
+                                    [newFolder release];
+                                    self.metadataKey = newMetadataKey;
+                                    self.metadataValue = newMetadataValue;
+                                    removeMetadataEnabled = YES;
+                                    [self.tableView reloadData];
+                                    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
+                                    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
+                                        [self.folderViewController refreshButtonPressed:nil];
+                                    }
+                                    else {
+                                        self.folderViewController.needsRefreshing = YES;
+                                    }
+                                    [[NSNotificationCenter defaultCenter] removeObserver:addFolderSuccessObserver];
+                                }];
+    
+    addFolderFailureObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"writeObjectFailed" object:object 
+                                                                                  queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification)
+                                {         
+                                    [object.metadata removeObjectForKey:newMetadataKey];
+                                    [object.metadata setObject:metadataValue forKey:metadataKey];
+                                    [activityIndicatorView removeFromSuperviewAndRelease];
+                                    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
+                                    [self.tableView reloadData];
+                                    [self alert:@"There was a problem saving the metadata." request:[notification.userInfo objectForKey:@"request"]];
+                                    
+                                    [[NSNotificationCenter defaultCenter] removeObserver:addFolderFailureObserver];
+                                }];
+    
+
+}
+
 @end