OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/proxy/proxy_config_service_android.h" | 5 #include "net/proxy/proxy_config_service_android.h" |
6 | 6 |
7 #include <sys/system_properties.h> | 7 #include <sys/system_properties.h> |
8 | 8 |
9 #include "base/android/jni_string.h" | 9 #include "base/android/jni_string.h" |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 return result.is_null() ? | 154 return result.is_null() ? |
155 std::string() : ConvertJavaStringToUTF8(env, result.obj()); | 155 std::string() : ConvertJavaStringToUTF8(env, result.obj()); |
156 } | 156 } |
157 | 157 |
158 } // namespace | 158 } // namespace |
159 | 159 |
160 class ProxyConfigServiceAndroid::Delegate | 160 class ProxyConfigServiceAndroid::Delegate |
161 : public base::RefCountedThreadSafe<Delegate> { | 161 : public base::RefCountedThreadSafe<Delegate> { |
162 public: | 162 public: |
163 Delegate(base::SequencedTaskRunner* network_task_runner, | 163 Delegate(base::SequencedTaskRunner* network_task_runner, |
164 base::SequencedTaskRunner* jni_task_runner, | 164 base::SequencedTaskRunner* main_task_runner, |
165 const GetPropertyCallback& get_property_callback) | 165 const GetPropertyCallback& get_property_callback) |
166 : ALLOW_THIS_IN_INITIALIZER_LIST(jni_delegate_(this)), | 166 : ALLOW_THIS_IN_INITIALIZER_LIST(jni_delegate_(this)), |
167 network_task_runner_(network_task_runner), | 167 network_task_runner_(network_task_runner), |
168 jni_task_runner_(jni_task_runner), | 168 main_task_runner_(main_task_runner), |
169 get_property_callback_(get_property_callback) { | 169 get_property_callback_(get_property_callback) { |
170 } | 170 } |
171 | 171 |
172 void SetupJNI() { | 172 void SetupJNI() { |
173 DCHECK(OnJNIThread()); | 173 DCHECK(OnNetworkThread()); |
174 JNIEnv* env = AttachCurrentThread(); | 174 JNIEnv* env = AttachCurrentThread(); |
175 if (java_proxy_change_listener_.is_null()) { | 175 if (java_proxy_change_listener_.is_null()) { |
176 java_proxy_change_listener_.Reset( | 176 java_proxy_change_listener_.Reset( |
177 Java_ProxyChangeListener_create( | 177 Java_ProxyChangeListener_create( |
178 env, base::android::GetApplicationContext())); | 178 env, base::android::GetApplicationContext())); |
179 CHECK(!java_proxy_change_listener_.is_null()); | 179 CHECK(!java_proxy_change_listener_.is_null()); |
180 } | 180 } |
181 Java_ProxyChangeListener_start( | 181 Java_ProxyChangeListener_start( |
182 env, | 182 env, |
183 java_proxy_change_listener_.obj(), | 183 java_proxy_change_listener_.obj(), |
184 reinterpret_cast<jint>(&jni_delegate_)); | 184 reinterpret_cast<jint>(&jni_delegate_)); |
185 } | 185 } |
186 | 186 |
187 void FetchInitialConfig() { | 187 void FetchInitialConfig() { |
188 DCHECK(OnJNIThread()); | 188 DCHECK(OnNetworkThread()); |
189 ProxyConfig proxy_config; | 189 SetNewConfigOnNetworkThread(); |
190 GetLatestProxyConfigInternal(get_property_callback_, &proxy_config); | |
191 network_task_runner_->PostTask( | |
192 FROM_HERE, | |
193 base::Bind(&Delegate::SetNewConfigOnNetworkThread, this, proxy_config)); | |
194 } | 190 } |
195 | 191 |
196 void Shutdown() { | 192 void StartTearDown() { |
197 if (OnJNIThread()) { | 193 DCHECK(OnMainThread()); |
198 ShutdownOnJNIThread(); | 194 if (java_proxy_change_listener_.is_null()) |
199 } else { | 195 return; |
200 jni_task_runner_->PostTask( | 196 JNIEnv* env = AttachCurrentThread(); |
201 FROM_HERE, | 197 Java_ProxyChangeListener_stop(env, java_proxy_change_listener_.obj()); |
202 base::Bind(&Delegate::ShutdownOnJNIThread, this)); | |
203 } | |
204 } | 198 } |
205 | 199 |
206 // Called only on the network thread. | 200 // Called only on the network thread. |
207 void AddObserver(Observer* observer) { | 201 void AddObserver(Observer* observer) { |
208 DCHECK(OnNetworkThread()); | 202 DCHECK(OnNetworkThread()); |
209 observers_.AddObserver(observer); | 203 observers_.AddObserver(observer); |
210 } | 204 } |
211 | 205 |
212 void RemoveObserver(Observer* observer) { | 206 void RemoveObserver(Observer* observer) { |
213 DCHECK(OnNetworkThread()); | 207 DCHECK(OnNetworkThread()); |
214 observers_.RemoveObserver(observer); | 208 observers_.RemoveObserver(observer); |
215 } | 209 } |
216 | 210 |
217 ConfigAvailability GetLatestProxyConfig(ProxyConfig* config) { | 211 ConfigAvailability GetLatestProxyConfig(ProxyConfig* config) { |
218 DCHECK(OnNetworkThread()); | 212 DCHECK(OnNetworkThread()); |
219 if (!config) | 213 if (!config) |
220 return ProxyConfigService::CONFIG_UNSET; | 214 return ProxyConfigService::CONFIG_UNSET; |
221 *config = proxy_config_; | 215 *config = proxy_config_; |
222 return ProxyConfigService::CONFIG_VALID; | 216 return ProxyConfigService::CONFIG_VALID; |
223 } | 217 } |
224 | 218 |
225 // Called on the JNI thread. | 219 // Called on the main thread. |
226 void ProxySettingsChanged() { | 220 void ProxySettingsChanged() { |
227 DCHECK(OnJNIThread()); | 221 DCHECK(OnMainThread()); |
228 ProxyConfig proxy_config; | |
229 GetLatestProxyConfigInternal(get_property_callback_, &proxy_config); | |
230 network_task_runner_->PostTask( | 222 network_task_runner_->PostTask( |
231 FROM_HERE, | 223 FROM_HERE, |
232 base::Bind( | 224 base::Bind(&Delegate::SetNewConfigOnNetworkThread, this)); |
233 &Delegate::SetNewConfigOnNetworkThread, this, proxy_config)); | |
234 } | 225 } |
235 | 226 |
236 private: | 227 private: |
237 friend class base::RefCountedThreadSafe<Delegate>; | 228 friend class base::RefCountedThreadSafe<Delegate>; |
238 | 229 |
239 class JNIDelegateImpl : public ProxyConfigServiceAndroid::JNIDelegate { | 230 class JNIDelegateImpl : public ProxyConfigServiceAndroid::JNIDelegate { |
240 public: | 231 public: |
241 explicit JNIDelegateImpl(Delegate* delegate) : delegate_(delegate) {} | 232 explicit JNIDelegateImpl(Delegate* delegate) : delegate_(delegate) {} |
242 | 233 |
243 // ProxyConfigServiceAndroid::JNIDelegate overrides. | 234 // ProxyConfigServiceAndroid::JNIDelegate overrides. |
244 virtual void ProxySettingsChanged(JNIEnv*, jobject) OVERRIDE { | 235 virtual void ProxySettingsChanged(JNIEnv*, jobject) OVERRIDE { |
245 delegate_->ProxySettingsChanged(); | 236 delegate_->ProxySettingsChanged(); |
246 } | 237 } |
247 | 238 |
248 private: | 239 private: |
249 Delegate* const delegate_; | 240 Delegate* const delegate_; |
250 }; | 241 }; |
251 | 242 |
252 virtual ~Delegate() {} | 243 virtual ~Delegate() {} |
253 | 244 |
254 void ShutdownOnJNIThread() { | |
255 if (java_proxy_change_listener_.is_null()) | |
256 return; | |
257 JNIEnv* env = AttachCurrentThread(); | |
258 Java_ProxyChangeListener_stop(env, java_proxy_change_listener_.obj()); | |
259 } | |
260 | |
261 // Called on the network thread. | 245 // Called on the network thread. |
262 void SetNewConfigOnNetworkThread(const ProxyConfig& proxy_config) { | 246 void SetNewConfigOnNetworkThread() { |
263 DCHECK(OnNetworkThread()); | 247 DCHECK(OnNetworkThread()); |
264 proxy_config_ = proxy_config; | 248 GetLatestProxyConfigInternal(get_property_callback_, &proxy_config_); |
265 FOR_EACH_OBSERVER(Observer, observers_, | 249 FOR_EACH_OBSERVER(Observer, observers_, |
266 OnProxyConfigChanged(proxy_config, | 250 OnProxyConfigChanged(proxy_config_, |
267 ProxyConfigService::CONFIG_VALID)); | 251 ProxyConfigService::CONFIG_VALID)); |
268 } | 252 } |
269 | 253 |
270 bool OnJNIThread() const { | 254 bool OnMainThread() const { |
271 return jni_task_runner_->RunsTasksOnCurrentThread(); | 255 return main_task_runner_->RunsTasksOnCurrentThread(); |
272 } | 256 } |
273 | 257 |
274 bool OnNetworkThread() const { | 258 bool OnNetworkThread() const { |
275 return network_task_runner_->RunsTasksOnCurrentThread(); | 259 return network_task_runner_->RunsTasksOnCurrentThread(); |
276 } | 260 } |
277 | 261 |
278 ScopedJavaGlobalRef<jobject> java_proxy_change_listener_; | 262 ScopedJavaGlobalRef<jobject> java_proxy_change_listener_; |
279 | 263 |
280 JNIDelegateImpl jni_delegate_; | 264 JNIDelegateImpl jni_delegate_; |
281 ObserverList<Observer> observers_; | 265 ObserverList<Observer> observers_; |
282 scoped_refptr<base::SequencedTaskRunner> network_task_runner_; | 266 scoped_refptr<base::SequencedTaskRunner> network_task_runner_; |
283 scoped_refptr<base::SequencedTaskRunner> jni_task_runner_; | 267 scoped_refptr<base::SequencedTaskRunner> main_task_runner_; |
284 GetPropertyCallback get_property_callback_; | 268 GetPropertyCallback get_property_callback_; |
285 ProxyConfig proxy_config_; | 269 ProxyConfig proxy_config_; |
286 | 270 |
287 DISALLOW_COPY_AND_ASSIGN(Delegate); | 271 DISALLOW_COPY_AND_ASSIGN(Delegate); |
288 }; | 272 }; |
289 | 273 |
290 ProxyConfigServiceAndroid::ProxyConfigServiceAndroid( | 274 ProxyConfigServiceAndroid::ProxyConfigServiceAndroid( |
291 base::SequencedTaskRunner* network_task_runner, | 275 base::SequencedTaskRunner* main_task_runner, |
292 base::SequencedTaskRunner* jni_task_runner) | 276 base::SequencedTaskRunner* network_task_runner) |
293 : delegate_(new Delegate( | 277 : delegate_(new Delegate( |
294 network_task_runner, jni_task_runner, base::Bind(&GetJavaProperty))) { | 278 network_task_runner, main_task_runner, base::Bind(&GetJavaProperty))) { |
295 delegate_->SetupJNI(); | 279 delegate_->SetupJNI(); |
296 delegate_->FetchInitialConfig(); | 280 delegate_->FetchInitialConfig(); |
297 } | 281 } |
298 | 282 |
299 ProxyConfigServiceAndroid::~ProxyConfigServiceAndroid() { | 283 ProxyConfigServiceAndroid::~ProxyConfigServiceAndroid() {} |
300 delegate_->Shutdown(); | 284 |
| 285 void ProxyConfigServiceAndroid::StartTearDown() { |
| 286 delegate_->StartTearDown(); |
301 } | 287 } |
302 | 288 |
303 // static | 289 // static |
304 bool ProxyConfigServiceAndroid::Register(JNIEnv* env) { | 290 bool ProxyConfigServiceAndroid::Register(JNIEnv* env) { |
305 return RegisterNativesImpl(env); | 291 return RegisterNativesImpl(env); |
306 } | 292 } |
307 | 293 |
308 void ProxyConfigServiceAndroid::AddObserver(Observer* observer) { | 294 void ProxyConfigServiceAndroid::AddObserver(Observer* observer) { |
309 delegate_->AddObserver(observer); | 295 delegate_->AddObserver(observer); |
310 } | 296 } |
311 | 297 |
312 void ProxyConfigServiceAndroid::RemoveObserver(Observer* observer) { | 298 void ProxyConfigServiceAndroid::RemoveObserver(Observer* observer) { |
313 delegate_->RemoveObserver(observer); | 299 delegate_->RemoveObserver(observer); |
314 } | 300 } |
315 | 301 |
316 ProxyConfigService::ConfigAvailability | 302 ProxyConfigService::ConfigAvailability |
317 ProxyConfigServiceAndroid::GetLatestProxyConfig(ProxyConfig* config) { | 303 ProxyConfigServiceAndroid::GetLatestProxyConfig(ProxyConfig* config) { |
318 return delegate_->GetLatestProxyConfig(config); | 304 return delegate_->GetLatestProxyConfig(config); |
319 } | 305 } |
320 | 306 |
321 ProxyConfigServiceAndroid::ProxyConfigServiceAndroid( | 307 ProxyConfigServiceAndroid::ProxyConfigServiceAndroid( |
322 base::SequencedTaskRunner* network_task_runner, | 308 base::SequencedTaskRunner* network_task_runner, |
323 base::SequencedTaskRunner* jni_task_runner, | 309 base::SequencedTaskRunner* main_task_runner, |
324 GetPropertyCallback get_property_callback) | 310 GetPropertyCallback get_property_callback) |
325 : delegate_(new Delegate( | 311 : delegate_(new Delegate( |
326 network_task_runner, jni_task_runner, get_property_callback)) { | 312 network_task_runner, main_task_runner, get_property_callback)) { |
327 delegate_->FetchInitialConfig(); | 313 delegate_->FetchInitialConfig(); |
328 } | 314 } |
329 | 315 |
330 void ProxyConfigServiceAndroid::ProxySettingsChanged() { | 316 void ProxyConfigServiceAndroid::ProxySettingsChanged() { |
331 delegate_->ProxySettingsChanged(); | 317 delegate_->ProxySettingsChanged(); |
332 } | 318 } |
333 | 319 |
334 } // namespace net | 320 } // namespace net |
OLD | NEW |