Index: chrome/browser/policy/file_based_policy_loader.h |
diff --git a/chrome/browser/policy/file_based_policy_loader.h b/chrome/browser/policy/file_based_policy_loader.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8acf9b2d151dff10fa8662d7923884119bbae387 |
--- /dev/null |
+++ b/chrome/browser/policy/file_based_policy_loader.h |
@@ -0,0 +1,104 @@ |
+// 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. |
+ |
+#ifndef CHROME_BROWSER_POLICY_FILE_BASED_POLICY_LOADER_H_ |
+#define CHROME_BROWSER_POLICY_FILE_BASED_POLICY_LOADER_H_ |
+#pragma once |
+ |
+#include "chrome/browser/file_path_watcher/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 implementation: |
+ virtual void Init(); |
+ virtual void Stop(); |
+ virtual void Reload(); |
+ |
+ void OnFilePathChanged(const FilePath& path); |
+ void OnError(); |
+ |
+ 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_; } |
+ |
+ private: |
+ // Finishes initialization after the threading system has been fully |
+ // intiialized. |
+ void InitAfterFileThreadAvailable(); |
+ |
+ // Creates the file path watcher and configures it watch |config_file_path_|. |
+ // Must be called on the file thread. |
+ void InitWatcher(); |
+ |
+ // Cancels file path watch notification and destroys the watcher. |
+ // Must be called on file thread. |
+ void StopOnFileThread(); |
+ |
+ // Schedules a reload task to run when |delay| expires. Must be called on the |
+ // file thread. |
+ void ScheduleReloadTask(const base::TimeDelta& delay); |
+ |
+ // Schedules a reload task to run after the number of minutes specified |
+ // in |reload_interval_minutes_|. Must be called on the file thread. |
+ void ScheduleFallbackReloadTask(); |
+ |
+ // Invoked from the reload task on the file thread. |
+ void ReloadFromTask(); |
+ |
+ // 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<FilePathWatcher> watcher_; |
+ |
+ // The reload task. Access only on the file thread. Holds a reference to the |
+ // currently posted task, so we can cancel and repost it if necessary. |
+ CancelableTask* reload_task_; |
+ |
+ // The interval that a policy reload will be triggered as a fallback even if |
+ // the delegate doesn't indicate that one is needed. |
+ const base::TimeDelta reload_interval_; |
+ |
+ // 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_ |