| // 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. |
| |
| #ifndef CHROME_BROWSER_POLICY_FILE_BASED_POLICY_LOADER_H_ |
| #define CHROME_BROWSER_POLICY_FILE_BASED_POLICY_LOADER_H_ |
| #pragma once |
| |
| #include "base/files/file_path_watcher.h" |
| #include "chrome/browser/policy/asynchronous_policy_loader.h" |
| #include "chrome/browser/policy/file_based_policy_provider.h" |
| |
| namespace policy { |
| |
| // A customized asynchronous policy loader that handles loading policy from a |
| // file using a FilePathWatcher. The loader creates a fallback task to load |
| // policy periodically in case the watcher fails and retries policy loads when |
| // the watched file is in flux. |
| class FileBasedPolicyLoader : public AsynchronousPolicyLoader { |
| public: |
| FileBasedPolicyLoader( |
| FileBasedPolicyProvider::ProviderDelegate* provider_delegate); |
| |
| // AsynchronousPolicyLoader overrides: |
| virtual void Reload(); |
| |
| void OnFilePathChanged(const FilePath& path); |
| void OnFilePathError(const FilePath& path); |
| |
| protected: |
| // FileBasedPolicyLoader objects should only be deleted by |
| // RefCountedThreadSafe. |
| friend class base::RefCountedThreadSafe<AsynchronousPolicyLoader>; |
| virtual ~FileBasedPolicyLoader(); |
| |
| const FilePath& config_file_path() { return config_file_path_; } |
| |
| // AsynchronousPolicyLoader overrides: |
| |
| // Creates the file path watcher and configures it to watch |
| // |config_file_path_|. Must be called on the file thread. |
| virtual void InitOnFileThread(); |
| virtual void StopOnFileThread(); |
| |
| private: |
| // Checks whether policy information is safe to read. If not, returns false |
| // and then delays until it is considered safe to reload in |delay|. |
| // Must be called on the file thread. |
| bool IsSafeToReloadPolicy(const base::Time& now, base::TimeDelta* delay); |
| |
| // The path at which we look for configuration files. |
| const FilePath config_file_path_; |
| |
| // Managed with a scoped_ptr rather than being declared as an inline member to |
| // decouple the watcher's life cycle from the loader's. This decoupling makes |
| // it possible to destroy the watcher before the loader's destructor is called |
| // (e.g. during Stop), since |watcher_| internally holds a reference to the |
| // loader and keeps it alive. |
| scoped_ptr<base::files::FilePathWatcher> watcher_; |
| |
| // Settle interval. |
| const base::TimeDelta settle_interval_; |
| |
| // Records last known modification timestamp of |config_file_path_|. |
| base::Time last_modification_file_; |
| |
| // The wall clock time at which the last modification timestamp was |
| // recorded. It's better to not assume the file notification time and the |
| // wall clock times come from the same source, just in case there is some |
| // non-local filesystem involved. |
| base::Time last_modification_clock_; |
| |
| DISALLOW_COPY_AND_ASSIGN(FileBasedPolicyLoader); |
| }; |
| |
| } // namespace policy |
| |
| #endif // CHROME_BROWSER_POLICY_FILE_BASED_POLICY_LOADER_H_ |