From: Miltiadis Vasilakis Date: Thu, 10 Nov 2011 01:11:25 +0000 (+0200) Subject: UI changes. X-Git-Tag: v1.0~16 X-Git-Url: https://code.grnet.gr/git/pithos-ios/commitdiff_plain/07592312af6f25b3018593c84b149388de4bc1b9 UI changes. Added login functionality. --- diff --git a/Classes/AccountDetailsViewController.h b/Classes/AccountDetailsViewController.h index 463ddb7..edf6424 100755 --- a/Classes/AccountDetailsViewController.h +++ b/Classes/AccountDetailsViewController.h @@ -19,9 +19,12 @@ RootViewController *rootViewController; ProvidersViewController *providersViewController; + NSString *userName; + NSString *apiKey; BOOL customProvider; NSInteger authenticationSection; NSInteger providerSection; + NSInteger getTokenSection; BOOL tableShrunk; @@ -33,6 +36,9 @@ @property (nonatomic, retain) ProvidersViewController *providersViewController; @property (nonatomic, retain) ActivityIndicatorView *activityIndicatorView; +@property (nonatomic, retain) NSString *userName; +@property (nonatomic, retain) NSString *apiKey; + - (void)saveButtonPressed:(id)sender; @end diff --git a/Classes/AccountDetailsViewController.m b/Classes/AccountDetailsViewController.m index 0a5b07a..1fd96c4 100755 --- a/Classes/AccountDetailsViewController.m +++ b/Classes/AccountDetailsViewController.m @@ -17,6 +17,7 @@ #import "NSString+Conveniences.h" #import "ActivityIndicatorView.h" #import "APILogger.h" +#import "OpenStackAppDelegate.h" #define kUsername 0 @@ -28,6 +29,7 @@ @implementation AccountDetailsViewController @synthesize provider, rootViewController, providersViewController, activityIndicatorView; +@synthesize userName, apiKey; - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait); @@ -58,7 +60,7 @@ [self.navigationController dismissModalViewControllerAnimated:YES]; } else { self.navigationItem.rightBarButtonItem.enabled = NO; - [self alert:@"Authentication Failure" message:@"Please check your User Name and API Key."]; + [self alert:@"Authentication Failure" message:@"Please check your User Name and Token."]; } } @@ -66,7 +68,7 @@ [self.activityIndicatorView removeFromSuperview]; self.navigationItem.rightBarButtonItem.enabled = YES; if ([request responseStatusCode] == 401) { - [self alert:@"Authentication Failure" message:@"Please check your User Name and API Key."]; + [self alert:@"Authentication Failure" message:@"Please check your User Name and Token."]; } else { [self failOnBadConnection]; } @@ -99,7 +101,7 @@ } else { valid = valid && apiKeyTextField.text && ![@"" isEqualToString:apiKeyTextField.text]; if (!valid) { - [self alert:nil message:@"Please enter your API key."]; + [self alert:nil message:@"Please enter your token."]; [apiKeyTextField becomeFirstResponder]; } else { account = [[OpenStackAccount alloc] init]; @@ -143,7 +145,7 @@ } else { valid = valid && apiKeyTextField.text && ![@"" isEqualToString:apiKeyTextField.text]; if (!valid) { - [self alert:nil message:@"Please enter your API key."]; + [self alert:nil message:@"Please enter your token."]; [apiKeyTextField becomeFirstResponder]; } else { account = [[OpenStackAccount alloc] init]; @@ -184,6 +186,7 @@ self.navigationItem.title = @"Authentication"; providerSection = -1; authenticationSection = 0; + getTokenSection = 1; [self addSaveButton]; } @@ -193,6 +196,7 @@ customProvider = YES; providerSection = 0; authenticationSection = 1; + getTokenSection = -1; [self.tableView reloadData]; } } @@ -218,11 +222,17 @@ #pragma mark Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return customProvider ? 2 : 1; + if (getTokenSection > 0) + return customProvider ? 3 : 2; + else + return customProvider ? 2 : 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return 2; + if (section == getTokenSection) + return 1; + else + return 2; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { @@ -261,6 +271,10 @@ ((UITextField *)*textField).delegate = self; ((UITextField *)*textField).secureTextEntry = secure; ((UITextField *)*textField).returnKeyType = returnKeyType; + if ([labelText isEqualToString:@"Username"]) + (*textField).text = userName; + else if ([labelText isEqualToString:@"Token"]) + (*textField).text = apiKey; } return cell; @@ -273,7 +287,8 @@ if (indexPath.section == authenticationSection) { if (indexPath.row == kUsername) { - + if (userName) + usernameTextField.text = userName; cell = [self textCell:@"Username" textField:&usernameTextField secure:NO returnKeyType:UIReturnKeyNext]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { CGRect rect = usernameTextField.frame; @@ -282,9 +297,9 @@ } } else if (indexPath.row == kAPIKey) { - - cell = [self textCell:@"API Key" textField:&apiKeyTextField secure:YES returnKeyType:UIReturnKeyDone]; - + if (apiKey) + apiKeyTextField.text = apiKey; + cell = [self textCell:@"Token" textField:&apiKeyTextField secure:YES returnKeyType:UIReturnKeyDone]; } } else if (indexPath.section == providerSection) { @@ -292,7 +307,7 @@ if (indexPath.row == kProviderName) { cell = [self textCell:@"Name" textField:&providerNameTextField secure:NO returnKeyType:UIReturnKeyNext]; - providerNameTextField.placeholder = @"Ex: Rackspace Cloud"; + providerNameTextField.placeholder = @"Ex: Pithos"; } else if (indexPath.row == kAuthEndpoint) { @@ -300,12 +315,39 @@ } + } else if (indexPath.section == getTokenSection) { + static NSString *CellIdentifier = @"Cell"; + + cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; + } + + cell.textLabel.text = @"Get Token"; } return cell; } +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + if (indexPath.section == getTokenSection) { + NSProcessInfo *processInfo = [NSProcessInfo processInfo]; + NSString *loginURL = [NSString stringWithFormat:@"%@?next=pithos://%@", + ((OpenStackAppDelegate *)[[UIApplication sharedApplication] delegate]).loginURLPrefix, + [processInfo processName]]; + + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:loginURL]]; + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + if (tableShrunk) { + tableShrunk = NO; + CGRect rect = self.tableView.frame; + rect.size.height = 416.0; + self.tableView.frame = rect; + } + } +} + #pragma mark - #pragma mark Text Field Delegate @@ -362,6 +404,8 @@ [rootViewController release]; [providersViewController release]; [activityIndicatorView release]; + [userName release]; + [apiKey release]; [super dealloc]; } diff --git a/Classes/AccountHomeViewController.m b/Classes/AccountHomeViewController.m index fabef21..dd05438 100755 --- a/Classes/AccountHomeViewController.m +++ b/Classes/AccountHomeViewController.m @@ -208,7 +208,7 @@ cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } else if (indexPath.row == storageRow) { cell.textLabel.text = [self.account.provider isRackspace] ? @"Cloud Files" : @"Object Storage"; - cell.imageView.image = [self.account.provider isRackspace] ? [UIImage imageNamed:@"cloud-files-icon.png"] : [UIImage imageNamed:@"openstack-icon.png"]; + cell.imageView.image = [self.account.provider isRackspace] ? [UIImage imageNamed:@"cloud-files-icon.png"] : [UIImage imageNamed:@"pithos-solo-smallest.png"]; } else if (indexPath.row == loadBalancingRow) { cell.textLabel.text = @"Load Balancers"; cell.imageView.image = [UIImage imageNamed:@"load-balancers-icon.png"]; @@ -235,7 +235,7 @@ cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; } } else if (indexPath.row == accountSettingsRow) { - cell.textLabel.text = @"API Account Info"; + cell.textLabel.text = @"Account Token"; cell.imageView.image = [UIImage imageNamed:@"account-settings-icon.png"]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { cell.accessoryType = UITableViewCellAccessoryNone; @@ -244,7 +244,7 @@ } } else if (indexPath.row == accountMetadataRow) { cell.textLabel.text = @"Account Metadata"; - cell.imageView.image = [UIImage imageNamed:@"Metadata.gif"]; + cell.imageView.image = [UIImage imageNamed:@"account-settings-icon.png"]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { cell.accessoryType = UITableViewCellAccessoryNone; } else { diff --git a/Classes/AccountHomeViewController.xib b/Classes/AccountHomeViewController.xib index 91e0966..89f63bf 100755 --- a/Classes/AccountHomeViewController.xib +++ b/Classes/AccountHomeViewController.xib @@ -2,13 +2,13 @@ 1056 - 10J869 - 1305 - 1038.35 + 10K549 + 1306 + 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 300 + 301 YES @@ -49,7 +49,7 @@ 266 {{0, 416}, {320, 44}} - + NO NO IBCocoaTouchFramework @@ -82,7 +82,7 @@ 274 {320, 416} - + 3 MQA @@ -103,7 +103,7 @@ {320, 460} - + 3 MQA @@ -198,6 +198,7 @@ + Toolbar 10 @@ -274,70 +275,7 @@ 21 - - - YES - - AccountHomeViewController - OpenStackViewController - - YES - - YES - refreshButton - tableView - - - YES - UIBarButtonItem - UITableView - - - - YES - - YES - refreshButton - tableView - - - YES - - refreshButton - UIBarButtonItem - - - tableView - UITableView - - - - - IBProjectSource - ./Classes/AccountHomeViewController.h - - - - OpenStackViewController - UIViewController - - toolbar - UIToolbar - - - toolbar - - toolbar - UIToolbar - - - - IBProjectSource - ./Classes/OpenStackViewController.h - - - - + 0 IBCocoaTouchFramework @@ -350,6 +288,6 @@ YES 3 - 300 + 301 diff --git a/Classes/AccountSettingsViewController.h b/Classes/AccountSettingsViewController.h index fb0e6d2..ec61b43 100755 --- a/Classes/AccountSettingsViewController.h +++ b/Classes/AccountSettingsViewController.h @@ -7,14 +7,29 @@ // #import +#import "ActivityIndicatorView.h" @class OpenStackAccount; @interface AccountSettingsViewController : UITableViewController { UITextField *usernameTextField; UITextField *apiKeyTextField; + + NSInteger userDetailsSection; + NSInteger getTokenSection; + + NSString *userName; + NSString *apiKey; + + ActivityIndicatorView *activityIndicatorView; } @property (nonatomic, retain) OpenStackAccount *account; +@property (nonatomic, retain) NSString *userName; +@property (nonatomic, retain) NSString *apiKey; +@property (nonatomic, retain) ActivityIndicatorView *activityIndicatorView; + +- (void)saveButtonPressed:(id)sender; + @end diff --git a/Classes/AccountSettingsViewController.m b/Classes/AccountSettingsViewController.m index 6f3d3af..e7aeabc 100755 --- a/Classes/AccountSettingsViewController.m +++ b/Classes/AccountSettingsViewController.m @@ -11,23 +11,109 @@ #import "Provider.h" #import "RSTextFieldCell.h" #import "UIColor+MoreColors.h" +#import "OpenStackAppDelegate.h" +#import "UIViewController+Conveniences.h" +#import "OpenStackRequest.h" #define kUsername 0 #define kAPIKey 1 @implementation AccountSettingsViewController -@synthesize account; +@synthesize account, userName, apiKey, activityIndicatorView; - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait); } +#pragma mark - +#pragma mark HTTP Response Handlers + +- (void)authenticationSucceded:(OpenStackRequest *)request { + + [self.activityIndicatorView removeFromSuperview]; + + if ([request isSuccess]) { + account.authToken = [[request responseHeaders] objectForKey:@"X-Auth-Token"]; + account.serversURL = [NSURL URLWithString:[[request responseHeaders] objectForKey:@"X-Server-Management-Url"]]; + account.filesURL = [NSURL URLWithString:[[request responseHeaders] objectForKey:@"X-Storage-Url"]]; + + NSString *cdnStr = [[request responseHeaders] objectForKey:@"X-Cdn-Management-Url"]; + if (!cdnStr) { + cdnStr = [[request responseHeaders] objectForKey:@"X-CDN-Management-Url"]; + } + if (cdnStr) { + account.cdnURL = [NSURL URLWithString:cdnStr]; + } + [account persist]; + [account refreshCollections]; + [self.navigationController dismissModalViewControllerAnimated:YES]; + } else { + self.navigationItem.rightBarButtonItem.enabled = NO; + [self alert:@"Authentication Failure" message:@"Please check your User Name and Token."]; + } +} + +- (void)authenticationFailed:(OpenStackRequest *)request { + [self.activityIndicatorView removeFromSuperview]; + self.navigationItem.rightBarButtonItem.enabled = YES; + if ([request responseStatusCode] == 401) { + [self alert:@"Authentication Failure" message:@"Please check your User Name and Token."]; + } else { + [self failOnBadConnection]; + } +} + + +- (void)authenticate { + + BOOL valid = YES; + + valid = valid && usernameTextField.text && ![@"" isEqualToString:usernameTextField.text]; + if (!valid) { + [self alert:nil message:@"Please enter your username."]; + [usernameTextField becomeFirstResponder]; + } else { + valid = valid && apiKeyTextField.text && ![@"" isEqualToString:apiKeyTextField.text]; + if (!valid) { + [self alert:nil message:@"Please enter your token."]; + [apiKeyTextField becomeFirstResponder]; + } else { + account.username = usernameTextField.text; + account.apiKey = apiKeyTextField.text; + + self.activityIndicatorView = [[[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:@"Authenticating..."] text:@"Authenticating..."] autorelease]; + [self.activityIndicatorView addToView:self.view]; + + OpenStackRequest *request = [OpenStackRequest authenticationRequest:account]; + request.delegate = self; + request.didFinishSelector = @selector(authenticationSucceded:); + request.didFailSelector = @selector(authenticationFailed:); + [request startAsynchronous]; + } + } +} + + + +#pragma mark - +#pragma mark Button Handlers + +- (void)saveButtonPressed:(id)sender { + [self authenticate]; +} + + #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = @"API Account Info"; + userDetailsSection = 0; + if ([self.account.provider isGRNet]) + getTokenSection = 1; + else + getTokenSection = -1; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { UIView *backgroundContainer = [[UIView alloc] init]; @@ -45,68 +131,107 @@ self.tableView.backgroundView = backgroundContainer; [backgroundContainer release]; } + + [self addSaveButton]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; - [usernameTextField becomeFirstResponder]; + //[usernameTextField becomeFirstResponder]; } #pragma mark - Table view data source - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; + if (getTokenSection > 0) + return 2; + else + return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return 2; + if (section == userDetailsSection) + return 2; + else + return 1; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { - return [NSString stringWithFormat:@"%@ Login", self.account.provider.name]; + if (section == userDetailsSection) + return [NSString stringWithFormat:@"%@ Login", self.account.provider.name]; + else + return nil; } - (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { - return [NSString stringWithFormat:@"API Version %@", self.account.apiVersion]; + if (section == userDetailsSection) + return [NSString stringWithFormat:@"API Version %@", self.account.apiVersion]; + else + return nil; } // Customize the appearance of table view cells. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; + RSTextFieldCell *cell = nil; + if (indexPath.section == userDetailsSection) { + cell = (RSTextFieldCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + if (cell == nil) { + cell = [[[RSTextFieldCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; + cell.selectionStyle = UITableViewCellSelectionStyleNone; + } - RSTextFieldCell *cell = (RSTextFieldCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; - if (cell == nil) { - cell = [[[RSTextFieldCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease]; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - } - - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { - cell.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.8]; - } + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + cell.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.8]; + } - [cell.textLabel setBackgroundColor:[UIColor clearColor]]; - - if (indexPath.row == kUsername) { - cell.textLabel.text = @"Username"; - usernameTextField = cell.textField; - usernameTextField.delegate = self; - usernameTextField.secureTextEntry = NO; - usernameTextField.returnKeyType = UIReturnKeyNext; - usernameTextField.text = self.account.username; - usernameTextField.placeholder = @"username"; - } else if (indexPath.row == kAPIKey) { - cell.textLabel.text = @"API Key"; - apiKeyTextField = cell.textField; - apiKeyTextField.secureTextEntry = YES; - apiKeyTextField.delegate = self; - apiKeyTextField.returnKeyType = UIReturnKeyDone; - apiKeyTextField.text = self.account.apiKey; + [cell.textLabel setBackgroundColor:[UIColor clearColor]]; + + if (indexPath.row == kUsername) { + cell.textLabel.text = @"Username"; + usernameTextField = cell.textField; + usernameTextField.delegate = self; + usernameTextField.secureTextEntry = NO; + usernameTextField.returnKeyType = UIReturnKeyNext; + usernameTextField.text = self.account.username; + usernameTextField.placeholder = @"username"; + if (userName) + usernameTextField.text = userName; + } else if (indexPath.row == kAPIKey) { + cell.textLabel.text = @"Token"; + apiKeyTextField = cell.textField; + apiKeyTextField.secureTextEntry = YES; + apiKeyTextField.delegate = self; + apiKeyTextField.returnKeyType = UIReturnKeyDone; + apiKeyTextField.text = self.account.apiKey; + if (apiKey) + apiKeyTextField.text = apiKey; + } + } else { + cell = (RSTextFieldCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; + } + + cell.textLabel.text = @"Get Token"; } return cell; } +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + if (indexPath.section == getTokenSection) { + NSProcessInfo *processInfo = [NSProcessInfo processInfo]; + NSString *loginURL = [NSString stringWithFormat:@"%@?next=pithos://%@", + ((OpenStackAppDelegate *)[[UIApplication sharedApplication] delegate]).loginURLPrefix, + [processInfo processName]]; + + [[UIApplication sharedApplication] openURL:[NSURL URLWithString:loginURL]]; + [tableView deselectRowAtIndexPath:indexPath animated:NO]; + } +} + #pragma mark - Text Field Delegate - (BOOL)textFieldShouldReturn:(UITextField *)textField { @@ -134,6 +259,9 @@ #pragma mark - Memory management - (void)dealloc { + [userName release]; + [apiKey release]; + [activityIndicatorView release]; [account release]; [super dealloc]; } diff --git a/Classes/AddContainerViewController.m b/Classes/AddContainerViewController.m index f9a7be2..aed3c85 100755 --- a/Classes/AddContainerViewController.m +++ b/Classes/AddContainerViewController.m @@ -75,6 +75,7 @@ [self alert:nil message:@"Please enter a name."]; [nameTextField becomeFirstResponder]; } else { + [self.containersViewController hideToolbarInfoMessage]; [self.containersViewController showToolbarActivityMessage:@"Creating container..."]; Container *container = [[Container alloc] init]; diff --git a/Classes/ContainersViewController.h b/Classes/ContainersViewController.h index 7077603..bd699a8 100755 --- a/Classes/ContainersViewController.h +++ b/Classes/ContainersViewController.h @@ -23,11 +23,12 @@ id getContainersFailedObserver; BOOL containersLoaded; - NSString *accountUsageInfo; + NSString *accountUsageInfo; } @property (nonatomic, retain) IBOutlet UITableView *tableView; @property (nonatomic, retain) OpenStackAccount *account; +@property (nonatomic, retain) NSString *accountUsageInfo; - (void)refreshButtonPressed:(id)sender; diff --git a/Classes/ContainersViewController.m b/Classes/ContainersViewController.m index e5895f0..a031d1b 100755 --- a/Classes/ContainersViewController.m +++ b/Classes/ContainersViewController.m @@ -22,7 +22,7 @@ @implementation ContainersViewController -@synthesize tableView, account; +@synthesize tableView, account, accountUsageInfo; - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait); @@ -44,6 +44,7 @@ queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { [self hideToolbarActivityMessage]; + [self showToolbarInfoMessage:accountUsageInfo]; [self.tableView reloadData]; }]; @@ -51,6 +52,7 @@ queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *notification) { [self hideToolbarActivityMessage]; + [self showToolbarInfoMessage:accountUsageInfo]; [self alert:@"There was a problem creating your container." request:[notification.userInfo objectForKey:@"request"]]; }]; @@ -117,8 +119,8 @@ self.account.containerCount = [self.account.containers count]; self.account.totalBytesUsed = [[request.responseHeaders objectForKey:@"X-Account-Bytes-Used"] longLongValue]; self.account.quota = [[request.responseHeaders objectForKey:@"X-Account-Policy-Quota"] longLongValue]; - accountUsageInfo = [NSString stringWithFormat:@"%@ used, %@ available", - [self humanReadableSize:self.account.totalBytesUsed], [self humanReadableSize:self.account.quota]]; + self.accountUsageInfo = [NSString stringWithFormat:@"%@ used, %@ available", + [self humanReadableSize:self.account.totalBytesUsed], [self humanReadableSize:self.account.quota]]; [self.account persist]; [self enableRefreshButton]; @@ -264,6 +266,7 @@ #pragma mark Memory management - (void)dealloc { + [accountUsageInfo release]; [tableView release]; [account release]; [super dealloc]; diff --git a/Classes/ContainersViewController.xib b/Classes/ContainersViewController.xib index 9f6fbc2..78d9fe3 100755 --- a/Classes/ContainersViewController.xib +++ b/Classes/ContainersViewController.xib @@ -53,6 +53,7 @@ NO NO IBCocoaTouchFramework + 1 YES @@ -77,10 +78,6 @@ 6 - - 2 - MC44MDc4NDMyMDgzIDAuMjAwMDAwMDE3OSAwLjE0OTAxOTYxMzkAA - @@ -304,7 +301,7 @@ - 25 + 30 0 diff --git a/Classes/EditAccountGroupsViewController.m b/Classes/EditAccountGroupsViewController.m index f299a83..55cf358 100644 --- a/Classes/EditAccountGroupsViewController.m +++ b/Classes/EditAccountGroupsViewController.m @@ -138,7 +138,7 @@ if (textField == nil) { CGRect bounds = [cell.contentView bounds]; - CGRect rect = CGRectInset(bounds, 20.0, 10.0); + CGRect rect = CGRectInset(bounds, 10.0, 10.0); textField = [[UITextField alloc] initWithFrame:rect]; [textField setFrame:rect]; } @@ -290,15 +290,6 @@ #pragma mark - Textfield delegate -//- (void)textFieldDidEndEditing:(UITextField *)textField { -// if ([textField tag] == 0) { -// if ([textField.text length] == 0 -// || [[textField.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0) { -// [self alert:@"Invalid input" message:@"Group name cannot be empty"]; -// } -// } -//} - - (BOOL)textFieldShouldReturn:(UITextField *)textField { diff --git a/Classes/EditMetadataViewController.m b/Classes/EditMetadataViewController.m index cab6e2f..6b1c0a2 100644 --- a/Classes/EditMetadataViewController.m +++ b/Classes/EditMetadataViewController.m @@ -142,7 +142,7 @@ if (textField == nil) { CGRect bounds = [cell.contentView bounds]; - CGRect rect = CGRectInset(bounds, 20.0, 10.0); + CGRect rect = CGRectInset(bounds, 10.0, 10.0); textField = [[UITextField alloc] initWithFrame:rect]; [textField setFrame:rect]; } diff --git a/Classes/EditPermissionsViewController.m b/Classes/EditPermissionsViewController.m index 3cca80a..fc886c8 100644 --- a/Classes/EditPermissionsViewController.m +++ b/Classes/EditPermissionsViewController.m @@ -139,7 +139,7 @@ if (textField == nil) { CGRect bounds = [cell.contentView bounds]; - CGRect rect = CGRectInset(bounds, 20.0, 10.0); + CGRect rect = CGRectInset(bounds, 10.0, 10.0); textField = [[UITextField alloc] initWithFrame:rect]; [textField setFrame:rect]; } diff --git a/Classes/EditPolicyViewController.m b/Classes/EditPolicyViewController.m index 0821f5b..a08c063 100644 --- a/Classes/EditPolicyViewController.m +++ b/Classes/EditPolicyViewController.m @@ -180,7 +180,7 @@ if (textField == nil) { CGRect bounds = [cell.contentView bounds]; - CGRect rect = CGRectInset(bounds, 20.0, 10.0); + CGRect rect = CGRectInset(bounds, 10.0, 10.0); textField = [[UITextField alloc] initWithFrame:rect]; [textField setFrame:rect]; } diff --git a/Classes/FolderViewController.h b/Classes/FolderViewController.h index 6591460..5fe40fd 100755 --- a/Classes/FolderViewController.h +++ b/Classes/FolderViewController.h @@ -43,6 +43,8 @@ @property (nonatomic, assign) BOOL contentsLoaded; @property (nonatomic, retain) IBOutlet UITableView *tableView; +- (void)reloadFolders; - (IBAction)homeButtonPressed:(id)sender; +- (IBAction)refreshButtonPressed:(id)sender; @end diff --git a/Classes/FolderViewController.m b/Classes/FolderViewController.m index 1309f58..9d25201 100755 --- a/Classes/FolderViewController.m +++ b/Classes/FolderViewController.m @@ -38,6 +38,17 @@ [super viewDidLoad]; [self addAddButton]; deleteActionSheet = [[UIActionSheet alloc] initWithTitle:@"Are you sure you want to delete this folder? This operation cannot be undone." delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete Folder" otherButtonTitles:nil]; + + UIImage *buttonImage = [UIImage imageNamed:@"HomeFolderIcon.png"]; + + UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; + [button setImage:buttonImage forState:UIControlStateNormal]; + button.frame = CGRectMake(0, 0, buttonImage.size.width, buttonImage.size.height); + [button addTarget:self action:@selector(homeButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; + UIBarButtonItem *customBarItem = [[UIBarButtonItem alloc] initWithCustomView:button]; + NSMutableArray *toolbarItems = [NSMutableArray arrayWithArray:self.toolbar.items]; + [toolbarItems addObject:customBarItem]; + self.toolbar.items = toolbarItems; } - (void)viewWillAppear:(BOOL)animated { @@ -54,31 +65,8 @@ [super viewDidAppear:animated]; if (!self.folder) { - activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:@"Loading..."] text:@"Loading..."]; - [activityIndicatorView addToView:self.view]; - - [self.account.manager getObjects:self.container]; - + [self refreshButtonPressed:nil]; } - - successObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"getObjectsSucceeded" object:self.container - queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) - { - self.folder = self.container.rootFolder; - contentsLoaded = YES; - [self.tableView reloadData]; - [[NSNotificationCenter defaultCenter] removeObserver:successObserver]; - [activityIndicatorView removeFromSuperviewAndRelease]; - }]; - - failureObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"renameServerSucceeded" object:self.container - queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) - { - [self.tableView reloadData]; - [[NSNotificationCenter defaultCenter] removeObserver:failureObserver]; - [activityIndicatorView removeFromSuperviewAndRelease]; - }]; - } - (void)viewWillDisappear:(BOOL)animated { @@ -90,18 +78,67 @@ } - (IBAction)homeButtonPressed:(id)sender { - [self.navigationController popToRootViewControllerAnimated:YES]; + [self.navigationController popToViewController:containersViewController animated:YES]; +} + +- (IBAction)refreshButtonPressed:(id)sender { + activityIndicatorView = [[ActivityIndicatorView alloc] initWithFrame:[ActivityIndicatorView frameForText:@"Loading..."] text:@"Loading..."]; + [activityIndicatorView addToView:self.view]; + + [self.account.manager getObjects:self.container]; + + + successObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"getObjectsSucceeded" object:self.container + queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) + { + contentsLoaded = YES; + [self reloadFolders]; + [[NSNotificationCenter defaultCenter] removeObserver:successObserver]; + [activityIndicatorView removeFromSuperviewAndRelease]; + }]; + + failureObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"renameServerSucceeded" object:self.container + queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) + { + [self.tableView reloadData]; + [[NSNotificationCenter defaultCenter] removeObserver:failureObserver]; + [activityIndicatorView removeFromSuperviewAndRelease]; + }]; + + +} + +- (void)reloadFolders +{ + NSArray *viewControllers = [self.navigationController viewControllers]; + int rootFolderControllerIndex = [viewControllers indexOfObject:self.containersViewController] + 1; + FolderViewController *rootFolderViewController = [viewControllers objectAtIndex:rootFolderControllerIndex]; + rootFolderViewController.folder = self.container.rootFolder; + [rootFolderViewController.tableView reloadData]; + + for (int i = rootFolderControllerIndex + 1; i < [viewControllers count]; i++) { + FolderViewController *folderViewController = [viewControllers objectAtIndex:i]; + Folder *parentFolder = folderViewController.parentFolderViewController.folder; + + folderViewController.folder = [parentFolder.folders objectForKey:folderViewController.folder.name]; + if (!folderViewController.folder) + [self.navigationController popViewControllerAnimated:YES]; + else + [folderViewController.tableView reloadData]; + } + + [self.containersViewController refreshButtonPressed:nil]; } #pragma mark - #pragma mark Table view data source -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { +- (NSInteger)numberOfSectionsInTableView:(UITableView *)aTableView { return 1; } -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { +- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section { return MAX(contentsLoaded ? 1 : 0, [folder.objects count] + [folder.folders count]); } @@ -201,6 +238,7 @@ vc.contentsLoaded = YES; vc.selectedFolderIndexPath = indexPath; vc.parentFolderViewController = self; + vc.containersViewController = self.containersViewController; [self.navigationController pushViewController:vc animated:YES]; [vc release]; [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; diff --git a/Classes/FolderViewController.xib b/Classes/FolderViewController.xib index 1bb6c30..8676cbe 100755 --- a/Classes/FolderViewController.xib +++ b/Classes/FolderViewController.xib @@ -49,22 +49,22 @@ 266 {{0, 416}, {320, 44}} - NO NO IBCocoaTouchFramework + 1 YES - - Home + IBCocoaTouchFramework - 1 + 13 + + + IBCocoaTouchFramework + + 5 - - - 2 - MC44MDc4NDMyMDgzIDAuMjAwMDAwMDE3OSAwLjE0OTAxOTYxMzkAA @@ -114,14 +114,6 @@ - tableView - - - - 12 - - - toolbar @@ -146,19 +138,19 @@ - homeButtonPressed: - + refreshButtonPressed: + - 19 + 26 - homeButton + tableView - + - 20 + 27 @@ -195,19 +187,32 @@ 10 + Table View 13 YES - + + - 14 - + 22 + + + YES + + + + + 24 + + + YES + @@ -220,7 +225,6 @@ -2.CustomClassName 10.IBPluginDependency 13.IBPluginDependency - 14.IBPluginDependency 9.IBPluginDependency @@ -230,7 +234,6 @@ com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -245,7 +248,7 @@ - 20 + 27 0 diff --git a/Classes/OpenStackAppDelegate.h b/Classes/OpenStackAppDelegate.h index bd5a637..3c3af94 100755 --- a/Classes/OpenStackAppDelegate.h +++ b/Classes/OpenStackAppDelegate.h @@ -18,6 +18,8 @@ UIBarButtonItem *barButtonItem; RootViewController *rootViewController; id serviceUnavailableObserver; + + NSString *loginURLPrefix; } @property (nonatomic, retain) IBOutlet UIWindow *window; @@ -27,6 +29,8 @@ @property (nonatomic, retain) UIBarButtonItem *barButtonItem; @property (nonatomic, retain) RootViewController *rootViewController; +@property (nonatomic, readonly) NSString *loginURLPrefix; + - (void) setupDependencies; @end diff --git a/Classes/OpenStackAppDelegate.m b/Classes/OpenStackAppDelegate.m index 89c6ab4..18f5e54 100755 --- a/Classes/OpenStackAppDelegate.m +++ b/Classes/OpenStackAppDelegate.m @@ -30,6 +30,7 @@ #import "UIViewController+Conveniences.h" #import "HTNotifier.h" #import "Analytics.h" +#import "ProvidersViewController.h" @implementation OpenStackAppDelegate @@ -39,6 +40,7 @@ @synthesize masterNavigationController; @synthesize barButtonItem; @synthesize rootViewController; +@synthesize loginURLPrefix; - (void)loadSettingsDefaults { @@ -146,6 +148,13 @@ [[NSNotificationCenter defaultCenter] removeObserver:serviceUnavailableObserver]; }]; + loginURLPrefix = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"PithosLoginURLPrefix"]; + if (!loginURLPrefix) { + loginURLPrefix = [NSString stringWithString:@"https://pithos.dev.grnet.gr/login"]; + } + + [loginURLPrefix retain]; + return YES; } @@ -229,6 +238,63 @@ TrackViewController(viewController); } +- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { + if (!url) + return NO; + + NSString *host = [url host]; + NSString *query = [url query]; + + NSProcessInfo *processInfo = [NSProcessInfo processInfo]; + if ([host hasPrefix:[NSString stringWithFormat:@"%@", [processInfo processName]]] && query) { + // user= + NSString *authUser; + NSRange userRange = [query rangeOfString:@"user=" options:NSCaseInsensitiveSearch]; + if (userRange.length == 0) + // XXX maybe show an error message? + return NO; + NSUInteger authUserStartLocation = userRange.location + userRange.length; + NSRange userEndRange = [query rangeOfString:@"-" options:NSCaseInsensitiveSearch + range:NSMakeRange(authUserStartLocation, [query length] - authUserStartLocation)]; + if (userEndRange.length) { + authUser = [[query substringWithRange:NSMakeRange(authUserStartLocation, userEndRange.location - authUserStartLocation)] + stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + } else { + authUser = [[query substringFromIndex:authUserStartLocation] + stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + } + // token= + NSString *authToken; + NSRange tokenRange = [query rangeOfString:@"token=" options:NSCaseInsensitiveSearch]; + if (tokenRange.length == 0) + // XXX maybe show an error message? + return NO; + NSUInteger authTokenStartLocation = tokenRange.location + tokenRange.length; + NSRange tokenEndRange = [query rangeOfString:@"&" options:NSCaseInsensitiveSearch + range:NSMakeRange(authTokenStartLocation, [query length] - authTokenStartLocation)]; + if (tokenEndRange.length) { + authToken = [[query substringWithRange:NSMakeRange(authTokenStartLocation, tokenEndRange.location - authTokenStartLocation)] + stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + } else { + authToken = [[query substringFromIndex:authTokenStartLocation] + stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + } + + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + [masterNavigationController.visibleViewController setValue:authToken forKey:@"apiKey"]; + [masterNavigationController.visibleViewController setValue:authUser forKey:@"userName"]; + [((UITableViewController *)masterNavigationController.visibleViewController).tableView reloadData]; + } else { + [navigationController.visibleViewController setValue:authToken forKey:@"apiKey"]; + [navigationController.visibleViewController setValue:authUser forKey:@"userName"]; + [((UITableViewController *)navigationController.visibleViewController).tableView reloadData]; + } + } + // XXX else maybe show an error message? + + return YES; +} + #pragma mark - #pragma mark Memory management diff --git a/Classes/Provider.h b/Classes/Provider.h index 19b3ae1..4a4837f 100755 --- a/Classes/Provider.h +++ b/Classes/Provider.h @@ -91,6 +91,7 @@ - (BOOL)isRackspace; - (BOOL)isRackspaceUS; - (BOOL)isRackspaceUK; +- (BOOL)isGRNet; @property (nonatomic, retain) NSString *name; @property (nonatomic, retain) NSURL *authEndpointURL; diff --git a/Classes/Provider.m b/Classes/Provider.m index 3658a1a..4d21cad 100755 --- a/Classes/Provider.m +++ b/Classes/Provider.m @@ -106,6 +106,9 @@ static NSArray *providers = nil; return [self.authEndpointURL.host isEqualToString:@"lon.auth.api.rackspacecloud.com"]; } +- (BOOL)isGRNet { + return [self.authEndpointURL.host hasPrefix:@"pithos.dev.grnet.gr"]; +} #pragma mark - #pragma mark Memory Management diff --git a/Classes/ProvidersViewController.h b/Classes/ProvidersViewController.h index 5ee96ea..dc8c1e2 100755 --- a/Classes/ProvidersViewController.h +++ b/Classes/ProvidersViewController.h @@ -7,6 +7,7 @@ // #import +#import "AccountDetailsViewController.h" @class Provider, RootViewController; @@ -16,4 +17,6 @@ @property (nonatomic, retain) RootViewController *rootViewController; +- (void)restoreAccountDetailsViewController:(AccountDetailsViewController *)accountDetailsViewController; + @end diff --git a/Classes/ProvidersViewController.m b/Classes/ProvidersViewController.m index 19a7bcf..b6a7a1c 100755 --- a/Classes/ProvidersViewController.m +++ b/Classes/ProvidersViewController.m @@ -8,7 +8,6 @@ #import "ProvidersViewController.h" #import "Provider.h" -#import "AccountDetailsViewController.h" #import "RootViewController.h" #import "UIViewController+Conveniences.h" @@ -17,6 +16,10 @@ @synthesize rootViewController; +- (void)restoreAccountDetailsViewController:(AccountDetailsViewController *)accountDetailsViewController { + [self.navigationController pushViewController:accountDetailsViewController animated:NO]; +} + #pragma mark - #pragma mark View lifecycle @@ -53,7 +56,7 @@ if (section == 0) { return 0; } else { - return [[Provider providers] count] + 1; + return 2; } } @@ -69,15 +72,13 @@ cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; if (indexPath.row == [[Provider providers] count]) { - cell.textLabel.textAlignment = UITextAlignmentCenter; cell.textLabel.text = @"Other"; - cell.detailTextLabel.text = @"Custom API Configuration"; - cell.imageView.image = [UIImage imageNamed:@"openstack-icon.png"]; + cell.imageView.image = [UIImage imageNamed:@"pithos-solo-smallest.png"]; } else { Provider *provider = [[Provider providers] objectAtIndex:indexPath.row]; cell.textLabel.text = provider.name; - cell.detailTextLabel.text = [provider.authEndpointURL host]; - cell.imageView.image = [UIImage imageNamed:@"rackspacecloud_icon.png"]; + cell.detailTextLabel.text = [provider.authEndpointURL absoluteString]; + cell.imageView.image = [UIImage imageNamed:@"pithos-solo-smallest.png"]; } return cell; diff --git a/Classes/RootViewController.h b/Classes/RootViewController.h index 68ea978..ea785ca 100755 --- a/Classes/RootViewController.h +++ b/Classes/RootViewController.h @@ -7,19 +7,27 @@ // #import "OpenStackViewController.h" +#import "AccountDetailsViewController.h" +#import "AccountSettingsViewController.h" @interface RootViewController : OpenStackViewController { IBOutlet UITableView *tableView; UIPopoverController *popoverController; id detailItem; + + BOOL restoreAccountView; } @property (nonatomic, retain) IBOutlet UITableView *tableView; @property (nonatomic, retain) id detailItem; @property (nonatomic, retain) UIPopoverController *popoverController; +@property (nonatomic, assign) BOOL restoreAccountView; +- (void)addButtonPressed:(id)sender; - (void)settingsButtonPressed:(id)sender; +- (void)restoreProviderView:(AccountDetailsViewController *)accountDetailsViewController; +- (void)restoreAccountView:(AccountSettingsViewController *)accountSettingsViewController; @end diff --git a/Classes/RootViewController.m b/Classes/RootViewController.m index 8de0b96..39e8df5 100755 --- a/Classes/RootViewController.m +++ b/Classes/RootViewController.m @@ -8,7 +8,6 @@ #import "RootViewController.h" #import "ProvidersViewController.h" -#import "AccountHomeViewController.h" #import "OpenStackAccount.h" #import "Provider.h" #import "Archiver.h" @@ -18,16 +17,42 @@ #import "Keychain.h" #import "PasscodeViewController.h" #import "OpenStackAppDelegate.h" +#import "AccountHomeViewController.h" @implementation RootViewController @synthesize tableView, popoverController, detailItem; +@synthesize restoreAccountView; - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait); } +- (void)restoreProviderView:(AccountDetailsViewController *)accountDetailsViewController { + OpenStackAppDelegate *app = [[UIApplication sharedApplication] delegate]; + ProvidersViewController *vc = [[ProvidersViewController alloc] initWithNibName:@"ProvidersViewController" bundle:nil]; + vc.rootViewController = self; + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + vc.modalPresentationStyle = UIModalPresentationFormSheet; + if (app.rootViewController.popoverController != nil) { + [app.rootViewController.popoverController dismissPopoverAnimated:YES]; + } + } + [self presentModalViewControllerWithNavigation:vc animated:NO]; + [vc restoreAccountDetailsViewController:accountDetailsViewController]; + [vc release]; +} + +- (void)restoreAccountView:(AccountSettingsViewController *)accountSettingsViewController { + AccountHomeViewController *vc = [[AccountHomeViewController alloc] initWithNibName:@"AccountHomeViewController" bundle:nil]; + vc.account = accountSettingsViewController.account; + vc.account.hasBeenRefreshed = NO; + vc.rootViewController = self; + [self.navigationController pushViewController:vc animated:YES]; + [vc release]; +} + #pragma mark - #pragma mark Split view support @@ -214,7 +239,7 @@ if (account.provider.logoURLs && [account.provider.logoURLs objectForKey:@"provider_icon"]) { cell.imageView.image = [UIImage imageNamed:[account.provider.logoURLs objectForKey:@"provider_icon"]]; } else { - cell.imageView.image = [UIImage imageNamed:@"openstack-icon.png"]; + cell.imageView.image = [UIImage imageNamed:@"pithos-solo-smallest.png"]; } return cell; diff --git a/Classes/StorageObjectViewController.xib b/Classes/StorageObjectViewController.xib index 412e50d..c5126a2 100755 --- a/Classes/StorageObjectViewController.xib +++ b/Classes/StorageObjectViewController.xib @@ -12,11 +12,9 @@ YES - IBUIBarButtonItem - IBUITableView - IBUIToolbar - IBUIView IBProxyObject + IBUIView + IBUITableView YES @@ -44,45 +42,11 @@ 292 YES - - - 266 - {{0, 416}, {320, 44}} - - - NO - NO - IBCocoaTouchFramework - - YES - - Home - IBCocoaTouchFramework - 1 - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - - 5 - - - - 2 - MC44MDc4NDMyMDgzIDAuMjAwMDAwMDE3OSAwLjE0OTAxOTYxMzkAA - - 274 - {320, 416} + {320, 460} - 10 @@ -132,7 +96,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA {320, 460} - 3 MQA @@ -156,14 +119,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA - toolbar - - - - 14 - - - tableView @@ -186,22 +141,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA 17 - - - homeButtonPressed: - - - - 28 - - - - homeButton - - - - 29 - @@ -229,7 +168,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA YES - @@ -238,32 +176,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA - - 10 - - - YES - - - - - - - - 11 - - - - - 12 - - - - - 27 - - - @@ -272,12 +184,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA YES -1.CustomClassName -2.CustomClassName - 10.IBEditorWindowLastContentRect - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 11.IBPluginDependency - 12.IBPluginDependency - 27.IBPluginDependency 8.IBEditorWindowLastContentRect 8.IBPluginDependency 9.IBEditorWindowLastContentRect @@ -288,14 +194,6 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA YES StorageObjectViewController UIResponder - {{0, 1101}, {320, 44}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw+UAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin {{823, 674}, {320, 460}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin {{329, 504}, {320, 480}} @@ -319,81 +217,7 @@ AAMAAAABAAEAAAFTAAMAAAAEAAACAgAAAAAACAAIAAgACAABAAEAAQABA 29 - - - YES - - OpenStackViewController - UIViewController - - toolbar - UIToolbar - - - toolbar - - toolbar - UIToolbar - - - - IBProjectSource - ./Classes/OpenStackViewController.h - - - - StorageObjectViewController - OpenStackViewController - - homeButtonPressed: - id - - - homeButtonPressed: - - homeButtonPressed: - id - - - - YES - - YES - homeButton - tableView - - - YES - UIBarButtonItem - UITableView - - - - YES - - YES - homeButton - tableView - - - YES - - homeButton - UIBarButtonItem - - - tableView - UITableView - - - - - IBProjectSource - ./Classes/StorageObjectViewController.h - - - - + 0 IBCocoaTouchFramework diff --git a/HomeFolderIcon.png b/HomeFolderIcon.png new file mode 100644 index 0000000..507bdf4 Binary files /dev/null and b/HomeFolderIcon.png differ diff --git a/MainWindow-Rackspace.xib b/MainWindow-Rackspace.xib index caf813b..3812211 100755 --- a/MainWindow-Rackspace.xib +++ b/MainWindow-Rackspace.xib @@ -2,17 +2,23 @@ 1024 - 10F569 - 804 - 1038.29 + 10K549 + 1306 + 1038.36 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 123 + 301 - + YES - + IBProxyObject + IBUINavigationController + IBUIViewController + IBUICustomObject + IBUIWindow + IBUINavigationBar + IBUINavigationItem YES @@ -23,9 +29,7 @@ YES - - YES - + YES @@ -41,10 +45,11 @@ IBCocoaTouchFramework - + 1316 {320, 480} + 10 @@ -9897,6 +9902,7 @@ AAEAAQABA + 1 1 IBCocoaTouchFramework @@ -9915,13 +9921,13 @@ AAEAAQABA YES - IBCocoaTouchFramework RootViewController + 1 1 IBCocoaTouchFramework @@ -10052,9 +10058,7 @@ AAEAAQABA YES - - YES - + {{673, 376}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -10067,391 +10071,18 @@ AAEAAQABA YES - - YES - + YES - - YES - + 21 - - - YES - - NSObject - - IBProjectSource - Classes/NSObject+Conveniences.h - - - - NSObject - - IBProjectSource - Classes/NSObject+SBJSON.h - - - - NSObject - - IBProjectSource - Classes/SBJsonWriter.h - - - - OpenStackAppDelegate - NSObject - - YES - - YES - navigationController - window - - - YES - UINavigationController - UIWindow - - - - YES - - YES - navigationController - window - - - YES - - navigationController - UINavigationController - - - window - UIWindow - - - - - IBProjectSource - Classes/OpenStackAppDelegate.h - - - - OpenStackViewController - UIViewController - - toolbar - UIToolbar - - - toolbar - - toolbar - UIToolbar - - - - IBProjectSource - Classes/OpenStackViewController.h - - - - RootViewController - OpenStackViewController - - settingsButtonPressed: - id - - - settingsButtonPressed: - - settingsButtonPressed: - id - - - - tableView - UITableView - - - tableView - - tableView - UITableView - - - - IBProjectSource - Classes/RootViewController.h - - - - UIViewController - - IBProjectSource - Classes/UIViewController+Conveniences.h - - - - UIWindow - UIView - - IBUserSource - - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UINavigationBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UINavigationBar.h - - - - UINavigationController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UINavigationItem - NSObject - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h - - - - + 0 IBCocoaTouchFramework @@ -10463,8 +10094,7 @@ AAEAAQABA YES - OpenStack.xcodeproj 3 - 123 + 301 diff --git a/MainWindow.xib b/MainWindow.xib index a12aff2..76e93e5 100755 --- a/MainWindow.xib +++ b/MainWindow.xib @@ -2,17 +2,23 @@ 1056 - 10J567 - 823 - 1038.35 - 462.00 + 10K549 + 1306 + 1038.36 + 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 + 301 - + YES - + IBProxyObject + IBUINavigationController + IBUIViewController + IBUICustomObject + IBUIWindow + IBUINavigationBar + IBUINavigationItem YES @@ -23,9 +29,7 @@ YES - - YES - + YES @@ -41,10 +45,12 @@ IBCocoaTouchFramework - + 1316 {320, 480} + + 10 @@ -9895,6 +9901,7 @@ AAEAAQABA + 1 1 IBCocoaTouchFramework @@ -9908,10 +9915,6 @@ AAEAAQABA YES IBCocoaTouchFramework 1 - - 2 - MC44MDc4NDMyMDgzIDAuMjAwMDAwMDE3OSAwLjE0OTAxOTYxMzkAA - YES @@ -9924,6 +9927,7 @@ AAEAAQABA RootViewController + 1 1 IBCocoaTouchFramework @@ -10054,9 +10058,7 @@ AAEAAQABA YES - - YES - + {{673, 376}, {320, 480}} com.apple.InterfaceBuilder.IBCocoaTouchPlugin @@ -10069,17 +10071,13 @@ AAEAAQABA YES - - YES - + YES - - YES - + 21 @@ -10088,27 +10086,6 @@ AAEAAQABA YES - NSObject - - IBProjectSource - Classes/NSObject+Conveniences.h - - - - NSObject - - IBProjectSource - Classes/NSObject+SBJSON.h - - - - NSObject - - IBProjectSource - Classes/SBJsonWriter.h - - - OpenStackAppDelegate NSObject @@ -10116,14 +10093,12 @@ AAEAAQABA YES navigationController - serviceUnavailableObserver splitViewController window YES UINavigationController - id UISplitViewController UIWindow @@ -10133,7 +10108,6 @@ AAEAAQABA YES navigationController - serviceUnavailableObserver splitViewController window @@ -10144,10 +10118,6 @@ AAEAAQABA UINavigationController - serviceUnavailableObserver - id - - splitViewController UISplitViewController @@ -10159,7 +10129,7 @@ AAEAAQABA IBProjectSource - Classes/OpenStackAppDelegate.h + ./Classes/OpenStackAppDelegate.h @@ -10178,346 +10148,26 @@ AAEAAQABA IBProjectSource - Classes/OpenStackViewController.h + ./Classes/OpenStackViewController.h RootViewController OpenStackViewController - - settingsButtonPressed: - id - - - settingsButtonPressed: - - settingsButtonPressed: - id - - - YES - - YES - detailItem - tableView - - - YES - id - UITableView - + tableView + UITableView - YES - - YES - detailItem - tableView - - - YES - - detailItem - id - - - tableView - UITableView - + tableView + + tableView + UITableView IBProjectSource - Classes/RootViewController.h - - - - UIViewController - - IBProjectSource - Classes/UIViewController+Conveniences.h - - - - UIWindow - UIView - - IBUserSource - - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UINavigationBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UINavigationBar.h - - - - UINavigationController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UINavigationItem - NSObject - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UISplitViewController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - MediaPlayer.framework/Headers/MPMoviePlayerViewController.h - - - - UIViewController - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h + ./Classes/RootViewController.h @@ -10533,8 +10183,7 @@ AAEAAQABA YES - OpenStack.xcodeproj 3 - 132 + 301 diff --git a/Metadata.gif b/Metadata.gif deleted file mode 100644 index f9614cd..0000000 Binary files a/Metadata.gif and /dev/null differ diff --git a/OpenStack-Info.plist b/OpenStack-Info.plist index fe686f7..8638128 100755 --- a/OpenStack-Info.plist +++ b/OpenStack-Info.plist @@ -28,7 +28,16 @@ CFBundleSignature ???? CFBundleURLTypes - + + + CFBundleURLName + gr.grnet.pithos-ios + CFBundleURLSchemes + + pithos + + + CFBundleVersion 1.0 LSRequiresIPhoneOS @@ -37,8 +46,10 @@ MainWindow NSMainNibFile~ipad MainWindow-iPad + PithosLoginURLPrefix + https://pithos.dev.grnet.gr/login UIApplicationExitsOnSuspend - + UIFileSharingEnabled UISupportedInterfaceOrientations~ipad diff --git a/OpenStack.xcodeproj/project.pbxproj b/OpenStack.xcodeproj/project.pbxproj index 5d54a6c..49b5802 100755 --- a/OpenStack.xcodeproj/project.pbxproj +++ b/OpenStack.xcodeproj/project.pbxproj @@ -9,6 +9,8 @@ /* Begin PBXBuildFile section */ 1D3623260D0F684500981E51 /* OpenStackAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D3623250D0F684500981E51 /* OpenStackAppDelegate.m */; }; 1D60589B0D05DD56006BFB54 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; }; + 243EB0A8145570700081D12A /* pithos-solo-small.png in Resources */ = {isa = PBXBuildFile; fileRef = 243EB0A7145570700081D12A /* pithos-solo-small.png */; }; + 243EB0AA145570E70081D12A /* pithos-solo-smallest.png in Resources */ = {isa = PBXBuildFile; fileRef = 243EB0A9145570E70081D12A /* pithos-solo-smallest.png */; }; 2485477B1446D36800E48921 /* EditPermissionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 248547791446D36800E48921 /* EditPermissionsViewController.m */; }; 2485477C1446D36800E48921 /* EditPermissionsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2485477A1446D36800E48921 /* EditPermissionsViewController.xib */; }; 2485478914473CBB00E48921 /* EditPolicyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2485478714473CBA00E48921 /* EditPolicyViewController.m */; }; @@ -24,8 +26,8 @@ 24AD830A144ED91E000BF73A /* pithos-logo-large.png in Resources */ = {isa = PBXBuildFile; fileRef = 24AD8309144ED91E000BF73A /* pithos-logo-large.png */; }; 24AD830E144EDD20000BF73A /* PithosImageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 24AD830C144EDD20000BF73A /* PithosImageViewController.m */; }; 24AD830F144EDD20000BF73A /* PithosImageViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 24AD830D144EDD20000BF73A /* PithosImageViewController.xib */; }; - 24AD832814502B0D000BF73A /* Metadata.gif in Resources */ = {isa = PBXBuildFile; fileRef = 24AD832714502B0D000BF73A /* Metadata.gif */; }; 24E040051442FB3C0065E8DB /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 24E040041442FB3C0065E8DB /* libz.dylib */; }; + 24ED1B5E1455A893005A4634 /* HomeFolderIcon.png in Resources */ = {isa = PBXBuildFile; fileRef = 24ED1B5D1455A893005A4634 /* HomeFolderIcon.png */; }; 2705F3EB12E7FA5900949131 /* RSTextFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2705F3E912E7FA5900949131 /* RSTextFieldCell.m */; }; 2705F3ED12E7FA5900949131 /* RSTextFieldCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2705F3E912E7FA5900949131 /* RSTextFieldCell.m */; }; 270878F213282104006D4EE3 /* NSObject+NSCoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 270878F013282104006D4EE3 /* NSObject+NSCoding.m */; }; @@ -1086,6 +1088,8 @@ 1D3623240D0F684500981E51 /* OpenStackAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenStackAppDelegate.h; sourceTree = ""; }; 1D3623250D0F684500981E51 /* OpenStackAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OpenStackAppDelegate.m; sourceTree = ""; }; 1D6058910D05DD3D006BFB54 /* OpenStack.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = OpenStack.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 243EB0A7145570700081D12A /* pithos-solo-small.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pithos-solo-small.png"; sourceTree = ""; }; + 243EB0A9145570E70081D12A /* pithos-solo-smallest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pithos-solo-smallest.png"; sourceTree = ""; }; 248547781446D36700E48921 /* EditPermissionsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EditPermissionsViewController.h; sourceTree = ""; }; 248547791446D36800E48921 /* EditPermissionsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EditPermissionsViewController.m; sourceTree = ""; }; 2485477A1446D36800E48921 /* EditPermissionsViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = EditPermissionsViewController.xib; sourceTree = ""; }; @@ -1108,8 +1112,8 @@ 24AD830B144EDD20000BF73A /* PithosImageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PithosImageViewController.h; sourceTree = ""; }; 24AD830C144EDD20000BF73A /* PithosImageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PithosImageViewController.m; sourceTree = ""; }; 24AD830D144EDD20000BF73A /* PithosImageViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PithosImageViewController.xib; sourceTree = ""; }; - 24AD832714502B0D000BF73A /* Metadata.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = Metadata.gif; sourceTree = ""; }; 24E040041442FB3C0065E8DB /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; + 24ED1B5D1455A893005A4634 /* HomeFolderIcon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = HomeFolderIcon.png; sourceTree = ""; }; 2705F3E812E7FA5900949131 /* RSTextFieldCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RSTextFieldCell.h; sourceTree = ""; }; 2705F3E912E7FA5900949131 /* RSTextFieldCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RSTextFieldCell.m; sourceTree = ""; }; 270878EF13282104006D4EE3 /* NSObject+NSCoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+NSCoding.h"; sourceTree = ""; }; @@ -1872,6 +1876,15 @@ name = Products; sourceTree = ""; }; + 243EB0A6145570550081D12A /* Pithos */ = { + isa = PBXGroup; + children = ( + 243EB0A7145570700081D12A /* pithos-solo-small.png */, + 243EB0A9145570E70081D12A /* pithos-solo-smallest.png */, + ); + name = Pithos; + sourceTree = ""; + }; 24AD82FF144ED6C9000BF73A /* Pithos */ = { isa = PBXGroup; children = ( @@ -1922,7 +1935,7 @@ 2768678C1368D39700B04AF3 /* rss-feeds-icon.png */, 2768678D1368D39700B04AF3 /* rss-feeds-icon@2x.png */, 24AD8309144ED91E000BF73A /* pithos-logo-large.png */, - 24AD832714502B0D000BF73A /* Metadata.gif */, + 24ED1B5D1455A893005A4634 /* HomeFolderIcon.png */, ); name = "Account Home"; sourceTree = ""; @@ -2685,6 +2698,7 @@ 2798A89F125E600400E02475 /* Logos */ = { isa = PBXGroup; children = ( + 243EB0A6145570550081D12A /* Pithos */, 27828C7D125A9D1500004D33 /* OpenStack */, 2798A8A8125E606600E02475 /* Rackspace Cloud */, ); @@ -3741,7 +3755,9 @@ 248547BC144C614D00E48921 /* EditAccountGroupsViewController.xib in Resources */, 24AD830A144ED91E000BF73A /* pithos-logo-large.png in Resources */, 24AD830F144EDD20000BF73A /* PithosImageViewController.xib in Resources */, - 24AD832814502B0D000BF73A /* Metadata.gif in Resources */, + 243EB0A8145570700081D12A /* pithos-solo-small.png in Resources */, + 243EB0AA145570E70081D12A /* pithos-solo-smallest.png in Resources */, + 24ED1B5E1455A893005A4634 /* HomeFolderIcon.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Resources-iPad/MainWindow-iPad.xib b/Resources-iPad/MainWindow-iPad.xib index da092e4..579fd54 100755 --- a/Resources-iPad/MainWindow-iPad.xib +++ b/Resources-iPad/MainWindow-iPad.xib @@ -2,16 +2,25 @@ 1056 - 10J567 - 823 - 1038.35 - 462.00 + 10K549 + 1306 + 1038.36 + 461.00 com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 + 301 - + YES + IBProxyObject + IBUINavigationController + IBUIViewController + IBUICustomObject + IBUISplitViewController + IBUIWindow + IBUINavigationBar + IBUINavigationItem + IBUITableViewController YES @@ -22,9 +31,7 @@ YES - - YES - + YES @@ -40,10 +47,12 @@ IBIPadFramework - + 1316 {768, 1024} + + 10 @@ -9896,6 +9905,7 @@ AAEAAQABA + 1 1 IBIPadFramework @@ -9908,21 +9918,20 @@ AAEAAQABA YES YES IBIPadFramework - - 2 - MC44MDc4NDMyMDgzIDAuMjAwMDAwMDE3OSAwLjE0OTAxOTYxMzkAA - + 1 YES + IBIPadFramework RootViewController + 1 1 IBIPadFramework @@ -9936,6 +9945,7 @@ AAEAAQABA 2 + 3 3 IBIPadFramework @@ -9946,6 +9956,7 @@ AAEAAQABA 2 + 1 1 IBIPadFramework @@ -9971,6 +9982,7 @@ AAEAAQABA 2 + 1 1 IBIPadFramework @@ -9984,6 +9996,7 @@ AAEAAQABA AboutViewController + 1 1 IBIPadFramework @@ -10197,9 +10210,7 @@ AAEAAQABA YES - - YES - + {{129, 132}, {768, 1024}} @@ -10229,17 +10240,13 @@ AAEAAQABA YES - - YES - + YES - - YES - + 36 @@ -10248,27 +10255,6 @@ AAEAAQABA YES - NSObject - - IBProjectSource - Classes/NSObject+Conveniences.h - - - - NSObject - - IBProjectSource - Classes/NSObject+SBJSON.h - - - - NSObject - - IBProjectSource - Classes/SBJsonWriter.h - - - OpenStackAppDelegate NSObject @@ -10276,14 +10262,12 @@ AAEAAQABA YES navigationController - serviceUnavailableObserver splitViewController window YES UINavigationController - id UISplitViewController UIWindow @@ -10293,7 +10277,6 @@ AAEAAQABA YES navigationController - serviceUnavailableObserver splitViewController window @@ -10304,10 +10287,6 @@ AAEAAQABA UINavigationController - serviceUnavailableObserver - id - - splitViewController UISplitViewController @@ -10319,7 +10298,7 @@ AAEAAQABA IBProjectSource - Classes/OpenStackAppDelegate.h + ./Classes/OpenStackAppDelegate.h @@ -10338,354 +10317,26 @@ AAEAAQABA IBProjectSource - Classes/OpenStackViewController.h + ./Classes/OpenStackViewController.h RootViewController OpenStackViewController - - settingsButtonPressed: - id - - - settingsButtonPressed: - - settingsButtonPressed: - id - - - YES - - YES - detailItem - tableView - - - YES - id - UITableView - + tableView + UITableView - YES - - YES - detailItem - tableView - - - YES - - detailItem - id - - - tableView - UITableView - + tableView + + tableView + UITableView IBProjectSource - Classes/RootViewController.h - - - - UIViewController - - IBProjectSource - Classes/UIViewController+Conveniences.h - - - - UIWindow - UIView - - IBUserSource - - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIApplication - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIApplication.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UINavigationBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UINavigationBar.h - - - - UINavigationController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UINavigationItem - NSObject - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UISplitViewController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UITableViewController - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITableViewController.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - MediaPlayer.framework/Headers/MPMoviePlayerViewController.h - - - - UIViewController - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - UIWindow - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIWindow.h + ./Classes/RootViewController.h @@ -10701,8 +10352,7 @@ AAEAAQABA YES - ../OpenStack.xcodeproj 3 - 132 + 301 diff --git a/openstack_providers.json b/openstack_providers.json index b9c367a..f6d9571 100755 --- a/openstack_providers.json +++ b/openstack_providers.json @@ -1,64 +1,7 @@ { "providers": [ { - "name": "Rackspace Cloud (US)", - "auth_endpoint_url": "https://auth.api.rackspacecloud.com/v1.0", - "auth_help_message": "Your API Key is available at manage.rackspacecloud.com", - "bar_style": "black", - "rss_feeds": [ - { "name": "Cloud Servers Status", "url": "feed://status.rackspacecloud.com/cloudservers/rss.xml", "logo": "cloud-servers-icon.png" }, - { "name": "Cloud Files Status", "url": "feed://status.clouddrive.com/?feed=rss2", "logo": "cloud-files-icon.png" } - ], - "contact_urls": [ - { "name": "US Phone Support", "url": "tel://8779340407" }, - { "name": "UK Phone Support", "url": "tel://08000833012" }, - { "name": "Rackspace on Twitter", "url": "http://twitter.com/rackspace" } - ], - "product_names": { - "compute": "Cloud Servers", - "compute_short_plural": "servers", - "compute_short_singular": "server", - "storage": "Cloud Files" - }, - "logos": { - "provider_icon": "rackspacecloud_icon.png", - "provider_icon_2x": "rackspacecloud_icon@2x.png", - "provider_large": "url to 1000x1000 logo", - "compute_icon": "35x35 compute logo", - "compute_icon_2x": "70x70 compute logo", - "compute_logo": "1000x1000 compute logo", - "storage_icon": "35x35 storage logo", - "storage_icon_2x": "70x70 storage logo", - "storage_logo": "1000x1000 storage logo" - } - }, - { - "name": "Rackspace Cloud (UK)", - "auth_endpoint_url": "https://lon.auth.api.rackspacecloud.com/v1.0", - "auth_help_message": "Your API Key is available at lon.manage.rackspacecloud.com", - "bar_style": "black", - "rss_feeds": [ - { "name": "Cloud Servers Status", "url": "feed://status.rackspacecloud.com/cloudservers/rss.xml", "logo": "cloud-servers-icon.png" }, - { "name": "Cloud Files Status", "url": "feed://status.clouddrive.com/?feed=rss2", "logo": "cloud-files-icon.png" } - ], - "contact_urls": [ - { "name": "UK Phone Support", "url": "tel://08000833012" }, - { "name": "US Phone Support", "url": "tel://8779340407" }, - { "name": "Rackspace on Twitter", "url": "http://twitter.com/rackspace" } - ], - "product_names": { - "compute": "Cloud Servers", - "storage": "Cloud Files" - }, - "logos": { - "provider_icon": "rackspacecloud_icon.png", - "provider_icon_2x": "rackspacecloud_icon@2x.png", - "provider_large": "url to 1000x1000 logo", - "compute_icon": "35x35 compute logo", - "compute_icon_2x": "70x70 compute logo", - "compute_logo": "1000x1000 compute logo", - "storage_icon": "35x35 storage logo", - "storage_icon_2x": "70x70 storage logo", - "storage_logo": "1000x1000 storage logo" - } + "name": "GRNet", + "auth_endpoint_url": "https://pithos.dev.grnet.gr/v1", + "bar_style": "black" } ] } \ No newline at end of file diff --git a/pithos-solo-small.png b/pithos-solo-small.png new file mode 100644 index 0000000..2b76dd5 Binary files /dev/null and b/pithos-solo-small.png differ diff --git a/pithos-solo-smallest.png b/pithos-solo-smallest.png new file mode 100644 index 0000000..53fb99e Binary files /dev/null and b/pithos-solo-smallest.png differ