Fix compile errors
[pithos-ios] / Classes / ContainerDetailViewController.m
index d7dbe52..9b4f530 100755 (executable)
 #import "EditMetadataViewController.h"
 #import "EditPolicyViewController.h"
 #import "Folder.h"
+#import "FolderViewController.h"
+#import "OpenStackRequest.h"
+#import "APICallback.h"
+#import "NSString+Conveniences.h"
 
 #define kOverview 0
 #define kMetadata 1
-#define kPolicy 2
 #define kCDNAccess 3
 #define kCDNAttributes 4
 #define kLogRetention 5
@@ -55,7 +58,7 @@
 
 @implementation ContainerDetailViewController
 
-@synthesize account, container, containersViewController, selectedContainerIndexPath;
+@synthesize account, container, containersViewController, selectedContainerIndexPath, rootFolderViewController;
 
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
     return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
     cdnURLActionSheet = [[UIActionSheet alloc] initWithTitle:container.cdnURL delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Copy to Pasteboard", nil];
     deleteActionSheet = [[UIActionSheet alloc] initWithTitle:@"Are you sure you want to delete this container?  This operation cannot be undone." delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete Container" otherButtonTitles:nil];
     
-    deleteSection = container.cdnEnabled ? 8 : 3;
+    if (!account.sharingAccount) {
+        deleteSection = container.cdnEnabled ? 8 : 3;
+        policySection = container.cdnEnabled ? 7 : 2;
+    } else {
+        deleteSection = -1;
+        policySection = -1;
+    }
 }
 
 - (void)viewWillAppear:(BOOL)animated {
     [super viewWillAppear:animated];
     if (container) {
         self.navigationItem.title = container.name;
-    //} else {
-    //    self.navigationItem.title = @"Cloud Files Container";
-    }
+    } 
     originalTTL = container.ttl;
     [self setBackgroundView];
     [self.tableView reloadData];
 }
 
+- (void)viewDidAppear:(BOOL)animated {
+    [super viewDidAppear:animated];
+    if (self.container && !container.metadata && (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone))
+        [self reloadMetadataSection];
+}
+
+- (void)viewWillDisappear:(BOOL)animated {
+    [super viewWillDisappear:animated];
+}
+
 #pragma mark -
 #pragma mark TTL
 
 
 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
     if (self.container) {
+        int numberOfSections;
         if (transitioning) {
-            return container.cdnEnabled ? 4 : 9;
+            numberOfSections = container.cdnEnabled ? 4 : 9;
         } else {
-            return container.cdnEnabled ? 9 : 4;
+            numberOfSections = container.cdnEnabled ? 9 : 4;
         }
+        if (account.sharingAccount)
+            return numberOfSections - 2;
+        else
+            return numberOfSections;
     } else {
         return 0;
     }
     if (section == kOverview) {
         return 2;
     } else if (section == kMetadata) {
-        return 1 + [container.metadata count];
-    } else if (section == kPolicy) {
-        return 3;
+        if (account.sharingAccount)
+            return [container.metadata count];
+        else
+            return 1 + [container.metadata count];     
+    } else if (section == policySection) {
+        if (account.sharingAccount)
+            return 2;
+        else
+            return 3;
     } else {
         return 1;
     }
         } else {
             cell.textLabel.textColor = [UIColor grayColor];
             cell.selectionStyle = UITableViewCellSelectionStyleNone;
+            cell.userInteractionEnabled = NO;
         }
     } else {
         if (self.container.count == 0) {
         } else {
             cell.textLabel.textColor = [UIColor grayColor];
             cell.selectionStyle = UITableViewCellSelectionStyleNone;
+            cell.userInteractionEnabled = NO;
         }
     }
     
             cell.detailTextLabel.text = [container humanizedSize];
         }
     } else if (indexPath.section == kMetadata) {
-        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
-        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
-        cell.accessoryView = nil;
+        if (account.sharingAccount) {
+            cell.accessoryType = UITableViewCellAccessoryNone;
+            cell.selectionStyle = UITableViewCellSelectionStyleNone;
+            cell.userInteractionEnabled = NO;
+        }
+        else {
+            cell.selectionStyle = UITableViewCellSelectionStyleBlue;
+            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
+        }
         if (indexPath.row == [container.metadata count]) {
             cell.textLabel.text = @"Add Metadata";
             cell.detailTextLabel.text = @"";
             cell.textLabel.text = metadataKeyCellText;
             cell.detailTextLabel.text = metadataValueCellText;
         }
-    } else if (indexPath.section == kPolicy) {
+    } else if (indexPath.section == policySection) {
         cell.selectionStyle = UITableViewCellSelectionStyleBlue;
         if (indexPath.row == 0) {
             cell.textLabel.text = @"Versioning";
             cell.detailTextLabel.text = container.versioning;
             cell.accessoryType = UITableViewCellAccessoryNone;
-            cell.selectionStyle = UITableViewCellEditingStyleNone;
+            cell.selectionStyle = UITableViewCellSelectionStyleNone;
         }
         else if (indexPath.row == 1) {
             cell.textLabel.text = @"Quota";
             cell.detailTextLabel.text = [NSString stringWithFormat:@"%u", container.quota];
             cell.accessoryType = UITableViewCellAccessoryNone;
-            cell.selectionStyle = UITableViewCellEditingStyleNone;
+            cell.selectionStyle = UITableViewCellSelectionStyleNone;
         }
         else {
             cell.textLabel.text = @"Edit policy";
         vc.account = account;
         vc.container = container;
         vc.object = object;
+        vc.objectIsContainer = YES;
         
         [self.navigationController pushViewController:vc animated:YES];
         [vc release];
-    } else if (indexPath.section == kPolicy) {
+    } else if (indexPath.section == policySection) {
         if (indexPath.row == 2) {
             EditPolicyViewController *vc = [[EditPolicyViewController alloc] initWithNibName:@"EditPolicyViewController" bundle:nil];
     
     } else {
         [self.containersViewController.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:selectedContainerIndexPath] withRowAnimation:UITableViewRowAnimationLeft];
     }
+    [self.rootFolderViewController.navigationController popViewControllerAnimated:YES];
 }
 
 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
         if (buttonIndex == 0) {
          
             NSString *activityMessage = @"Deleting container...";
+            [activityIndicatorView release];
             activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
-            [activityIndicatorView addToView:self.view scrollOffset:self.tableView.contentOffset.y];    
+            [activityIndicatorView addToView:self.view scrollOffset:self.tableView.contentOffset.y];  
             
-            [self.account.manager deleteContainer:self.container];
-            
-            successObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"deleteContainerSucceeded" object:self.container
-                                                                                 queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
-            {
-                [activityIndicatorView removeFromSuperviewAndRelease];
-
+            [[self.account.manager deleteContainer:self.container] success:^(OpenStackRequest *request) {
+                
+                [activityIndicatorView removeFromSuperview];                
                 [self.account.containers removeObjectForKey:self.container.name];
                 [self.account persist];
+                if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
+                    [self.containersViewController.navigationController popViewControllerAnimated:YES];
+                else
+                    [self.navigationController popViewControllerAnimated:YES];
                 
+                [self deleteContainerRow];
+
                 
-                if ([self.account.containers count] == 0 && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
-                    // on ipad, delete needs to get rid of the container on the main view
-                    self.container = nil;
-                    [self setBackgroundView];
-                    [self.tableView reloadData];
+            } failure:^(OpenStackRequest *request) {
+                
+                // 404 Not Found means it's not there, so we can show the user that it's deleted
+                if ([request responseStatusCode] == 404) {
+                    [self.account.containers removeObjectForKey:container.name];
+                    [self.account persist];
+                    
                 } else {
-                    [self.navigationController popViewControllerAnimated:YES];
+                    [activityIndicatorView removeFromSuperview];
+                    [self alert:@"There was a problem deleting this container." request:request];
                 }
-                
-                [self.containersViewController.tableView selectRowAtIndexPath:selectedContainerIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
-                [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(deleteContainerRow) userInfo:nil repeats:NO];
-                
-                [[NSNotificationCenter defaultCenter] removeObserver:successObserver];
             }];
-            
-            failureObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"deleteContainerFailed" object:self.container
-                                                                                 queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
-            {
-                [activityIndicatorView removeFromSuperviewAndRelease];
-                [self alert:@"There was a problem deleting this container." request:[notification.userInfo objectForKey:@"request"]];
-                [[NSNotificationCenter defaultCenter] removeObserver:failureObserver];
-            }];
-            
+                        
         }
-        
         [self.tableView deselectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:deleteSection] animated:YES];
     }
 }
     [deleteActionSheet release];
     [containersViewController release];
     [selectedContainerIndexPath release];
+    [rootFolderViewController release];
+    [activityIndicatorView release];
     [super dealloc];
 }
 
+#pragma mark -
+#pragma mark Helper functions
+
+- (void)reloadMetadataSection {
+    NSString *activityMessage = @"Loading metadata...";
+    [activityIndicatorView release];
+    activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
+    [activityIndicatorView addToView:self.view scrollOffset:self.tableView.contentOffset.y]; 
+    [[self.account.manager getContainerInfo:container] 
+     success:^(OpenStackRequest *request) {
+         [activityIndicatorView removeFromSuperview];
+         container.metadata = [NSMutableDictionary dictionary];
+         for (NSString *header in request.responseHeaders) {
+             NSString *metadataKey;
+             NSString *metadataValue;
+             if ([header rangeOfString:@"X-Container-Meta-"].location != NSNotFound) {
+                 metadataKey = [NSString decodeFromPercentEscape:[header substringFromIndex:17]];
+                 metadataValue = [NSString decodeFromPercentEscape:[request.responseHeaders objectForKey:header]];
+                 [container.metadata setObject:metadataValue forKey:metadataKey];
+             }
+         } 
+         NSIndexSet *metadataSections = [NSIndexSet indexSetWithIndex:kMetadata];
+         [self.tableView reloadSections:metadataSections withRowAnimation:UITableViewRowAnimationFade];
+     }
+     failure:^(OpenStackRequest *request) {
+         [activityIndicatorView removeFromSuperview];
+         [self alert:@"There was a problem retrieving the container's metadata." request:request]; 
+     }];
+}
+
 @end