15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_PROFILES_PROFILE_DOWNLOADER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_PROFILES_PROFILE_DOWNLOADER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/image_decoder.h" 15424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "google_apis/gaia/oauth2_token_service.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ProfileDownloaderDelegate; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OAuth2AccessTokenFetcher; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLFetcher; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Downloads user profile information. The profile picture is decoded in a 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sandboxed process. 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass ProfileDownloader : public net::URLFetcherDelegate, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ImageDecoder::Delegate, 31558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public OAuth2TokenService::Observer, 32558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch public OAuth2TokenService::Consumer { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum PictureStatus { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PICTURE_SUCCESS, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PICTURE_FAILED, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PICTURE_DEFAULT, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PICTURE_CACHED, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ProfileDownloader(ProfileDownloaderDelegate* delegate); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ProfileDownloader(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts downloading profile information if the necessary authorization token 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is ready. If not, subscribes to token service and starts fetching if the 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // token is available. Should not be called more than once. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Starts downloading profile information if the necessary authorization token 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // is ready. If not, subscribes to token service and starts fetching if the 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // token is available. Should not be called more than once. 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void StartForAccount(const std::string& account_id); 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On successful download this returns the full name of the user. For example 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "Pat Smith". 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetProfileFullName() const; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // On successful download this returns the given name of the user. For example 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // if the name is "Pat Smith", the given name is "Pat". 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual base::string16 GetProfileGivenName() const; 61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // On successful download this returns G+ locale preference of the user. 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual std::string GetProfileLocale() const; 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On successful download this returns the profile picture of the user. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For users with no profile picture set (that is, they have the default 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // profile picture) this will return an Null bitmap. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SkBitmap GetProfilePicture() const; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the profile picture status. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual PictureStatus GetProfilePictureStatus() const; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the URL for the profile picture. This can be cached so that the same 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // picture is not downloaded multiple times. This value should only be used 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the picture status is PICTURE_SUCCESS. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual std::string GetProfilePictureURL() const; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ProfileDownloaderTest; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ProfileDownloaderTest, ParseData); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ProfileDownloaderTest, DefaultURL); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overriden from net::URLFetcherDelegate: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overriden from ImageDecoder::Delegate: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnImageDecoded(const ImageDecoder* decoder, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkBitmap& decoded_image) OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnDecodeImageFailed(const ImageDecoder* decoder) OVERRIDE; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Overriden from OAuth2TokenService::Observer: 92558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch // Overriden from OAuth2TokenService::Consumer: 95558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request, 96558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const std::string& access_token, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Time& expiration_time) OVERRIDE; 98558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request, 99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch const GoogleServiceAuthError& error) OVERRIDE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Parses the entry response and gets the name, profile image URL and locale. 10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // |data| should be the JSON formatted data return by the response. 10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Returns false to indicate a parsing error. 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static bool ParseProfileJSON(const std::string& data, 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16* full_name, 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16* given_name, 10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string* url, 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int image_size, 10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string* profile_locale); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the image url is url of the default profile picture. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsDefaultProfileImageURL(const std::string& url); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Issues the first request to get user profile image. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartFetchingImage(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the authorization header. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* GetAuthorizationHeader() const; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Starts fetching OAuth2 access token. This is needed before the GAIA info 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can be downloaded. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void StartFetchingOAuth2AccessToken(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProfileDownloaderDelegate* delegate_; 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::string account_id_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string auth_token_; 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<net::URLFetcher> user_entry_fetcher_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<net::URLFetcher> profile_image_fetcher_; 128558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch scoped_ptr<OAuth2TokenService::Request> oauth2_access_token_request_; 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 profile_full_name_; 130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 profile_given_name_; 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::string profile_locale_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkBitmap profile_picture_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PictureStatus picture_status_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string picture_url_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ProfileDownloader); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_PROFILES_PROFILE_DOWNLOADER_H_ 140