// 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. #ifndef CHROME_BROWSER_CHROME_TO_MOBILE_SERVICE_H_ #define CHROME_BROWSER_CHROME_TO_MOBILE_SERVICE_H_ #pragma once #include #include #include #include #include "base/file_path.h" #include "base/memory/scoped_vector.h" #include "base/memory/weak_ptr.h" #include "base/string16.h" #include "base/timer.h" #include "chrome/browser/profiles/profile_keyed_service.h" #include "chrome/common/net/gaia/oauth2_access_token_consumer.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" #include "content/public/common/url_fetcher_delegate.h" #include "googleurl/src/gurl.h" class OAuth2AccessTokenFetcher; class CloudPrintURL; class MockChromeToMobileService; class Profile; namespace base { class DictionaryValue; } // ChromeToMobileService connects to the cloud print service to enumerate // compatible mobiles owned by its profile and send URLs and MHTML snapshots. class ChromeToMobileService : public ProfileKeyedService, public content::URLFetcherDelegate, public content::NotificationObserver, public OAuth2AccessTokenConsumer { public: class Observer { public: virtual ~Observer(); // Called on generation of the page's MHTML snapshot. virtual void SnapshotGenerated(const FilePath& path, int64 bytes) = 0; // Called after URLFetcher responses from sending the URL (and snapshot). virtual void OnSendComplete(bool success) = 0; }; enum Metric { DEVICES_REQUESTED = 0, // Cloud print was contacted to list devices. DEVICES_AVAILABLE, // Cloud print returned 1+ compatible devices. BUBBLE_SHOWN, // The page action bubble was shown. SNAPSHOT_GENERATED, // A snapshot was successfully generated. SNAPSHOT_ERROR, // An error occurred during snapshot generation. SENDING_URL, // Send was invoked (with or without a snapshot). SENDING_SNAPSHOT, // A snapshot was sent along with the page URL. SEND_SUCCESS, // Cloud print responded with success on send. SEND_ERROR, // Cloud print responded with failure on send. NUM_METRICS }; // The URLFetcher request types. enum RequestType { SEARCH, URL, DELAYED_SNAPSHOT, SNAPSHOT, }; // The aggregated URLFetcher submission data. struct RequestData { RequestData(); ~RequestData(); string16 mobile_id; GURL url; string16 title; FilePath snapshot_path; std::string snapshot_id; RequestType type; }; // Returns whether Chrome To Mobile is enabled. Check for the 'disable' or // 'enable' command line switches, otherwise relay the default enabled state. static bool IsChromeToMobileEnabled(); explicit ChromeToMobileService(Profile* profile); virtual ~ChromeToMobileService(); // Returns true if the service has found any registered mobile devices. bool HasDevices(); // Get the list of mobile devices. const std::vector& mobiles(); // Request an updated mobile device list, request auth first if needed. // Virtual for unit test mocking. virtual void RequestMobileListUpdate(); // Callback with an MHTML snapshot of the profile's selected WebContents. // Virtual for unit test mocking. virtual void GenerateSnapshot(base::WeakPtr observer); // Send the profile's selected WebContents to the specified mobile device. // Virtual for unit test mocking. virtual void SendToMobile(const string16& mobile_id, const FilePath& snapshot, base::WeakPtr observer); // Delete the snapshot file (should be called on observer destruction). // Virtual for unit test mocking. virtual void DeleteSnapshot(const FilePath& snapshot); // Log a metric for the "ChromeToMobile.Service" histogram. // Virtual for unit test mocking. virtual void LogMetric(Metric metric); // content::URLFetcherDelegate method. virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; // content::NotificationObserver method. virtual void Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) OVERRIDE; // OAuth2AccessTokenConsumer methods. virtual void OnGetTokenSuccess(const std::string& access_token) OVERRIDE; virtual void OnGetTokenFailure(const GoogleServiceAuthError& error) OVERRIDE; private: friend class MockChromeToMobileService; // Handle the attempted creation of a temporary file for snapshot generation. // Alert the observer of failure or generate MHTML with an observer callback. void SnapshotFileCreated(base::WeakPtr observer, const FilePath& path, bool success); // Utility function to create URLFetcher requests. content::URLFetcher* CreateRequest(const RequestData& data); // Send the OAuth2AccessTokenFetcher request. // Virtual for unit test mocking. virtual void RefreshAccessToken(); // Request account information to limit cloud print access to existing users. void RequestAccountInfo(); // Send the cloud print URLFetcher search request. void RequestSearch(); void HandleAccountInfoResponse(); void HandleSearchResponse(); void HandleSubmitResponse(const net::URLFetcher* source); base::WeakPtrFactory weak_ptr_factory_; Profile* profile_; // Used to recieve TokenService notifications for GaiaOAuth2LoginRefreshToken. content::NotificationRegistrar registrar_; // Cloud print helper class and auth token. scoped_ptr cloud_print_url_; std::string access_token_; // The list of mobile devices retrieved from the cloud print service. ScopedVector mobiles_; // The set of snapshots currently available. std::set snapshots_; // Map URLFetchers to observers for reporting OnSendComplete. typedef std::map > RequestObserverMap; RequestObserverMap request_observer_map_; // The pending OAuth access token request and a timer for retrying on failure. scoped_ptr access_token_fetcher_; base::OneShotTimer auth_retry_timer_; // The pending account information request and the cloud print access flag. scoped_ptr account_info_request_; bool cloud_print_accessible_; // The pending mobile device search request; and the time of the last request. scoped_ptr search_request_; base::TimeTicks previous_search_time_; DISALLOW_COPY_AND_ASSIGN(ChromeToMobileService); }; #endif // CHROME_BROWSER_CHROME_TO_MOBILE_SERVICE_H_