| // Copyright (c) 2012 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. |
| // |
| // This class implements the OAuth2 client for the Chromoting host. |
| |
| #ifndef REMOTING_HOST_OAUTH_CLIENT_H_ |
| #define REMOTING_HOST_OAUTH_CLIENT_H_ |
| |
| #include <string> |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "base/threading/thread.h" |
| #include "remoting/host/gaia_oauth_client.h" |
| #include "remoting/host/url_request_context.h" |
| |
| namespace base { |
| class MessageLoopProxy; |
| } // namespace base |
| |
| namespace remoting { |
| |
| class OAuthClient : public GaiaOAuthClient::Delegate { |
| public: |
| class Delegate { |
| public: |
| virtual ~Delegate() { } |
| // Invoked on a successful response to the RefreshToken request. |
| virtual void OnRefreshTokenResponse(const std::string& access_token, |
| int expires_in_seconds) = 0; |
| // Invoked when there is an OAuth error with one of the requests. |
| virtual void OnOAuthError() = 0; |
| }; |
| |
| OAuthClient(); |
| virtual ~OAuthClient(); |
| |
| // Notify the delegate on the speficied message loop when an access token is |
| // available. As long as the refresh is successful, another will be queued, |
| // timed just before the access token expires. As soon as an error occurs, |
| // this automatic refresh behaviour is cancelled. |
| // |
| // The delegate is accessed on the specified message loop, and must out-live |
| // it. |
| void Start(const std::string& refresh_token, |
| Delegate* delegate, |
| base::MessageLoopProxy* message_loop); |
| |
| // Overridden from GaiaOAuthClient::Delegate |
| virtual void OnGetTokensResponse(const std::string& refresh_token, |
| const std::string& access_token, |
| int expires_in_seconds) OVERRIDE; |
| virtual void OnRefreshTokenResponse(const std::string& access_token, |
| int expires) OVERRIDE; |
| virtual void OnOAuthError() OVERRIDE; |
| virtual void OnNetworkError(int response_code) OVERRIDE; |
| |
| private: |
| void RefreshToken(); |
| |
| // TODO(jamiewalch): Move these to the ChromotingHostContext class so |
| // that the URLRequestContextGetter is available for other purposes. |
| base::Thread network_thread_; |
| base::Thread file_thread_; |
| scoped_ptr<URLRequestContextGetter> url_request_context_getter_; |
| scoped_ptr<GaiaOAuthClient> gaia_oauth_client_; |
| std::string refresh_token_; |
| OAuthClient::Delegate* delegate_; |
| scoped_refptr<base::MessageLoopProxy> message_loop_; |
| |
| DISALLOW_COPY_AND_ASSIGN(OAuthClient); |
| }; |
| |
| } // namespace remoting |
| |
| #endif // REMOTING_HOST_OAUTH_CLIENT_H_ |