| Index: chrome/browser/chrome_to_mobile_service.h | 
| diff --git a/chrome/browser/chrome_to_mobile_service.h b/chrome/browser/chrome_to_mobile_service.h | 
| new file mode 100755 | 
| index 0000000000000000000000000000000000000000..6a70094abe83745ddc8a83b3a2d1b59803207a5f | 
| --- /dev/null | 
| +++ b/chrome/browser/chrome_to_mobile_service.h | 
| @@ -0,0 +1,133 @@ | 
| +// 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 <map> | 
| +#include <string> | 
| +#include <vector> | 
| + | 
| +#include "base/file_util.h" | 
| +#include "base/memory/weak_ptr.h" | 
| +#include "base/scoped_temp_dir.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/common/url_fetcher_delegate.h" | 
| +#include "googleurl/src/gurl.h" | 
| + | 
| +class OAuth2AccessTokenFetcher; | 
| +class CloudPrintURL; | 
| +class Profile; | 
| + | 
| +// ChromeToMobileService connects to the cloud print service to enumerate | 
| +// compatible mobiles owned by its profile and send URLs and MHTML snapshots. | 
| +// The mobile list updates regularly, and explicitly by RequestMobileListUpdate. | 
| +class ChromeToMobileService : public ProfileKeyedService, | 
| +                              public content::URLFetcherDelegate, | 
| +                              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; | 
| +  }; | 
| + | 
| +  // 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; | 
| +  }; | 
| + | 
| +  explicit ChromeToMobileService(Profile* profile); | 
| +  virtual ~ChromeToMobileService(); | 
| + | 
| +  // content::URLFetcherDelegate methods. | 
| +  virtual void OnURLFetchComplete(const content::URLFetcher* source) OVERRIDE; | 
| + | 
| +  // OAuth2AccessTokenConsumer methods. | 
| +  virtual void OnGetTokenSuccess(const std::string& access_token) OVERRIDE; | 
| +  virtual void OnGetTokenFailure(const GoogleServiceAuthError& error) OVERRIDE; | 
| + | 
| +  // Get the list of mobile devices. | 
| +  const std::vector<base::DictionaryValue*>& mobiles() { return mobiles_; } | 
| + | 
| +  // Request an updated mobile device list, request auth first if needed. | 
| +  void RequestMobileListUpdate(); | 
| + | 
| +  // Callback with an MHTML snapshot of the profile's selected WebContents. | 
| +  void GenerateSnapshot(base::WeakPtr<Observer> observer); | 
| + | 
| +  // Send the profile's selected WebContents to the specified mobile device. | 
| +  void SendToMobile(const string16& mobile_id, | 
| +                    const FilePath& snapshot, | 
| +                    base::WeakPtr<Observer> observer); | 
| + | 
| + private: | 
| +  // Utility function to initialize the ScopedTempDir. | 
| +  void CreateUniqueTempDir(); | 
| + | 
| +  // Utility function to create URLFetcher requests. | 
| +  content::URLFetcher* CreateRequest(const RequestData& data); | 
| + | 
| +  void RequestAuth(); | 
| +  void RequestSearch(); | 
| + | 
| +  void HandleSearchResponse(); | 
| +  void HandleSubmitResponse(const content::URLFetcher* source); | 
| + | 
| +  Profile* profile_; | 
| + | 
| +  // A utility class for accessing the cloud print service. | 
| +  scoped_ptr<CloudPrintURL> cloud_print_url_; | 
| + | 
| +  // The list of mobile devices retrieved from the cloud print service. | 
| +  std::vector<base::DictionaryValue*> mobiles_; | 
| + | 
| +  // The temporary directory for MHTML snapshot files. | 
| +  ScopedTempDir temp_dir_; | 
| + | 
| +  // Map URLFetchers to observers for reporting OnSendComplete. | 
| +  typedef std::map<const content::URLFetcher*, base::WeakPtr<Observer> > | 
| +      RequestObserverMap; | 
| +  RequestObserverMap request_observer_map_; | 
| + | 
| +  // The OAuth2 token and retry count. | 
| +  std::string oauth2_token_; | 
| +  size_t oauth2_retry_count_; | 
| + | 
| +  // The pending URL requests. | 
| +  scoped_ptr<OAuth2AccessTokenFetcher> oauth2_request_; | 
| +  scoped_ptr<content::URLFetcher> search_request_; | 
| + | 
| +  // A timer for authentication retries and mobile device list updates. | 
| +  base::OneShotTimer<ChromeToMobileService> request_timer_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(ChromeToMobileService); | 
| +}; | 
| + | 
| +#endif  // CHROME_BROWSER_CHROME_TO_MOBILE_SERVICE_H_ | 
|  |