Fix bugs. Show version in settings. Update icons. Update version.
[pithos-ios] / Classes / FolderDetailViewController.m
index fa3be0e..a0271c2 100644 (file)
 
 #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