#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
@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