Index: chrome/browser/chromeos/policy/device_local_account_external_data_service.cc |
diff --git a/chrome/browser/chromeos/policy/device_local_account_external_data_service.cc b/chrome/browser/chromeos/policy/device_local_account_external_data_service.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e751a4d3c9923de87b02bc81cbed9e46a2fb47ca |
--- /dev/null |
+++ b/chrome/browser/chromeos/policy/device_local_account_external_data_service.cc |
@@ -0,0 +1,88 @@ |
+// 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. |
+ |
+#include "chrome/browser/chromeos/policy/device_local_account_external_data_service.h" |
+ |
+#include <set> |
+ |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
+#include "base/files/file_path.h" |
+#include "base/location.h" |
+#include "base/logging.h" |
+#include "base/path_service.h" |
+#include "base/sequenced_task_runner.h" |
+#include "chrome/browser/policy/cloud/cloud_policy_store.h" |
+#include "chromeos/chromeos_paths.h" |
+#include "policy/policy_constants.h" |
+ |
+namespace policy { |
+ |
+DeviceLocalAccountExternalDataService::DeviceLocalAccountExternalDataService( |
+ DeviceLocalAccountPolicyService* parent, |
+ scoped_refptr<base::SequencedTaskRunner> backend_task_runner, |
+ scoped_refptr<base::SequencedTaskRunner> io_task_runner) |
+ : parent_(parent), |
+ backend_task_runner_(backend_task_runner), |
+ io_task_runner_(io_task_runner) { |
+ base::FilePath cache_dir; |
+ CHECK(PathService::Get(chromeos::DIR_DEVICE_LOCAL_ACCOUNT_EXTERNAL_DATA, |
+ &cache_dir)); |
+ resource_cache_.reset(new ResourceCache(cache_dir, backend_task_runner)); |
+ parent_->AddObserver(this); |
+} |
+ |
+DeviceLocalAccountExternalDataService:: |
+ ~DeviceLocalAccountExternalDataService() { |
+ parent_->RemoveObserver(this); |
+#if !defined(NDEBUG) |
+ for (ExternalDataManagerMap::const_iterator it = |
+ external_data_managers_.begin(); |
+ it != external_data_managers_.end(); ++it) { |
+ DCHECK(it->second->HasOneRef()); |
+ } |
+#endif // !defined(NDEBUG) |
+ backend_task_runner_->DeleteSoon(FROM_HERE, resource_cache_.release()); |
+} |
+ |
+void DeviceLocalAccountExternalDataService::OnPolicyUpdated( |
+ const std::string& user_id) { |
+} |
+ |
+void DeviceLocalAccountExternalDataService::OnDeviceLocalAccountsChanged() { |
+ std::set<std::string> account_ids; |
+ for (ExternalDataManagerMap::iterator it = external_data_managers_.begin(); |
+ it != external_data_managers_.end(); ) { |
+ if (it->second->HasOneRef()) { |
+ external_data_managers_.erase(it++); |
+ } else { |
+ account_ids.insert(it->first); |
+ ++it; |
+ } |
+ } |
+ backend_task_runner_->PostTask(FROM_HERE, base::Bind( |
+ &ResourceCache::PurgeOtherKeys, |
+ base::Unretained(resource_cache_.get()), |
+ account_ids)); |
+} |
+ |
+scoped_refptr<DeviceLocalAccountExternalDataManager> |
+ DeviceLocalAccountExternalDataService::GetExternalDataManager( |
+ const std::string& account_id, |
+ CloudPolicyStore* policy_store) { |
+ scoped_refptr<DeviceLocalAccountExternalDataManager>& external_data_manager = |
+ external_data_managers_[account_id]; |
+ if (!external_data_manager) { |
+ external_data_manager = new DeviceLocalAccountExternalDataManager( |
+ account_id, |
+ GetChromePolicyDefinitionList(), |
+ backend_task_runner_, |
+ io_task_runner_, |
+ resource_cache_.get()); |
+ } |
+ external_data_manager->SetPolicyStore(policy_store); |
+ return external_data_manager; |
+} |
+ |
+} // namespace policy |