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#include "chrome/browser/policy/cloud/policy_header_service_factory.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "chrome/browser/browser_process.h"
9#include "chrome/browser/profiles/profile.h"
10#include "components/keyed_service/content/browser_context_dependency_manager.h"
11#include "components/policy/core/browser/browser_policy_connector.h"
12#include "components/policy/core/common/cloud/cloud_policy_store.h"
13#include "components/policy/core/common/cloud/device_management_service.h"
14#include "components/policy/core/common/cloud/policy_header_service.h"
15
16#if defined(OS_CHROMEOS)
17#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
18#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
19#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos.h"
20#include "chrome/browser/chromeos/policy/user_cloud_policy_manager_factory_chromeos.h"
21#else
22#include "chrome/browser/policy/cloud/user_cloud_policy_manager_factory.h"
23#include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
24#endif
25
26namespace policy {
27
28namespace {
29
30class PolicyHeaderServiceWrapper : public KeyedService {
31 public:
32  explicit PolicyHeaderServiceWrapper(scoped_ptr<PolicyHeaderService> service)
33      : policy_header_service_(service.Pass()) {}
34
35  PolicyHeaderService* policy_header_service() const {
36    return policy_header_service_.get();
37  }
38
39  virtual void Shutdown() OVERRIDE {
40    // Shutdown our core object so it can unregister any observers before the
41    // services we depend on are shutdown.
42    policy_header_service_.reset();
43  }
44
45 private:
46  scoped_ptr<PolicyHeaderService> policy_header_service_;
47};
48
49}  // namespace
50
51PolicyHeaderServiceFactory::PolicyHeaderServiceFactory()
52    : BrowserContextKeyedServiceFactory(
53        "PolicyHeaderServiceFactory",
54        BrowserContextDependencyManager::GetInstance()) {
55#if defined(OS_CHROMEOS)
56  DependsOn(UserCloudPolicyManagerFactoryChromeOS::GetInstance());
57#else
58  DependsOn(UserCloudPolicyManagerFactory::GetInstance());
59#endif
60}
61
62PolicyHeaderServiceFactory::~PolicyHeaderServiceFactory() {
63}
64
65// static
66PolicyHeaderService* PolicyHeaderServiceFactory::GetForBrowserContext(
67    content::BrowserContext* context) {
68  PolicyHeaderServiceWrapper* wrapper =
69      static_cast<PolicyHeaderServiceWrapper*>(
70          GetInstance()->GetServiceForBrowserContext(context, true));
71  if (wrapper)
72    return wrapper->policy_header_service();
73  else
74    return NULL;
75}
76
77KeyedService* PolicyHeaderServiceFactory::BuildServiceInstanceFor(
78    content::BrowserContext* context) const {
79#if defined(OS_CHROMEOS)
80  BrowserPolicyConnectorChromeOS* connector =
81      g_browser_process->platform_part()->browser_policy_connector_chromeos();
82#else
83  BrowserPolicyConnector* connector =
84      g_browser_process->browser_policy_connector();
85#endif
86
87  DeviceManagementService* device_management_service =
88      connector->device_management_service();
89#if defined(OS_CHROMEOS)
90  CloudPolicyManager* manager =
91      UserCloudPolicyManagerFactoryChromeOS::GetForProfile(
92           Profile::FromBrowserContext(context));
93#else
94  CloudPolicyManager* manager =
95      UserCloudPolicyManagerFactory::GetForBrowserContext(context);
96#endif
97  if (!manager)
98    return NULL;
99  CloudPolicyStore* user_store = manager->core()->store();
100  CloudPolicyStore* device_store = NULL;
101#if defined(OS_CHROMEOS)
102  device_store = connector->GetDeviceCloudPolicyManager()->core()->store();
103#endif
104
105  scoped_ptr<PolicyHeaderService> service = make_scoped_ptr(
106      new PolicyHeaderService(device_management_service->GetServerUrl(),
107                              kPolicyVerificationKeyHash,
108                              user_store,
109                              device_store));
110  return new PolicyHeaderServiceWrapper(service.Pass());
111}
112
113// static
114PolicyHeaderServiceFactory* PolicyHeaderServiceFactory::GetInstance() {
115  return Singleton<PolicyHeaderServiceFactory>::get();
116}
117
118}  // namespace policy
119