// 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 #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