| // Copyright (c) 2011 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 "content/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(); |
| SetupWatches(); |
| } |
| |
| void ConfigurationPolicyLoaderWin::StopOnFileThread() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 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(); |
| } |
| |
| } // namespace policy |