// Copyright 2013 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_CHROMEOS_POLICY_CLOUD_EXTERNAL_DATA_MANAGER_BASE_H_ #define CHROME_BROWSER_CHROMEOS_POLICY_CLOUD_EXTERNAL_DATA_MANAGER_BASE_H_ #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/threading/non_thread_safe.h" #include "components/policy/core/common/cloud/cloud_external_data_manager.h" #include "components/policy/core/common/policy_details.h" namespace base { class SequencedTaskRunner; } namespace policy { class CloudExternalDataStore; class ExternalPolicyDataFetcherBackend; // Downloads, verifies, caches and retrieves external data referenced by // policies. // This is a common base class used by specializations for regular users and // device-local accounts. class CloudExternalDataManagerBase : public CloudExternalDataManager, public base::NonThreadSafe { public: // |get_policy_details| is used to determine the maximum size that the // data referenced by each policy can have. Download scheduling, verification, // caching and retrieval tasks are done via the |backend_task_runner|, which // must support file I/O. Network I/O is done via the |io_task_runner|. CloudExternalDataManagerBase( const GetChromePolicyDetailsCallback& get_policy_details, scoped_refptr<base::SequencedTaskRunner> backend_task_runner, scoped_refptr<base::SequencedTaskRunner> io_task_runner); virtual ~CloudExternalDataManagerBase(); // Allows downloaded external data to be cached in |external_data_store|. // Ownership of the store is taken. The store can be destroyed by calling // SetExternalDataStore(scoped_ptr<CloudExternalDataStore>()). Accesses to the // store are made via |backend_task_runner_| only. void SetExternalDataStore( scoped_ptr<CloudExternalDataStore> external_data_store); // CloudExternalDataManager: virtual void SetPolicyStore(CloudPolicyStore* policy_store) OVERRIDE; virtual void OnPolicyStoreLoaded() OVERRIDE; virtual void Connect( scoped_refptr<net::URLRequestContextGetter> request_context) OVERRIDE; virtual void Disconnect() OVERRIDE; virtual void Fetch( const std::string& policy, const ExternalDataFetcher::FetchCallback& callback) OVERRIDE; // Allows policies to reference |max_size| bytes of external data even if no // |max_size| was specified in policy_templates.json. // TODO(bartfab): This override is only needed because there are no policies // that reference external data and have a |max_size| yet. Once the first such // policy is added, use that policy in tests and remove the override. static void SetMaxExternalDataSizeForTesting(int max_size); protected: friend class CloudExternalDataManagerBaseTest; // Try to download and cache all external data referenced by policies in // |policy_store_|. void FetchAll(); scoped_refptr<base::SequencedTaskRunner> backend_task_runner_; scoped_refptr<base::SequencedTaskRunner> io_task_runner_; private: // The |external_policy_data_fetcher_backend_| handles network I/O for the // |backend_| because URLRequestContextGetter and URLFetchers cannot be // referenced from background threads. It is instantiated on the thread |this| // runs on but after that, must only be accessed and eventually destroyed via // the |io_task_runner_|. scoped_ptr<ExternalPolicyDataFetcherBackend> external_policy_data_fetcher_backend_; // The |backend_| handles all data download scheduling, verification, caching // and retrieval. It is instantiated on the thread |this| runs on but after // that, must only be accessed and eventually destroyed via the // |backend_task_runner_|. class Backend; scoped_ptr<Backend> backend_; DISALLOW_COPY_AND_ASSIGN(CloudExternalDataManagerBase); }; } // namespace policy #endif // CHROME_BROWSER_CHROMEOS_POLICY_CLOUD_EXTERNAL_DATA_MANAGER_BASE_H_