| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "google_apis/gaia/oauth2_token_service_request.h" | 5 #include "google_apis/gaia/oauth2_token_service_request.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/single_thread_task_runner.h" | 10 #include "base/single_thread_task_runner.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 // Called on the token service thread. | 64 // Called on the token service thread. |
| 65 virtual void StopOnTokenServiceThread() = 0; | 65 virtual void StopOnTokenServiceThread() = 0; |
| 66 | 66 |
| 67 base::SingleThreadTaskRunner* token_service_task_runner(); | 67 base::SingleThreadTaskRunner* token_service_task_runner(); |
| 68 OAuth2TokenService* token_service(); | 68 OAuth2TokenService* token_service(); |
| 69 OAuth2TokenServiceRequest* owner(); | 69 OAuth2TokenServiceRequest* owner(); |
| 70 | 70 |
| 71 private: | 71 private: |
| 72 friend class base::RefCountedThreadSafe<OAuth2TokenServiceRequest::Core>; | 72 friend class base::RefCountedThreadSafe<OAuth2TokenServiceRequest::Core>; |
| 73 | 73 |
| 74 void DoNothing(); |
| 75 |
| 74 scoped_refptr<base::SingleThreadTaskRunner> token_service_task_runner_; | 76 scoped_refptr<base::SingleThreadTaskRunner> token_service_task_runner_; |
| 75 OAuth2TokenServiceRequest* owner_; | 77 OAuth2TokenServiceRequest* owner_; |
| 76 TokenServiceProvider* provider_; | 78 TokenServiceProvider* provider_; |
| 77 DISALLOW_COPY_AND_ASSIGN(Core); | 79 DISALLOW_COPY_AND_ASSIGN(Core); |
| 78 }; | 80 }; |
| 79 | 81 |
| 80 OAuth2TokenServiceRequest::Core::Core(OAuth2TokenServiceRequest* owner, | 82 OAuth2TokenServiceRequest::Core::Core(OAuth2TokenServiceRequest* owner, |
| 81 TokenServiceProvider* provider) | 83 TokenServiceProvider* provider) |
| 82 : owner_(owner), provider_(provider) { | 84 : owner_(owner), provider_(provider) { |
| 83 DCHECK(owner_); | 85 DCHECK(owner_); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 97 this)); | 99 this)); |
| 98 } | 100 } |
| 99 | 101 |
| 100 void OAuth2TokenServiceRequest::Core::Stop() { | 102 void OAuth2TokenServiceRequest::Core::Stop() { |
| 101 DCHECK(CalledOnValidThread()); | 103 DCHECK(CalledOnValidThread()); |
| 102 DCHECK(!IsStopped()); | 104 DCHECK(!IsStopped()); |
| 103 | 105 |
| 104 // Detaches |owner_| from this instance so |owner_| will be called back only | 106 // Detaches |owner_| from this instance so |owner_| will be called back only |
| 105 // if |Stop()| has never been called. | 107 // if |Stop()| has never been called. |
| 106 owner_ = NULL; | 108 owner_ = NULL; |
| 107 token_service_task_runner_->PostTask( | 109 |
| 110 // We are stopping and will likely be destroyed soon. Use a reply closure |
| 111 // (DoNothing) to retain "this" and ensure we are destroyed in the owner |
| 112 // thread, not the task runner thread. PostTaskAndReply guarantees that the |
| 113 // reply closure will execute after StopOnTokenServiceThread has completed. |
| 114 token_service_task_runner_->PostTaskAndReply( |
| 108 FROM_HERE, | 115 FROM_HERE, |
| 109 base::Bind(&OAuth2TokenServiceRequest::Core::StopOnTokenServiceThread, | 116 base::Bind(&OAuth2TokenServiceRequest::Core::StopOnTokenServiceThread, |
| 110 this)); | 117 this), |
| 118 base::Bind(&OAuth2TokenServiceRequest::Core::DoNothing, this)); |
| 111 } | 119 } |
| 112 | 120 |
| 113 bool OAuth2TokenServiceRequest::Core::IsStopped() const { | 121 bool OAuth2TokenServiceRequest::Core::IsStopped() const { |
| 114 DCHECK(CalledOnValidThread()); | 122 DCHECK(CalledOnValidThread()); |
| 115 return owner_ == NULL; | 123 return owner_ == NULL; |
| 116 } | 124 } |
| 117 | 125 |
| 118 base::SingleThreadTaskRunner* | 126 base::SingleThreadTaskRunner* |
| 119 OAuth2TokenServiceRequest::Core::token_service_task_runner() { | 127 OAuth2TokenServiceRequest::Core::token_service_task_runner() { |
| 120 return token_service_task_runner_; | 128 return token_service_task_runner_; |
| 121 } | 129 } |
| 122 | 130 |
| 123 OAuth2TokenService* OAuth2TokenServiceRequest::Core::token_service() { | 131 OAuth2TokenService* OAuth2TokenServiceRequest::Core::token_service() { |
| 124 DCHECK(token_service_task_runner_->BelongsToCurrentThread()); | 132 DCHECK(token_service_task_runner_->BelongsToCurrentThread()); |
| 125 return provider_->GetTokenService(); | 133 return provider_->GetTokenService(); |
| 126 } | 134 } |
| 127 | 135 |
| 128 OAuth2TokenServiceRequest* OAuth2TokenServiceRequest::Core::owner() { | 136 OAuth2TokenServiceRequest* OAuth2TokenServiceRequest::Core::owner() { |
| 129 DCHECK(CalledOnValidThread()); | 137 DCHECK(CalledOnValidThread()); |
| 130 return owner_; | 138 return owner_; |
| 131 } | 139 } |
| 132 | 140 |
| 141 void OAuth2TokenServiceRequest::Core::DoNothing() { |
| 142 DCHECK(CalledOnValidThread()); |
| 143 } |
| 144 |
| 133 namespace { | 145 namespace { |
| 134 | 146 |
| 135 // An implementation of Core for getting an access token. | 147 // An implementation of Core for getting an access token. |
| 136 class RequestCore : public OAuth2TokenServiceRequest::Core, | 148 class RequestCore : public OAuth2TokenServiceRequest::Core, |
| 137 public OAuth2TokenService::Consumer { | 149 public OAuth2TokenService::Consumer { |
| 138 public: | 150 public: |
| 139 RequestCore(OAuth2TokenServiceRequest* owner, | 151 RequestCore(OAuth2TokenServiceRequest* owner, |
| 140 OAuth2TokenServiceRequest::TokenServiceProvider* provider, | 152 OAuth2TokenServiceRequest::TokenServiceProvider* provider, |
| 141 OAuth2TokenService::Consumer* consumer, | 153 OAuth2TokenService::Consumer* consumer, |
| 142 const std::string& account_id, | 154 const std::string& account_id, |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 339 const std::string& account_id) | 351 const std::string& account_id) |
| 340 : account_id_(account_id) { | 352 : account_id_(account_id) { |
| 341 DCHECK(!account_id_.empty()); | 353 DCHECK(!account_id_.empty()); |
| 342 } | 354 } |
| 343 | 355 |
| 344 void OAuth2TokenServiceRequest::StartWithCore(const scoped_refptr<Core>& core) { | 356 void OAuth2TokenServiceRequest::StartWithCore(const scoped_refptr<Core>& core) { |
| 345 DCHECK(core); | 357 DCHECK(core); |
| 346 core_ = core; | 358 core_ = core; |
| 347 core_->Start(); | 359 core_->Start(); |
| 348 } | 360 } |
| OLD | NEW |