Index: chrome/browser/policy/configuration_policy_loader_win.cc |
diff --git a/chrome/browser/policy/configuration_policy_loader_win.cc b/chrome/browser/policy/configuration_policy_loader_win.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..68ccf808d9b8d1f3b86e4e7064d0bf95a101d76a |
--- /dev/null |
+++ b/chrome/browser/policy/configuration_policy_loader_win.cc |
@@ -0,0 +1,90 @@ |
+// Copyright (c) 2010 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/policy/configuration_policy_loader_win.h" |
+ |
+#include <userenv.h> |
+ |
+#include "chrome/browser/browser_thread.h" |
+ |
+namespace policy { |
+ |
+ConfigurationPolicyLoaderWin::ConfigurationPolicyLoaderWin( |
+ AsynchronousPolicyProvider::Delegate* delegate, |
+ int reload_interval_minutes) |
+ : AsynchronousPolicyLoader(delegate, reload_interval_minutes), |
+ user_policy_changed_event_(false, false), |
+ machine_policy_changed_event_(false, false), |
+ user_policy_watcher_failed_(false), |
+ machine_policy_watcher_failed_(false) { |
+ if (!RegisterGPNotification(user_policy_changed_event_.handle(), false)) { |
+ PLOG(WARNING) << "Failed to register user group policy notification"; |
+ user_policy_watcher_failed_ = true; |
+ } |
+ if (!RegisterGPNotification(machine_policy_changed_event_.handle(), true)) { |
+ PLOG(WARNING) << "Failed to register machine group policy notification."; |
+ machine_policy_watcher_failed_ = true; |
+ } |
+} |
+ |
+void ConfigurationPolicyLoaderWin::InitOnFileThread() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ AsynchronousPolicyLoader::InitOnFileThread(); |
+ MessageLoop::current()->AddDestructionObserver(this); |
+ SetupWatches(); |
+} |
+ |
+void ConfigurationPolicyLoaderWin::StopOnFileThread() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ MessageLoop::current()->RemoveDestructionObserver(this); |
+ user_policy_watcher_.StopWatching(); |
+ machine_policy_watcher_.StopWatching(); |
+ AsynchronousPolicyLoader::StopOnFileThread(); |
+} |
+ |
+void ConfigurationPolicyLoaderWin::SetupWatches() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ CancelReloadTask(); |
+ |
+ if (!user_policy_watcher_failed_ && |
+ !user_policy_watcher_.GetWatchedObject() && |
+ !user_policy_watcher_.StartWatching( |
+ user_policy_changed_event_.handle(), this)) { |
+ LOG(WARNING) << "Failed to start watch for user policy change event"; |
+ user_policy_watcher_failed_ = true; |
+ } |
+ if (!machine_policy_watcher_failed_ && |
+ !machine_policy_watcher_.GetWatchedObject() && |
+ !machine_policy_watcher_.StartWatching( |
+ machine_policy_changed_event_.handle(), this)) { |
+ LOG(WARNING) << "Failed to start watch for machine policy change event"; |
+ machine_policy_watcher_failed_ = true; |
+ } |
+ |
+ if (user_policy_watcher_failed_ || machine_policy_watcher_failed_) |
+ ScheduleFallbackReloadTask(); |
+} |
+ |
+void ConfigurationPolicyLoaderWin::Reload() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ AsynchronousPolicyLoader::Reload(); |
+ SetupWatches(); |
+} |
+ |
+void ConfigurationPolicyLoaderWin::OnObjectSignaled(HANDLE object) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
+ DCHECK(object == user_policy_changed_event_.handle() || |
+ object == machine_policy_changed_event_.handle()) |
+ << "unexpected object signaled policy reload, obj = " |
+ << std::showbase << std::hex << object; |
+ Reload(); |
+} |
+ |
+void ConfigurationPolicyLoaderWin:: |
+ WillDestroyCurrentMessageLoop() { |
+ CancelReloadTask(); |
+ MessageLoop::current()->RemoveDestructionObserver(this); |
+} |
+ |
+} // namespace policy |