Chromium Code Reviews| 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* glib_task_runner, |
|
digit1
2012/10/19 10:32:46
same remarks in this file.
| |
| 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 glib_task_runner_(glib_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(OnGlibThread()); |
| 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 glib thread. |
| 226 void ProxySettingsChanged() { | 220 void ProxySettingsChanged() { |
| 227 DCHECK(OnJNIThread()); | 221 DCHECK(OnGlibThread()); |
| 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 OnGlibThread() const { |
| 271 return jni_task_runner_->RunsTasksOnCurrentThread(); | 255 return glib_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> glib_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* glib_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, glib_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* glib_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, glib_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 |