Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3551)

Unified Diff: remoting/ios/host_refresh.mm

Issue 278863003: Chromoting iOS client (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/ios/host_refresh.h ('k') | remoting/ios/host_refresh_test_helper.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « remoting/ios/host_refresh.h ('k') | remoting/ios/host_refresh_test_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698