Statistics
| Branch: | Tag: | Revision:

root / Classes / StorageObjectViewController.m @ c2940e36

History | View | Annotate | Download (36.9 kB)

1 700184fb Miltiadis Vasilakis
//
2 700184fb Miltiadis Vasilakis
//  StorageObjectViewController.m
3 700184fb Miltiadis Vasilakis
//  OpenStack
4 700184fb Miltiadis Vasilakis
//
5 700184fb Miltiadis Vasilakis
//  Created by Mike Mayo on 12/19/10.
6 700184fb Miltiadis Vasilakis
//  The OpenStack project is provided under the Apache 2.0 license.
7 700184fb Miltiadis Vasilakis
//
8 700184fb Miltiadis Vasilakis
9 700184fb Miltiadis Vasilakis
#import "StorageObjectViewController.h"
10 700184fb Miltiadis Vasilakis
#import "OpenStackAccount.h"
11 623869ee Miltiadis Vasilakis
#import "OpenStackRequest.h"
12 700184fb Miltiadis Vasilakis
#import "Container.h"
13 700184fb Miltiadis Vasilakis
#import "Folder.h"
14 700184fb Miltiadis Vasilakis
#import "StorageObject.h"
15 700184fb Miltiadis Vasilakis
#import "AccountManager.h"
16 700184fb Miltiadis Vasilakis
#import "AnimatedProgressView.h"
17 700184fb Miltiadis Vasilakis
#import "UIViewController+Conveniences.h"
18 700184fb Miltiadis Vasilakis
#import "MediaViewController.h"
19 700184fb Miltiadis Vasilakis
#import "FolderViewController.h"
20 700184fb Miltiadis Vasilakis
#import "UIColor+MoreColors.h"
21 700184fb Miltiadis Vasilakis
#import "OpenStackAppDelegate.h"
22 38d59b6c Miltiadis Vasilakis
#import "EditMetadataViewController.h"
23 623869ee Miltiadis Vasilakis
#import "Provider.h"
24 91869be8 Miltiadis Vasilakis
#import "EditPermissionsViewController.h"
25 221c2106 Miltiadis Vasilakis
#import "TextViewCell.h"
26 45f2fce6 Miltiadis Vasilakis
#import "NSString+Conveniences.h"
27 7db1712d Miltiadis Vasilakis
#import "APICallback.h"
28 64929bae Miltiadis Vasilakis
#import "ObjectVersionsViewController.h"
29 60731366 Miltiadis Vasilakis
#import <MediaPlayer/MPMoviePlayerController.h>
30 60731366 Miltiadis Vasilakis
#import <MessageUI/MessageUI.h>
31 60731366 Miltiadis Vasilakis
#import "ActivityIndicatorView.h"
32 700184fb Miltiadis Vasilakis
33 700184fb Miltiadis Vasilakis
#define kDetails 0
34 cacaa443 Miltiadis Vasilakis
#define kActions 1
35 4b4b833e Miltiadis Vasilakis
#define kMetadata 2
36 38d59b6c Miltiadis Vasilakis
37 38d59b6c Miltiadis Vasilakis
#define maxMetadataViewableLength 12
38 38d59b6c Miltiadis Vasilakis
39 700184fb Miltiadis Vasilakis
// TODO: use etag to reset download
40 700184fb Miltiadis Vasilakis
// TODO: try downloading directly to the file to save memory.  don't use object.data
41 700184fb Miltiadis Vasilakis
42 700184fb Miltiadis Vasilakis
/*
43 cacaa443 Miltiadis Vasilakis
Name                            whatever.txt
44 cacaa443 Miltiadis Vasilakis
Full Path                       folder/whatever.txt
45 cacaa443 Miltiadis Vasilakis
Size                            123 KB
46 cacaa443 Miltiadis Vasilakis
Type                            text/plain
47 cacaa443 Miltiadis Vasilakis
Last Modified                   2012-12-21 11:11:00
48 cacaa443 Miltiadis Vasilakis
49 814a8d8f Miltiadis Vasilakis
if fileDownloaded:
50 814a8d8f Miltiadis Vasilakis
 Open File
51 814a8d8f Miltiadis Vasilakis
 Mail File
52 814a8d8f Miltiadis Vasilakis
 Delete from Cache
53 814a8d8f Miltiadis Vasilakis
else if fileDownloading:
54 814a8d8f Miltiadis Vasilakis
 Open File (disabled)
55 814a8d8f Miltiadis Vasilakis
 Mail File (disabled)
56 814a8d8f Miltiadis Vasilakis
 Downloading (progress view)
57 814a8d8f Miltiadis Vasilakis
 Cancel
58 814a8d8f Miltiadis Vasilakis
else:
59 814a8d8f Miltiadis Vasilakis
 Open File
60 814a8d8f Miltiadis Vasilakis
 Mail File
61 cacaa443 Miltiadis Vasilakis
62 cacaa443 Miltiadis Vasilakis
Metadata
63 cacaa443 Miltiadis Vasilakis
Key                             Value -> tap goes to a metadata item VC to edit or delete
64 cacaa443 Miltiadis Vasilakis
Key                             Value
65 cacaa443 Miltiadis Vasilakis
Add Metadata... (if max not already reached)
66 cacaa443 Miltiadis Vasilakis
67 cacaa443 Miltiadis Vasilakis
Public URL                      On/Off
68 cacaa443 Miltiadis Vasilakis
69 cacaa443 Miltiadis Vasilakis
Share
70 700184fb Miltiadis Vasilakis
 
71 cacaa443 Miltiadis Vasilakis
Versions
72 700184fb Miltiadis Vasilakis
 
73 cacaa443 Miltiadis Vasilakis
Delete Object
74 cacaa443 Miltiadis Vasilakis
*/
75 700184fb Miltiadis Vasilakis
76 700184fb Miltiadis Vasilakis
@implementation StorageObjectViewController
77 700184fb Miltiadis Vasilakis
78 cacaa443 Miltiadis Vasilakis
@synthesize account, container, folder, object, folderViewController;
79 b45fc7f8 Miltiadis Vasilakis
@synthesize oldPublicURI, permissions, documentInteractionController, objectIsReadOnly, versionID;
80 700184fb Miltiadis Vasilakis
81 cacaa443 Miltiadis Vasilakis
#pragma mark - View lifecycle
82 cacaa443 Miltiadis Vasilakis
83 700184fb Miltiadis Vasilakis
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
84 689de104 Miltiadis Vasilakis
    return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
85 700184fb Miltiadis Vasilakis
}
86 700184fb Miltiadis Vasilakis
87 700184fb Miltiadis Vasilakis
- (void)viewDidLoad {
88 700184fb Miltiadis Vasilakis
    [super viewDidLoad];
89 cacaa443 Miltiadis Vasilakis
    
90 623869ee Miltiadis Vasilakis
    objectIsPublicSwitch = [[UISwitch alloc] init];
91 623869ee Miltiadis Vasilakis
    [objectIsPublicSwitch addTarget:self action:@selector(objectIsPublicSwitchChanged:) forControlEvents:UIControlEventValueChanged];
92 623869ee Miltiadis Vasilakis
    
93 b45fc7f8 Miltiadis Vasilakis
    self.permissions = [object permissions];
94 d17a05de Miltiadis Vasilakis
    objectIsReadOnly = NO;
95 d17a05de Miltiadis Vasilakis
    if (account.sharingAccount) { 
96 b45fc7f8 Miltiadis Vasilakis
        if (permissions.count) {
97 b45fc7f8 Miltiadis Vasilakis
            objectIsReadOnly = ![[permissions objectForKey:account.username] isEqualToString:@"write"];
98 d17a05de Miltiadis Vasilakis
        }
99 d17a05de Miltiadis Vasilakis
        objectIsPublicSwitch.enabled = NO;
100 d17a05de Miltiadis Vasilakis
    }
101 64929bae Miltiadis Vasilakis
    
102 64929bae Miltiadis Vasilakis
    downloadProgressView = [[AnimatedProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
103 814a8d8f Miltiadis Vasilakis
    fileDownloading = NO;
104 814a8d8f Miltiadis Vasilakis
    OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
105 814a8d8f Miltiadis Vasilakis
    OpenStackRequest *request = [app objectDownloadRequestForAccount:account container:container object:object];
106 814a8d8f Miltiadis Vasilakis
    if (request) {
107 814a8d8f Miltiadis Vasilakis
        fileDownloading = YES;
108 814a8d8f Miltiadis Vasilakis
        request.downloadProgressDelegate = self;
109 814a8d8f Miltiadis Vasilakis
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationNone];
110 64929bae Miltiadis Vasilakis
    }
111 814a8d8f Miltiadis Vasilakis
    
112 700184fb Miltiadis Vasilakis
}
113 700184fb Miltiadis Vasilakis
114 700184fb Miltiadis Vasilakis
- (void)viewWillAppear:(BOOL)animated {
115 700184fb Miltiadis Vasilakis
    [super viewWillAppear:animated];
116 700184fb Miltiadis Vasilakis
    self.navigationItem.title = object.name;
117 700184fb Miltiadis Vasilakis
    
118 54cb751a Miltiadis Vasilakis
    NSIndexPath *selection = [self.tableView indexPathForSelectedRow];
119 38d59b6c Miltiadis Vasilakis
	if (selection)
120 38d59b6c Miltiadis Vasilakis
		[self.tableView deselectRowAtIndexPath:selection animated:YES];
121 814a8d8f Miltiadis Vasilakis
    
122 689de104 Miltiadis Vasilakis
    OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
123 814a8d8f Miltiadis Vasilakis
    if ([app cacheFilePathForHash:object.hash]) {
124 814a8d8f Miltiadis Vasilakis
        fileDownloaded = YES;
125 64929bae Miltiadis Vasilakis
    } else {
126 64929bae Miltiadis Vasilakis
        fileDownloaded = NO;
127 64929bae Miltiadis Vasilakis
    }
128 700184fb Miltiadis Vasilakis
    
129 689de104 Miltiadis Vasilakis
    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
130 700184fb Miltiadis Vasilakis
        CGRect rect = downloadProgressView.frame;
131 700184fb Miltiadis Vasilakis
        rect.size.width = 440.0;
132 700184fb Miltiadis Vasilakis
        downloadProgressView.frame = rect;
133 700184fb Miltiadis Vasilakis
    }
134 700184fb Miltiadis Vasilakis
    
135 4b4b833e Miltiadis Vasilakis
    publicLinkSection = 3;
136 4b4b833e Miltiadis Vasilakis
    permissionsSection = 4;
137 aa2cf4d7 Miltiadis Vasilakis
    versionsSection = 5;
138 aa2cf4d7 Miltiadis Vasilakis
    deleteSection = 6;
139 700184fb Miltiadis Vasilakis
    
140 64929bae Miltiadis Vasilakis
    if (versionID) {
141 64929bae Miltiadis Vasilakis
        publicLinkSection = -1;
142 64929bae Miltiadis Vasilakis
        permissionsSection = -1;
143 64929bae Miltiadis Vasilakis
        versionsSection = -1;
144 d17a05de Miltiadis Vasilakis
        deleteSection = -1;
145 64929bae Miltiadis Vasilakis
        objectIsReadOnly = YES;
146 d17a05de Miltiadis Vasilakis
    }
147 4b4b833e Miltiadis Vasilakis
    if (account.sharingAccount || account.shared) {
148 4b4b833e Miltiadis Vasilakis
        versionsSection = -1;
149 4b4b833e Miltiadis Vasilakis
        deleteSection = -1;
150 4b4b833e Miltiadis Vasilakis
    }
151 64929bae Miltiadis Vasilakis
    
152 54cb751a Miltiadis Vasilakis
    objectIsPublic = ([object.publicURI length]);
153 623869ee Miltiadis Vasilakis
    objectIsPublicSwitch.on = objectIsPublic;
154 38d59b6c Miltiadis Vasilakis
    [self.tableView reloadData];
155 700184fb Miltiadis Vasilakis
}
156 700184fb Miltiadis Vasilakis
157 54fd5c36 Miltiadis Vasilakis
- (void)viewDidAppear:(BOOL)animated {
158 3e581f16 Miltiadis Vasilakis
    [super viewDidAppear:animated];
159 3e581f16 Miltiadis Vasilakis
    if (!object.metadata) {
160 54fd5c36 Miltiadis Vasilakis
        [self reloadMetadataSection];
161 b45fc7f8 Miltiadis Vasilakis
    } else {
162 b45fc7f8 Miltiadis Vasilakis
        [self updatePermissionsUserCatalog];
163 54fd5c36 Miltiadis Vasilakis
    }
164 814a8d8f Miltiadis Vasilakis
    if (fileDownloading) {
165 814a8d8f Miltiadis Vasilakis
        [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:kActions]
166 814a8d8f Miltiadis Vasilakis
                              atScrollPosition:UITableViewScrollPositionMiddle
167 814a8d8f Miltiadis Vasilakis
                                      animated:YES];
168 814a8d8f Miltiadis Vasilakis
    }
169 54fd5c36 Miltiadis Vasilakis
}
170 54fd5c36 Miltiadis Vasilakis
171 cacaa443 Miltiadis Vasilakis
#pragma mark - Memory management
172 cacaa443 Miltiadis Vasilakis
173 cacaa443 Miltiadis Vasilakis
- (void)dealloc {
174 cacaa443 Miltiadis Vasilakis
    if (fileDownloading) {
175 814a8d8f Miltiadis Vasilakis
        OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
176 814a8d8f Miltiadis Vasilakis
        OpenStackRequest *request = [app objectDownloadRequestForAccount:account container:container object:object];
177 814a8d8f Miltiadis Vasilakis
        request.downloadProgressDelegate = nil;
178 cacaa443 Miltiadis Vasilakis
    }
179 cacaa443 Miltiadis Vasilakis
    [account release];
180 cacaa443 Miltiadis Vasilakis
    [downloadProgressView release];
181 cacaa443 Miltiadis Vasilakis
    [cdnURLActionSheet release];
182 cacaa443 Miltiadis Vasilakis
    [folderViewController release];
183 b45fc7f8 Miltiadis Vasilakis
    [oldPublicURI release];
184 cacaa443 Miltiadis Vasilakis
    [permissions release];
185 b45fc7f8 Miltiadis Vasilakis
    [objectIsPublicSwitch release];
186 cacaa443 Miltiadis Vasilakis
    [documentInteractionController release];
187 cacaa443 Miltiadis Vasilakis
    [versionID release];
188 cacaa443 Miltiadis Vasilakis
    [super dealloc];
189 cacaa443 Miltiadis Vasilakis
}
190 cacaa443 Miltiadis Vasilakis
191 cacaa443 Miltiadis Vasilakis
#pragma mark - Internal
192 cacaa443 Miltiadis Vasilakis
193 cacaa443 Miltiadis Vasilakis
- (void)objectIsPublicSwitchChanged:(id)sender {
194 cacaa443 Miltiadis Vasilakis
    NSString *activityMessage = [NSString stringWithFormat:@"Enabling public link.."];
195 b45fc7f8 Miltiadis Vasilakis
    self.oldPublicURI = object.publicURI;
196 cacaa443 Miltiadis Vasilakis
    
197 cacaa443 Miltiadis Vasilakis
    if (objectIsPublic) {
198 cacaa443 Miltiadis Vasilakis
        activityMessage = [NSString stringWithFormat:@"Disabling public link.."];
199 cacaa443 Miltiadis Vasilakis
        object.publicURI = @"";
200 cacaa443 Miltiadis Vasilakis
    } else {
201 cacaa443 Miltiadis Vasilakis
        object.publicURI = @"TRUE";
202 cacaa443 Miltiadis Vasilakis
    }
203 cacaa443 Miltiadis Vasilakis
    __block ActivityIndicatorView *activityIndicatorView = [ActivityIndicatorView activityIndicatorViewWithText:activityMessage
204 cacaa443 Miltiadis Vasilakis
                                                                                                   andAddToView:self.view
205 cacaa443 Miltiadis Vasilakis
                                                                                                   scrollOffset:self.tableView.contentOffset.y];
206 cacaa443 Miltiadis Vasilakis
    objectIsPublic = !objectIsPublic;
207 cacaa443 Miltiadis Vasilakis
    [[self.account.manager writeObjectMetadata:container object:object]
208 cacaa443 Miltiadis Vasilakis
     success:^(OpenStackRequest *request) {
209 cacaa443 Miltiadis Vasilakis
         NSIndexPath *publicURICellIndexPath = [NSIndexPath indexPathForRow:1 inSection:publicLinkSection];
210 cacaa443 Miltiadis Vasilakis
         if (objectIsPublic) {
211 cacaa443 Miltiadis Vasilakis
             [[self.account.manager getObjectInfo:container object:object version:versionID]
212 cacaa443 Miltiadis Vasilakis
              success:^(OpenStackRequest *request) {
213 c2940e36 Miltiadis Vasilakis
                  [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
214 cacaa443 Miltiadis Vasilakis
                  object.publicURI = [request.responseHeaders objectForKey:@"X-Object-Public"];
215 cacaa443 Miltiadis Vasilakis
                  NSIndexPath *publicURICellIndexPath = [NSIndexPath indexPathForRow:1 inSection:publicLinkSection];
216 cacaa443 Miltiadis Vasilakis
                  [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:publicURICellIndexPath]
217 cacaa443 Miltiadis Vasilakis
                                        withRowAnimation:UITableViewRowAnimationBottom];
218 cacaa443 Miltiadis Vasilakis
              }
219 cacaa443 Miltiadis Vasilakis
              failure:^(OpenStackRequest *request) {
220 c2940e36 Miltiadis Vasilakis
                  [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
221 cacaa443 Miltiadis Vasilakis
                  [self alert:@"There was a problem retrieving the public link from the server." request:request];
222 cacaa443 Miltiadis Vasilakis
              }];
223 cacaa443 Miltiadis Vasilakis
         } else {
224 c2940e36 Miltiadis Vasilakis
             [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
225 cacaa443 Miltiadis Vasilakis
             [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:publicURICellIndexPath]
226 cacaa443 Miltiadis Vasilakis
                                   withRowAnimation:UITableViewRowAnimationTop];
227 cacaa443 Miltiadis Vasilakis
         }
228 cacaa443 Miltiadis Vasilakis
     }
229 cacaa443 Miltiadis Vasilakis
     failure:^(OpenStackRequest *request) {
230 c2940e36 Miltiadis Vasilakis
         [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
231 cacaa443 Miltiadis Vasilakis
         objectIsPublic = !objectIsPublic;
232 cacaa443 Miltiadis Vasilakis
         objectIsPublicSwitch.on = !objectIsPublicSwitch.on;
233 b45fc7f8 Miltiadis Vasilakis
         object.publicURI = oldPublicURI;
234 cacaa443 Miltiadis Vasilakis
         [self alert:@"There was a problem enabling the public link." request:request];
235 cacaa443 Miltiadis Vasilakis
     }];
236 cacaa443 Miltiadis Vasilakis
}
237 cacaa443 Miltiadis Vasilakis
238 814a8d8f Miltiadis Vasilakis
- (void)openFile {
239 814a8d8f Miltiadis Vasilakis
    OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
240 814a8d8f Miltiadis Vasilakis
    NSString *filePath = [app cacheFilePathForHash:object.hash];
241 814a8d8f Miltiadis Vasilakis
    self.documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:[NSURL fileURLWithPath:filePath]];
242 814a8d8f Miltiadis Vasilakis
    self.documentInteractionController.delegate = self;
243 814a8d8f Miltiadis Vasilakis
    self.documentInteractionController.name = object.name;
244 814a8d8f Miltiadis Vasilakis
    
245 814a8d8f Miltiadis Vasilakis
    CGRect frameToPresentMenuFrom;
246 814a8d8f Miltiadis Vasilakis
    if ([[UIDevice currentDevice].systemVersion hasPrefix:@"6"]) {
247 814a8d8f Miltiadis Vasilakis
        frameToPresentMenuFrom = CGRectMake(0.0,
248 814a8d8f Miltiadis Vasilakis
                                            self.tableView.contentOffset.y,
249 814a8d8f Miltiadis Vasilakis
                                            self.view.frame.size.width,
250 814a8d8f Miltiadis Vasilakis
                                            1.0);
251 814a8d8f Miltiadis Vasilakis
    } else {
252 814a8d8f Miltiadis Vasilakis
        UITableViewCell *openFileCell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:kActions]];
253 814a8d8f Miltiadis Vasilakis
        frameToPresentMenuFrom = CGRectMake(openFileCell.frame.origin.x,
254 814a8d8f Miltiadis Vasilakis
                                            openFileCell.frame.origin.y - self.tableView.contentOffset.y,
255 814a8d8f Miltiadis Vasilakis
                                            openFileCell.frame.size.width,
256 814a8d8f Miltiadis Vasilakis
                                            openFileCell.frame.size.height);
257 814a8d8f Miltiadis Vasilakis
    }
258 814a8d8f Miltiadis Vasilakis
    if (![self.documentInteractionController presentOptionsMenuFromRect:frameToPresentMenuFrom inView:self.view animated:YES]) {
259 814a8d8f Miltiadis Vasilakis
        if ([self.object isPlayableMedia]) {
260 814a8d8f Miltiadis Vasilakis
            MediaViewController *vc = [[MediaViewController alloc] initWithNibName:@"MediaViewController" bundle:nil];
261 814a8d8f Miltiadis Vasilakis
            vc.container = self.container;
262 814a8d8f Miltiadis Vasilakis
            vc.object = self.object;
263 814a8d8f Miltiadis Vasilakis
            [self.navigationController pushViewController:vc animated:YES];
264 814a8d8f Miltiadis Vasilakis
            [vc release];
265 814a8d8f Miltiadis Vasilakis
        } else {
266 814a8d8f Miltiadis Vasilakis
            [self alert:@"Error" message:@"This file could not be opened."];
267 814a8d8f Miltiadis Vasilakis
        }
268 814a8d8f Miltiadis Vasilakis
    }
269 814a8d8f Miltiadis Vasilakis
}
270 814a8d8f Miltiadis Vasilakis
271 814a8d8f Miltiadis Vasilakis
- (void)mailFile {
272 814a8d8f Miltiadis Vasilakis
    if (![MFMailComposeViewController canSendMail]) {
273 814a8d8f Miltiadis Vasilakis
        [self alert:@"Cannot send mail" message:@"Your device has not been configured for sending mail"];
274 814a8d8f Miltiadis Vasilakis
    } else {
275 814a8d8f Miltiadis Vasilakis
        OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
276 814a8d8f Miltiadis Vasilakis
        NSString *filePath = [app cacheFilePathForHash:object.hash];
277 814a8d8f Miltiadis Vasilakis
        NSData *data = [NSData dataWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
278 814a8d8f Miltiadis Vasilakis
        
279 814a8d8f Miltiadis Vasilakis
        MFMailComposeViewController *vc = [[MFMailComposeViewController alloc] init];
280 814a8d8f Miltiadis Vasilakis
        vc.mailComposeDelegate = self;
281 814a8d8f Miltiadis Vasilakis
        [vc setSubject:object.name];
282 814a8d8f Miltiadis Vasilakis
        [vc addAttachmentData:data mimeType:object.contentType fileName:object.name];
283 814a8d8f Miltiadis Vasilakis
        [vc setMessageBody:@"" isHTML:NO];
284 814a8d8f Miltiadis Vasilakis
        if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
285 814a8d8f Miltiadis Vasilakis
            vc.modalPresentationStyle = UIModalPresentationPageSheet;
286 814a8d8f Miltiadis Vasilakis
        [self presentModalViewController:vc animated:YES];
287 814a8d8f Miltiadis Vasilakis
        [vc release];
288 814a8d8f Miltiadis Vasilakis
    }
289 814a8d8f Miltiadis Vasilakis
}
290 814a8d8f Miltiadis Vasilakis
291 b45fc7f8 Miltiadis Vasilakis
- (void)updatePermissionsUserCatalog {
292 b45fc7f8 Miltiadis Vasilakis
    NSMutableArray *UUIDs = [NSMutableArray arrayWithCapacity:permissions.count];
293 3e581f16 Miltiadis Vasilakis
    for (NSString *user in permissions) {
294 b45fc7f8 Miltiadis Vasilakis
        NSRange rangeOfColumn = [user rangeOfString:@":"];
295 b45fc7f8 Miltiadis Vasilakis
        NSString *UUID = (rangeOfColumn.location == NSNotFound) ? user : [user substringToIndex:rangeOfColumn.location];
296 b45fc7f8 Miltiadis Vasilakis
        if (![UUID isEqualToString:@"*"]) {
297 b45fc7f8 Miltiadis Vasilakis
            [UUIDs addObject:UUID];
298 b45fc7f8 Miltiadis Vasilakis
        }
299 b45fc7f8 Miltiadis Vasilakis
    }
300 b45fc7f8 Miltiadis Vasilakis
    if (UUIDs.count) {
301 b45fc7f8 Miltiadis Vasilakis
        __block ActivityIndicatorView *activityIndicatorView = [ActivityIndicatorView activityIndicatorViewWithText:@"Loading permissions..."
302 b45fc7f8 Miltiadis Vasilakis
                                                                                                       andAddToView:self.view];
303 b45fc7f8 Miltiadis Vasilakis
        [[self.account.manager userCatalogForDisplaynames:nil UUIDs:UUIDs]
304 b45fc7f8 Miltiadis Vasilakis
         success:^(OpenStackRequest *request) {
305 c2940e36 Miltiadis Vasilakis
             [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
306 b45fc7f8 Miltiadis Vasilakis
             [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:permissionsSection] withRowAnimation:UITableViewRowAnimationNone];
307 b45fc7f8 Miltiadis Vasilakis
         }
308 b45fc7f8 Miltiadis Vasilakis
         failure:^(OpenStackRequest *request) {
309 c2940e36 Miltiadis Vasilakis
             [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
310 3e581f16 Miltiadis Vasilakis
             [self alert:@"Failed to translate sharing UUIDs." request:request];
311 b45fc7f8 Miltiadis Vasilakis
         }];
312 b45fc7f8 Miltiadis Vasilakis
    }
313 b45fc7f8 Miltiadis Vasilakis
}
314 b45fc7f8 Miltiadis Vasilakis
315 cacaa443 Miltiadis Vasilakis
#pragma mark - Actions
316 cacaa443 Miltiadis Vasilakis
317 cacaa443 Miltiadis Vasilakis
- (void)reloadMetadataSection {
318 cacaa443 Miltiadis Vasilakis
    __block ActivityIndicatorView *activityIndicatorView = [ActivityIndicatorView activityIndicatorViewWithText:@"Loading metadata..."
319 cacaa443 Miltiadis Vasilakis
                                                                                                   andAddToView:self.view];
320 cacaa443 Miltiadis Vasilakis
    [[self.account.manager getObjectInfo:container object:object version:versionID]
321 cacaa443 Miltiadis Vasilakis
     success:^(OpenStackRequest *request) {
322 c2940e36 Miltiadis Vasilakis
         [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
323 cacaa443 Miltiadis Vasilakis
         object.metadata = [NSMutableDictionary dictionary];
324 cacaa443 Miltiadis Vasilakis
         for (NSString *header in request.responseHeaders) {
325 cacaa443 Miltiadis Vasilakis
             NSString *metadataKey;
326 cacaa443 Miltiadis Vasilakis
             NSString *metadataValue;
327 cacaa443 Miltiadis Vasilakis
             if ([header rangeOfString:@"X-Object-Meta-"].location != NSNotFound) {
328 cacaa443 Miltiadis Vasilakis
                 metadataKey = [NSString decodeFromPercentEscape:[header substringFromIndex:14]];
329 cacaa443 Miltiadis Vasilakis
                 metadataValue = [NSString decodeFromPercentEscape:[request.responseHeaders objectForKey:header]];
330 cacaa443 Miltiadis Vasilakis
                 [object.metadata setObject:metadataValue forKey:metadataKey];
331 cacaa443 Miltiadis Vasilakis
             }
332 cacaa443 Miltiadis Vasilakis
         }
333 c2940e36 Miltiadis Vasilakis
         [self.tableView reloadData];
334 b45fc7f8 Miltiadis Vasilakis
         [self updatePermissionsUserCatalog];
335 cacaa443 Miltiadis Vasilakis
     }
336 cacaa443 Miltiadis Vasilakis
     failure:^(OpenStackRequest *request) {
337 c2940e36 Miltiadis Vasilakis
         [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
338 cacaa443 Miltiadis Vasilakis
         [self alert:@"There was a problem retrieving the object's metadata." request:request];
339 cacaa443 Miltiadis Vasilakis
     }];
340 cacaa443 Miltiadis Vasilakis
}
341 cacaa443 Miltiadis Vasilakis
342 814a8d8f Miltiadis Vasilakis
- (void)downloadFileForAction:(StorageObjectAction)action {
343 814a8d8f Miltiadis Vasilakis
    if (fileDownloading)
344 814a8d8f Miltiadis Vasilakis
        return;
345 814a8d8f Miltiadis Vasilakis
    fileDownloading = YES;
346 814a8d8f Miltiadis Vasilakis
    [downloadProgressView setProgress:0.0 animated:NO];
347 814a8d8f Miltiadis Vasilakis
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationNone];
348 814a8d8f Miltiadis Vasilakis
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:kActions]
349 814a8d8f Miltiadis Vasilakis
                          atScrollPosition:UITableViewScrollPositionMiddle
350 814a8d8f Miltiadis Vasilakis
                                  animated:YES];
351 814a8d8f Miltiadis Vasilakis
    NSMutableDictionary *requestUserInfo = [NSDictionary dictionaryWithObject:[NSNumber numberWithInteger:action] forKey:@"action"];
352 814a8d8f Miltiadis Vasilakis
    [[self.account.manager getObject:self.container object:self.object downloadProgressDelegate:self requestUserInfo:requestUserInfo version:versionID]
353 814a8d8f Miltiadis Vasilakis
     success:^(OpenStackRequest *request) {
354 814a8d8f Miltiadis Vasilakis
         if (request.isCancelled) {
355 814a8d8f Miltiadis Vasilakis
             fileDownloaded = NO;
356 814a8d8f Miltiadis Vasilakis
             fileDownloading = NO;
357 814a8d8f Miltiadis Vasilakis
             [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationNone];
358 814a8d8f Miltiadis Vasilakis
         } else {
359 814a8d8f Miltiadis Vasilakis
             fileDownloaded = YES;
360 814a8d8f Miltiadis Vasilakis
             fileDownloading = NO;
361 814a8d8f Miltiadis Vasilakis
             if ([self.navigationController.visibleViewController isEqual:self]) {
362 814a8d8f Miltiadis Vasilakis
                 if ([[request.userInfo objectForKey:@"action"] integerValue] == StorageObjectActionMailFile) {
363 814a8d8f Miltiadis Vasilakis
                     [self mailFile];
364 814a8d8f Miltiadis Vasilakis
                 } else {
365 814a8d8f Miltiadis Vasilakis
                     [self openFile];
366 814a8d8f Miltiadis Vasilakis
                 }
367 814a8d8f Miltiadis Vasilakis
             }
368 814a8d8f Miltiadis Vasilakis
             [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationNone];
369 814a8d8f Miltiadis Vasilakis
             [self.folderViewController reloadData];
370 814a8d8f Miltiadis Vasilakis
         }
371 814a8d8f Miltiadis Vasilakis
     }
372 814a8d8f Miltiadis Vasilakis
     failure:^(OpenStackRequest *request) {
373 814a8d8f Miltiadis Vasilakis
         fileDownloaded = NO;
374 814a8d8f Miltiadis Vasilakis
         fileDownloading = NO;
375 814a8d8f Miltiadis Vasilakis
         [self alert:@"File failed to download." request:request];
376 814a8d8f Miltiadis Vasilakis
         [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationNone];
377 814a8d8f Miltiadis Vasilakis
     }];
378 814a8d8f Miltiadis Vasilakis
}
379 814a8d8f Miltiadis Vasilakis
380 cacaa443 Miltiadis Vasilakis
#pragma mark - UITableViewDataSource
381 700184fb Miltiadis Vasilakis
382 700184fb Miltiadis Vasilakis
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
383 6d8123d2 Miltiadis Vasilakis
    int numberOfSections = 7;
384 64929bae Miltiadis Vasilakis
    if (publicLinkSection < 0)
385 64929bae Miltiadis Vasilakis
        numberOfSections--;
386 64929bae Miltiadis Vasilakis
    if (permissionsSection < 0)
387 64929bae Miltiadis Vasilakis
        numberOfSections--;
388 cacaa443 Miltiadis Vasilakis
    if (versionsSection < 0)
389 cacaa443 Miltiadis Vasilakis
        numberOfSections--;
390 cacaa443 Miltiadis Vasilakis
    if (deleteSection < 0)
391 cacaa443 Miltiadis Vasilakis
        numberOfSections--;
392 64929bae Miltiadis Vasilakis
393 64929bae Miltiadis Vasilakis
    return numberOfSections;
394 700184fb Miltiadis Vasilakis
}
395 700184fb Miltiadis Vasilakis
396 700184fb Miltiadis Vasilakis
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
397 700184fb Miltiadis Vasilakis
    if (section == kDetails) {
398 1ab29d03 Miltiadis Vasilakis
        return (object.lastModifiedString ? 5: 4);
399 cacaa443 Miltiadis Vasilakis
    } else if (section == kActions) {
400 814a8d8f Miltiadis Vasilakis
        if (fileDownloaded) {
401 814a8d8f Miltiadis Vasilakis
            return 3;
402 814a8d8f Miltiadis Vasilakis
        } else if (fileDownloading) {
403 814a8d8f Miltiadis Vasilakis
            return 4;
404 814a8d8f Miltiadis Vasilakis
        } else {
405 814a8d8f Miltiadis Vasilakis
            return 2;
406 814a8d8f Miltiadis Vasilakis
        }
407 700184fb Miltiadis Vasilakis
    } else if (section == kMetadata) {
408 64929bae Miltiadis Vasilakis
        if (objectIsReadOnly) {
409 d17a05de Miltiadis Vasilakis
            return [object.metadata count];
410 64929bae Miltiadis Vasilakis
        } else {
411 b45fc7f8 Miltiadis Vasilakis
            return ([object.metadata count] + 1);
412 64929bae Miltiadis Vasilakis
        }
413 64929bae Miltiadis Vasilakis
    } else if (section == publicLinkSection) {
414 b45fc7f8 Miltiadis Vasilakis
        return (objectIsPublic ? 2 : 1);
415 64929bae Miltiadis Vasilakis
    } else if (section == permissionsSection) {
416 60731366 Miltiadis Vasilakis
        if (account.sharingAccount || objectIsReadOnly) {
417 b45fc7f8 Miltiadis Vasilakis
            return permissions.count;
418 60731366 Miltiadis Vasilakis
        } else {
419 b45fc7f8 Miltiadis Vasilakis
            return (permissions.count + 1);
420 60731366 Miltiadis Vasilakis
        }
421 700184fb Miltiadis Vasilakis
    } else {
422 700184fb Miltiadis Vasilakis
        return 1;
423 700184fb Miltiadis Vasilakis
    }
424 700184fb Miltiadis Vasilakis
}
425 700184fb Miltiadis Vasilakis
426 700184fb Miltiadis Vasilakis
- (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
427 700184fb Miltiadis Vasilakis
    CGFloat result = aTableView.rowHeight;
428 cacaa443 Miltiadis Vasilakis
    if ((indexPath.section == kDetails) && ((indexPath.row == 0) || (indexPath.row == 1))) {
429 cacaa443 Miltiadis Vasilakis
        NSString *text;
430 cacaa443 Miltiadis Vasilakis
        if (indexPath.row == 0) {
431 cacaa443 Miltiadis Vasilakis
            text = object.name;
432 192b305e Miltiadis Vasilakis
        } else {
433 cacaa443 Miltiadis Vasilakis
            text = object.fullPath;
434 700184fb Miltiadis Vasilakis
        }
435 cacaa443 Miltiadis Vasilakis
        result = 22.0 + [text sizeWithFont:[UIFont systemFontOfSize:18.0]
436 cacaa443 Miltiadis Vasilakis
                         constrainedToSize:(([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) ?
437 cacaa443 Miltiadis Vasilakis
                                            CGSizeMake(537.0, 9000.0) :
438 cacaa443 Miltiadis Vasilakis
                                            CGSizeMake(221.0, 9000.0))
439 cacaa443 Miltiadis Vasilakis
                             lineBreakMode:UILineBreakModeCharacterWrap].height;
440 cacaa443 Miltiadis Vasilakis
    } else if ((indexPath.section == publicLinkSection) && (indexPath.row == 1)) {
441 c91b5b28 Miltiadis Vasilakis
        NSURL *publicLinkURL = [account.provider.publicLinkURLPrefix URLByAppendingPathComponent:
442 cacaa443 Miltiadis Vasilakis
                                [NSString encodeToPercentEscape:[self.object.publicURI substringFromIndex:1]
443 cacaa443 Miltiadis Vasilakis
                                             charactersToEncode:@"!*'();:@&=+$,?%#[]"]];
444 cacaa443 Miltiadis Vasilakis
        result = 30.0 + [[publicLinkURL description] sizeWithFont:[UIFont systemFontOfSize:18.0]
445 cacaa443 Miltiadis Vasilakis
                                                constrainedToSize:(([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) ?
446 cacaa443 Miltiadis Vasilakis
                                                                   CGSizeMake(596.0, 9000.0) :
447 cacaa443 Miltiadis Vasilakis
                                                                   CGSizeMake(280.0, 9000.0))
448 cacaa443 Miltiadis Vasilakis
                                                    lineBreakMode:UILineBreakModeCharacterWrap].height;
449 700184fb Miltiadis Vasilakis
    }
450 700184fb Miltiadis Vasilakis
    return MAX(aTableView.rowHeight, result);
451 700184fb Miltiadis Vasilakis
}
452 700184fb Miltiadis Vasilakis
453 700184fb Miltiadis Vasilakis
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
454 aa2cf4d7 Miltiadis Vasilakis
    if ((indexPath.section == publicLinkSection) && (indexPath.row == 1)) {
455 aa2cf4d7 Miltiadis Vasilakis
        static NSString *CellIdentifier = @"TextViewCell";
456 aa2cf4d7 Miltiadis Vasilakis
        TextViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];
457 aa2cf4d7 Miltiadis Vasilakis
        if (cell == nil) {
458 aa2cf4d7 Miltiadis Vasilakis
            cell = [[[TextViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
459 aa2cf4d7 Miltiadis Vasilakis
            cell.textView.frame = cell.contentView.frame;
460 45f2fce6 Miltiadis Vasilakis
461 221c2106 Miltiadis Vasilakis
        }
462 aa2cf4d7 Miltiadis Vasilakis
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
463 aa2cf4d7 Miltiadis Vasilakis
        cell.textView.backgroundColor = [UIColor clearColor];
464 aa2cf4d7 Miltiadis Vasilakis
        cell.textView.font = [UIFont systemFontOfSize:15.0];
465 aa2cf4d7 Miltiadis Vasilakis
        cell.textView.dataDetectorTypes = UIDataDetectorTypeLink;
466 c91b5b28 Miltiadis Vasilakis
        cell.textView.text = [[account.provider.publicLinkURLPrefix URLByAppendingPathComponent:
467 cacaa443 Miltiadis Vasilakis
                               [NSString encodeToPercentEscape:[self.object.publicURI substringFromIndex:1]
468 cacaa443 Miltiadis Vasilakis
                                            charactersToEncode:@"!*'();:@&=+$,?%#[]"]] description];
469 aa2cf4d7 Miltiadis Vasilakis
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
470 aa2cf4d7 Miltiadis Vasilakis
        cell.accessoryView = UITableViewCellAccessoryNone;
471 aa2cf4d7 Miltiadis Vasilakis
        return cell;
472 221c2106 Miltiadis Vasilakis
    }
473 700184fb Miltiadis Vasilakis
    
474 aa2cf4d7 Miltiadis Vasilakis
    if (indexPath.section == deleteSection) {
475 aa2cf4d7 Miltiadis Vasilakis
        static NSString *CellIdentifier = @"DeleteCell";
476 cacaa443 Miltiadis Vasilakis
        UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
477 aa2cf4d7 Miltiadis Vasilakis
        if (cell == nil) {
478 aa2cf4d7 Miltiadis Vasilakis
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
479 aa2cf4d7 Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleBlue;
480 aa2cf4d7 Miltiadis Vasilakis
            cell.textLabel.textAlignment = UITextAlignmentCenter;
481 aa2cf4d7 Miltiadis Vasilakis
            cell.textLabel.text = @"Delete Object";
482 aa2cf4d7 Miltiadis Vasilakis
        }
483 aa2cf4d7 Miltiadis Vasilakis
        return cell;
484 aa2cf4d7 Miltiadis Vasilakis
    }
485 aa2cf4d7 Miltiadis Vasilakis
    
486 aa2cf4d7 Miltiadis Vasilakis
    static NSString *CellIdentifier = @"Cell";
487 700184fb Miltiadis Vasilakis
    UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];
488 700184fb Miltiadis Vasilakis
    if (cell == nil) {
489 700184fb Miltiadis Vasilakis
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
490 700184fb Miltiadis Vasilakis
        cell.textLabel.backgroundColor = [UIColor clearColor];
491 700184fb Miltiadis Vasilakis
        cell.detailTextLabel.backgroundColor = [UIColor clearColor];
492 700184fb Miltiadis Vasilakis
        cell.detailTextLabel.lineBreakMode = UILineBreakModeWordWrap;
493 700184fb Miltiadis Vasilakis
    }
494 64929bae Miltiadis Vasilakis
    cell.textLabel.textColor = [UIColor blackColor];
495 4b4b833e Miltiadis Vasilakis
    cell.detailTextLabel.numberOfLines = 0;
496 689de104 Miltiadis Vasilakis
    if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
497 700184fb Miltiadis Vasilakis
        cell.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.8];
498 700184fb Miltiadis Vasilakis
    }
499 d17a05de Miltiadis Vasilakis
    cell.userInteractionEnabled = YES;
500 700184fb Miltiadis Vasilakis
    cell.detailTextLabel.textAlignment = UITextAlignmentRight;
501 91869be8 Miltiadis Vasilakis
    cell.accessoryView = nil;
502 91869be8 Miltiadis Vasilakis
    cell.textLabel.font = [UIFont boldSystemFontOfSize:17.0];
503 700184fb Miltiadis Vasilakis
    
504 700184fb Miltiadis Vasilakis
    // Configure the cell...
505 700184fb Miltiadis Vasilakis
    if (indexPath.section == kDetails) {
506 700184fb Miltiadis Vasilakis
        cell.accessoryType = UITableViewCellAccessoryNone;
507 700184fb Miltiadis Vasilakis
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
508 700184fb Miltiadis Vasilakis
        cell.accessoryView = nil;
509 700184fb Miltiadis Vasilakis
        if (indexPath.row == 0) {
510 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Name";
511 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = object.name;
512 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == 1) {
513 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Full Path";
514 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = object.fullPath;
515 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == 2) {
516 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Size";
517 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = [object humanizedBytes];
518 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == 3) {
519 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Type";
520 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = object.contentType;
521 1ab29d03 Miltiadis Vasilakis
        } else if (indexPath.row == 4) {
522 1ab29d03 Miltiadis Vasilakis
            cell.textLabel.text = @"Last Modified";
523 1ab29d03 Miltiadis Vasilakis
            cell.detailTextLabel.text = object.lastModifiedString;
524 700184fb Miltiadis Vasilakis
        }
525 700184fb Miltiadis Vasilakis
    } else if (indexPath.section == kMetadata) {
526 d17a05de Miltiadis Vasilakis
        if (objectIsReadOnly) {
527 d17a05de Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryNone;
528 d17a05de Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
529 d17a05de Miltiadis Vasilakis
            cell.userInteractionEnabled = NO;
530 d17a05de Miltiadis Vasilakis
        }
531 d17a05de Miltiadis Vasilakis
        else {
532 d17a05de Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleBlue;
533 d17a05de Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
534 d17a05de Miltiadis Vasilakis
        }
535 d17a05de Miltiadis Vasilakis
        
536 700184fb Miltiadis Vasilakis
        cell.accessoryView = nil;
537 700184fb Miltiadis Vasilakis
        if (indexPath.row == [object.metadata count]) {
538 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Add Metadata";
539 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = @"";
540 700184fb Miltiadis Vasilakis
        } else {
541 700184fb Miltiadis Vasilakis
            NSString *key = [[object.metadata allKeys] objectAtIndex:indexPath.row];
542 38d59b6c Miltiadis Vasilakis
            NSString *value = [object.metadata objectForKey:key];
543 38d59b6c Miltiadis Vasilakis
            NSString *metadataKeyCellText = key;
544 38d59b6c Miltiadis Vasilakis
            NSString *metadataValueCellText = value;
545 38d59b6c Miltiadis Vasilakis
            if ([metadataKeyCellText length] > maxMetadataViewableLength) {
546 38d59b6c Miltiadis Vasilakis
                metadataKeyCellText = [metadataKeyCellText substringToIndex:(maxMetadataViewableLength - 3)];
547 38d59b6c Miltiadis Vasilakis
                metadataKeyCellText = [metadataKeyCellText stringByAppendingString:@"..."];
548 38d59b6c Miltiadis Vasilakis
            }
549 38d59b6c Miltiadis Vasilakis
            if ([metadataValueCellText length] > maxMetadataViewableLength) {
550 38d59b6c Miltiadis Vasilakis
                metadataValueCellText = [metadataValueCellText substringToIndex:(maxMetadataViewableLength - 3)];
551 38d59b6c Miltiadis Vasilakis
                metadataValueCellText = [metadataValueCellText stringByAppendingString:@"..."];
552 38d59b6c Miltiadis Vasilakis
            }
553 38d59b6c Miltiadis Vasilakis
            
554 38d59b6c Miltiadis Vasilakis
            cell.textLabel.text = metadataKeyCellText;
555 38d59b6c Miltiadis Vasilakis
            cell.detailTextLabel.text = metadataValueCellText;
556 700184fb Miltiadis Vasilakis
        }
557 64929bae Miltiadis Vasilakis
    } else if (indexPath.section == publicLinkSection) {
558 623869ee Miltiadis Vasilakis
        if (indexPath.row == 0) {
559 623869ee Miltiadis Vasilakis
            cell.textLabel.text = @"Public URL";        
560 623869ee Miltiadis Vasilakis
            cell.detailTextLabel.text = @"";
561 623869ee Miltiadis Vasilakis
            cell.accessoryView = objectIsPublicSwitch;
562 623869ee Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryNone;
563 623869ee Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
564 623869ee Miltiadis Vasilakis
        }
565 64929bae Miltiadis Vasilakis
    } else if (indexPath.section == permissionsSection) {
566 d17a05de Miltiadis Vasilakis
        if (account.sharingAccount) {
567 d17a05de Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryNone;
568 d17a05de Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
569 d17a05de Miltiadis Vasilakis
            cell.userInteractionEnabled = NO;
570 b45fc7f8 Miltiadis Vasilakis
        } else {
571 d17a05de Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleBlue;
572 d17a05de Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
573 d17a05de Miltiadis Vasilakis
        }
574 91869be8 Miltiadis Vasilakis
        cell.accessoryView = nil;
575 45f2fce6 Miltiadis Vasilakis
        
576 b45fc7f8 Miltiadis Vasilakis
        if (indexPath.row == permissions.count) {
577 4b4b833e Miltiadis Vasilakis
            cell.textLabel.text = @"Share";
578 91869be8 Miltiadis Vasilakis
            cell.detailTextLabel.text = @""; 
579 4b4b833e Miltiadis Vasilakis
        } else {
580 b45fc7f8 Miltiadis Vasilakis
            NSString *user = [[[permissions allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] objectAtIndex:indexPath.row];
581 b45fc7f8 Miltiadis Vasilakis
            NSRange rangeOfColumn = [user rangeOfString:@":"];
582 b45fc7f8 Miltiadis Vasilakis
            NSString *UUID = (rangeOfColumn.location == NSNotFound) ? user : [user substringToIndex:rangeOfColumn.location];
583 b45fc7f8 Miltiadis Vasilakis
            NSString *group = ((rangeOfColumn.location == NSNotFound) || (rangeOfColumn.location == user.length - 1)) ? nil : [user substringFromIndex:(rangeOfColumn.location + 1)];
584 b45fc7f8 Miltiadis Vasilakis
            NSMutableString *displayname = [NSMutableString stringWithString:[account displaynameForUUID:UUID safe:YES]];
585 b45fc7f8 Miltiadis Vasilakis
            if (group) {
586 b45fc7f8 Miltiadis Vasilakis
                [displayname appendFormat:@":%@", group];
587 b45fc7f8 Miltiadis Vasilakis
            }
588 b45fc7f8 Miltiadis Vasilakis
            cell.textLabel.text = displayname;
589 b45fc7f8 Miltiadis Vasilakis
            
590 4b4b833e Miltiadis Vasilakis
            cell.detailTextLabel.numberOfLines = 1;
591 4b4b833e Miltiadis Vasilakis
            cell.detailTextLabel.lineBreakMode = UILineBreakModeTailTruncation;
592 b45fc7f8 Miltiadis Vasilakis
            cell.detailTextLabel.text = ([[permissions objectForKey:user] isEqualToString:@"write"] ? @"Read/Write" : @"Read Only");
593 91869be8 Miltiadis Vasilakis
        }
594 cacaa443 Miltiadis Vasilakis
    } else if (indexPath.section == kActions) {
595 700184fb Miltiadis Vasilakis
        if (indexPath.row == 0) {
596 814a8d8f Miltiadis Vasilakis
            cell.textLabel.text = @"Open File";
597 64929bae Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryNone;
598 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = @"";
599 814a8d8f Miltiadis Vasilakis
            if (fileDownloading) {
600 814a8d8f Miltiadis Vasilakis
                cell.textLabel.textColor = [UIColor grayColor];
601 814a8d8f Miltiadis Vasilakis
                cell.selectionStyle = UITableViewCellSelectionStyleNone;
602 814a8d8f Miltiadis Vasilakis
            } else {
603 814a8d8f Miltiadis Vasilakis
                cell.selectionStyle = UITableViewCellSelectionStyleBlue;
604 814a8d8f Miltiadis Vasilakis
            }
605 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == 1) {
606 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Email File as Attachment";
607 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = @"";
608 814a8d8f Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryNone;
609 814a8d8f Miltiadis Vasilakis
            if (fileDownloading) {
610 814a8d8f Miltiadis Vasilakis
                cell.textLabel.textColor = [UIColor grayColor];
611 814a8d8f Miltiadis Vasilakis
                cell.selectionStyle = UITableViewCellSelectionStyleNone;
612 814a8d8f Miltiadis Vasilakis
            } else {
613 814a8d8f Miltiadis Vasilakis
                cell.selectionStyle = UITableViewCellSelectionStyleBlue;
614 814a8d8f Miltiadis Vasilakis
            }
615 814a8d8f Miltiadis Vasilakis
        } else if (indexPath.row == 2) {
616 814a8d8f Miltiadis Vasilakis
            if (fileDownloaded) {
617 814a8d8f Miltiadis Vasilakis
                cell.textLabel.text = @"Remove from Cache";
618 814a8d8f Miltiadis Vasilakis
                cell.accessoryType = UITableViewCellAccessoryNone;
619 814a8d8f Miltiadis Vasilakis
                cell.detailTextLabel.text = @"";
620 814a8d8f Miltiadis Vasilakis
            } else if (fileDownloading) {
621 814a8d8f Miltiadis Vasilakis
                cell.textLabel.text = @"Downloading";
622 814a8d8f Miltiadis Vasilakis
                cell.accessoryType = UITableViewCellAccessoryNone;
623 814a8d8f Miltiadis Vasilakis
                cell.detailTextLabel.text = @"";
624 814a8d8f Miltiadis Vasilakis
                cell.selectionStyle = UITableViewCellSelectionStyleNone;
625 814a8d8f Miltiadis Vasilakis
                cell.accessoryView = downloadProgressView;
626 814a8d8f Miltiadis Vasilakis
            }
627 814a8d8f Miltiadis Vasilakis
        } else if (indexPath.row == 3) {
628 814a8d8f Miltiadis Vasilakis
            if (fileDownloading) {
629 814a8d8f Miltiadis Vasilakis
                cell.textLabel.text = @"Cancel";
630 814a8d8f Miltiadis Vasilakis
                cell.accessoryType = UITableViewCellAccessoryNone;
631 814a8d8f Miltiadis Vasilakis
                cell.detailTextLabel.text = @"";
632 814a8d8f Miltiadis Vasilakis
            }
633 aa2cf4d7 Miltiadis Vasilakis
        }
634 64929bae Miltiadis Vasilakis
    } else if (indexPath.section == versionsSection) {
635 64929bae Miltiadis Vasilakis
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
636 64929bae Miltiadis Vasilakis
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
637 64929bae Miltiadis Vasilakis
        cell.textLabel.text = @"Versions";
638 64929bae Miltiadis Vasilakis
        cell.detailTextLabel.text = @"";
639 700184fb Miltiadis Vasilakis
    }
640 700184fb Miltiadis Vasilakis
    
641 700184fb Miltiadis Vasilakis
    return cell;
642 700184fb Miltiadis Vasilakis
}
643 700184fb Miltiadis Vasilakis
644 cacaa443 Miltiadis Vasilakis
#pragma mark - UITableViewDelegate
645 700184fb Miltiadis Vasilakis
646 700184fb Miltiadis Vasilakis
- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
647 38d59b6c Miltiadis Vasilakis
    if (indexPath.section == kMetadata) {
648 38d59b6c Miltiadis Vasilakis
        EditMetadataViewController *vc = [[EditMetadataViewController alloc] initWithNibName:@"EditMetadataViewController" bundle:nil];
649 38d59b6c Miltiadis Vasilakis
        NSString *metadataKey;
650 38d59b6c Miltiadis Vasilakis
        NSString *metadataValue;
651 38d59b6c Miltiadis Vasilakis
        
652 38d59b6c Miltiadis Vasilakis
        if (indexPath.row == [self.object.metadata count]) {
653 38d59b6c Miltiadis Vasilakis
            metadataKey = @"";
654 38d59b6c Miltiadis Vasilakis
            metadataValue = @"";
655 221c2106 Miltiadis Vasilakis
            vc.removeMetadataEnabled = FALSE;
656 38d59b6c Miltiadis Vasilakis
            vc.navigationItem.title = @"Add Metadata";
657 60731366 Miltiadis Vasilakis
        } else {
658 38d59b6c Miltiadis Vasilakis
            metadataKey = [[self.object.metadata allKeys] objectAtIndex:indexPath.row];
659 38d59b6c Miltiadis Vasilakis
            metadataValue = [self.object.metadata objectForKey:metadataKey];
660 221c2106 Miltiadis Vasilakis
            vc.removeMetadataEnabled = YES;
661 38d59b6c Miltiadis Vasilakis
            vc.navigationItem.title = @"Edit Metadata";
662 38d59b6c Miltiadis Vasilakis
        }
663 38d59b6c Miltiadis Vasilakis
664 38d59b6c Miltiadis Vasilakis
        vc.metadataKey = metadataKey;
665 38d59b6c Miltiadis Vasilakis
        vc.metadataValue = metadataValue;
666 38d59b6c Miltiadis Vasilakis
        vc.account = account;
667 38d59b6c Miltiadis Vasilakis
        vc.container = container;
668 38d59b6c Miltiadis Vasilakis
        vc.object = object;
669 38d59b6c Miltiadis Vasilakis
        [self.navigationController pushViewController:vc animated:YES];
670 38d59b6c Miltiadis Vasilakis
        [vc release];
671 64929bae Miltiadis Vasilakis
    } else if (indexPath.section == permissionsSection) {
672 91869be8 Miltiadis Vasilakis
        EditPermissionsViewController *vc = [[EditPermissionsViewController alloc] initWithNibName:@"EditPermissionsViewController" bundle:nil];
673 91869be8 Miltiadis Vasilakis
        NSString *user;
674 91869be8 Miltiadis Vasilakis
        
675 b45fc7f8 Miltiadis Vasilakis
        if (indexPath.row == permissions.count) {
676 91869be8 Miltiadis Vasilakis
            user = @"";
677 54cb751a Miltiadis Vasilakis
            vc.removePermissionsEnabled = NO;
678 3e581f16 Miltiadis Vasilakis
            vc.navigationItem.title = @"Add Permission";
679 60731366 Miltiadis Vasilakis
        } else {
680 b45fc7f8 Miltiadis Vasilakis
            user = [[[permissions allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] objectAtIndex:indexPath.row];
681 91869be8 Miltiadis Vasilakis
            NSString *userPermissions = [permissions objectForKey:user];
682 b45fc7f8 Miltiadis Vasilakis
            if ([userPermissions rangeOfString:@"read"].location != NSNotFound) {
683 91869be8 Miltiadis Vasilakis
                vc.readPermissionSelected = YES;
684 b45fc7f8 Miltiadis Vasilakis
            } else {
685 91869be8 Miltiadis Vasilakis
                vc.readPermissionSelected = NO;
686 b45fc7f8 Miltiadis Vasilakis
            }
687 b45fc7f8 Miltiadis Vasilakis
            if ([userPermissions rangeOfString:@"write"].location != NSNotFound) {
688 91869be8 Miltiadis Vasilakis
                vc.writePermissionSelected = YES;
689 b45fc7f8 Miltiadis Vasilakis
            } else {
690 91869be8 Miltiadis Vasilakis
                vc.writePermissionSelected = NO;
691 b45fc7f8 Miltiadis Vasilakis
            }
692 54cb751a Miltiadis Vasilakis
            vc.removePermissionsEnabled = YES;
693 3e581f16 Miltiadis Vasilakis
            vc.navigationItem.title = @"Edit Permission";
694 91869be8 Miltiadis Vasilakis
        }
695 91869be8 Miltiadis Vasilakis
        
696 b45fc7f8 Miltiadis Vasilakis
        vc.permissionUser = user;
697 91869be8 Miltiadis Vasilakis
        vc.permissions = permissions;
698 91869be8 Miltiadis Vasilakis
        vc.account = account;
699 91869be8 Miltiadis Vasilakis
        vc.container = container;
700 91869be8 Miltiadis Vasilakis
        vc.object = object;
701 d17a05de Miltiadis Vasilakis
        vc.folderViewController = folderViewController;
702 91869be8 Miltiadis Vasilakis
        [self.navigationController pushViewController:vc animated:YES];
703 91869be8 Miltiadis Vasilakis
        [vc release];
704 cacaa443 Miltiadis Vasilakis
    } else if (indexPath.section == kActions) {
705 814a8d8f Miltiadis Vasilakis
        if (indexPath.row == 0) {
706 700184fb Miltiadis Vasilakis
            if (fileDownloaded) {
707 814a8d8f Miltiadis Vasilakis
                [self openFile];
708 814a8d8f Miltiadis Vasilakis
                [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
709 814a8d8f Miltiadis Vasilakis
            } else if (!fileDownloading) {
710 814a8d8f Miltiadis Vasilakis
                [self downloadFileForAction:StorageObjectActionOpenFile];
711 814a8d8f Miltiadis Vasilakis
                [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
712 814a8d8f Miltiadis Vasilakis
            }
713 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == 1) {
714 814a8d8f Miltiadis Vasilakis
            if (fileDownloaded) {
715 814a8d8f Miltiadis Vasilakis
                [self mailFile];
716 814a8d8f Miltiadis Vasilakis
                [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
717 814a8d8f Miltiadis Vasilakis
            } else if (!fileDownloading) {
718 814a8d8f Miltiadis Vasilakis
                [self downloadFileForAction:StorageObjectActionMailFile];
719 814a8d8f Miltiadis Vasilakis
                [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
720 700184fb Miltiadis Vasilakis
            }
721 814a8d8f Miltiadis Vasilakis
        } else if ((indexPath.row == 2) && fileDownloaded) {
722 814a8d8f Miltiadis Vasilakis
            OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
723 814a8d8f Miltiadis Vasilakis
            BOOL removed = [app removeCacheObjectForHash:object.hash];
724 814a8d8f Miltiadis Vasilakis
            [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
725 814a8d8f Miltiadis Vasilakis
            if (removed) {
726 814a8d8f Miltiadis Vasilakis
                fileDownloaded = NO;
727 814a8d8f Miltiadis Vasilakis
                fileDownloading = NO;
728 814a8d8f Miltiadis Vasilakis
                [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationNone];
729 814a8d8f Miltiadis Vasilakis
            }
730 814a8d8f Miltiadis Vasilakis
        } else if ((indexPath.row == 3) && fileDownloading) {
731 814a8d8f Miltiadis Vasilakis
            OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate];
732 814a8d8f Miltiadis Vasilakis
            OpenStackRequest *request = [app objectDownloadRequestForAccount:account container:container object:object];
733 814a8d8f Miltiadis Vasilakis
            [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
734 814a8d8f Miltiadis Vasilakis
            if (request) {
735 814a8d8f Miltiadis Vasilakis
                request.downloadProgressDelegate = nil;
736 814a8d8f Miltiadis Vasilakis
                [request cancel];
737 814a8d8f Miltiadis Vasilakis
                fileDownloaded = NO;
738 814a8d8f Miltiadis Vasilakis
                fileDownloading = NO;
739 814a8d8f Miltiadis Vasilakis
                [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationNone];
740 30a43f47 Miltiadis Vasilakis
            }
741 700184fb Miltiadis Vasilakis
        }
742 700184fb Miltiadis Vasilakis
    } else if (indexPath.section == deleteSection) {
743 aa2cf4d7 Miltiadis Vasilakis
        UIActionSheet *deleteActionSheet = [[[UIActionSheet alloc] initWithTitle:@"Are you sure you want to delete this file? This operation cannot be undone."
744 aa2cf4d7 Miltiadis Vasilakis
                                                                        delegate:self
745 aa2cf4d7 Miltiadis Vasilakis
                                                               cancelButtonTitle:@"Cancel"
746 aa2cf4d7 Miltiadis Vasilakis
                                                          destructiveButtonTitle:@"Delete File"
747 aa2cf4d7 Miltiadis Vasilakis
                                                               otherButtonTitles:nil] autorelease];
748 700184fb Miltiadis Vasilakis
        [deleteActionSheet showInView:self.view];
749 64929bae Miltiadis Vasilakis
    } else if (indexPath.section == versionsSection) {
750 64929bae Miltiadis Vasilakis
        ObjectVersionsViewController *vc = [[ObjectVersionsViewController alloc] initWithNibName:@"ObjectVersionsViewController" bundle:nil];
751 64929bae Miltiadis Vasilakis
        vc.account = account;
752 64929bae Miltiadis Vasilakis
        vc.container = container;
753 64929bae Miltiadis Vasilakis
        vc.object = object;
754 64929bae Miltiadis Vasilakis
        [self.navigationController pushViewController:vc animated:YES];
755 64929bae Miltiadis Vasilakis
        [vc release];
756 700184fb Miltiadis Vasilakis
    }
757 700184fb Miltiadis Vasilakis
}
758 700184fb Miltiadis Vasilakis
759 700184fb Miltiadis Vasilakis
- (void)setProgress:(float)newProgress {
760 700184fb Miltiadis Vasilakis
    [downloadProgressView setProgress:newProgress animated:YES];    
761 700184fb Miltiadis Vasilakis
    if (newProgress >= 1.0) {
762 700184fb Miltiadis Vasilakis
        fileDownloading = NO;
763 700184fb Miltiadis Vasilakis
        fileDownloaded = YES;
764 814a8d8f Miltiadis Vasilakis
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationNone];
765 700184fb Miltiadis Vasilakis
    }
766 700184fb Miltiadis Vasilakis
}
767 700184fb Miltiadis Vasilakis
768 cacaa443 Miltiadis Vasilakis
#pragma mark - UIDocumentInteractionControllerDelegate
769 700184fb Miltiadis Vasilakis
770 700184fb Miltiadis Vasilakis
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *) controller {
771 700184fb Miltiadis Vasilakis
    return self.navigationController;
772 700184fb Miltiadis Vasilakis
}
773 700184fb Miltiadis Vasilakis
774 cacaa443 Miltiadis Vasilakis
#pragma mark - UIActionSheetDelegate
775 700184fb Miltiadis Vasilakis
776 700184fb Miltiadis Vasilakis
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
777 aa2cf4d7 Miltiadis Vasilakis
    if (buttonIndex == 0) {
778 aa2cf4d7 Miltiadis Vasilakis
        // delete the file and pop out
779 aa2cf4d7 Miltiadis Vasilakis
        self.folderViewController.refreshButton.enabled = NO;
780 60731366 Miltiadis Vasilakis
        __block ActivityIndicatorView *activityIndicatorView = [ActivityIndicatorView activityIndicatorViewWithText:@"Deleting file..."
781 60731366 Miltiadis Vasilakis
                                                                                                       andAddToView:self.view];
782 aa2cf4d7 Miltiadis Vasilakis
        [[self.account.manager deleteObject:self.container object:self.object] 
783 aa2cf4d7 Miltiadis Vasilakis
         success:^(OpenStackRequest *request) {
784 c2940e36 Miltiadis Vasilakis
             [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
785 689de104 Miltiadis Vasilakis
             if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) {
786 aa2cf4d7 Miltiadis Vasilakis
                 [self.navigationController popViewControllerAnimated:YES];
787 aa2cf4d7 Miltiadis Vasilakis
                 if (account.shared)
788 aa2cf4d7 Miltiadis Vasilakis
                     self.folderViewController.needsRefreshing = YES;
789 689de104 Miltiadis Vasilakis
             } else if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
790 aa2cf4d7 Miltiadis Vasilakis
                 self.folderViewController.selectedObjectViewController = nil;
791 aa2cf4d7 Miltiadis Vasilakis
                 if (!account.shared)
792 aa2cf4d7 Miltiadis Vasilakis
                     [self.folderViewController setDetailViewController];
793 aa2cf4d7 Miltiadis Vasilakis
                 else 
794 aa2cf4d7 Miltiadis Vasilakis
                    [self.folderViewController refreshButtonPressed:nil];
795 60731366 Miltiadis Vasilakis
//                 self.folderViewController.refreshButton.enabled = YES;
796 7db1712d Miltiadis Vasilakis
             }
797 7be37a93 Miltiadis Vasilakis
             if (self.folder.objectsAndFoldersCount == 1) {
798 a20544e8 Miltiadis Vasilakis
                 [self.folder removeObject:self.object];
799 a20544e8 Miltiadis Vasilakis
                 self.folderViewController.folder = self.folderViewController.folder;
800 aa2cf4d7 Miltiadis Vasilakis
             } else {
801 7be37a93 Miltiadis Vasilakis
                 [self.folderViewController deleteAnimatedObject:self.object];
802 aa2cf4d7 Miltiadis Vasilakis
             }
803 60731366 Miltiadis Vasilakis
             self.folderViewController.refreshButton.enabled = YES;
804 aa2cf4d7 Miltiadis Vasilakis
         }
805 aa2cf4d7 Miltiadis Vasilakis
         failure:^(OpenStackRequest *request) {
806 c2940e36 Miltiadis Vasilakis
             [activityIndicatorView stopAnimatingAndRemoveFromSuperview];
807 a20544e8 Miltiadis Vasilakis
             [self alert:@"There was a problem deleting this file." request:request];
808 60731366 Miltiadis Vasilakis
             self.folderViewController.refreshButton.enabled = YES;
809 aa2cf4d7 Miltiadis Vasilakis
         }];
810 700184fb Miltiadis Vasilakis
    }
811 aa2cf4d7 Miltiadis Vasilakis
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:deleteSection];
812 aa2cf4d7 Miltiadis Vasilakis
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
813 700184fb Miltiadis Vasilakis
}
814 700184fb Miltiadis Vasilakis
815 cacaa443 Miltiadis Vasilakis
#pragma mark - MFMailComposeViewControllerDelegate
816 700184fb Miltiadis Vasilakis
817 700184fb Miltiadis Vasilakis
// Dismisses the email composition interface when users tap Cancel or Send.
818 814a8d8f Miltiadis Vasilakis
- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error {
819 700184fb Miltiadis Vasilakis
	[self dismissModalViewControllerAnimated:YES];
820 54fd5c36 Miltiadis Vasilakis
}
821 54fd5c36 Miltiadis Vasilakis
822 700184fb Miltiadis Vasilakis
@end