Statistics
| Branch: | Tag: | Revision:

root / Classes / EditPermissionsViewController.m @ 3a8071d4

History | View | Annotate | Download (19.3 kB)

1
//
2
//  EditPermissionsViewController.m
3
//  pithos-ios
4
//
5
// Copyright 2011 GRNET S.A. All rights reserved.
6
//
7
// Redistribution and use in source and binary forms, with or
8
// without modification, are permitted provided that the following
9
// conditions are met:
10
// 
11
//   1. Redistributions of source code must retain the above
12
//      copyright notice, this list of conditions and the following
13
//      disclaimer.
14
// 
15
//   2. Redistributions in binary form must reproduce the above
16
//      copyright notice, this list of conditions and the following
17
//      disclaimer in the documentation and/or other materials
18
//      provided with the distribution.
19
// 
20
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
21
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
24
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
27
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
// POSSIBILITY OF SUCH DAMAGE.
32
// 
33
// The views and conclusions contained in the software and
34
// documentation are those of the authors and should not be
35
// interpreted as representing official policies, either expressed
36
// or implied, of GRNET S.A.
37

    
38
#import "EditPermissionsViewController.h"
39
#import "AccountManager.h"
40
#import "UIViewController+Conveniences.h"
41
#import "FolderViewController.h"
42
#import "Folder.h"
43
#import "PithosUtilities.h"
44
#import "APICallback.h"
45

    
46
#define kUser 0
47
#define kPermissions 1
48
#define kSavePermissions 2
49
#define kRemovePermissions 3
50

    
51
@implementation EditPermissionsViewController
52

    
53
@synthesize account, container, object;
54
@synthesize user, readPermissionSelected, writePermissionSelected, permissions;
55
@synthesize oldPermissionsString;
56
@synthesize newPermissionsEntry, removePermissionsEnabled;
57
@synthesize folderViewController, objectIsFolder;
58

    
59
- (void)dealloc
60
{
61
    [account release];
62
    [container release];
63
    [object release];
64
    [user release];
65
    [permissions release];
66
    [oldPermissionsString release];
67
    [activityIndicatorView release];
68
    [super dealloc];
69
}
70

    
71
- (void)didReceiveMemoryWarning
72
{
73
    // Releases the view if it doesn't have a superview.
74
    [super didReceiveMemoryWarning];
75
    
76
    // Release any cached data, images, etc that aren't in use.
77
}
78

    
79
#pragma mark - View lifecycle
80

    
81
- (void)viewDidLoad
82
{
83
    [super viewDidLoad];
84
}
85

    
86
- (void)viewDidUnload
87
{
88
    [super viewDidUnload];
89
}
90

    
91
- (void)viewWillAppear:(BOOL)animated
92
{
93
    [super viewWillAppear:animated];
94
}
95

    
96
- (void)viewDidAppear:(BOOL)animated
97
{
98
    [super viewDidAppear:animated];
99
}
100

    
101
- (void)viewWillDisappear:(BOOL)animated
102
{
103
    [super viewWillDisappear:animated];
104
}
105

    
106
- (void)viewDidDisappear:(BOOL)animated
107
{
108
    [super viewDidDisappear:animated];
109
}
110

    
111
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
112
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
113
}
114

    
115
#pragma mark - Table view data source
116

    
117
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
118
{
119
    if (removePermissionsEnabled)
120
        return 4;
121
    else 
122
        return 3;
123
}
124

    
125
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
126
{
127
    if (section == kPermissions)
128
        return 2;
129
    else
130
        return 1;
131
}
132

    
133
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
134
{
135
    static NSString *CellIdentifier = @"Cell";
136
    
137
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
138
    if (cell == nil) {
139
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
140
    }
141
    
142
    if (indexPath.section == kUser) {
143
        UITextField *textField = nil;
144
        for (id subView in cell.contentView.subviews) {
145
            if ([subView isKindOfClass:[UITextField class]]) {
146
                textField = (UITextField *)subView;
147
            }
148
        }
149
        
150
        if (textField == nil) {
151
            CGRect bounds = [cell.contentView bounds];
152
            CGRect rect = CGRectInset(bounds, 10.0, 10.0);                        
153
            textField = [[UITextField alloc] initWithFrame:rect];
154
            [textField setFrame:rect];
155
        }
156
        
157
        [textField setClearButtonMode:UITextFieldViewModeWhileEditing];
158
        [textField setBackgroundColor:[UIColor clearColor]];
159
        [textField setOpaque:YES];
160
        [textField setAutocorrectionType:UITextAutocorrectionTypeNo];
161
        [textField setAutocapitalizationType:UITextAutocapitalizationTypeNone];
162
        [textField setDelegate:self];
163
        textField.placeholder = @"User";
164
        textField.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
165
        textField.text = self.user;
166
        
167
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
168
        [cell.contentView addSubview:textField];
169
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
170
    }
171
    else if (indexPath.section == kPermissions) {
172
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
173
        if (indexPath.row == 0) {
174
            cell.textLabel.text = @"Read";
175
            if (readPermissionSelected)
176
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
177
            else
178
                cell.accessoryType = UITableViewCellAccessoryNone;
179
        }
180
        else {
181
            cell.textLabel.text = @"Write";
182
            if (writePermissionSelected)
183
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
184
            else
185
                cell.accessoryType = UITableViewCellAccessoryNone;
186
        }
187
    } 
188
    else if (indexPath.section == kSavePermissions) {
189
        cell.textLabel.text = @"Save";
190
        cell.accessoryType = UITableViewCellAccessoryNone;
191
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
192
    }
193
    else if (indexPath.section == kRemovePermissions) {
194
        cell.textLabel.text = @"Remove";
195
        cell.accessoryType = UITableViewCellAccessoryNone;
196
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
197
    }
198
    
199
    return cell;
200
}
201

    
202
#pragma mark - Table view delegate
203

    
204
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
205
{    
206
    
207
    if (indexPath.section != kUser)
208
        [self.view endEditing:YES];
209
    
210
    NSString *newUserName;
211
    NSIndexPath *userCellIndexPath = [NSIndexPath indexPathForRow:0 inSection:kUser];
212
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:userCellIndexPath];
213
    UITextField *textField = [[cell.contentView subviews] objectAtIndex:0];
214
    newUserName = textField.text;
215
    if (![self userInputIsValid:newUserName]) {
216
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
217
        return;
218
    }
219
    
220
    if (indexPath.section == kPermissions) {
221
        UITableViewCell *readPermissionsCell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:kPermissions]];
222
        UITableViewCell *writePermissionsCell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:kPermissions]];
223

    
224
        if (indexPath.row == 0) {
225
            if (!readPermissionSelected) {
226
                readPermissionSelected = YES;
227
                if (writePermissionSelected) {
228
                    writePermissionSelected = FALSE;
229
                    writePermissionsCell.accessoryType = UITableViewCellAccessoryNone;
230
                }
231
                readPermissionsCell.accessoryType = UITableViewCellAccessoryCheckmark;
232
            }
233
        }
234
        else if (indexPath.row == 1) {
235
            if (!writePermissionSelected) {
236
                writePermissionSelected = YES;
237
                if (readPermissionSelected) {
238
                    readPermissionSelected = FALSE;
239
                    readPermissionsCell.accessoryType = UITableViewCellAccessoryNone;
240
                }
241
                writePermissionsCell.accessoryType = UITableViewCellAccessoryCheckmark;
242
            }
243
        }
244
    }
245
    else if (indexPath.section == kSavePermissions) {
246
        if (!readPermissionSelected && !writePermissionSelected) {
247
            [self alert:@"Cannot save permissions"  message:@"Please select permissions type"];
248
            [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
249
            return;
250
        }
251
        
252
        [self.permissions removeObjectForKey:self.user];
253
        if (readPermissionSelected) 
254
            [self.permissions setObject:@"read" forKey:newUserName];
255
        else if (writePermissionSelected)
256
            [self.permissions setObject:@"write" forKey:newUserName];
257
        
258
        self.user = newUserName;
259
        self.oldPermissionsString = object.sharing;
260
        object.sharing = [self buildPermissionsString];
261
        
262
        if (objectIsFolder && ![PithosUtilities isContentTypeDirectory:object.contentType]) {
263
            if (((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) &&
264
                [folderViewController.parentFolderViewController.folder.objects objectForKey:object.name]) || 
265
                ((UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) &&
266
                 [folderViewController.folder.objects objectForKey:object.name])) {
267
                NSString *alertMessage = [NSString stringWithFormat:@"In order to apply the changes in '%@', the object at the same path must be replaced. Continue?",object.name];
268
                NSString *alertTitle = @"Apply changes";
269
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:alertTitle
270
                                                                message:alertMessage
271
                                                               delegate:self
272
                                                      cancelButtonTitle:@"Cancel"
273
                                                      otherButtonTitles:@"OK", nil];
274
                [alert show];
275
                [alert release];
276
                return;
277
            } else {
278
                NSString *activityMessage = @"Applying permissions...";
279
                [activityIndicatorView release];
280
                activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
281
                [activityIndicatorView addToView:self.view];
282
                
283
                object.name = object.fullPath;
284
                object.contentType = @"application/directory";
285
                object.data = [NSData data];
286
                [self createNewFolder];  
287
                return;
288
            }
289
        }
290
        
291
        NSString *activityMessage = @"Applying permissions...";
292
        [activityIndicatorView release];
293
        activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
294
        
295
        [activityIndicatorView addToView:self.view];
296
        [[self.account.manager writeObjectMetadata:container object:object] 
297
         success:^(OpenStackRequest *request) {
298
             [activityIndicatorView removeFromSuperview];
299
             [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
300
             removePermissionsEnabled = YES;
301
             [self.tableView reloadData];
302
             if (objectIsFolder || (account.shared && ![oldPermissionsString isEqualToString:object.sharing])) {
303
                 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
304
                     [self.folderViewController refreshButtonPressed:nil];
305
                 }
306
                 else {
307
                     self.folderViewController.needsRefreshing = YES;
308
                 }
309
             } 
310
         }
311
         failure:^(OpenStackRequest *request) {
312
             object.sharing = self.oldPermissionsString;
313
             readPermissionSelected = !readPermissionSelected;
314
             writePermissionSelected = !writePermissionSelected;
315
             
316
             if (readPermissionSelected)
317
                 [self.permissions setObject:@"read" forKey:user];
318
             else if (writePermissionSelected) 
319
                 [self.permissions setObject:@"write" forKey:user];
320
             
321
             [activityIndicatorView removeFromSuperview];
322
             [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
323
             [self.tableView reloadData];
324
             [self alert:@"There was a problem applying the permissions." request:request];
325
         }];
326
    } 
327
    else if (indexPath.section == kRemovePermissions) {
328
        NSString *activityMessage = @"Removing permissions...";   
329
        [activityIndicatorView release];
330
        activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
331
        [activityIndicatorView addToView:self.view];
332
        
333
        [permissions removeObjectForKey:user];
334
        self.oldPermissionsString = object.sharing;
335
        object.sharing = [self buildPermissionsString];
336
        [[self.account.manager writeObjectMetadata:container object:object] 
337
         success:^(OpenStackRequest *request) {
338
             self.user = @"";
339
             self.readPermissionSelected = FALSE;
340
             self.writePermissionSelected = FALSE;
341
             removePermissionsEnabled = NO;
342
             [self.tableView reloadData];
343
             [activityIndicatorView removeFromSuperview];
344
             [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
345
             if (objectIsFolder || (account.shared && ![oldPermissionsString isEqualToString:object.sharing])) {
346
                 self.folderViewController.needsRefreshing = YES;
347
                 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
348
                     [self.folderViewController refreshButtonPressed:nil];
349
                 else
350
                     self.folderViewController.refreshWhenAppeared = YES;
351
             }
352
         }
353
         failure:^(OpenStackRequest *request) {
354
             object.sharing = self.oldPermissionsString;
355
             if (readPermissionSelected)
356
                 [self.permissions setObject:@"read" forKey:user];
357
             else if (writePermissionSelected) 
358
                 [self.permissions setObject:@"write" forKey:user];
359
             
360
             [activityIndicatorView removeFromSuperview];
361
             [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
362
             [self.tableView reloadData];
363
             [self alert:@"There was a problem removing the permissions." request:request];
364
         }];
365
    }
366
}
367

    
368
#pragma mark - Textfield delegate
369

    
370

    
371
- (BOOL)textFieldShouldReturn:(UITextField *)textField
372
{
373
    [self userInputIsValid:textField.text];
374
    [textField resignFirstResponder];
375
    
376
    return YES;
377
}
378

    
379
#pragma mark - Alertview delegate
380

    
381
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
382
{
383
    if (buttonIndex == 1) {
384
        NSString *activityMessage = @"Applying permissions...";
385
        [activityIndicatorView release];
386
        activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
387
        [activityIndicatorView addToView:self.view];
388
        
389
        object.name = object.fullPath;
390
        object.contentType = @"application/directory";
391
        object.data = [NSData data];
392
        [self createNewFolder];
393
    } else {
394
        [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
395
    }
396
}
397

    
398
- (void)createNewFolder {
399
    [[self.account.manager writeObject:self.container object:object downloadProgressDelegate:nil]
400
     success:^(OpenStackRequest *request) {
401
         Folder *newFolder = [[Folder alloc] init];
402
         newFolder.name = [[object.name componentsSeparatedByString:@"/"] lastObject];
403
         newFolder.parent = folderViewController.folder;
404
         newFolder.sharing = folderViewController.folder.sharing;
405
         [folderViewController.folder.folders setObject:newFolder forKey:newFolder.name];
406
         [activityIndicatorView removeFromSuperview];
407
         [newFolder release];
408
         [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
409
         removePermissionsEnabled = YES;
410
         [self.tableView reloadData];
411
         if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
412
             [self.folderViewController refreshButtonPressed:nil];
413
         }
414
         else {
415
             self.folderViewController.needsRefreshing = YES;
416
             self.folderViewController.refreshWhenAppeared = YES;
417
         }            
418
     }
419
     failure:^(OpenStackRequest *request) {
420
         object.sharing = self.oldPermissionsString;
421
         readPermissionSelected = !readPermissionSelected;
422
         writePermissionSelected = !writePermissionSelected;
423
         
424
         if (readPermissionSelected)
425
             [self.permissions setObject:@"read" forKey:user];
426
         else if (writePermissionSelected) 
427
             [self.permissions setObject:@"write" forKey:user];
428
         
429
         [activityIndicatorView removeFromSuperview];
430
         [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
431
         [self.tableView reloadData];
432
         [self alert:@"There was a problem applying the permissions." request:request];                                    
433
     }];
434
}
435

    
436
#pragma mark - helper methods
437

    
438
- (NSString *)buildPermissionsString
439
{
440
    NSString *readPermissionsString = @"";
441
    NSString *writePermissionsString = @"";
442
    
443
    for (NSString *aUser in [permissions allKeys]) {
444
        if ([[permissions objectForKey:aUser] isEqual:@"read"]) {
445
            if ([readPermissionsString length] == 0)
446
                readPermissionsString = [NSString stringWithFormat:@"read=%@", aUser];
447
            else
448
                readPermissionsString = [NSString stringWithFormat:@"%@,%@", readPermissionsString ,aUser];
449
        }
450
        else if ([[permissions objectForKey:aUser] isEqual:@"write"]) {
451
            if ([writePermissionsString length] == 0)
452
                writePermissionsString = [NSString stringWithFormat:@"write=%@", aUser];
453
            else
454
                writePermissionsString = [NSString stringWithFormat:@"%@,%@", writePermissionsString, aUser];
455
        }
456
    }
457
    
458
    if ([writePermissionsString length] == 0)
459
        return readPermissionsString;
460
    else if ([readPermissionsString length] == 0)
461
        return writePermissionsString;
462
    else return [NSString stringWithFormat:@"%@;%@", readPermissionsString, writePermissionsString];
463
}
464

    
465
- (BOOL) userInputIsValid: (NSString *) input
466
{
467
    if ([input length] == 0
468
        || [[input stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0
469
        ) {
470
        [self alert:@"Invalid input" message:@"User name cannot be empty"];
471
        return NO;
472
    }
473
    else {
474
        NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"=,;"];
475
        if ([input rangeOfCharacterFromSet:set].location != NSNotFound) {
476
            [self alert:@"Invalid input" message:@"User name cannot contain '=', ',' or ';'"];
477
            return NO;
478
        }
479
        else {
480
            return YES;
481
        }
482
    }
483
    
484
    return YES;
485
}
486

    
487

    
488
@end