// 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. #include "google_apis/gaia/oauth2_access_token_fetcher_immediate_error.h" #include "base/bind.h" #include "base/threading/thread_task_runner_handle.h" #include "google_apis/gaia/google_service_auth_error.h" OAuth2AccessTokenFetcherImmediateError::FailCaller::FailCaller( OAuth2AccessTokenFetcherImmediateError* fetcher) : fetcher_(fetcher) { } OAuth2AccessTokenFetcherImmediateError::FailCaller::~FailCaller() { } void OAuth2AccessTokenFetcherImmediateError::FailCaller::run() { if (fetcher_) { fetcher_->Fail(); fetcher_ = nullptr; } } void OAuth2AccessTokenFetcherImmediateError::FailCaller::detach() { fetcher_ = nullptr; } OAuth2AccessTokenFetcherImmediateError::OAuth2AccessTokenFetcherImmediateError( OAuth2AccessTokenConsumer* consumer, const GoogleServiceAuthError& error) : OAuth2AccessTokenFetcher(consumer), immediate_error_(error) { DCHECK(immediate_error_ != GoogleServiceAuthError::AuthErrorNone()); } OAuth2AccessTokenFetcherImmediateError:: ~OAuth2AccessTokenFetcherImmediateError() { CancelRequest(); } void OAuth2AccessTokenFetcherImmediateError::CancelRequest() { if (failer_) { failer_->detach(); failer_ = nullptr; } } void OAuth2AccessTokenFetcherImmediateError::Start( const std::string& client_id, const std::string& client_secret, const std::vector& scopes) { failer_ = new FailCaller(this); base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&OAuth2AccessTokenFetcherImmediateError::FailCaller::run, failer_)); } void OAuth2AccessTokenFetcherImmediateError::Fail() { // The call below will likely destruct this object. We have to make a copy // of the error into a local variable because the class member thus will // be destroyed after which the copy-passed-by-reference will cause a // memory violation when accessed. GoogleServiceAuthError error_copy = immediate_error_; FireOnGetTokenFailure(error_copy); }