X-Git-Url: https://code.grnet.gr/git/pithos-ios/blobdiff_plain/221c21061e973bcf061e0bd42c97b42ff5f78a3b..3a8071d414ae0ceea07ca1240cc10fea09b75cf4:/Classes/FolderDetailViewController.m diff --git a/Classes/FolderDetailViewController.m b/Classes/FolderDetailViewController.m index fa3be0e..a0271c2 100644 --- a/Classes/FolderDetailViewController.m +++ b/Classes/FolderDetailViewController.m @@ -37,29 +37,35 @@ #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]; } @@ -76,6 +82,35 @@ - (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 @@ -86,18 +121,21 @@ - (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 @@ -113,15 +151,25 @@ - (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 { @@ -131,12 +179,13 @@ } 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) { @@ -193,8 +242,15 @@ 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"; @@ -216,6 +272,27 @@ 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; @@ -243,21 +320,83 @@ 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