OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #if !defined(__has_feature) || !__has_feature(objc_arc) | |
6 #error "This file requires ARC support." | |
7 #endif | |
8 | |
9 #import "remoting/ios/host_refresh.h" | |
10 | |
11 #import "remoting/ios/authorize.h" | |
12 #import "remoting/ios/host.h" | |
13 #import "remoting/ios/utility.h" | |
14 | |
15 namespace { | |
16 NSString* kDefaultErrorMessage = @"The Host list refresh is not available at " | |
17 @"this time. Please try again later."; | |
18 } // namespace | |
19 | |
20 @interface HostRefresh (Private) | |
21 - (void)authentication:(GTMOAuth2Authentication*)auth | |
22 request:(NSMutableURLRequest*)request | |
23 error:(NSError*)error; | |
24 - (void)formatErrorMessage:(NSString*)error; | |
25 - (void)notifyDelegate; | |
26 @end | |
27 | |
28 // Logic flow begins with refreshHostList, and continues until an error occurs, | |
29 // or the host list is returned to the delegate | |
30 @implementation HostRefresh | |
31 | |
32 @synthesize jsonData = _jsonData; | |
33 @synthesize errorMessage = _errorMessage; | |
34 @synthesize delegate = _delegate; | |
35 | |
36 // Override default constructor and initialize internals | |
37 - (id)init { | |
38 self = [super init]; | |
39 if (self) { | |
40 _jsonData = [[NSMutableData alloc] init]; | |
41 } | |
42 return self; | |
43 } | |
44 | |
45 // Begin the authentication and authorization process. Begin the process by | |
46 // creating an oAuth2 request to google api's including the needed scopes to | |
47 // fetch the users host list. | |
48 - (void)refreshHostList:(GTMOAuth2Authentication*)authReq | |
49 delegate:(id<HostRefreshDelegate>)delegate { | |
50 | |
51 CHECK(_delegate == nil); // Do not reuse an instance of this class | |
52 | |
53 _delegate = delegate; | |
54 | |
55 [Authorize beginRequest:authReq | |
56 delegate:self | |
57 didFinishSelector:@selector(authentication:request:error:)]; | |
58 } | |
59 | |
60 // Handle completion of the authorization process. Append service credentials | |
61 // for jabber. If an error occurred, notify user. | |
62 - (void)authentication:(NSObject*)auth | |
63 request:(NSMutableURLRequest*)request | |
64 error:(NSError*)error { | |
65 if (error != nil) { | |
66 [self formatErrorMessage:error.localizedDescription]; | |
67 } else { | |
68 // Add credentials for service | |
69 [Authorize appendCredentials:request]; | |
70 | |
71 // Begin connection, the returned reference is not useful right now and | |
72 // marked as __unused | |
73 __unused NSURLConnection* connection = | |
74 [[NSURLConnection alloc] initWithRequest:request delegate:self]; | |
75 } | |
76 } | |
77 | |
78 // @protocol NSURLConnectionDelegate, handle any error during connection | |
79 - (void)connection:(NSURLConnection*)connection | |
80 didFailWithError:(NSError*)error { | |
81 [self formatErrorMessage:[error localizedDescription]]; | |
82 | |
83 [self notifyDelegate]; | |
84 } | |
85 | |
86 // @protocol NSURLConnectionDataDelegate, may be called async multiple times. | |
87 // Each call appends the new data to the known data until completed. | |
88 - (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data { | |
89 [_jsonData appendData:data]; | |
90 } | |
91 | |
92 // @protocol NSURLConnectionDataDelegate | |
93 // Ensure connection succeeded: HTTP 200 OK | |
94 - (void)connection:(NSURLConnection*)connection | |
95 didReceiveResponse:(NSURLResponse*)response { | |
96 NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; | |
97 if ([response respondsToSelector:@selector(allHeaderFields)]) { | |
98 NSNumber* responseCode = | |
99 [[NSNumber alloc] initWithInteger:[httpResponse statusCode]]; | |
100 if (responseCode.intValue != 200) { | |
101 [self formatErrorMessage:[NSString | |
102 stringWithFormat:@"HTTP STATUS CODE: %d", | |
103 [httpResponse statusCode]]]; | |
104 } | |
105 } | |
106 } | |
107 | |
108 // @protocol NSURLConnectionDataDelegate handle a completed connection, parse | |
109 // received data, and return host list to delegate | |
110 - (void)connectionDidFinishLoading:(NSURLConnection*)connection { | |
111 [self notifyDelegate]; | |
112 } | |
113 | |
114 // Store a formatted error message to return later | |
115 - (void)formatErrorMessage:(NSString*)error { | |
116 _errorMessage = kDefaultErrorMessage; | |
117 if (error != nil && error.length > 0) { | |
118 _errorMessage = [_errorMessage | |
119 stringByAppendingString:[@" " stringByAppendingString:error]]; | |
120 } | |
121 } | |
122 | |
123 // The connection has finished, call to delegate | |
124 - (void)notifyDelegate { | |
125 if (_jsonData.length == 0 && _errorMessage == nil) { | |
126 [self formatErrorMessage:nil]; | |
127 } | |
128 | |
129 [_delegate hostListRefresh:[Host parseListFromJSON:_jsonData] | |
130 errorMessage:_errorMessage]; | |
131 } | |
132 @end | |
OLD | NEW |