Change download file to directly show open/email as attachment. Fix bugs and improve...
[pithos-ios] / Classes / ObjectVersionsViewController.m
1 //
2 //  ObjectVersionsViewController.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 "ObjectVersionsViewController.h"
39 #import "StorageObjectViewController.h"
40 #import "OpenStackAccount.h"
41 #import "OpenStackRequest.h"
42 #import "AccountManager.h"
43 #import "APICallback.h"
44 #import "JSON.h"
45 #import "ActivityIndicatorView.h"
46 #import "UIViewController+Conveniences.h"
47 #import "StorageObject.h"
48
49
50 @implementation ObjectVersionsViewController
51
52 @synthesize tableView, versions, account, container, object;
53
54 #pragma mark - View lifecycle
55
56 - (void)viewDidLoad {
57     [super viewDidLoad];
58     self.navigationItem.title = @"Versions";
59     self.versions = [NSMutableArray array];
60     versionsLoaded = NO;
61     NSString *activityMessage = @"Loading..";
62     ActivityIndicatorView *activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
63     [activityIndicatorView addToView:self.view];
64
65     [[self.account.manager  getObjectVersionsList:container object:object]
66      success:^(OpenStackRequest *request) {
67          SBJSON *parser = [[SBJSON alloc] init];
68          NSArray *versionsInJson = [[parser objectWithString:[request responseString]] objectForKey:@"versions"];
69          for (NSArray *versionInfo in versionsInJson) {
70              [versions addObject:[NSDictionary dictionaryWithObjectsAndKeys:[versionInfo objectAtIndex:0], @"versionID",
71                                  [NSDate dateWithTimeIntervalSince1970:[[versionInfo objectAtIndex:1] doubleValue]], @"versionDate",
72                                  nil]]; 
73          }
74          [activityIndicatorView removeFromSuperviewAndRelease];
75          versionsLoaded = YES;
76          [self.tableView reloadData];
77      }
78      failure:^(OpenStackRequest *request) {
79          [activityIndicatorView removeFromSuperviewAndRelease];
80          [self alert:@"Couldn't get versions from server" request:request];
81      }];    
82 }
83
84 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
85     return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
86 }
87
88 #pragma mark - memory management
89
90 - (void)dealloc {
91     [account release];
92     [container release];
93     [object release];
94     [versions release];
95     [super dealloc];
96 }
97
98
99 #pragma mark - Table view data source
100
101 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
102     return 1;
103 }
104
105 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
106     if (!versionsLoaded)
107         return 0;
108     else
109         return MAX(1, versions.count);
110 }
111
112 - (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
113     static NSString *CellIdentifier = @"Cell";
114     
115     UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier];
116     if (cell == nil) {
117         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
118     }
119     cell.userInteractionEnabled = YES;
120     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
121     cell.selectionStyle = UITableViewCellSelectionStyleBlue;
122     if (versions.count == 0 || !versions) {
123         cell.textLabel.text = @"No previous versions available";
124         cell.userInteractionEnabled = NO;
125         cell.accessoryType = UITableViewCellAccessoryNone;
126         cell.selectionStyle = UITableViewCellSelectionStyleNone;
127     } else {
128         NSDictionary *versionDetails = [versions objectAtIndex:indexPath.row];
129         cell.textLabel.text = [[versionDetails objectForKey:@"versionID"] description];
130         NSString *dateString = [NSDateFormatter localizedStringFromDate:[versionDetails objectForKey:@"versionDate"]
131                                                               dateStyle:NSDateFormatterMediumStyle
132                                                               timeStyle:NSDateFormatterMediumStyle];
133         cell.detailTextLabel.text = dateString;
134     }
135     
136     return cell;
137 }
138
139 #pragma mark - Table view delegate
140
141 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
142     NSString *activityMessage = @"Loading..";
143     ActivityIndicatorView *activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:activityMessage] text:activityMessage];
144     [activityIndicatorView addToView:self.view];
145     
146     NSDictionary *versionDetails = [versions objectAtIndex:indexPath.row];
147     NSString *versionID = [[versionDetails objectForKey:@"versionID"] description];
148     
149     [[self.account.manager getObjectInfo:container object:object version:versionID]
150      success:^(OpenStackRequest *request) {
151          [activityIndicatorView removeFromSuperviewAndRelease];
152          StorageObject *versionedObject = [[[StorageObject alloc] init] autorelease];
153          versionedObject.name = object.name;
154          versionedObject.fullPath = object.fullPath;
155          [versionedObject setPropertiesfromResponseHeaders:request.responseHeaders];
156          StorageObjectViewController *vc = [[StorageObjectViewController alloc] initWithNibName:@"StorageObjectViewController" bundle:nil];
157          vc.objectIsReadOnly = YES;
158          vc.account = account;
159          vc.container = container;
160          vc.object = versionedObject;
161          vc.versionID = versionID;
162          [self.navigationController pushViewController:vc animated:YES];
163          [vc release];
164          [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
165      } 
166      failure:^(OpenStackRequest *request) {
167          [activityIndicatorView removeFromSuperviewAndRelease];
168          [self alert:[NSString stringWithFormat:@"Failed to get file info for version: %@", versionID] request:request];
169      }];
170 }
171
172 @end