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 |