Statistics
| Branch: | Tag: | Revision:

root / Classes / ServerViewController.m @ 4b4b833e

History | View | Annotate | Download (58.1 kB)

1 700184fb Miltiadis Vasilakis
//
2 700184fb Miltiadis Vasilakis
//  ServerViewController.m
3 700184fb Miltiadis Vasilakis
//  OpenStack
4 700184fb Miltiadis Vasilakis
//
5 700184fb Miltiadis Vasilakis
//  Created by Mike Mayo on 10/7/10.
6 700184fb Miltiadis Vasilakis
//  The OpenStack project is provided under the Apache 2.0 license.
7 700184fb Miltiadis Vasilakis
//
8 700184fb Miltiadis Vasilakis
9 700184fb Miltiadis Vasilakis
#import "ServerViewController.h"
10 700184fb Miltiadis Vasilakis
#import "Server.h"
11 700184fb Miltiadis Vasilakis
#import "OpenStackAccount.h"
12 700184fb Miltiadis Vasilakis
#import "Image.h"
13 700184fb Miltiadis Vasilakis
#import "Flavor.h"
14 700184fb Miltiadis Vasilakis
#import "UIViewController+Conveniences.h"
15 700184fb Miltiadis Vasilakis
#import "PingIPAddressViewController.h"
16 700184fb Miltiadis Vasilakis
#import "RenameServerViewController.h"
17 700184fb Miltiadis Vasilakis
#import "ResetServerAdminPasswordViewController.h"
18 700184fb Miltiadis Vasilakis
#import "AccountManager.h"
19 700184fb Miltiadis Vasilakis
#import "NSObject+Conveniences.h"
20 700184fb Miltiadis Vasilakis
#import "ServersViewController.h"
21 700184fb Miltiadis Vasilakis
#import "ResizeServerViewController.h"
22 700184fb Miltiadis Vasilakis
#import "RebuildServerViewController.h"
23 700184fb Miltiadis Vasilakis
#import "AnimatedProgressView.h"
24 700184fb Miltiadis Vasilakis
#import "OpenStackRequest.h"
25 700184fb Miltiadis Vasilakis
#import "RateLimit.h"
26 700184fb Miltiadis Vasilakis
#import "ManageBackupScheduleViewController.h"
27 700184fb Miltiadis Vasilakis
#import "SimpleImagePickerViewController.h"
28 700184fb Miltiadis Vasilakis
#import "UIColor+MoreColors.h"
29 700184fb Miltiadis Vasilakis
#import <QuartzCore/QuartzCore.h>
30 700184fb Miltiadis Vasilakis
#import "AccountHomeViewController.h"
31 700184fb Miltiadis Vasilakis
#import "ServersOnHostViewController.h"
32 700184fb Miltiadis Vasilakis
#import "NameAndStatusTitleView.h"
33 700184fb Miltiadis Vasilakis
#import "APICallback.h"
34 700184fb Miltiadis Vasilakis
#import "Provider.h"
35 700184fb Miltiadis Vasilakis
#import "Analytics.h"
36 700184fb Miltiadis Vasilakis
37 700184fb Miltiadis Vasilakis
// TODO: bring back host id section as "n servers on this (physical) host"
38 700184fb Miltiadis Vasilakis
39 700184fb Miltiadis Vasilakis
@implementation ServerViewController
40 700184fb Miltiadis Vasilakis
41 700184fb Miltiadis Vasilakis
@synthesize server, account, tableView, selectedIPAddressIndexPath, serversViewController, selectedServerIndexPath, accountHomeViewController;
42 700184fb Miltiadis Vasilakis
43 700184fb Miltiadis Vasilakis
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
44 700184fb Miltiadis Vasilakis
    //CGPoint point = scrollView.contentOffset;
45 700184fb Miltiadis Vasilakis
    //CGRect tr = titleView.frame;
46 700184fb Miltiadis Vasilakis
    //CGRect ar = actionView.frame;
47 700184fb Miltiadis Vasilakis
    /*
48 700184fb Miltiadis Vasilakis
    if (previousScrollPoint.y - point.y < 0) {
49 700184fb Miltiadis Vasilakis
        titleView.frame = CGRectMake(tr.origin.x, (previousScrollPoint.y - point.y) / 3.0, tr.size.width, tr.size.height);
50 700184fb Miltiadis Vasilakis
        actionView.frame = CGRectMake(ar.origin.x, 64 + ((previousScrollPoint.y - point.y) / 2.0), ar.size.width, ar.size.height);
51 700184fb Miltiadis Vasilakis
    }
52 700184fb Miltiadis Vasilakis
    */
53 700184fb Miltiadis Vasilakis
    [UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionAllowUserInteraction animations:^{
54 700184fb Miltiadis Vasilakis
        CGRect tr = titleView.frame;
55 700184fb Miltiadis Vasilakis
        CGRect ar = actionView.frame;
56 700184fb Miltiadis Vasilakis
        
57 700184fb Miltiadis Vasilakis
        if (self.tableView.contentOffset.y >= 150) {
58 700184fb Miltiadis Vasilakis
            tr.origin.y = -67;
59 700184fb Miltiadis Vasilakis
            ar.origin.y = -136.0;
60 700184fb Miltiadis Vasilakis
        } else {
61 700184fb Miltiadis Vasilakis
            tr.origin.y = 0;
62 700184fb Miltiadis Vasilakis
            ar.origin.y = 64;
63 700184fb Miltiadis Vasilakis
        }
64 700184fb Miltiadis Vasilakis
        titleView.frame = tr;
65 700184fb Miltiadis Vasilakis
        actionView.frame = ar;
66 700184fb Miltiadis Vasilakis
    } completion:^(BOOL finished) {
67 700184fb Miltiadis Vasilakis
    }];
68 700184fb Miltiadis Vasilakis
    
69 700184fb Miltiadis Vasilakis
}
70 700184fb Miltiadis Vasilakis
71 700184fb Miltiadis Vasilakis
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
72 700184fb Miltiadis Vasilakis
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) || (toInterfaceOrientation == UIInterfaceOrientationPortrait);
73 700184fb Miltiadis Vasilakis
}
74 700184fb Miltiadis Vasilakis
75 700184fb Miltiadis Vasilakis
- (void)setParallaxViews {
76 700184fb Miltiadis Vasilakis
    
77 700184fb Miltiadis Vasilakis
    if (!titleView) {    
78 700184fb Miltiadis Vasilakis
        // make an offset for the table
79 700184fb Miltiadis Vasilakis
        self.tableView.tableHeaderView = [[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 134.0)] autorelease];
80 700184fb Miltiadis Vasilakis
81 700184fb Miltiadis Vasilakis
        NSString *logoFilename = @"";
82 700184fb Miltiadis Vasilakis
        if ([self.server.image respondsToSelector:@selector(logoPrefix)]) {
83 700184fb Miltiadis Vasilakis
            logoFilename = [[self.server.image logoPrefix] stringByAppendingString:@"-icon.png"];
84 700184fb Miltiadis Vasilakis
        }
85 700184fb Miltiadis Vasilakis
        
86 700184fb Miltiadis Vasilakis
        titleView = [[NameAndStatusTitleView alloc] initWithEntity:self.server logoFilename:logoFilename];
87 700184fb Miltiadis Vasilakis
        [self.view addSubview:titleView];
88 700184fb Miltiadis Vasilakis
        [titleView setNeedsDisplay];
89 700184fb Miltiadis Vasilakis
    }
90 700184fb Miltiadis Vasilakis
    
91 700184fb Miltiadis Vasilakis
    actionView.backgroundColor = [UIColor colorWithRed:0.929 green:0.929 blue:0.929 alpha:1];
92 700184fb Miltiadis Vasilakis
    actionView.clipsToBounds = NO;
93 700184fb Miltiadis Vasilakis
    [actionView.layer setShadowColor:[[UIColor blackColor] CGColor]];
94 700184fb Miltiadis Vasilakis
    [actionView.layer setShadowRadius:2.0f];
95 700184fb Miltiadis Vasilakis
    [actionView.layer setShadowOffset:CGSizeMake(1, 1)];
96 700184fb Miltiadis Vasilakis
    [actionView.layer setShadowOpacity:0.8f];
97 700184fb Miltiadis Vasilakis
    
98 700184fb Miltiadis Vasilakis
    /*
99 700184fb Miltiadis Vasilakis
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
100 700184fb Miltiadis Vasilakis
        // line up the action buttons with the table view on iPad
101 700184fb Miltiadis Vasilakis
        CGRect rebootFrame = rebootButton.frame;
102 700184fb Miltiadis Vasilakis
        rebootFrame.origin.x += 14;
103 700184fb Miltiadis Vasilakis
        rebootButton.frame = rebootFrame;
104 700184fb Miltiadis Vasilakis
    }
105 700184fb Miltiadis Vasilakis
     */
106 700184fb Miltiadis Vasilakis
    
107 700184fb Miltiadis Vasilakis
    
108 700184fb Miltiadis Vasilakis
    [self scrollViewDidScroll:self.tableView];
109 700184fb Miltiadis Vasilakis
}
110 700184fb Miltiadis Vasilakis
111 700184fb Miltiadis Vasilakis
- (void)setBackgroundView {
112 700184fb Miltiadis Vasilakis
    if (self.server) {
113 700184fb Miltiadis Vasilakis
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
114 700184fb Miltiadis Vasilakis
            UIView *backgroundContainer = [[UIView alloc] init];
115 700184fb Miltiadis Vasilakis
            backgroundContainer.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
116 700184fb Miltiadis Vasilakis
            backgroundContainer.backgroundColor = [UIColor iPadTableBackgroundColor];
117 700184fb Miltiadis Vasilakis
            
118 700184fb Miltiadis Vasilakis
            NSString *logoFilename = @"";
119 700184fb Miltiadis Vasilakis
            if ([self.server.image respondsToSelector:@selector(logoPrefix)]) {
120 700184fb Miltiadis Vasilakis
                logoFilename = [[self.server.image logoPrefix] stringByAppendingString:@"-large.png"];
121 700184fb Miltiadis Vasilakis
            }
122 700184fb Miltiadis Vasilakis
            
123 700184fb Miltiadis Vasilakis
            UIImageView *osLogo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:logoFilename]];
124 700184fb Miltiadis Vasilakis
            osLogo.contentMode = UIViewContentModeScaleAspectFit;
125 700184fb Miltiadis Vasilakis
            osLogo.frame = CGRectMake(100.0, 100.0, 1000.0, 1000.0);
126 700184fb Miltiadis Vasilakis
            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
127 700184fb Miltiadis Vasilakis
                osLogo.alpha = 0.3;        
128 700184fb Miltiadis Vasilakis
            }
129 700184fb Miltiadis Vasilakis
            
130 700184fb Miltiadis Vasilakis
            [backgroundContainer addSubview:osLogo];
131 700184fb Miltiadis Vasilakis
            [osLogo release];
132 700184fb Miltiadis Vasilakis
            
133 700184fb Miltiadis Vasilakis
            tableView.backgroundView = backgroundContainer;
134 700184fb Miltiadis Vasilakis
            [backgroundContainer release];
135 700184fb Miltiadis Vasilakis
            
136 700184fb Miltiadis Vasilakis
        } else { 
137 700184fb Miltiadis Vasilakis
            self.tableView.backgroundView = nil;
138 700184fb Miltiadis Vasilakis
            /*
139 700184fb Miltiadis Vasilakis
            NSString *logoFilename = [[server.image logoPrefix] stringByAppendingString:@"-large.png"];    
140 700184fb Miltiadis Vasilakis
            UIImageView *osLogo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:logoFilename]];
141 700184fb Miltiadis Vasilakis
            osLogo.contentMode = UIViewContentModeScaleAspectFit;
142 700184fb Miltiadis Vasilakis
            osLogo.frame = CGRectMake(0.0, 0.0, 320.0, 480.0);
143 700184fb Miltiadis Vasilakis
            tableView.backgroundView = osLogo;
144 700184fb Miltiadis Vasilakis
            [osLogo release];
145 700184fb Miltiadis Vasilakis
             */
146 700184fb Miltiadis Vasilakis
        }
147 700184fb Miltiadis Vasilakis
    } else {
148 700184fb Miltiadis Vasilakis
        UIView *container = [[UIView alloc] init];
149 700184fb Miltiadis Vasilakis
        container.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
150 700184fb Miltiadis Vasilakis
        container.backgroundColor = [UIColor iPadTableBackgroundColor];
151 700184fb Miltiadis Vasilakis
152 700184fb Miltiadis Vasilakis
        UILabel *label = [[UILabel alloc] init];
153 700184fb Miltiadis Vasilakis
        label.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
154 700184fb Miltiadis Vasilakis
        label.backgroundColor = [UIColor clearColor];
155 700184fb Miltiadis Vasilakis
        label.textColor = [UIColor emptyCollectionGrayColor];
156 700184fb Miltiadis Vasilakis
        label.font = [UIFont boldSystemFontOfSize:18.0];
157 700184fb Miltiadis Vasilakis
        label.text = @"No server selected";
158 700184fb Miltiadis Vasilakis
        label.textAlignment = UITextAlignmentCenter;
159 700184fb Miltiadis Vasilakis
        [container addSubview:label];
160 700184fb Miltiadis Vasilakis
        [label release];
161 700184fb Miltiadis Vasilakis
        
162 700184fb Miltiadis Vasilakis
        tableView.backgroundView = container;
163 700184fb Miltiadis Vasilakis
        [container release];
164 700184fb Miltiadis Vasilakis
    }
165 700184fb Miltiadis Vasilakis
}
166 700184fb Miltiadis Vasilakis
167 700184fb Miltiadis Vasilakis
- (void)refreshCountdownLabels:(NSTimer *)timer {
168 700184fb Miltiadis Vasilakis
    [self refreshLimitStrings]; 
169 700184fb Miltiadis Vasilakis
    
170 700184fb Miltiadis Vasilakis
    if (actionsExpanded) {
171 700184fb Miltiadis Vasilakis
        NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
172 700184fb Miltiadis Vasilakis
        
173 700184fb Miltiadis Vasilakis
        if (![rebootCountdown isEqualToString:@""]) {
174 700184fb Miltiadis Vasilakis
            [indexPaths addObject:[NSIndexPath indexPathForRow:kReboot inSection:kActions]];
175 700184fb Miltiadis Vasilakis
        }
176 700184fb Miltiadis Vasilakis
        if (![renameCountdown isEqualToString:@""]) {
177 700184fb Miltiadis Vasilakis
            [indexPaths addObject:[NSIndexPath indexPathForRow:kRename inSection:kActions]];
178 700184fb Miltiadis Vasilakis
        }
179 700184fb Miltiadis Vasilakis
        if (![resizeCountdown isEqualToString:@""]) {
180 700184fb Miltiadis Vasilakis
            [indexPaths addObject:[NSIndexPath indexPathForRow:kResize inSection:kActions]];
181 700184fb Miltiadis Vasilakis
        }
182 700184fb Miltiadis Vasilakis
        if (![changePasswordCountdown isEqualToString:@""]) {
183 700184fb Miltiadis Vasilakis
            [indexPaths addObject:[NSIndexPath indexPathForRow:kChangePassword inSection:kActions]];
184 700184fb Miltiadis Vasilakis
        }
185 700184fb Miltiadis Vasilakis
        if (![backupsCountdown isEqualToString:@""]) {
186 700184fb Miltiadis Vasilakis
            [indexPaths addObject:[NSIndexPath indexPathForRow:kBackups inSection:kActions]];
187 700184fb Miltiadis Vasilakis
        }
188 700184fb Miltiadis Vasilakis
        if (![rebuildCountdown isEqualToString:@""]) {
189 700184fb Miltiadis Vasilakis
            [indexPaths addObject:[NSIndexPath indexPathForRow:kRebuild inSection:kActions]];
190 700184fb Miltiadis Vasilakis
        }
191 700184fb Miltiadis Vasilakis
        if (![deleteCountdown isEqualToString:@""]) {
192 700184fb Miltiadis Vasilakis
            [indexPaths addObject:[NSIndexPath indexPathForRow:kDelete inSection:kActions]];
193 700184fb Miltiadis Vasilakis
        }
194 700184fb Miltiadis Vasilakis
195 700184fb Miltiadis Vasilakis
        [self.tableView reloadData];
196 700184fb Miltiadis Vasilakis
        [indexPaths release];        
197 700184fb Miltiadis Vasilakis
    }
198 700184fb Miltiadis Vasilakis
199 700184fb Miltiadis Vasilakis
}
200 700184fb Miltiadis Vasilakis
201 700184fb Miltiadis Vasilakis
- (void)refreshLimitStrings {
202 700184fb Miltiadis Vasilakis
203 700184fb Miltiadis Vasilakis
    RateLimit *rebootLimit = [OpenStackRequest softRebootServerLimit:self.account server:self.server];
204 700184fb Miltiadis Vasilakis
    if (rebootLimit && rebootLimit.remaining == 0) {
205 700184fb Miltiadis Vasilakis
        rebootCountdown = [ServerViewController timeUntilDate:rebootLimit.resetTime];
206 700184fb Miltiadis Vasilakis
    }    
207 700184fb Miltiadis Vasilakis
    
208 700184fb Miltiadis Vasilakis
    RateLimit *renameLimit = [OpenStackRequest renameServerLimit:self.account server:self.server];
209 700184fb Miltiadis Vasilakis
    if (renameLimit && renameLimit.remaining == 0) {
210 700184fb Miltiadis Vasilakis
        renameCountdown = [ServerViewController timeUntilDate:renameLimit.resetTime];
211 700184fb Miltiadis Vasilakis
    }
212 700184fb Miltiadis Vasilakis
213 700184fb Miltiadis Vasilakis
    RateLimit *resizeLimit = [OpenStackRequest resizeServerLimit:self.account server:self.server];
214 700184fb Miltiadis Vasilakis
    if (resizeLimit && resizeLimit.remaining == 0) {
215 700184fb Miltiadis Vasilakis
        resizeCountdown = [ServerViewController timeUntilDate:resizeLimit.resetTime];
216 700184fb Miltiadis Vasilakis
    }
217 700184fb Miltiadis Vasilakis
    
218 700184fb Miltiadis Vasilakis
    RateLimit *changePasswordLimit = [OpenStackRequest changeServerAdminPasswordLimit:self.account server:self.server];
219 700184fb Miltiadis Vasilakis
    if (changePasswordLimit && changePasswordLimit.remaining == 0) {
220 700184fb Miltiadis Vasilakis
        changePasswordCountdown = [ServerViewController timeUntilDate:changePasswordLimit.resetTime];
221 700184fb Miltiadis Vasilakis
    }
222 700184fb Miltiadis Vasilakis
223 700184fb Miltiadis Vasilakis
    RateLimit *backupsLimit = [OpenStackRequest updateBackupScheduleLimit:self.account server:self.server];
224 700184fb Miltiadis Vasilakis
    if (backupsLimit && backupsLimit.remaining == 0) {
225 700184fb Miltiadis Vasilakis
        backupsCountdown = [ServerViewController timeUntilDate:backupsLimit.resetTime];
226 700184fb Miltiadis Vasilakis
    }
227 700184fb Miltiadis Vasilakis
228 700184fb Miltiadis Vasilakis
    RateLimit *rebuildLimit = nil; // [OpenStackRequest rebuildServerLimit:self.account server:self.server];
229 700184fb Miltiadis Vasilakis
    if (rebuildLimit && rebuildLimit.remaining == 0) {
230 700184fb Miltiadis Vasilakis
        rebuildCountdown = [ServerViewController timeUntilDate:rebuildLimit.resetTime];
231 700184fb Miltiadis Vasilakis
    }
232 700184fb Miltiadis Vasilakis
233 700184fb Miltiadis Vasilakis
    RateLimit *deleteLimit = [OpenStackRequest deleteServerLimit:self.account server:self.server];
234 700184fb Miltiadis Vasilakis
    if (deleteLimit && deleteLimit.remaining == 0) {
235 700184fb Miltiadis Vasilakis
        deleteCountdown = [ServerViewController timeUntilDate:deleteLimit.resetTime];
236 700184fb Miltiadis Vasilakis
    }
237 700184fb Miltiadis Vasilakis
}
238 700184fb Miltiadis Vasilakis
239 700184fb Miltiadis Vasilakis
- (void)pollServer {
240 700184fb Miltiadis Vasilakis
    pollRequest = [OpenStackRequest getServerRequest:self.account serverId:self.server.identifier];
241 700184fb Miltiadis Vasilakis
    polling = YES;
242 700184fb Miltiadis Vasilakis
    pollRequest.delegate = self;
243 700184fb Miltiadis Vasilakis
    pollRequest.didFinishSelector = @selector(getServerSucceeded:);
244 700184fb Miltiadis Vasilakis
    pollRequest.didFailSelector = @selector(getServerFailed:);
245 700184fb Miltiadis Vasilakis
    [pollRequest startAsynchronous];
246 700184fb Miltiadis Vasilakis
    [titleView setNeedsDisplay];
247 700184fb Miltiadis Vasilakis
}
248 700184fb Miltiadis Vasilakis
249 700184fb Miltiadis Vasilakis
- (void)getServerSucceeded:(OpenStackRequest *)request {
250 700184fb Miltiadis Vasilakis
    if ([request isSuccess]) {
251 700184fb Miltiadis Vasilakis
        self.server = [request server];
252 700184fb Miltiadis Vasilakis
        
253 700184fb Miltiadis Vasilakis
        NSLog(@"flavor id: %@", self.server.flavorId);
254 700184fb Miltiadis Vasilakis
        
255 700184fb Miltiadis Vasilakis
        self.server.flavor = [self.account.flavors objectForKey:self.server.flavorId];
256 700184fb Miltiadis Vasilakis
        
257 700184fb Miltiadis Vasilakis
        NSLog(@"server flavor: %@", self.server.flavor);
258 700184fb Miltiadis Vasilakis
        
259 700184fb Miltiadis Vasilakis
        self.server.image = [self.account.images objectForKey:self.server.imageId];
260 700184fb Miltiadis Vasilakis
        
261 700184fb Miltiadis Vasilakis
        [self.account.servers setObject:server forKey:self.server.identifier];
262 700184fb Miltiadis Vasilakis
        [self.account persist];
263 700184fb Miltiadis Vasilakis
        
264 700184fb Miltiadis Vasilakis
        NSLog(@"polling server worked. %i, %@", self.server.progress, self.server.status);
265 700184fb Miltiadis Vasilakis
        [progressView setProgress:self.server.progress animated:YES];
266 700184fb Miltiadis Vasilakis
        
267 700184fb Miltiadis Vasilakis
        if ([self.server.status isEqualToString:@"VERIFY_RESIZE"]) {
268 700184fb Miltiadis Vasilakis
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Resize Complete" message:@"Confirming the resize will destroy the saved copy of your original server." delegate:self cancelButtonTitle:@"Decide Later" otherButtonTitles:@"Confirm Resize", @"Revert to Previous Size", nil];
269 700184fb Miltiadis Vasilakis
            [alert show];
270 700184fb Miltiadis Vasilakis
            [alert release];
271 700184fb Miltiadis Vasilakis
        }
272 700184fb Miltiadis Vasilakis
    }
273 700184fb Miltiadis Vasilakis
    if (kOverview >= 0) {
274 700184fb Miltiadis Vasilakis
        [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:kStatus inSection:kOverview]] withRowAnimation:UITableViewRowAnimationNone];
275 700184fb Miltiadis Vasilakis
    }
276 700184fb Miltiadis Vasilakis
    if ([self.server shouldBePolled]) {
277 700184fb Miltiadis Vasilakis
        [self pollServer];
278 700184fb Miltiadis Vasilakis
    } else {
279 700184fb Miltiadis Vasilakis
        polling = NO;        
280 700184fb Miltiadis Vasilakis
        //[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:kStatus inSection:kOverview]] withRowAnimation:UITableViewRowAnimationNone];
281 700184fb Miltiadis Vasilakis
        [self.tableView reloadData];
282 700184fb Miltiadis Vasilakis
        [self setBackgroundView];
283 700184fb Miltiadis Vasilakis
        if ([self.server.image respondsToSelector:@selector(logoPrefix)]) {
284 700184fb Miltiadis Vasilakis
            titleView.logoView.image = [UIImage imageNamed:[[self.server.image logoPrefix] stringByAppendingString:@"-icon.png"]];
285 700184fb Miltiadis Vasilakis
        }
286 700184fb Miltiadis Vasilakis
        
287 700184fb Miltiadis Vasilakis
        if (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad) {
288 700184fb Miltiadis Vasilakis
            [self.serversViewController.tableView reloadData];
289 700184fb Miltiadis Vasilakis
        }
290 700184fb Miltiadis Vasilakis
        
291 700184fb Miltiadis Vasilakis
    }
292 700184fb Miltiadis Vasilakis
    titleView.entity = self.server;
293 700184fb Miltiadis Vasilakis
    [titleView setNeedsDisplay];
294 700184fb Miltiadis Vasilakis
    
295 700184fb Miltiadis Vasilakis
}
296 700184fb Miltiadis Vasilakis
297 700184fb Miltiadis Vasilakis
- (void)getServerFailed:(OpenStackRequest *)request {
298 700184fb Miltiadis Vasilakis
    NSLog(@"polling server failed. trying again.");
299 700184fb Miltiadis Vasilakis
    [self pollServer];
300 700184fb Miltiadis Vasilakis
}
301 700184fb Miltiadis Vasilakis
302 700184fb Miltiadis Vasilakis
#pragma mark -
303 700184fb Miltiadis Vasilakis
#pragma mark View lifecycle
304 700184fb Miltiadis Vasilakis
305 700184fb Miltiadis Vasilakis
- (void)viewDidLoad {
306 700184fb Miltiadis Vasilakis
    [super viewDidLoad];
307 700184fb Miltiadis Vasilakis
    
308 700184fb Miltiadis Vasilakis
    actionsExpanded = YES;
309 700184fb Miltiadis Vasilakis
310 700184fb Miltiadis Vasilakis
    previousScrollPoint = CGPointZero;
311 700184fb Miltiadis Vasilakis
    titleView = nil;
312 700184fb Miltiadis Vasilakis
    
313 700184fb Miltiadis Vasilakis
    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
314 700184fb Miltiadis Vasilakis
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
315 700184fb Miltiadis Vasilakis
316 700184fb Miltiadis Vasilakis
    UIApplication *application = [UIApplication sharedApplication];
317 700184fb Miltiadis Vasilakis
    NSURL *url = [NSURL URLWithString:@"ssh://123.123.123.123"];
318 700184fb Miltiadis Vasilakis
    if ([application canOpenURL:url]) {
319 700184fb Miltiadis Vasilakis
        ipAddressActionSheet = [[UIActionSheet alloc] initWithTitle:selectedIPAddress delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Ping IP Address", @"Copy to Pasteboard", @"Open in Safari", @"Open in SSH Client", nil];
320 700184fb Miltiadis Vasilakis
    } else {
321 700184fb Miltiadis Vasilakis
        ipAddressActionSheet = [[UIActionSheet alloc] initWithTitle:selectedIPAddress delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Ping IP Address", @"Copy to Pasteboard", @"Open in Safari", nil];    
322 700184fb Miltiadis Vasilakis
    }
323 700184fb Miltiadis Vasilakis
    
324 700184fb Miltiadis Vasilakis
    rebootActionSheet = [[UIActionSheet alloc] initWithTitle:@"A soft reboot performs a graceful shutdown of your system.  A hard reboot is the equivalent of unplugging your server." delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Perform Hard Reboot" otherButtonTitles:@"Perform Soft Reboot", nil];
325 700184fb Miltiadis Vasilakis
    deleteActionSheet = [[UIActionSheet alloc] initWithTitle:@"Are you sure you want to delete this server?  This operation cannot be undone and you will lose all backup images." delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete Server" otherButtonTitles:nil];    
326 700184fb Miltiadis Vasilakis
    progressView = [[AnimatedProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleDefault];
327 700184fb Miltiadis Vasilakis
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
328 700184fb Miltiadis Vasilakis
        CGRect rect = progressView.frame;
329 700184fb Miltiadis Vasilakis
        rect.size.width = 440.0;
330 700184fb Miltiadis Vasilakis
        progressView.frame = rect;
331 700184fb Miltiadis Vasilakis
    }
332 700184fb Miltiadis Vasilakis
    
333 700184fb Miltiadis Vasilakis
    actionsArrow = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow-up.png"]];
334 700184fb Miltiadis Vasilakis
    actionsArrow.highlightedImage = [UIImage imageNamed:@"arrow-up-highlighted.png"];
335 700184fb Miltiadis Vasilakis
    actionsArrow.transform = CGAffineTransformMakeRotation(180.0 * M_PI / 180.0);    
336 700184fb Miltiadis Vasilakis
}
337 700184fb Miltiadis Vasilakis
338 700184fb Miltiadis Vasilakis
- (void)viewWillAppear:(BOOL)animated {
339 700184fb Miltiadis Vasilakis
    [super viewWillAppear:animated];    
340 700184fb Miltiadis Vasilakis
    self.navigationItem.title = [self.account.provider isRackspace] ? @"Cloud Server" : @"Server";
341 700184fb Miltiadis Vasilakis
    [self setBackgroundView];
342 700184fb Miltiadis Vasilakis
    
343 700184fb Miltiadis Vasilakis
    if (self.server) {
344 700184fb Miltiadis Vasilakis
        [self setParallaxViews];
345 700184fb Miltiadis Vasilakis
    } else {
346 700184fb Miltiadis Vasilakis
        actionView.alpha = 0;
347 700184fb Miltiadis Vasilakis
        rebootButton.enabled = NO;
348 700184fb Miltiadis Vasilakis
        pingButton.enabled = NO;
349 700184fb Miltiadis Vasilakis
    }
350 700184fb Miltiadis Vasilakis
}
351 700184fb Miltiadis Vasilakis
352 700184fb Miltiadis Vasilakis
- (void)viewDidAppear:(BOOL)animated {
353 700184fb Miltiadis Vasilakis
    [super viewDidAppear:animated];
354 700184fb Miltiadis Vasilakis
    rebootCountdown = @"";
355 700184fb Miltiadis Vasilakis
    renameCountdown = @"";
356 700184fb Miltiadis Vasilakis
    resizeCountdown = @"";
357 700184fb Miltiadis Vasilakis
    changePasswordCountdown = @"";
358 700184fb Miltiadis Vasilakis
    backupsCountdown = @"";
359 700184fb Miltiadis Vasilakis
    rebuildCountdown = @"";
360 700184fb Miltiadis Vasilakis
    deleteCountdown = @"";
361 700184fb Miltiadis Vasilakis
    
362 700184fb Miltiadis Vasilakis
    [self refreshLimitStrings];
363 700184fb Miltiadis Vasilakis
    
364 700184fb Miltiadis Vasilakis
    // handle success
365 700184fb Miltiadis Vasilakis
    if (!getLimitsSucceededObserver) {
366 700184fb Miltiadis Vasilakis
        getLimitsSucceededObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"getLimitsSucceeded" object:self.account
367 700184fb Miltiadis Vasilakis
                                                                                        queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
368 700184fb Miltiadis Vasilakis
        {
369 700184fb Miltiadis Vasilakis
            OpenStackRequest *request = [notification.userInfo objectForKey:@"request"];
370 700184fb Miltiadis Vasilakis
            self.account.rateLimits = [request rateLimits];
371 700184fb Miltiadis Vasilakis
            [[NSNotificationCenter defaultCenter] removeObserver:getLimitsSucceededObserver];
372 700184fb Miltiadis Vasilakis
        }];
373 700184fb Miltiadis Vasilakis
        
374 700184fb Miltiadis Vasilakis
        getImageSucceededObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"getImageSucceeded" object:nil
375 700184fb Miltiadis Vasilakis
                                                                                       queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
376 700184fb Miltiadis Vasilakis
        {
377 700184fb Miltiadis Vasilakis
            Image *image = [self.account.images objectForKey:self.server.imageId];
378 700184fb Miltiadis Vasilakis
            self.server.image = image;
379 700184fb Miltiadis Vasilakis
380 700184fb Miltiadis Vasilakis
            /*
381 700184fb Miltiadis Vasilakis
            NSString *logoFilename = [[server.image logoPrefix] stringByAppendingString:@"-large.png"];    
382 700184fb Miltiadis Vasilakis
            UIImageView *osLogo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:logoFilename]];
383 700184fb Miltiadis Vasilakis
            osLogo.contentMode = UIViewContentModeScaleAspectFit;
384 700184fb Miltiadis Vasilakis
            osLogo.frame = CGRectMake(0.0, 0.0, 320.0, 480.0);
385 700184fb Miltiadis Vasilakis
            tableView.backgroundView = osLogo;
386 700184fb Miltiadis Vasilakis
            [osLogo release];
387 700184fb Miltiadis Vasilakis
             */
388 700184fb Miltiadis Vasilakis
            [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:kImage inSection:kDetails]] withRowAnimation:UITableViewRowAnimationNone];
389 700184fb Miltiadis Vasilakis
        }];
390 700184fb Miltiadis Vasilakis
        
391 700184fb Miltiadis Vasilakis
        getImageFailedObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"getImageFailed" object:self.server.imageId
392 700184fb Miltiadis Vasilakis
                                                                                    queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
393 700184fb Miltiadis Vasilakis
        {
394 700184fb Miltiadis Vasilakis
            NSLog(@"loading image failed");
395 700184fb Miltiadis Vasilakis
        }];
396 700184fb Miltiadis Vasilakis
        
397 700184fb Miltiadis Vasilakis
        updateBackupScheduleSucceededObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"updateBackupScheduleSucceeded" object:self.server
398 700184fb Miltiadis Vasilakis
                                                                                                   queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
399 700184fb Miltiadis Vasilakis
        {
400 700184fb Miltiadis Vasilakis
            [self hideToolbarActivityMessage];
401 700184fb Miltiadis Vasilakis
        }];
402 700184fb Miltiadis Vasilakis
        
403 700184fb Miltiadis Vasilakis
        updateBackupScheduleFailedObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"updateBackupScheduleFailed" object:self.account
404 700184fb Miltiadis Vasilakis
                                                                                                queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
405 700184fb Miltiadis Vasilakis
        {
406 700184fb Miltiadis Vasilakis
            [self hideToolbarActivityMessage];
407 700184fb Miltiadis Vasilakis
            [self alert:@"There was a problem updating your backup schedule." request:[notification.userInfo objectForKey:@"request"]];
408 700184fb Miltiadis Vasilakis
        }];    
409 700184fb Miltiadis Vasilakis
        
410 700184fb Miltiadis Vasilakis
        resizeServerSucceededObserver = [[NSNotificationCenter defaultCenter] addObserverForName:[self.account.manager notificationName:@"resizeServerSucceeded" identifier:self.server.identifier] object:nil
411 700184fb Miltiadis Vasilakis
                                                                                           queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
412 700184fb Miltiadis Vasilakis
        {
413 700184fb Miltiadis Vasilakis
            [self hideToolbarActivityMessage];
414 700184fb Miltiadis Vasilakis
            self.server.status = @"QUEUE_RESIZE";
415 700184fb Miltiadis Vasilakis
            if (kOverview >= 0) {
416 700184fb Miltiadis Vasilakis
                [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:kStatus inSection:kOverview]] withRowAnimation:UITableViewRowAnimationNone];
417 700184fb Miltiadis Vasilakis
            }
418 700184fb Miltiadis Vasilakis
            [self pollServer];        
419 700184fb Miltiadis Vasilakis
        }];
420 700184fb Miltiadis Vasilakis
        
421 700184fb Miltiadis Vasilakis
        resizeServerFailedObserver = [[NSNotificationCenter defaultCenter] addObserverForName:[self.account.manager notificationName:@"resizeServerFailed" identifier:self.server.identifier] object:nil
422 700184fb Miltiadis Vasilakis
                                                                                        queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
423 700184fb Miltiadis Vasilakis
        {
424 700184fb Miltiadis Vasilakis
            [self hideToolbarActivityMessage];
425 700184fb Miltiadis Vasilakis
            [self alert:@"There was a problem resizing this server." request:[notification.userInfo objectForKey:@"request"]];
426 700184fb Miltiadis Vasilakis
        }];
427 700184fb Miltiadis Vasilakis
        
428 700184fb Miltiadis Vasilakis
        confirmResizeSucceededObserver = [[NSNotificationCenter defaultCenter] addObserverForName:[self.account.manager notificationName:@"confirmResizeServerSucceeded" identifier:self.server.identifier] object:nil
429 700184fb Miltiadis Vasilakis
                                                                                            queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
430 700184fb Miltiadis Vasilakis
        {
431 700184fb Miltiadis Vasilakis
            [self hideToolbarActivityMessage];
432 700184fb Miltiadis Vasilakis
            [self pollServer];        
433 700184fb Miltiadis Vasilakis
        }];
434 700184fb Miltiadis Vasilakis
        
435 700184fb Miltiadis Vasilakis
        confirmResizeFailedObserver = [[NSNotificationCenter defaultCenter] addObserverForName:[self.account.manager notificationName:@"confirmResizeServerFailed" identifier:self.server.identifier] object:nil
436 700184fb Miltiadis Vasilakis
                                                                                         queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
437 700184fb Miltiadis Vasilakis
        {
438 700184fb Miltiadis Vasilakis
            [self hideToolbarActivityMessage];
439 700184fb Miltiadis Vasilakis
            [self alert:@"There was a problem confirming the resize." request:[notification.userInfo objectForKey:@"request"]];
440 700184fb Miltiadis Vasilakis
        }];
441 700184fb Miltiadis Vasilakis
        
442 700184fb Miltiadis Vasilakis
        revertResizeSucceededObserver = [[NSNotificationCenter defaultCenter] addObserverForName:[self.account.manager notificationName:@"revertResizeServerSucceeded" identifier:self.server.identifier] object:nil
443 700184fb Miltiadis Vasilakis
                                                                                           queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
444 700184fb Miltiadis Vasilakis
        {
445 700184fb Miltiadis Vasilakis
            [self hideToolbarActivityMessage];
446 700184fb Miltiadis Vasilakis
            [self pollServer];        
447 700184fb Miltiadis Vasilakis
        }];
448 700184fb Miltiadis Vasilakis
        
449 700184fb Miltiadis Vasilakis
        revertResizeFailedObserver = [[NSNotificationCenter defaultCenter] addObserverForName:[self.account.manager notificationName:@"revertResizeServerFailed" identifier:self.server.identifier] object:nil
450 700184fb Miltiadis Vasilakis
                                                                                        queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
451 700184fb Miltiadis Vasilakis
        {
452 700184fb Miltiadis Vasilakis
            [self hideToolbarActivityMessage];
453 700184fb Miltiadis Vasilakis
            [self alert:@"There was a problem reverting the resize." request:[notification.userInfo objectForKey:@"request"]];
454 700184fb Miltiadis Vasilakis
        }];
455 700184fb Miltiadis Vasilakis
        
456 700184fb Miltiadis Vasilakis
        rebuildSucceededObserver = [[NSNotificationCenter defaultCenter] addObserverForName:[self.account.manager notificationName:@"rebuildServerSucceeded" identifier:self.server.identifier] object:nil
457 700184fb Miltiadis Vasilakis
                                                                                      queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
458 700184fb Miltiadis Vasilakis
        {
459 700184fb Miltiadis Vasilakis
            [self hideToolbarActivityMessage];
460 700184fb Miltiadis Vasilakis
            [self pollServer];        
461 700184fb Miltiadis Vasilakis
        }];
462 700184fb Miltiadis Vasilakis
        
463 700184fb Miltiadis Vasilakis
        rebuildFailedObserver = [[NSNotificationCenter defaultCenter] addObserverForName:[self.account.manager notificationName:@"rebuildServerFailed" identifier:self.server.identifier] object:nil
464 700184fb Miltiadis Vasilakis
                                                                                   queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
465 700184fb Miltiadis Vasilakis
        {
466 700184fb Miltiadis Vasilakis
            [self hideToolbarActivityMessage];
467 700184fb Miltiadis Vasilakis
            [self alert:@"There was a problem rebuilding this server." request:[notification.userInfo objectForKey:@"request"]];
468 700184fb Miltiadis Vasilakis
        }];
469 700184fb Miltiadis Vasilakis
    }
470 700184fb Miltiadis Vasilakis
    
471 700184fb Miltiadis Vasilakis
    // if the server has less than 100% progress, we need to poll it.
472 700184fb Miltiadis Vasilakis
    // normally, we would do this through the account manager, but this is the only
473 700184fb Miltiadis Vasilakis
    // place we'll need the information.  the downside to this is that we may
474 700184fb Miltiadis Vasilakis
    // temporarily show a server as building when it's already complete, but that's
475 700184fb Miltiadis Vasilakis
    // better than the possibility of polling several servers at once when a user
476 700184fb Miltiadis Vasilakis
    // decides to add multiple nodes
477 700184fb Miltiadis Vasilakis
    if (self.server && [server shouldBePolled]) {
478 700184fb Miltiadis Vasilakis
        [self pollServer];
479 700184fb Miltiadis Vasilakis
    }
480 700184fb Miltiadis Vasilakis
    
481 700184fb Miltiadis Vasilakis
    if (!countdownTimer) {        
482 700184fb Miltiadis Vasilakis
        countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(refreshCountdownLabels:) userInfo:nil repeats:YES];
483 700184fb Miltiadis Vasilakis
    }    
484 700184fb Miltiadis Vasilakis
    
485 700184fb Miltiadis Vasilakis
    if (self.server && [self.server.status isEqualToString:@"VERIFY_RESIZE"]) {
486 700184fb Miltiadis Vasilakis
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Resize Complete" message:@"Confirming the resize will destroy the saved copy of your original server." delegate:self cancelButtonTitle:@"Decide Later" otherButtonTitles:@"Confirm Resize", @"Revert to Previous Size", nil];
487 700184fb Miltiadis Vasilakis
        [alert show];
488 700184fb Miltiadis Vasilakis
        [alert release];
489 700184fb Miltiadis Vasilakis
    }    
490 700184fb Miltiadis Vasilakis
}
491 700184fb Miltiadis Vasilakis
492 700184fb Miltiadis Vasilakis
- (void)viewDidUnload {
493 700184fb Miltiadis Vasilakis
    [super viewDidUnload];
494 700184fb Miltiadis Vasilakis
    titleView = nil;
495 700184fb Miltiadis Vasilakis
    actionView = nil;
496 700184fb Miltiadis Vasilakis
    rebootButton = nil;
497 700184fb Miltiadis Vasilakis
    pingButton = nil;
498 700184fb Miltiadis Vasilakis
    self.tableView = nil;
499 700184fb Miltiadis Vasilakis
    
500 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:rebootSucceededObserver];
501 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:rebootFailedObserver];
502 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:getLimitsSucceededObserver];
503 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:changeAdminPasswordSucceededObserver];
504 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:changeAdminPasswordFailedObserver];
505 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:deleteServerSucceededObserver];
506 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:deleteServerFailedObserver];
507 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:getImageSucceededObserver];
508 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:getImageFailedObserver];
509 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:updateBackupScheduleSucceededObserver];
510 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:updateBackupScheduleFailedObserver];
511 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:resizeServerSucceededObserver];
512 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:resizeServerFailedObserver];
513 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:confirmResizeSucceededObserver];
514 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:confirmResizeFailedObserver];
515 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:revertResizeSucceededObserver];
516 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:revertResizeFailedObserver];
517 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:rebuildSucceededObserver];
518 700184fb Miltiadis Vasilakis
    [[NSNotificationCenter defaultCenter] removeObserver:rebuildFailedObserver];
519 700184fb Miltiadis Vasilakis
}
520 700184fb Miltiadis Vasilakis
521 700184fb Miltiadis Vasilakis
- (void)viewWillDisappear:(BOOL)animated {
522 700184fb Miltiadis Vasilakis
    [super viewWillDisappear:animated];
523 700184fb Miltiadis Vasilakis
    
524 700184fb Miltiadis Vasilakis
    if (polling && pollRequest != nil) {
525 700184fb Miltiadis Vasilakis
        pollRequest.delegate = nil;
526 700184fb Miltiadis Vasilakis
    }
527 700184fb Miltiadis Vasilakis
    
528 700184fb Miltiadis Vasilakis
//    [self.serversViewController.tableView deselectRowAtIndexPath:self.selectedServerIndexPath animated:YES];
529 700184fb Miltiadis Vasilakis
    
530 700184fb Miltiadis Vasilakis
    [countdownTimer invalidate];
531 700184fb Miltiadis Vasilakis
    countdownTimer = nil;
532 700184fb Miltiadis Vasilakis
}
533 700184fb Miltiadis Vasilakis
534 700184fb Miltiadis Vasilakis
#pragma mark -
535 700184fb Miltiadis Vasilakis
#pragma mark Table view data source
536 700184fb Miltiadis Vasilakis
537 700184fb Miltiadis Vasilakis
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
538 700184fb Miltiadis Vasilakis
    //return self.server ? 5 : 0;
539 700184fb Miltiadis Vasilakis
    return self.server ? 4 : 0;
540 700184fb Miltiadis Vasilakis
}
541 700184fb Miltiadis Vasilakis
542 700184fb Miltiadis Vasilakis
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
543 700184fb Miltiadis Vasilakis
    if (section == kOverview) {
544 700184fb Miltiadis Vasilakis
        return 2;
545 700184fb Miltiadis Vasilakis
    } else if (section == kDetails) {
546 700184fb Miltiadis Vasilakis
        return 2;
547 700184fb Miltiadis Vasilakis
    } else if (section == kIPAddresses) {
548 700184fb Miltiadis Vasilakis
        NSArray *publicIPs = [self.server.addresses objectForKey:@"public"];
549 700184fb Miltiadis Vasilakis
        NSArray *privateIPs = [self.server.addresses objectForKey:@"private"];
550 700184fb Miltiadis Vasilakis
        return [publicIPs count] + [privateIPs count];
551 700184fb Miltiadis Vasilakis
    } else if (section == kActions) {
552 700184fb Miltiadis Vasilakis
        //return actionsExpanded ? 8 : 1;
553 700184fb Miltiadis Vasilakis
        return 6;
554 700184fb Miltiadis Vasilakis
    } else {
555 700184fb Miltiadis Vasilakis
        return 0;
556 700184fb Miltiadis Vasilakis
    }
557 700184fb Miltiadis Vasilakis
}
558 700184fb Miltiadis Vasilakis
559 700184fb Miltiadis Vasilakis
- (CGFloat)findLabelHeight:(NSString*)text font:(UIFont *)font {
560 700184fb Miltiadis Vasilakis
    CGSize textLabelSize;
561 700184fb Miltiadis Vasilakis
    
562 700184fb Miltiadis Vasilakis
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
563 700184fb Miltiadis Vasilakis
        textLabelSize = CGSizeMake(530.0, 9000.0f);
564 700184fb Miltiadis Vasilakis
    } else {
565 700184fb Miltiadis Vasilakis
        textLabelSize = CGSizeMake(230.0, 9000.0f);
566 700184fb Miltiadis Vasilakis
    }
567 700184fb Miltiadis Vasilakis
    
568 700184fb Miltiadis Vasilakis
    // pad \n\n to fix layout bug
569 700184fb Miltiadis Vasilakis
    CGSize stringSize = [text sizeWithFont:font constrainedToSize:textLabelSize lineBreakMode:UILineBreakModeCharacterWrap];
570 700184fb Miltiadis Vasilakis
    return stringSize.height;
571 700184fb Miltiadis Vasilakis
}
572 700184fb Miltiadis Vasilakis
573 700184fb Miltiadis Vasilakis
- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
574 700184fb Miltiadis Vasilakis
    
575 700184fb Miltiadis Vasilakis
    static NSString *CellIdentifier = @"Cell";
576 700184fb Miltiadis Vasilakis
    
577 700184fb Miltiadis Vasilakis
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
578 700184fb Miltiadis Vasilakis
    if (cell == nil) {
579 700184fb Miltiadis Vasilakis
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
580 700184fb Miltiadis Vasilakis
        //cell.backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.93];
581 700184fb Miltiadis Vasilakis
        cell.textLabel.backgroundColor = [UIColor clearColor];
582 700184fb Miltiadis Vasilakis
        cell.detailTextLabel.backgroundColor = [UIColor clearColor];
583 700184fb Miltiadis Vasilakis
        cell.detailTextLabel.adjustsFontSizeToFitWidth = YES;
584 700184fb Miltiadis Vasilakis
        cell.detailTextLabel.lineBreakMode = UILineBreakModeCharacterWrap;
585 700184fb Miltiadis Vasilakis
        cell.detailTextLabel.textAlignment = UITextAlignmentRight;
586 700184fb Miltiadis Vasilakis
587 700184fb Miltiadis Vasilakis
    }
588 700184fb Miltiadis Vasilakis
    
589 700184fb Miltiadis Vasilakis
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
590 700184fb Miltiadis Vasilakis
        cell.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.8];
591 700184fb Miltiadis Vasilakis
    }
592 700184fb Miltiadis Vasilakis
    
593 700184fb Miltiadis Vasilakis
    cell.textLabel.textColor = [UIColor blackColor];
594 700184fb Miltiadis Vasilakis
    cell.accessoryView = nil;
595 700184fb Miltiadis Vasilakis
596 700184fb Miltiadis Vasilakis
    if (indexPath.section == kOverview) {
597 700184fb Miltiadis Vasilakis
        cell.accessoryType = UITableViewCellAccessoryNone;
598 700184fb Miltiadis Vasilakis
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
599 700184fb Miltiadis Vasilakis
        cell.accessoryView = nil;
600 700184fb Miltiadis Vasilakis
601 700184fb Miltiadis Vasilakis
        if (indexPath.row == kName) {
602 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Name";
603 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = server.name;
604 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == kStatus) {
605 700184fb Miltiadis Vasilakis
            if ([server.status isEqualToString:@"BUILD"]) {
606 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Building";
607 700184fb Miltiadis Vasilakis
                cell.detailTextLabel.text = @"";
608 700184fb Miltiadis Vasilakis
                cell.accessoryView = progressView;
609 700184fb Miltiadis Vasilakis
            } else if ([server.status isEqualToString:@"QUEUE_RESIZE"]) {
610 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Queueing";
611 700184fb Miltiadis Vasilakis
                cell.detailTextLabel.text = @"";
612 700184fb Miltiadis Vasilakis
                cell.accessoryView = progressView;
613 700184fb Miltiadis Vasilakis
            } else if ([server.status isEqualToString:@"PREP_RESIZE"]) {
614 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Preparing";
615 700184fb Miltiadis Vasilakis
                cell.detailTextLabel.text = @"";
616 700184fb Miltiadis Vasilakis
                cell.accessoryView = progressView;
617 700184fb Miltiadis Vasilakis
            } else if ([server.status isEqualToString:@"RESIZE"]) {
618 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Resizing";
619 700184fb Miltiadis Vasilakis
                cell.detailTextLabel.text = @"";
620 700184fb Miltiadis Vasilakis
                cell.accessoryView = progressView;
621 700184fb Miltiadis Vasilakis
            } else if ([server.status isEqualToString:@"VERIFY_RESIZE"]) {
622 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Status";
623 700184fb Miltiadis Vasilakis
                cell.detailTextLabel.text = @"Resize Complete";
624 700184fb Miltiadis Vasilakis
            } else if ([server.status isEqualToString:@"REBUILD"]) {
625 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Rebuilding";
626 700184fb Miltiadis Vasilakis
                cell.detailTextLabel.text = @"";
627 700184fb Miltiadis Vasilakis
                cell.accessoryView = progressView;
628 700184fb Miltiadis Vasilakis
            } else {
629 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Status";
630 700184fb Miltiadis Vasilakis
                cell.detailTextLabel.text = server.status;
631 700184fb Miltiadis Vasilakis
            }
632 700184fb Miltiadis Vasilakis
            
633 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == kHostId) {
634 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Host ID";
635 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = server.hostId;
636 700184fb Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
637 700184fb Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleBlue;
638 700184fb Miltiadis Vasilakis
        }
639 700184fb Miltiadis Vasilakis
    } else if (indexPath.section == kDetails) {
640 700184fb Miltiadis Vasilakis
        cell.accessoryType = UITableViewCellAccessoryNone;
641 700184fb Miltiadis Vasilakis
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
642 700184fb Miltiadis Vasilakis
        cell.accessoryView = nil;
643 700184fb Miltiadis Vasilakis
644 700184fb Miltiadis Vasilakis
        if (indexPath.row == kImage) {
645 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Image";
646 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = server.image.name; 
647 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == kMemory) {
648 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Size";
649 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = [NSString stringWithFormat:@"%i MB RAM, %i GB Disk", self.server.flavor.ram, self.server.flavor.disk];
650 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == kDisk) {
651 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Disk";
652 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = [NSString stringWithFormat:@"%i GB", server.flavor.disk];
653 700184fb Miltiadis Vasilakis
        }
654 700184fb Miltiadis Vasilakis
    } else if (indexPath.section == kIPAddresses) {
655 700184fb Miltiadis Vasilakis
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
656 700184fb Miltiadis Vasilakis
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
657 700184fb Miltiadis Vasilakis
        cell.accessoryView = nil;
658 700184fb Miltiadis Vasilakis
        
659 700184fb Miltiadis Vasilakis
        NSArray *publicIPs = [server.addresses objectForKey:@"public"];
660 700184fb Miltiadis Vasilakis
        NSArray *privateIPs = [server.addresses objectForKey:@"private"];
661 700184fb Miltiadis Vasilakis
        
662 700184fb Miltiadis Vasilakis
        if (indexPath.row < [publicIPs count]) {
663 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Public";
664 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = [publicIPs objectAtIndex:indexPath.row];
665 700184fb Miltiadis Vasilakis
            if ([[publicIPs objectAtIndex:indexPath.row] isKindOfClass:[NSString class]]) {
666 700184fb Miltiadis Vasilakis
                // v1.0 API
667 700184fb Miltiadis Vasilakis
                cell.detailTextLabel.text = [publicIPs objectAtIndex:indexPath.row];
668 700184fb Miltiadis Vasilakis
            } else {
669 700184fb Miltiadis Vasilakis
                // v1.1 API
670 700184fb Miltiadis Vasilakis
                cell.detailTextLabel.text = [[publicIPs objectAtIndex:indexPath.row] objectForKey:@"addr"];
671 700184fb Miltiadis Vasilakis
            }            
672 700184fb Miltiadis Vasilakis
        } else {
673 700184fb Miltiadis Vasilakis
            cell.textLabel.text = @"Private";
674 700184fb Miltiadis Vasilakis
            cell.detailTextLabel.text = [privateIPs objectAtIndex:indexPath.row - [publicIPs count]];
675 700184fb Miltiadis Vasilakis
        }
676 700184fb Miltiadis Vasilakis
    } else if (indexPath.section == kActions) {
677 700184fb Miltiadis Vasilakis
        cell.textLabel.text = @"Actions";
678 700184fb Miltiadis Vasilakis
        cell.detailTextLabel.text = @"";
679 700184fb Miltiadis Vasilakis
        cell.accessoryView = nil;
680 700184fb Miltiadis Vasilakis
        if (indexPath.row == kActionsRow) {
681 700184fb Miltiadis Vasilakis
            cell.accessoryType = UITableViewCellAccessoryNone;
682 700184fb Miltiadis Vasilakis
            cell.accessoryView = actionsArrow;
683 700184fb Miltiadis Vasilakis
            cell.selectionStyle = UITableViewCellSelectionStyleBlue;
684 700184fb Miltiadis Vasilakis
            cell.textLabel.textColor = actionsExpanded ? cell.detailTextLabel.textColor : [UIColor blackColor];
685 700184fb Miltiadis Vasilakis
        } else {
686 700184fb Miltiadis Vasilakis
            if (performingAction) {
687 700184fb Miltiadis Vasilakis
                cell.textLabel.textColor = [UIColor grayColor];
688 700184fb Miltiadis Vasilakis
                cell.selectionStyle = UITableViewCellSelectionStyleNone;
689 700184fb Miltiadis Vasilakis
                cell.accessoryType = UITableViewCellAccessoryNone;
690 700184fb Miltiadis Vasilakis
            } else {
691 700184fb Miltiadis Vasilakis
                cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
692 700184fb Miltiadis Vasilakis
                cell.selectionStyle = UITableViewCellSelectionStyleBlue;
693 700184fb Miltiadis Vasilakis
            }
694 700184fb Miltiadis Vasilakis
            
695 700184fb Miltiadis Vasilakis
            if (indexPath.row == kReboot) {
696 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Reboot Server";
697 700184fb Miltiadis Vasilakis
                if (![rebootCountdown isEqualToString:@""]) {
698 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = rebootCountdown;
699 700184fb Miltiadis Vasilakis
                    cell.accessoryType = UITableViewCellAccessoryNone;
700 700184fb Miltiadis Vasilakis
                    cell.selectionStyle = UITableViewCellSelectionStyleNone;
701 700184fb Miltiadis Vasilakis
                } else {
702 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = @"";
703 700184fb Miltiadis Vasilakis
                }
704 700184fb Miltiadis Vasilakis
            } else if (indexPath.row == kRename) {
705 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Rename Server";
706 700184fb Miltiadis Vasilakis
                if (renameCountdown && ![renameCountdown isEqualToString:@""]) {
707 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = renameCountdown;
708 700184fb Miltiadis Vasilakis
                    cell.accessoryType = UITableViewCellAccessoryNone;
709 700184fb Miltiadis Vasilakis
                    cell.selectionStyle = UITableViewCellSelectionStyleNone;
710 700184fb Miltiadis Vasilakis
                } else {
711 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = @"";
712 700184fb Miltiadis Vasilakis
                }
713 700184fb Miltiadis Vasilakis
            } else if (indexPath.row == kResize) {
714 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Resize Server";
715 700184fb Miltiadis Vasilakis
                if (![resizeCountdown isEqualToString:@""]) {
716 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = resizeCountdown;
717 700184fb Miltiadis Vasilakis
                    cell.accessoryType = UITableViewCellAccessoryNone;
718 700184fb Miltiadis Vasilakis
                    cell.selectionStyle = UITableViewCellSelectionStyleNone;
719 700184fb Miltiadis Vasilakis
                } else {
720 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = @"";
721 700184fb Miltiadis Vasilakis
                }
722 700184fb Miltiadis Vasilakis
            } else if (indexPath.row == kChangePassword) {
723 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Change Root Password";
724 700184fb Miltiadis Vasilakis
                if (![changePasswordCountdown isEqualToString:@""]) {
725 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = changePasswordCountdown;
726 700184fb Miltiadis Vasilakis
                    cell.accessoryType = UITableViewCellAccessoryNone;
727 700184fb Miltiadis Vasilakis
                    cell.selectionStyle = UITableViewCellSelectionStyleNone;
728 700184fb Miltiadis Vasilakis
                } else {
729 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = @"";
730 700184fb Miltiadis Vasilakis
                }
731 700184fb Miltiadis Vasilakis
            } else if (indexPath.row == kBackups) {
732 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Manage Backup Schedules";
733 700184fb Miltiadis Vasilakis
                if (![backupsCountdown isEqualToString:@""]) {
734 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = backupsCountdown;
735 700184fb Miltiadis Vasilakis
                    cell.accessoryType = UITableViewCellAccessoryNone;
736 700184fb Miltiadis Vasilakis
                    cell.selectionStyle = UITableViewCellSelectionStyleNone;
737 700184fb Miltiadis Vasilakis
                } else {
738 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = @"";
739 700184fb Miltiadis Vasilakis
                }
740 700184fb Miltiadis Vasilakis
            } else if (indexPath.row == kRebuild) {
741 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Rebuild Server";
742 700184fb Miltiadis Vasilakis
                if (![rebuildCountdown isEqualToString:@""]) {
743 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = rebuildCountdown;
744 700184fb Miltiadis Vasilakis
                    cell.accessoryType = UITableViewCellAccessoryNone;
745 700184fb Miltiadis Vasilakis
                    cell.selectionStyle = UITableViewCellSelectionStyleNone;
746 700184fb Miltiadis Vasilakis
                } else {
747 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = @"";
748 700184fb Miltiadis Vasilakis
                }
749 700184fb Miltiadis Vasilakis
            } else if (indexPath.row == kDelete) {
750 700184fb Miltiadis Vasilakis
                cell.textLabel.text = @"Delete Server";
751 700184fb Miltiadis Vasilakis
                if (![deleteCountdown isEqualToString:@""]) {
752 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = deleteCountdown;
753 700184fb Miltiadis Vasilakis
                    cell.accessoryType = UITableViewCellAccessoryNone;
754 700184fb Miltiadis Vasilakis
                    cell.selectionStyle = UITableViewCellSelectionStyleNone;
755 700184fb Miltiadis Vasilakis
                } else {
756 700184fb Miltiadis Vasilakis
                    cell.detailTextLabel.text = @"";
757 700184fb Miltiadis Vasilakis
                }
758 700184fb Miltiadis Vasilakis
            }
759 700184fb Miltiadis Vasilakis
        }
760 700184fb Miltiadis Vasilakis
    }
761 700184fb Miltiadis Vasilakis
    
762 700184fb Miltiadis Vasilakis
    return cell;
763 700184fb Miltiadis Vasilakis
}
764 700184fb Miltiadis Vasilakis
765 700184fb Miltiadis Vasilakis
#pragma mark -
766 700184fb Miltiadis Vasilakis
#pragma mark Table view delegate
767 700184fb Miltiadis Vasilakis
768 700184fb Miltiadis Vasilakis
- (void)reloadActionsTitleRow {
769 700184fb Miltiadis Vasilakis
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:kActions]] withRowAnimation:UITableViewRowAnimationNone];
770 700184fb Miltiadis Vasilakis
}
771 700184fb Miltiadis Vasilakis
772 700184fb Miltiadis Vasilakis
- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
773 700184fb Miltiadis Vasilakis
774 700184fb Miltiadis Vasilakis
    if (indexPath.section == kOverview) {
775 700184fb Miltiadis Vasilakis
        if (indexPath.row == kHostId) {
776 700184fb Miltiadis Vasilakis
            ServersOnHostViewController *vc = [[ServersOnHostViewController alloc] initWithNibName:@"ServersOnHostViewController" bundle:nil];
777 700184fb Miltiadis Vasilakis
            vc.account = self.account;
778 700184fb Miltiadis Vasilakis
            vc.hostID = self.server.hostId;
779 700184fb Miltiadis Vasilakis
            [self.navigationController pushViewController:vc animated:YES];
780 700184fb Miltiadis Vasilakis
            [vc release];
781 700184fb Miltiadis Vasilakis
            
782 700184fb Miltiadis Vasilakis
            // deselect the row
783 700184fb Miltiadis Vasilakis
            [NSTimer scheduledTimerWithTimeInterval:1.0 target:self.tableView selector:@selector(reloadData) userInfo:nil repeats:NO];
784 700184fb Miltiadis Vasilakis
        }
785 700184fb Miltiadis Vasilakis
    } else if (indexPath.section == kIPAddresses) {
786 700184fb Miltiadis Vasilakis
        NSArray *publicIPs = [server.addresses objectForKey:@"public"];
787 700184fb Miltiadis Vasilakis
        NSArray *privateIPs = [server.addresses objectForKey:@"private"];
788 700184fb Miltiadis Vasilakis
        if (indexPath.row < [publicIPs count]) {
789 700184fb Miltiadis Vasilakis
            if ([[publicIPs objectAtIndex:indexPath.row] isKindOfClass:[NSString class]]) {
790 700184fb Miltiadis Vasilakis
                selectedIPAddress = [publicIPs objectAtIndex:indexPath.row];
791 700184fb Miltiadis Vasilakis
            } else {
792 700184fb Miltiadis Vasilakis
                selectedIPAddress = [[publicIPs objectAtIndex:indexPath.row] objectForKey:@"addr"];
793 700184fb Miltiadis Vasilakis
            }
794 700184fb Miltiadis Vasilakis
        } else {
795 700184fb Miltiadis Vasilakis
            if ([[privateIPs objectAtIndex:[publicIPs count] - indexPath.row] isKindOfClass:[NSString class]]) {
796 700184fb Miltiadis Vasilakis
                selectedIPAddress = [privateIPs objectAtIndex:[publicIPs count] - indexPath.row];
797 700184fb Miltiadis Vasilakis
            } else {
798 700184fb Miltiadis Vasilakis
                selectedIPAddress = [[privateIPs objectAtIndex:[publicIPs count] - indexPath.row] objectForKey:@"addr"];
799 700184fb Miltiadis Vasilakis
            }
800 700184fb Miltiadis Vasilakis
        }
801 700184fb Miltiadis Vasilakis
        selectedIPAddressIndexPath = indexPath;
802 700184fb Miltiadis Vasilakis
803 700184fb Miltiadis Vasilakis
        ipAddressActionSheet.title = selectedIPAddress;
804 700184fb Miltiadis Vasilakis
        [ipAddressActionSheet showInView:self.view];
805 700184fb Miltiadis Vasilakis
    } else if (indexPath.section == kActions) {
806 700184fb Miltiadis Vasilakis
        if (indexPath.row == kActionsRow) {
807 700184fb Miltiadis Vasilakis
            NSMutableArray *indexPaths = [[NSMutableArray alloc] initWithCapacity:7];
808 700184fb Miltiadis Vasilakis
            for (int i = 1; i < 8; i++) {
809 700184fb Miltiadis Vasilakis
                [indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:kActions]];
810 700184fb Miltiadis Vasilakis
            }
811 700184fb Miltiadis Vasilakis
            if (actionsExpanded) {
812 700184fb Miltiadis Vasilakis
                actionsExpanded = NO;
813 700184fb Miltiadis Vasilakis
                [tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];
814 700184fb Miltiadis Vasilakis
            } else {
815 700184fb Miltiadis Vasilakis
                actionsExpanded = YES;
816 700184fb Miltiadis Vasilakis
                [tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationBottom];
817 700184fb Miltiadis Vasilakis
                [tableView scrollToRowAtIndexPath:[indexPaths lastObject] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
818 700184fb Miltiadis Vasilakis
            }
819 700184fb Miltiadis Vasilakis
            [indexPaths release];
820 700184fb Miltiadis Vasilakis
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
821 700184fb Miltiadis Vasilakis
            [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(reloadActionsTitleRow) userInfo:nil repeats:NO];
822 700184fb Miltiadis Vasilakis
            
823 700184fb Miltiadis Vasilakis
            // flip the arrow
824 700184fb Miltiadis Vasilakis
            [UIView beginAnimations:nil context:NULL];
825 700184fb Miltiadis Vasilakis
            [UIView setAnimationDuration:0.4];
826 700184fb Miltiadis Vasilakis
            if (actionsExpanded) {
827 700184fb Miltiadis Vasilakis
                actionsArrow.transform = CGAffineTransformMakeRotation(0.0);
828 700184fb Miltiadis Vasilakis
            } else {
829 700184fb Miltiadis Vasilakis
                actionsArrow.transform = CGAffineTransformMakeRotation(180.0 * M_PI / 180.0);
830 700184fb Miltiadis Vasilakis
            }
831 700184fb Miltiadis Vasilakis
            [UIView commitAnimations];            
832 700184fb Miltiadis Vasilakis
            
833 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == kReboot) {
834 700184fb Miltiadis Vasilakis
            if (!performingAction && [rebootCountdown isEqualToString:@""]) {
835 700184fb Miltiadis Vasilakis
                [rebootActionSheet showInView:self.view];
836 700184fb Miltiadis Vasilakis
            } else if (![rebootCountdown isEqualToString:@""]) {
837 700184fb Miltiadis Vasilakis
                [self alert:nil message:@"Reboots are not available because the API rate limit has been reached for this account.  These actions will be available as soon as the countdown reaches zero."];
838 700184fb Miltiadis Vasilakis
                [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
839 700184fb Miltiadis Vasilakis
            } else {
840 700184fb Miltiadis Vasilakis
                [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
841 700184fb Miltiadis Vasilakis
            }
842 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == kRename) {
843 700184fb Miltiadis Vasilakis
            if (!performingAction) {
844 700184fb Miltiadis Vasilakis
                RenameServerViewController *vc = [[RenameServerViewController alloc] initWithNibName:@"RenameServerViewController" bundle:nil];
845 700184fb Miltiadis Vasilakis
                vc.serverViewController = self;
846 700184fb Miltiadis Vasilakis
                vc.actionIndexPath = indexPath;
847 700184fb Miltiadis Vasilakis
                if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
848 700184fb Miltiadis Vasilakis
                    vc.modalPresentationStyle = UIModalPresentationFormSheet;
849 700184fb Miltiadis Vasilakis
                }                
850 700184fb Miltiadis Vasilakis
                [self.navigationController presentModalViewController:vc animated:YES];
851 700184fb Miltiadis Vasilakis
                [vc release];
852 700184fb Miltiadis Vasilakis
            } else {
853 700184fb Miltiadis Vasilakis
                [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
854 700184fb Miltiadis Vasilakis
            }
855 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == kResize) {
856 700184fb Miltiadis Vasilakis
            if (!performingAction) {
857 700184fb Miltiadis Vasilakis
                ResizeServerViewController *vc = [[ResizeServerViewController alloc] initWithNibName:@"ResizeServerViewController" bundle:nil];
858 700184fb Miltiadis Vasilakis
                vc.serverViewController = self;
859 700184fb Miltiadis Vasilakis
                vc.actionIndexPath = indexPath;
860 700184fb Miltiadis Vasilakis
                vc.account = account;
861 700184fb Miltiadis Vasilakis
                vc.server = server;
862 700184fb Miltiadis Vasilakis
                if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
863 700184fb Miltiadis Vasilakis
                    vc.modalPresentationStyle = UIModalPresentationFormSheet;
864 700184fb Miltiadis Vasilakis
                }                
865 700184fb Miltiadis Vasilakis
                [self.navigationController presentModalViewController:vc animated:YES];
866 700184fb Miltiadis Vasilakis
                [vc release];
867 700184fb Miltiadis Vasilakis
            } else {
868 700184fb Miltiadis Vasilakis
                [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
869 700184fb Miltiadis Vasilakis
            }
870 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == kRebuild) {
871 700184fb Miltiadis Vasilakis
            SimpleImagePickerViewController *vc = [[SimpleImagePickerViewController alloc] initWithNibName:@"SimpleImagePickerViewController" bundle:nil];
872 700184fb Miltiadis Vasilakis
            vc.mode = kModeRebuildServer;
873 700184fb Miltiadis Vasilakis
            vc.account = self.account;
874 700184fb Miltiadis Vasilakis
            vc.selectedImageId = self.server.imageId;
875 700184fb Miltiadis Vasilakis
            vc.serverViewController = self;
876 700184fb Miltiadis Vasilakis
            vc.delegate = self;
877 700184fb Miltiadis Vasilakis
            [self presentModalViewControllerWithNavigation:vc];
878 700184fb Miltiadis Vasilakis
            [vc release];            
879 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == kChangePassword) {
880 700184fb Miltiadis Vasilakis
            if (!performingAction) {
881 700184fb Miltiadis Vasilakis
                ResetServerAdminPasswordViewController *vc = [[ResetServerAdminPasswordViewController alloc] initWithNibName:@"ResetServerAdminPasswordViewController" bundle:nil];
882 700184fb Miltiadis Vasilakis
                vc.serverViewController = self;
883 700184fb Miltiadis Vasilakis
                vc.actionIndexPath = indexPath;
884 700184fb Miltiadis Vasilakis
                if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
885 700184fb Miltiadis Vasilakis
                    vc.modalPresentationStyle = UIModalPresentationFormSheet;
886 700184fb Miltiadis Vasilakis
                }                
887 700184fb Miltiadis Vasilakis
                [self.navigationController presentModalViewController:vc animated:YES];
888 700184fb Miltiadis Vasilakis
                [vc release];
889 700184fb Miltiadis Vasilakis
            } else {
890 700184fb Miltiadis Vasilakis
                [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
891 700184fb Miltiadis Vasilakis
            }
892 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == kBackups) {            
893 700184fb Miltiadis Vasilakis
            if (!performingAction) {
894 700184fb Miltiadis Vasilakis
                ManageBackupScheduleViewController *vc = [[ManageBackupScheduleViewController alloc] initWithNibName:@"ManageBackupScheduleViewController" bundle:nil];
895 700184fb Miltiadis Vasilakis
                vc.serverViewController = self;
896 700184fb Miltiadis Vasilakis
                vc.actionIndexPath = indexPath;
897 700184fb Miltiadis Vasilakis
                vc.account = self.account;
898 700184fb Miltiadis Vasilakis
                vc.server = self.server;
899 700184fb Miltiadis Vasilakis
                if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
900 700184fb Miltiadis Vasilakis
                    vc.modalPresentationStyle = UIModalPresentationFormSheet;
901 700184fb Miltiadis Vasilakis
                }                
902 700184fb Miltiadis Vasilakis
                [self.navigationController presentModalViewController:vc animated:YES];
903 700184fb Miltiadis Vasilakis
                [vc release];
904 700184fb Miltiadis Vasilakis
            } else {
905 700184fb Miltiadis Vasilakis
                [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
906 700184fb Miltiadis Vasilakis
            }
907 700184fb Miltiadis Vasilakis
        } else if (indexPath.row == kDelete) {
908 700184fb Miltiadis Vasilakis
            if (!performingAction) {
909 700184fb Miltiadis Vasilakis
                [deleteActionSheet showInView:self.view];
910 700184fb Miltiadis Vasilakis
            } else {
911 700184fb Miltiadis Vasilakis
                [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
912 700184fb Miltiadis Vasilakis
            }
913 700184fb Miltiadis Vasilakis
        }
914 700184fb Miltiadis Vasilakis
    }
915 700184fb Miltiadis Vasilakis
}
916 700184fb Miltiadis Vasilakis
917 700184fb Miltiadis Vasilakis
#pragma mark -
918 700184fb Miltiadis Vasilakis
#pragma mark Action Sheet Delegate
919 700184fb Miltiadis Vasilakis
920 700184fb Miltiadis Vasilakis
- (void)changeAdminPassword:(NSString *)password {
921 700184fb Miltiadis Vasilakis
    [self showToolbarActivityMessage:@"Changing password..."];        
922 700184fb Miltiadis Vasilakis
    performingAction = YES;
923 700184fb Miltiadis Vasilakis
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationFade];
924 700184fb Miltiadis Vasilakis
    
925 700184fb Miltiadis Vasilakis
    // handle success
926 700184fb Miltiadis Vasilakis
    changeAdminPasswordSucceededObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"changeAdminPasswordSucceeded" object:self.server
927 700184fb Miltiadis Vasilakis
                                                                                 queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
928 700184fb Miltiadis Vasilakis
                               {
929 700184fb Miltiadis Vasilakis
                                   [self hideToolbarActivityMessage];
930 700184fb Miltiadis Vasilakis
                                   performingAction = NO;
931 700184fb Miltiadis Vasilakis
                                   [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationFade];
932 700184fb Miltiadis Vasilakis
                                   [[NSNotificationCenter defaultCenter] removeObserver:changeAdminPasswordSucceededObserver];
933 700184fb Miltiadis Vasilakis
                                   [[NSNotificationCenter defaultCenter] removeObserver:changeAdminPasswordFailedObserver];
934 700184fb Miltiadis Vasilakis
                               }];
935 700184fb Miltiadis Vasilakis
    
936 700184fb Miltiadis Vasilakis
    // handle failure
937 700184fb Miltiadis Vasilakis
    changeAdminPasswordFailedObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"changeAdminPasswordFailed" object:self.server 
938 700184fb Miltiadis Vasilakis
                                                                              queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
939 700184fb Miltiadis Vasilakis
                            {
940 700184fb Miltiadis Vasilakis
                                [self alert:@"There was a problem changing the root password." request:[notification.userInfo objectForKey:@"request"]];
941 700184fb Miltiadis Vasilakis
                                [self hideToolbarActivityMessage];
942 700184fb Miltiadis Vasilakis
                                performingAction = NO;
943 700184fb Miltiadis Vasilakis
                                [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationFade];
944 700184fb Miltiadis Vasilakis
                                [[NSNotificationCenter defaultCenter] removeObserver:changeAdminPasswordSucceededObserver];
945 700184fb Miltiadis Vasilakis
                                [[NSNotificationCenter defaultCenter] removeObserver:changeAdminPasswordFailedObserver];
946 700184fb Miltiadis Vasilakis
                            }];
947 700184fb Miltiadis Vasilakis
    
948 700184fb Miltiadis Vasilakis
    [self.account.manager changeAdminPassword:self.server password:password];
949 700184fb Miltiadis Vasilakis
}
950 700184fb Miltiadis Vasilakis
951 700184fb Miltiadis Vasilakis
- (void)removeServersListRow {
952 700184fb Miltiadis Vasilakis
//    if ([self.account.servers count] == 0) {
953 700184fb Miltiadis Vasilakis
        [self.serversViewController.tableView reloadData];
954 700184fb Miltiadis Vasilakis
//    } else {
955 700184fb Miltiadis Vasilakis
//        [self.serversViewController.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:selectedServerIndexPath] withRowAnimation:UITableViewRowAnimationLeft];
956 700184fb Miltiadis Vasilakis
//    }
957 700184fb Miltiadis Vasilakis
}
958 700184fb Miltiadis Vasilakis
959 700184fb Miltiadis Vasilakis
- (void)popViewController {
960 700184fb Miltiadis Vasilakis
    [self.navigationController popViewControllerAnimated:YES];
961 700184fb Miltiadis Vasilakis
}
962 700184fb Miltiadis Vasilakis
963 700184fb Miltiadis Vasilakis
- (void)deleteServer {
964 700184fb Miltiadis Vasilakis
    [self showToolbarActivityMessage:@"Deleting server..."];        
965 700184fb Miltiadis Vasilakis
    performingAction = YES;
966 700184fb Miltiadis Vasilakis
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationFade];
967 700184fb Miltiadis Vasilakis
968 700184fb Miltiadis Vasilakis
    // handle success
969 700184fb Miltiadis Vasilakis
    deleteServerSucceededObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"deleteServerSucceeded" object:self.server
970 700184fb Miltiadis Vasilakis
                                                                                              queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
971 700184fb Miltiadis Vasilakis
        {
972 700184fb Miltiadis Vasilakis
            [self hideToolbarActivityMessage];
973 700184fb Miltiadis Vasilakis
            performingAction = NO;
974 700184fb Miltiadis Vasilakis
            [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationFade];
975 700184fb Miltiadis Vasilakis
            
976 700184fb Miltiadis Vasilakis
            NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithDictionary:self.account.servers];
977 700184fb Miltiadis Vasilakis
            [dict removeObjectForKey:self.server.identifier];
978 e06c24cf Miltiadis Vasilakis
            self.account.servers = [[[NSMutableDictionary alloc] initWithDictionary:dict] autorelease]; // TODO: release
979 700184fb Miltiadis Vasilakis
            [self.account persist];
980 700184fb Miltiadis Vasilakis
            [dict release];
981 700184fb Miltiadis Vasilakis
             
982 700184fb Miltiadis Vasilakis
            self.serversViewController.account.servers = self.account.servers;
983 700184fb Miltiadis Vasilakis
            
984 700184fb Miltiadis Vasilakis
            if ([self.account.servers count] == 0 && UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
985 700184fb Miltiadis Vasilakis
                // on ipad, delete needs to get rid of the server on the main view
986 700184fb Miltiadis Vasilakis
                self.server = nil;
987 700184fb Miltiadis Vasilakis
                [self setBackgroundView];
988 700184fb Miltiadis Vasilakis
                [self.tableView reloadData];
989 700184fb Miltiadis Vasilakis
            } else {
990 700184fb Miltiadis Vasilakis
                [self.navigationController popViewControllerAnimated:YES];
991 700184fb Miltiadis Vasilakis
            }
992 700184fb Miltiadis Vasilakis
            [self.serversViewController.tableView selectRowAtIndexPath:selectedServerIndexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
993 700184fb Miltiadis Vasilakis
            [NSTimer scheduledTimerWithTimeInterval:0.75 target:self selector:@selector(removeServersListRow) userInfo:nil repeats:NO];
994 700184fb Miltiadis Vasilakis
995 700184fb Miltiadis Vasilakis
            [[NSNotificationCenter defaultCenter] removeObserver:deleteServerSucceededObserver];
996 700184fb Miltiadis Vasilakis
            [[NSNotificationCenter defaultCenter] removeObserver:deleteServerFailedObserver];
997 700184fb Miltiadis Vasilakis
        }];
998 700184fb Miltiadis Vasilakis
    
999 700184fb Miltiadis Vasilakis
    // handle failure
1000 700184fb Miltiadis Vasilakis
    deleteServerFailedObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"deleteServerFailed" object:self.server 
1001 700184fb Miltiadis Vasilakis
                                                                                           queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
1002 700184fb Miltiadis Vasilakis
         {
1003 700184fb Miltiadis Vasilakis
             [self alert:@"There was a problem deleting this server." request:[notification.userInfo objectForKey:@"request"]];
1004 700184fb Miltiadis Vasilakis
             [self hideToolbarActivityMessage];
1005 700184fb Miltiadis Vasilakis
             performingAction = NO;
1006 700184fb Miltiadis Vasilakis
             [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationFade];
1007 700184fb Miltiadis Vasilakis
             [[NSNotificationCenter defaultCenter] removeObserver:deleteServerFailedObserver];
1008 700184fb Miltiadis Vasilakis
             [[NSNotificationCenter defaultCenter] removeObserver:deleteServerSucceededObserver];
1009 700184fb Miltiadis Vasilakis
         }];
1010 700184fb Miltiadis Vasilakis
    
1011 700184fb Miltiadis Vasilakis
    [self.account.manager deleteServer:self.server];
1012 700184fb Miltiadis Vasilakis
}
1013 700184fb Miltiadis Vasilakis
1014 700184fb Miltiadis Vasilakis
- (void)showAction:(NSString *)name {
1015 700184fb Miltiadis Vasilakis
    [self showToolbarActivityMessage:name];
1016 700184fb Miltiadis Vasilakis
    //performingAction = YES;
1017 700184fb Miltiadis Vasilakis
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationFade];
1018 700184fb Miltiadis Vasilakis
}
1019 700184fb Miltiadis Vasilakis
1020 700184fb Miltiadis Vasilakis
- (void)hideAction {
1021 700184fb Miltiadis Vasilakis
    [self hideToolbarActivityMessage];
1022 700184fb Miltiadis Vasilakis
    performingAction = NO;
1023 700184fb Miltiadis Vasilakis
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationFade];
1024 700184fb Miltiadis Vasilakis
}
1025 700184fb Miltiadis Vasilakis
1026 700184fb Miltiadis Vasilakis
- (void)renameServer:(NSString *)name {
1027 700184fb Miltiadis Vasilakis
    [self showAction:@"Renaming server..."];
1028 700184fb Miltiadis Vasilakis
    [[self.account.manager renameServer:self.server name:name] success:^(OpenStackRequest *request) {
1029 700184fb Miltiadis Vasilakis
        [self hideAction];
1030 700184fb Miltiadis Vasilakis
        [self.account refreshCollections];
1031 700184fb Miltiadis Vasilakis
        self.server.name = name;
1032 700184fb Miltiadis Vasilakis
        titleView.nameLabel.text = self.server.name;
1033 700184fb Miltiadis Vasilakis
        [self.serversViewController.tableView reloadData];
1034 700184fb Miltiadis Vasilakis
    } failure:^(OpenStackRequest *request) {
1035 700184fb Miltiadis Vasilakis
        [self alert:@"There was a problem renaming this server." request:request];
1036 700184fb Miltiadis Vasilakis
        [self hideAction];
1037 700184fb Miltiadis Vasilakis
    }];
1038 700184fb Miltiadis Vasilakis
}
1039 700184fb Miltiadis Vasilakis
1040 700184fb Miltiadis Vasilakis
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
1041 700184fb Miltiadis Vasilakis
    if ([actionSheet isEqual:ipAddressActionSheet]) {
1042 700184fb Miltiadis Vasilakis
1043 700184fb Miltiadis Vasilakis
        UIApplication *application = [UIApplication sharedApplication];
1044 700184fb Miltiadis Vasilakis
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"ssh://%@", selectedIPAddress]];
1045 700184fb Miltiadis Vasilakis
        
1046 700184fb Miltiadis Vasilakis
        if (buttonIndex == 0) { // Ping IP Address
1047 700184fb Miltiadis Vasilakis
            
1048 700184fb Miltiadis Vasilakis
            TrackEvent(CATEGORY_SERVER, EVENT_PINGED);
1049 700184fb Miltiadis Vasilakis
            
1050 700184fb Miltiadis Vasilakis
            PingIPAddressViewController *vc = [[PingIPAddressViewController alloc] initWithNibName:@"PingIPAddressViewController" bundle:nil ipAddress:selectedIPAddress];
1051 700184fb Miltiadis Vasilakis
            vc.serverViewController = self;
1052 700184fb Miltiadis Vasilakis
            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
1053 700184fb Miltiadis Vasilakis
                vc.modalPresentationStyle = UIModalPresentationPageSheet;
1054 700184fb Miltiadis Vasilakis
            }                
1055 700184fb Miltiadis Vasilakis
            [self.navigationController presentModalViewController:vc animated:YES];
1056 700184fb Miltiadis Vasilakis
            [vc release];
1057 700184fb Miltiadis Vasilakis
            [self.tableView deselectRowAtIndexPath:selectedIPAddressIndexPath animated:YES];
1058 700184fb Miltiadis Vasilakis
        } else if (buttonIndex == 1) { // Copy to Pasteboard
1059 700184fb Miltiadis Vasilakis
            UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
1060 700184fb Miltiadis Vasilakis
            [pasteboard setString:selectedIPAddress];
1061 700184fb Miltiadis Vasilakis
            [self.tableView deselectRowAtIndexPath:selectedIPAddressIndexPath animated:YES];
1062 700184fb Miltiadis Vasilakis
        } else if (buttonIndex == 2) {
1063 700184fb Miltiadis Vasilakis
            UIApplication *application = [UIApplication sharedApplication];
1064 700184fb Miltiadis Vasilakis
            NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", selectedIPAddress]];
1065 700184fb Miltiadis Vasilakis
            if ([application canOpenURL:url]) {
1066 700184fb Miltiadis Vasilakis
                [application openURL:url];
1067 700184fb Miltiadis Vasilakis
            }
1068 700184fb Miltiadis Vasilakis
            [self.tableView deselectRowAtIndexPath:selectedIPAddressIndexPath animated:YES];
1069 700184fb Miltiadis Vasilakis
        } else if (buttonIndex == 3 && [application canOpenURL:url]) {
1070 700184fb Miltiadis Vasilakis
            [application openURL:url];
1071 700184fb Miltiadis Vasilakis
        } else {
1072 700184fb Miltiadis Vasilakis
            [self.tableView deselectRowAtIndexPath:selectedIPAddressIndexPath animated:YES];
1073 700184fb Miltiadis Vasilakis
        }
1074 700184fb Miltiadis Vasilakis
    } else if ([actionSheet isEqual:rebootActionSheet]) {
1075 700184fb Miltiadis Vasilakis
        [self.tableView deselectRowAtIndexPath:[NSIndexPath indexPathForRow:kReboot inSection:kActions] animated:YES];
1076 700184fb Miltiadis Vasilakis
        
1077 700184fb Miltiadis Vasilakis
        if (buttonIndex != 2) {
1078 700184fb Miltiadis Vasilakis
            [self showToolbarActivityMessage:@"Rebooting..."];        
1079 700184fb Miltiadis Vasilakis
            performingAction = YES;
1080 700184fb Miltiadis Vasilakis
            [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationFade];
1081 700184fb Miltiadis Vasilakis
            
1082 700184fb Miltiadis Vasilakis
            // handle success
1083 700184fb Miltiadis Vasilakis
            rebootSucceededObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"rebootSucceeded" object:self.server
1084 700184fb Miltiadis Vasilakis
                                                                                         queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
1085 700184fb Miltiadis Vasilakis
            {
1086 700184fb Miltiadis Vasilakis
                [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(pollServer) userInfo:nil repeats:NO];
1087 700184fb Miltiadis Vasilakis
                [self hideToolbarActivityMessage];
1088 700184fb Miltiadis Vasilakis
                performingAction = NO;
1089 700184fb Miltiadis Vasilakis
                [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationFade];
1090 700184fb Miltiadis Vasilakis
                [[NSNotificationCenter defaultCenter] removeObserver:rebootSucceededObserver];
1091 700184fb Miltiadis Vasilakis
                [[NSNotificationCenter defaultCenter] removeObserver:rebootFailedObserver];
1092 700184fb Miltiadis Vasilakis
            }];
1093 700184fb Miltiadis Vasilakis
            
1094 700184fb Miltiadis Vasilakis
            // handle failure
1095 700184fb Miltiadis Vasilakis
            rebootFailedObserver = [[NSNotificationCenter defaultCenter] addObserverForName:@"rebootFailed" object:self.server 
1096 700184fb Miltiadis Vasilakis
                                                                                      queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification* notification) 
1097 700184fb Miltiadis Vasilakis
            {
1098 700184fb Miltiadis Vasilakis
                [self alert:@"There was a problem rebooting this server." request:[notification.userInfo objectForKey:@"request"]];
1099 700184fb Miltiadis Vasilakis
                [self hideToolbarActivityMessage];
1100 700184fb Miltiadis Vasilakis
                performingAction = NO;
1101 700184fb Miltiadis Vasilakis
                [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:kActions] withRowAnimation:UITableViewRowAnimationFade];
1102 700184fb Miltiadis Vasilakis
                [[NSNotificationCenter defaultCenter] removeObserver:rebootSucceededObserver];
1103 700184fb Miltiadis Vasilakis
                [[NSNotificationCenter defaultCenter] removeObserver:rebootFailedObserver];
1104 700184fb Miltiadis Vasilakis
            }];
1105 700184fb Miltiadis Vasilakis
            
1106 700184fb Miltiadis Vasilakis
            if (buttonIndex == 0) {
1107 700184fb Miltiadis Vasilakis
                [self.account.manager hardRebootServer:self.server];
1108 700184fb Miltiadis Vasilakis
            } else if (buttonIndex == 1) {
1109 700184fb Miltiadis Vasilakis
                [self.account.manager softRebootServer:self.server];
1110 700184fb Miltiadis Vasilakis
            }
1111 700184fb Miltiadis Vasilakis
        }
1112 700184fb Miltiadis Vasilakis
1113 700184fb Miltiadis Vasilakis
    } else if ([actionSheet isEqual:deleteActionSheet]) {
1114 700184fb Miltiadis Vasilakis
        if (buttonIndex == 0) {
1115 700184fb Miltiadis Vasilakis
            [self deleteServer];
1116 700184fb Miltiadis Vasilakis
        }
1117 700184fb Miltiadis Vasilakis
        [self.tableView deselectRowAtIndexPath:[NSIndexPath indexPathForRow:kDelete inSection:kActions] animated:YES];
1118 700184fb Miltiadis Vasilakis
    }
1119 700184fb Miltiadis Vasilakis
}
1120 700184fb Miltiadis Vasilakis
1121 700184fb Miltiadis Vasilakis
#pragma mark -
1122 700184fb Miltiadis Vasilakis
#pragma mark Resize Alert Delegate
1123 700184fb Miltiadis Vasilakis
1124 700184fb Miltiadis Vasilakis
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
1125 700184fb Miltiadis Vasilakis
    if (buttonIndex == 1) {
1126 700184fb Miltiadis Vasilakis
        [self.account.manager confirmResizeServer:self.server];
1127 700184fb Miltiadis Vasilakis
        [self showToolbarActivityMessage:@"Confirming resize..."];
1128 700184fb Miltiadis Vasilakis
    } else if (buttonIndex == 2) {
1129 700184fb Miltiadis Vasilakis
        [self.account.manager revertResizeServer:self.server];
1130 700184fb Miltiadis Vasilakis
        [self showToolbarActivityMessage:@"Reverting resize..."];
1131 700184fb Miltiadis Vasilakis
    }
1132 700184fb Miltiadis Vasilakis
}
1133 700184fb Miltiadis Vasilakis
1134 700184fb Miltiadis Vasilakis
#pragma - Button Handlers
1135 700184fb Miltiadis Vasilakis
1136 700184fb Miltiadis Vasilakis
- (IBAction)rebootButtonPressed:(id)sender {
1137 700184fb Miltiadis Vasilakis
    if (!performingAction && [rebootCountdown isEqualToString:@""]) {
1138 700184fb Miltiadis Vasilakis
        [rebootActionSheet showInView:self.view];
1139 700184fb Miltiadis Vasilakis
    } else if (![rebootCountdown isEqualToString:@""]) {
1140 700184fb Miltiadis Vasilakis
        [self alert:nil message:@"Reboots are not available because the API rate limit has been reached for this account.  These actions will be available as soon as the countdown reaches zero."];
1141 700184fb Miltiadis Vasilakis
    }
1142 700184fb Miltiadis Vasilakis
}
1143 700184fb Miltiadis Vasilakis
1144 700184fb Miltiadis Vasilakis
- (IBAction)snapshotButtonPressed:(id)sender {
1145 700184fb Miltiadis Vasilakis
    
1146 700184fb Miltiadis Vasilakis
}
1147 700184fb Miltiadis Vasilakis
1148 700184fb Miltiadis Vasilakis
- (IBAction)pingIPButtonPressed:(id)sender {
1149 700184fb Miltiadis Vasilakis
    if ([[server.addresses objectForKey:@"public"] count] > 0) {
1150 700184fb Miltiadis Vasilakis
        
1151 700184fb Miltiadis Vasilakis
        TrackEvent(CATEGORY_SERVER, EVENT_PINGED);
1152 700184fb Miltiadis Vasilakis
        
1153 700184fb Miltiadis Vasilakis
        NSString *ipAddress = [[server.addresses objectForKey:@"public"] objectAtIndex:0];
1154 700184fb Miltiadis Vasilakis
        PingIPAddressViewController *vc = [[PingIPAddressViewController alloc] initWithNibName:@"PingIPAddressViewController" bundle:nil ipAddress:ipAddress];
1155 700184fb Miltiadis Vasilakis
        vc.serverViewController = self;
1156 700184fb Miltiadis Vasilakis
        if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
1157 700184fb Miltiadis Vasilakis
            vc.modalPresentationStyle = UIModalPresentationPageSheet;
1158 700184fb Miltiadis Vasilakis
        }                
1159 700184fb Miltiadis Vasilakis
        [self.navigationController presentModalViewController:vc animated:YES];
1160 700184fb Miltiadis Vasilakis
        [vc release];
1161 700184fb Miltiadis Vasilakis
    }
1162 700184fb Miltiadis Vasilakis
}
1163 700184fb Miltiadis Vasilakis
1164 700184fb Miltiadis Vasilakis
#pragma mark -
1165 700184fb Miltiadis Vasilakis
#pragma mark Memory management
1166 700184fb Miltiadis Vasilakis
1167 700184fb Miltiadis Vasilakis
- (void)dealloc {
1168 700184fb Miltiadis Vasilakis
    [server release];
1169 700184fb Miltiadis Vasilakis
    [account release];
1170 700184fb Miltiadis Vasilakis
    [tableView release];
1171 700184fb Miltiadis Vasilakis
    [selectedIPAddressIndexPath release];
1172 700184fb Miltiadis Vasilakis
    [ipAddressActionSheet release];
1173 700184fb Miltiadis Vasilakis
    [rebootActionSheet release];
1174 700184fb Miltiadis Vasilakis
    [deleteActionSheet release];
1175 700184fb Miltiadis Vasilakis
    [serversViewController release];
1176 700184fb Miltiadis Vasilakis
    [selectedServerIndexPath release];
1177 700184fb Miltiadis Vasilakis
    [progressView release];
1178 700184fb Miltiadis Vasilakis
    [actionsArrow release];
1179 700184fb Miltiadis Vasilakis
    [accountHomeViewController release];
1180 700184fb Miltiadis Vasilakis
    [super dealloc];
1181 700184fb Miltiadis Vasilakis
}
1182 700184fb Miltiadis Vasilakis
1183 700184fb Miltiadis Vasilakis
1184 700184fb Miltiadis Vasilakis
@end