Index: remoting/ios/host_refresh.mm |
diff --git a/remoting/ios/host_refresh.mm b/remoting/ios/host_refresh.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bf5e67ee5bd102c35b0c5b5d832915fb366eaf97 |
--- /dev/null |
+++ b/remoting/ios/host_refresh.mm |
@@ -0,0 +1,132 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
+#import "remoting/ios/host_refresh.h" |
+ |
+#import "remoting/ios/authorize.h" |
+#import "remoting/ios/host.h" |
+#import "remoting/ios/utility.h" |
+ |
+namespace { |
+NSString* kDefaultErrorMessage = @"The Host list refresh is not available at " |
+ @"this time. Please try again later."; |
+} // namespace |
+ |
+@interface HostRefresh (Private) |
+- (void)authentication:(GTMOAuth2Authentication*)auth |
+ request:(NSMutableURLRequest*)request |
+ error:(NSError*)error; |
+- (void)formatErrorMessage:(NSString*)error; |
+- (void)notifyDelegate; |
+@end |
+ |
+// Logic flow begins with refreshHostList, and continues until an error occurs, |
+// or the host list is returned to the delegate |
+@implementation HostRefresh |
+ |
+@synthesize jsonData = _jsonData; |
+@synthesize errorMessage = _errorMessage; |
+@synthesize delegate = _delegate; |
+ |
+// Override default constructor and initialize internals |
+- (id)init { |
+ self = [super init]; |
+ if (self) { |
+ _jsonData = [[NSMutableData alloc] init]; |
+ } |
+ return self; |
+} |
+ |
+// Begin the authentication and authorization process. Begin the process by |
+// creating an oAuth2 request to google api's including the needed scopes to |
+// fetch the users host list. |
+- (void)refreshHostList:(GTMOAuth2Authentication*)authReq |
+ delegate:(id<HostRefreshDelegate>)delegate { |
+ |
+ CHECK(_delegate == nil); // Do not reuse an instance of this class |
+ |
+ _delegate = delegate; |
+ |
+ [Authorize beginRequest:authReq |
+ delegate:self |
+ didFinishSelector:@selector(authentication:request:error:)]; |
+} |
+ |
+// Handle completion of the authorization process. Append service credentials |
+// for jabber. If an error occurred, notify user. |
+- (void)authentication:(NSObject*)auth |
+ request:(NSMutableURLRequest*)request |
+ error:(NSError*)error { |
+ if (error != nil) { |
+ [self formatErrorMessage:error.localizedDescription]; |
+ } else { |
+ // Add credentials for service |
+ [Authorize appendCredentials:request]; |
+ |
+ // Begin connection, the returned reference is not useful right now and |
+ // marked as __unused |
+ __unused NSURLConnection* connection = |
+ [[NSURLConnection alloc] initWithRequest:request delegate:self]; |
+ } |
+} |
+ |
+// @protocol NSURLConnectionDelegate, handle any error during connection |
+- (void)connection:(NSURLConnection*)connection |
+ didFailWithError:(NSError*)error { |
+ [self formatErrorMessage:[error localizedDescription]]; |
+ |
+ [self notifyDelegate]; |
+} |
+ |
+// @protocol NSURLConnectionDataDelegate, may be called async multiple times. |
+// Each call appends the new data to the known data until completed. |
+- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data { |
+ [_jsonData appendData:data]; |
+} |
+ |
+// @protocol NSURLConnectionDataDelegate |
+// Ensure connection succeeded: HTTP 200 OK |
+- (void)connection:(NSURLConnection*)connection |
+ didReceiveResponse:(NSURLResponse*)response { |
+ NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; |
+ if ([response respondsToSelector:@selector(allHeaderFields)]) { |
+ NSNumber* responseCode = |
+ [[NSNumber alloc] initWithInteger:[httpResponse statusCode]]; |
+ if (responseCode.intValue != 200) { |
+ [self formatErrorMessage:[NSString |
+ stringWithFormat:@"HTTP STATUS CODE: %d", |
+ [httpResponse statusCode]]]; |
+ } |
+ } |
+} |
+ |
+// @protocol NSURLConnectionDataDelegate handle a completed connection, parse |
+// received data, and return host list to delegate |
+- (void)connectionDidFinishLoading:(NSURLConnection*)connection { |
+ [self notifyDelegate]; |
+} |
+ |
+// Store a formatted error message to return later |
+- (void)formatErrorMessage:(NSString*)error { |
+ _errorMessage = kDefaultErrorMessage; |
+ if (error != nil && error.length > 0) { |
+ _errorMessage = [_errorMessage |
+ stringByAppendingString:[@" " stringByAppendingString:error]]; |
+ } |
+} |
+ |
+// The connection has finished, call to delegate |
+- (void)notifyDelegate { |
+ if (_jsonData.length == 0 && _errorMessage == nil) { |
+ [self formatErrorMessage:nil]; |
+ } |
+ |
+ [_delegate hostListRefresh:[Host parseListFromJSON:_jsonData] |
+ errorMessage:_errorMessage]; |
+} |
+@end |