1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_CHROMEOS_POLICY_USER_CLOUD_EXTERNAL_DATA_MANAGER_H_
6#define CHROME_BROWSER_CHROMEOS_POLICY_USER_CLOUD_EXTERNAL_DATA_MANAGER_H_
7
8#include "base/basictypes.h"
9#include "base/files/file_path.h"
10#include "base/memory/ref_counted.h"
11#include "chrome/browser/chromeos/policy/cloud_external_data_manager_base.h"
12#include "components/policy/core/common/policy_details.h"
13
14namespace base {
15class SequencedTaskRunner;
16}
17
18namespace policy {
19
20class CloudPolicyStore;
21class ResourceCache;
22
23// Downloads, verifies, caches and retrieves external data referenced by
24// policies.
25// This is the implementation for regular users on Chrome OS. The code would
26// work on desktop platforms as well but for now, is used on Chrome OS only
27// because no other platform has policies referencing external data.
28class UserCloudExternalDataManager : public CloudExternalDataManagerBase {
29 public:
30  // |get_policy_details| is used to determine the maximum size that the
31  // data referenced by each policy can have. Download scheduling, verification,
32  // caching and retrieval tasks are done via the |backend_task_runner|, which
33  // must support file I/O. Network I/O is done via the |io_task_runner|. The
34  // manager is responsible for external data references by policies in
35  // |policy_store|.
36  UserCloudExternalDataManager(
37      const GetChromePolicyDetailsCallback& get_policy_details,
38      scoped_refptr<base::SequencedTaskRunner> backend_task_runner,
39      scoped_refptr<base::SequencedTaskRunner> io_task_runner,
40      const base::FilePath& cache_path,
41      CloudPolicyStore* policy_store);
42  virtual ~UserCloudExternalDataManager();
43
44 private:
45  // Cache used to store downloaded external data. The |resource_cache_| is
46  // owned by the manager but its destruction must be handled with care:
47  // * The manager owns a |backend_| which owns an |external_data_store_| which
48  //   uses the |resource_cache_|. The |external_data_store_| must be destroyed
49  //   before the |resource_cache_|.
50  // * After construction, |backend_|, |external_data_store_| and
51  //   |resource_cache_| can only be accessed through the
52  //   |backend_task_runner_|.
53  //
54  // It follows that in order to destroy |resource_cache_|, the manager must
55  // take the following steps:
56  // * Post a task to the |backend_task_runner_| that will tell the |backend_|
57  //   to destroy the |external_data_store_|.
58  // * Post a task to the |backend_task_runner_| that will destroy the
59  //   |resource_cache_|.
60  // Because of this destruction sequence, a scoped_ptr cannot be used.
61  ResourceCache* resource_cache_;
62
63  DISALLOW_COPY_AND_ASSIGN(UserCloudExternalDataManager);
64};
65
66}  // namespace policy
67
68#endif  // CHROME_BROWSER_CHROMEOS_POLICY_USER_CLOUD_EXTERNAL_DATA_MANAGER_H_
69