Statistics
| Branch: | Tag: | Revision:

root / Classes / AccountSettingsViewController.m @ 7db1712d

History | View | Annotate | Download (10.1 kB)

1
//
2
//  AccountSettingsViewController.m
3
//  OpenStack
4
//
5
//  Created by Mike Mayo on 12/14/10.
6
//  The OpenStack project is provided under the Apache 2.0 license.
7
//
8

    
9
#import "AccountSettingsViewController.h"
10
#import "OpenStackAccount.h"
11
#import "Provider.h"
12
#import "RSTextFieldCell.h"
13
#import "UIColor+MoreColors.h"
14
#import "OpenStackAppDelegate.h"
15
#import "UIViewController+Conveniences.h"
16
#import "OpenStackRequest.h"
17

    
18
#define kUsername 0
19
#define kAPIKey 1
20

    
21
@implementation AccountSettingsViewController
22

    
23
@synthesize account, userName, apiKey, activityIndicatorView;
24

    
25
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
26
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
27
}
28

    
29
#pragma mark -
30
#pragma mark HTTP Response Handlers
31

    
32
- (void)authenticationSucceded:(OpenStackRequest *)request {
33
    
34
    [self.activityIndicatorView removeFromSuperview];
35

    
36
    if ([request isSuccess]) {        
37
        account.authToken = [[request responseHeaders] objectForKey:@"X-Auth-Token"];
38
        account.serversURL = [NSURL URLWithString:[[request responseHeaders] objectForKey:@"X-Server-Management-Url"]];
39
        
40
        NSString *filesStorageURL;
41
        if (![[request responseHeaders] objectForKey:@"X-Storage-URL"]) {
42
            filesStorageURL = [NSString stringWithFormat:@"%@/v1/%@",
43
                               [account.hostURL absoluteString],
44
                               [account username]];
45
            account.filesURL = [NSURL URLWithString:filesStorageURL];
46
        }
47
        else {
48
            account.filesURL = [NSURL URLWithString:[[request responseHeaders] objectForKey:@"X-Storage-Url"]];
49
        }
50
        
51
        account.pithosPublicLinkURLPrefix = account.hostURL;
52
        account.pithosLoginURLPrefix = [NSURL URLWithString:
53
                                        [[account.hostURL absoluteString]
54
                                         stringByAppendingString:@"/login"]];
55

    
56
        NSString *cdnStr = [[request responseHeaders] objectForKey:@"X-Cdn-Management-Url"];
57
        if (!cdnStr) {
58
            cdnStr = [[request responseHeaders] objectForKey:@"X-CDN-Management-Url"];
59
        }
60
        if (cdnStr) {
61
            account.cdnURL = [NSURL URLWithString:cdnStr];
62
        }
63
        [account persist];
64
        [account refreshCollections];
65
        [self.navigationController dismissModalViewControllerAnimated:YES];
66
    } else {
67
        self.navigationItem.rightBarButtonItem.enabled = NO;
68
        [self alert:@"Authentication Failure" message:@"Please check your User Name and Token."];
69
    }
70
}
71

    
72
- (void)authenticationFailed:(OpenStackRequest *)request {
73
    [self.activityIndicatorView removeFromSuperview];
74
    self.navigationItem.rightBarButtonItem.enabled = YES;
75
    self.account.containers = nil;
76
    if ([request responseStatusCode] == 401) {
77
        [self alert:@"Authentication Failure" message:@"Please check your User Name and Token."];
78
    } else {
79
        [self failOnBadConnection];
80
    }
81
}
82

    
83

    
84
- (void)authenticate {
85
    
86
    BOOL valid = YES;
87
    
88
        valid = valid && usernameTextField.text && ![@"" isEqualToString:usernameTextField.text];
89
        if (!valid) {
90
            [self alert:nil message:@"Please enter your username."];
91
            [usernameTextField becomeFirstResponder];
92
        } else {
93
            valid = valid && apiKeyTextField.text && ![@"" isEqualToString:apiKeyTextField.text];
94
            if (!valid) {
95
                [self alert:nil message:@"Please enter your token."];
96
                [apiKeyTextField becomeFirstResponder];
97
            } else {
98
                account.username = usernameTextField.text;
99
                account.apiKey = apiKeyTextField.text;                        
100
                
101
                self.activityIndicatorView = [[[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:@"Authenticating..."] text:@"Authenticating..."] autorelease];
102
                [self.activityIndicatorView addToView:self.view];
103
                
104
                OpenStackRequest *request = [OpenStackRequest authenticationRequest:account];
105
                request.delegate = self;
106
                request.didFinishSelector = @selector(authenticationSucceded:);
107
                request.didFailSelector = @selector(authenticationFailed:);
108
                [request startAsynchronous];
109
            }
110
        }
111
}
112

    
113

    
114

    
115
#pragma mark -
116
#pragma mark Button Handlers
117

    
118
- (void)saveButtonPressed:(id)sender {
119
    [self authenticate];
120
}
121

    
122

    
123
#pragma mark - View lifecycle
124

    
125
- (void)viewDidLoad {
126
    [super viewDidLoad];
127
    self.navigationItem.title = @"API Account Info";
128
    userDetailsSection = 0;
129
    if ([self.account.provider isGRNet])
130
        getTokenSection = 1;
131
    else
132
        getTokenSection = -1;
133
    
134
    /*if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
135
        UIView *backgroundContainer = [[UIView alloc] init];
136
        backgroundContainer.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
137
        backgroundContainer.backgroundColor = [UIColor iPadTableBackgroundColor];
138
        NSString *logoFilename = @"account-settings-icon-large.png";
139
        UIImageView *osLogo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:logoFilename]];
140
        osLogo.contentMode = UIViewContentModeScaleAspectFit;
141
        osLogo.frame = CGRectMake(100.0, 100.0, 1000.0, 1000.0);
142
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
143
            osLogo.alpha = 0.3;
144
        }
145
        [backgroundContainer addSubview:osLogo];
146
        [osLogo release];
147
        self.tableView.backgroundView = backgroundContainer;
148
        [backgroundContainer release];
149
    }   */ 
150
    
151
    [self addSaveButton];
152
}
153

    
154

    
155
- (void)viewDidAppear:(BOOL)animated {
156
    [super viewDidAppear:animated];    
157
    //[usernameTextField becomeFirstResponder];
158
}
159

    
160
#pragma mark - Table view data source
161

    
162
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
163
    if (getTokenSection > 0)
164
        return 2;
165
    else
166
        return 1;
167
}
168

    
169
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
170
    if (section == userDetailsSection)
171
        return 2;
172
    else
173
        return 1;
174
}
175

    
176
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
177
    if (section == userDetailsSection)
178
        return [NSString stringWithFormat:@"%@ Login", self.account.provider.name];
179
    else 
180
        return nil;
181
}
182

    
183
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
184
    if (section == userDetailsSection)
185
        return [NSString stringWithFormat:@"API Version %@", self.account.apiVersion];
186
    else
187
        return nil;
188
}
189

    
190
// Customize the appearance of table view cells.
191
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
192
    
193
    static NSString *CellIdentifier = @"Cell";
194
    RSTextFieldCell *cell = nil;
195
    if (indexPath.section == userDetailsSection) {
196
        cell = (RSTextFieldCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
197
        if (cell == nil) {
198
            cell = [[[RSTextFieldCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
199
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
200
        }
201
    
202
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
203
            cell.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.8];
204
        }
205

    
206
        [cell.textLabel setBackgroundColor:[UIColor clearColor]];
207

    
208
        if (indexPath.row == kUsername) {
209
            cell.textLabel.text = @"Username";
210
            usernameTextField = cell.textField;
211
            usernameTextField.delegate = self;
212
            usernameTextField.secureTextEntry = NO;
213
            usernameTextField.returnKeyType = UIReturnKeyNext;
214
            usernameTextField.text = self.account.username;
215
            usernameTextField.placeholder = @"username";
216
            if (userName)
217
                usernameTextField.text = userName;
218
        } else if (indexPath.row == kAPIKey) {
219
            cell.textLabel.text = @"Token";
220
            apiKeyTextField = cell.textField;
221
            apiKeyTextField.secureTextEntry = YES;
222
            apiKeyTextField.delegate = self;
223
            apiKeyTextField.returnKeyType = UIReturnKeyDone;
224
            apiKeyTextField.text = self.account.apiKey;
225
            if (apiKey)
226
                apiKeyTextField.text = apiKey;
227
        }
228
    } else {
229
        cell = (RSTextFieldCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
230
        if (cell == nil) {
231
            cell = [[[RSTextFieldCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
232
        }
233
        
234
        cell.textLabel.text = @"Get Token";
235
    }
236
    return cell;
237
}
238

    
239
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
240
    if (indexPath.section == getTokenSection) {
241
        NSString *loginURL = [NSString stringWithFormat:@"%@?next=pithos://login", account.pithosLoginURLPrefix]; 
242
        
243
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:loginURL]];
244
        [tableView deselectRowAtIndexPath:indexPath animated:NO];
245
    }
246
}
247

    
248
#pragma mark - Text Field Delegate
249

    
250
- (BOOL)textFieldShouldReturn:(UITextField *)textField {    
251
    [textField resignFirstResponder];    
252
    if ([textField isEqual:usernameTextField]) {
253
        [apiKeyTextField becomeFirstResponder];
254
    }
255
    return NO;
256
}
257

    
258
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
259
    NSString *result = [textField.text stringByReplacingCharactersInRange:range withString:string];
260
    if ([textField isEqual:usernameTextField]) {
261
        self.account.username = result;
262
    } else if ([textField isEqual:apiKeyTextField]) {
263
        self.account.apiKey = result;
264
    }
265
    self.account.authToken = @"";
266
    self.account.hasBeenRefreshed = NO;
267
    [self.account persist];
268
    
269
    return YES;
270
}
271

    
272
#pragma mark - Memory management
273

    
274
- (void)dealloc {
275
    [userName release];
276
    [apiKey release];
277
    [activityIndicatorView release];
278
    [account release];
279
    [super dealloc];
280
}
281

    
282

    
283
@end
284