#import "FolderDetailViewController.h"
#import "EditMetadataViewController.h"
+#import "EditPermissionsViewController.h"
+#import "StorageObject.h"
+#import "APICallback.h"
+#import "AccountManager.h"
+#import "UIViewController+Conveniences.h"
+#import "NSString+Conveniences.h"
#define kOverview 0
#define kMetadata 1
+#define kPermissions 2
#define maxMetadataViewableLength 12
@implementation FolderDetailViewController
-@synthesize account, container, folder;
+@synthesize account, container, folder, folderViewController;
-- (id)initWithStyle:(UITableViewStyle)style
-{
- self = [super initWithStyle:style];
- if (self) {
- // Custom initialization
- }
- return self;
-}
+#pragma mark -
+#pragma mark Memory management
- (void)dealloc
{
+ [object release];
+ [account release];
+ [container release];
+ [folderViewController release];
[folder release];
+ [permissions release];
[super dealloc];
}
- (void)viewDidLoad
{
[super viewDidLoad];
+ permissions = [[NSMutableDictionary alloc] init];
+ if (folder.sharing.length > 0) {
+ NSArray *sharingArray = [folder.sharing componentsSeparatedByString:@";"];
+ for (NSString *typeSpecificPermissions in sharingArray) {
+ NSArray *array=[typeSpecificPermissions componentsSeparatedByString:@"="];
+ NSString *permissionsType = [array objectAtIndex:0];
+ if ([permissionsType hasPrefix:@" "])
+ permissionsType = [permissionsType substringFromIndex:1];
+
+ NSArray *users = [[array objectAtIndex:1] componentsSeparatedByString:@","];
+ for (NSString *user in users) {
+ [permissions setObject:permissionsType forKey:user];
+ }
+ }
+ }
+
+ folderIsReadOnly = NO;
+ if (account.sharingAccount) {
+ if ([permissions count] > 0) {
+ folderIsReadOnly = [[permissions objectForKey:[account username]] isEqualToString:@"read"];
+ }
+ }
+
+ object = [[StorageObject alloc] init];
+ object.name = folder.name;
+ object.metadata = folder.metadata;
+ object.fullPath = [folder fullPath];
+ object.sharing = folder.sharing;
+ object.contentType = folder.contentType;
}
- (void)viewDidUnload
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
-
[self.tableView reloadData];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
+ if (folder.metadata == nil) {
+ [self reloadMetadataSection];
+ }
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
+ folder.sharing = object.sharing;
}
- (void)viewDidDisappear:(BOOL)animated
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
- return 2;
+ return 3;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == kOverview)
return 2;
- else
- return 1 + [folder.metadata count];
+ else if (section == kPermissions) {
+ if (account.sharingAccount)
+ return [permissions count];
+ else
+ return 1 + [permissions count];
+ }
+ else if (section == kMetadata)
+ if (folderIsReadOnly)
+ return [folder.metadata count];
+ else
+ return 1 + [folder.metadata count];
+ return 0;
}
- (CGFloat)findLabelHeight:(NSString*)text font:(UIFont *)font {
} else {
textLabelSize = CGSizeMake(221.0, 9000.0f);
}
+
CGSize stringSize = [text sizeWithFont:font constrainedToSize:textLabelSize lineBreakMode:UILineBreakModeCharacterWrap];
return stringSize.height;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
- CGFloat result = tableView.rowHeight;
+ CGFloat result;
if (indexPath.section == kOverview) {
if (indexPath.row == 0) {
cell.detailTextLabel.text = folderFullPathToShow;
}
} else if (indexPath.section == kMetadata) {
- cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
- cell.selectionStyle = UITableViewCellSelectionStyleBlue;
+ if (folderIsReadOnly) {
+ cell.accessoryType = UITableViewCellAccessoryNone;
+ cell.selectionStyle = UITableViewCellSelectionStyleNone;
+ cell.userInteractionEnabled = NO;
+ }
+ else {
+ cell.selectionStyle = UITableViewCellSelectionStyleBlue;
+ cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
+ }
cell.accessoryView = nil;
if (indexPath.row == [folder.metadata count]) {
cell.textLabel.text = @"Add Metadata";
cell.textLabel.text = metadataKeyCellText;
cell.detailTextLabel.text = metadataValueCellText;
}
+ } else if (indexPath.section == kPermissions) {
+ if (account.sharingAccount) {
+ cell.accessoryType = UITableViewCellAccessoryNone;
+ cell.selectionStyle = UITableViewCellSelectionStyleNone;
+ cell.userInteractionEnabled = NO;
+ }
+ else {
+ cell.selectionStyle = UITableViewCellSelectionStyleBlue;
+ cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
+ }
+ cell.accessoryView = nil;
+
+ if (indexPath.row == [permissions count]) {
+ cell.textLabel.text = @"Add Permissions";
+ cell.detailTextLabel.text = @"";
+ }
+ else {
+ NSString *user = [[permissions allKeys] objectAtIndex:indexPath.row];
+ cell.textLabel.text = user;
+ cell.detailTextLabel.text = [permissions objectForKey:user];
+ }
}
return cell;
vc.removeMetadataEnabled = TRUE;
vc.navigationItem.title = @"Edit Metadata";
}
-
- StorageObject *object = [[[StorageObject alloc] init] autorelease];
- object.name = folder.name;
- object.metadata = folder.metadata;
- object.fullPath = [folder fullPath];
-
+
vc.metadataKey = metadataKey;
vc.metadataValue = metadataValue;
vc.account = account;
vc.container = container;
vc.object = object;
+ vc.objectIsFolder = YES;
+ vc.folderViewController = folderViewController;
[self.navigationController pushViewController:vc animated:YES];
[vc release];
- }
+ } else if (indexPath.section == kPermissions) {
+ EditPermissionsViewController *vc = [[EditPermissionsViewController alloc] initWithNibName:@"EditPermissionsViewController" bundle:nil];
+ NSString *user;
+
+ if (indexPath.row == [permissions count]) {
+ user = @"";
+ vc.removePermissionsEnabled = NO;
+ vc.navigationItem.title = @"Add Permissions";
+ }
+ else {
+ user = [[permissions allKeys] objectAtIndex:indexPath.row];
+ NSString *userPermissions = [permissions objectForKey:user];
+ if ([userPermissions rangeOfString:@"read"].location != NSNotFound)
+ vc.readPermissionSelected = YES;
+ else
+ vc.readPermissionSelected = NO;
+
+ if ([userPermissions rangeOfString:@"write"].location != NSNotFound)
+ vc.writePermissionSelected = YES;
+ else
+ vc.writePermissionSelected = NO;
+
+ vc.removePermissionsEnabled = YES;
+ vc.navigationItem.title = @"Edit Permissions";
+ }
+
+ vc.user = user;
+ vc.permissions = permissions;
+ vc.account = account;
+ vc.container = container;
+ vc.object = object;
+ vc.objectIsFolder = YES;
+ vc.folderViewController = folderViewController;
+ [self.navigationController pushViewController:vc animated:YES];
+ [vc release];
+ }
+}
+
+#pragma mark -
+#pragma mark Helper functions
+
+- (void)reloadMetadataSection {
+ NSString *activityMessage = @"Loading metadata...";
+ ActivityIndicatorView *activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
+ [activityIndicatorView addToView:self.view];
+ [[self.account.manager getObjectInfo:container object:object version:nil]
+ success:^(OpenStackRequest *request) {
+ [activityIndicatorView removeFromSuperviewAndRelease];
+ folder.metadata = [NSMutableDictionary dictionary];
+ for (NSString *header in request.responseHeaders) {
+ NSString *metadataKey;
+ NSString *metadataValue;
+ if ([header rangeOfString:@"X-Object-Meta-"].location != NSNotFound) {
+ metadataKey = [NSString decodeFromPercentEscape:[header substringFromIndex:14]];
+ metadataValue = [NSString decodeFromPercentEscape:[request.responseHeaders objectForKey:header]];
+ [folder.metadata setObject:metadataValue forKey:metadataKey];
+ }
+ }
+ object.metadata = folder.metadata;
+ NSIndexSet *metadataSections = [NSIndexSet indexSetWithIndex:kMetadata];
+ [self.tableView reloadSections:metadataSections withRowAnimation:UITableViewRowAnimationFade];
+ }
+ failure:^(OpenStackRequest *request) {
+ [activityIndicatorView removeFromSuperviewAndRelease];
+ [self alert:@"There was a problem retrieving the object's metadata." request:request];
+ }];
}
@end