summaryrefslogtreecommitdiffstats
path: root/chrome/browser/policy/file_based_policy_provider.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/policy/file_based_policy_provider.h')
-rw-r--r--chrome/browser/policy/file_based_policy_provider.h165
1 files changed, 10 insertions, 155 deletions
diff --git a/chrome/browser/policy/file_based_policy_provider.h b/chrome/browser/policy/file_based_policy_provider.h
index a4e989d..c94e1d4 100644
--- a/chrome/browser/policy/file_based_policy_provider.h
+++ b/chrome/browser/policy/file_based_policy_provider.h
@@ -6,39 +6,25 @@
#define CHROME_BROWSER_POLICY_FILE_BASED_POLICY_PROVIDER_H_
#pragma once
-#include "base/basictypes.h"
#include "base/file_path.h"
-#include "base/lock.h"
-#include "base/ref_counted.h"
-#include "base/scoped_ptr.h"
#include "base/time.h"
-#include "base/weak_ptr.h"
-#include "chrome/browser/file_path_watcher.h"
-#include "chrome/browser/policy/configuration_policy_provider.h"
-
-class CancelableTask;
-class DictionaryValue;
-class MessageLoop;
+#include "chrome/browser/policy/asynchronous_policy_provider.h"
namespace policy {
-class FileBasedPolicyLoader;
-class FileBasedPolicyWatcher;
-
// File based policy provider that coordinates watching and reloading policy
// information from the configuration path. Actual logic for loading policy
// information is handled by a delegate passed at construction time.
-class FileBasedPolicyProvider
- : public ConfigurationPolicyProvider,
- public base::SupportsWeakPtr<FileBasedPolicyProvider> {
+class FileBasedPolicyProvider : public AsynchronousPolicyProvider {
public:
+
// Delegate interface for actual policy loading from the system.
- class Delegate {
+ class ProviderDelegate : public AsynchronousPolicyProvider::Delegate {
public:
- virtual ~Delegate();
+ explicit ProviderDelegate(const FilePath& config_file_path);
+ virtual ~ProviderDelegate();
- // Loads the policy information. Ownership of the return value is
- // transferred to the caller.
+ // AsynchronousPolicyProvider::Delegate implementation:
virtual DictionaryValue* Load() = 0;
// Gets the last modification timestamp for the policy information from the
@@ -48,152 +34,21 @@ class FileBasedPolicyProvider
const FilePath& config_file_path() { return config_file_path_; }
- protected:
- explicit Delegate(const FilePath& config_file_path);
-
private:
- // The path at which we look for configuration files.
const FilePath config_file_path_;
- DISALLOW_COPY_AND_ASSIGN(Delegate);
+ DISALLOW_COPY_AND_ASSIGN(ProviderDelegate);
};
// Assumes ownership of |delegate|.
FileBasedPolicyProvider(const PolicyDefinitionList* policy_list,
- Delegate* delegate);
- virtual ~FileBasedPolicyProvider();
-
- // ConfigurationPolicyProvider implementation.
- virtual bool Provide(ConfigurationPolicyStoreInterface* store);
+ ProviderDelegate* delegate);
+ virtual ~FileBasedPolicyProvider() {}
private:
- // Watches for changes to the configuration directory.
- scoped_refptr<FileBasedPolicyWatcher> watcher_;
-
- // The loader object we use internally.
- scoped_refptr<FileBasedPolicyLoader> loader_;
-
DISALLOW_COPY_AND_ASSIGN(FileBasedPolicyProvider);
};
-// FilePathWatcher delegate implementation that handles change notifications for
-// the configuration file or directory. It keeps the authorative version of the
-// currently effective policy dictionary and updates it as appropriate. The
-// actual loading logic is handled by a delegate.
-class FileBasedPolicyLoader : public FilePathWatcher::Delegate {
- public:
- // Creates a new loader that'll load its data from |config_file_path|.
- // Assumes ownership of |delegate|, which provides the actual loading logic.
- // The parameters |settle_interval_seconds| and |reload_interval_minutes|
- // specify the time to wait before reading the file contents after a change
- // and the period for checking |config_file_path| for changes, respectively.
- FileBasedPolicyLoader(base::WeakPtr<ConfigurationPolicyProvider> provider,
- FileBasedPolicyProvider::Delegate* delegate,
- int settle_interval_seconds,
- int reload_interval_minutes);
-
- // Stops any pending reload tasks.
- void Stop();
-
- // Reloads the policies and sends out a notification, if appropriate. Must be
- // called on the file thread.
- void Reload();
-
- // Gets the current dictionary value object. Ownership of the returned value
- // is transferred to the caller.
- DictionaryValue* GetPolicy();
-
- const FilePath& config_file_path() { return delegate_->config_file_path(); }
-
- // FilePathWatcher::Delegate implementation:
- void OnFilePathChanged(const FilePath& path);
- void OnError();
-
- private:
- // FileBasedPolicyLoader objects should only be deleted by
- // RefCountedThreadSafe.
- friend class base::RefCountedThreadSafe<FileBasedPolicyLoader>;
- virtual ~FileBasedPolicyLoader();
-
- // Checks whether reading policy information is safe to do. If not, returns
- // false and the delay until it is considered safe to reload in |delay|.
- bool IsSafeToReloadPolicy(const base::Time& now, base::TimeDelta* delay);
-
- // Schedules a reload task to run when |delay| expires. Must be called on the
- // file thread.
- void ScheduleReloadTask(const base::TimeDelta& delay);
-
- // Notifies the policy provider to send out a policy changed notification.
- // Must be called on |origin_loop_|.
- void NotifyPolicyChanged();
-
- // Invoked from the reload task on the file thread.
- void ReloadFromTask();
-
- // The delegate.
- scoped_ptr<FileBasedPolicyProvider::Delegate> delegate_;
-
- // The provider this loader is associated with. Access only on the thread that
- // called the constructor. See |origin_loop_| below.
- base::WeakPtr<ConfigurationPolicyProvider> provider_;
-
- // The message loop on which this object was constructed and |provider_|
- // received on. Recorded so we can call back into the non thread safe provider
- // to fire the notification.
- MessageLoop* origin_loop_;
-
- // 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_;
-
- // Protects |policy_|.
- Lock lock_;
-
- // The current policy definition.
- scoped_ptr<DictionaryValue> policy_;
-
- // 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_;
-
- // Settle and reload intervals.
- const int settle_interval_seconds_;
- const int reload_interval_minutes_;
-
- DISALLOW_COPY_AND_ASSIGN(FileBasedPolicyLoader);
-};
-
-// Wraps a FilePathWatcher for the configuration path and takes care of
-// initializing the watcher object on the file thread.
-class FileBasedPolicyWatcher
- : public base::RefCountedThreadSafe<FileBasedPolicyWatcher> {
- public:
- FileBasedPolicyWatcher();
-
- // Runs initialization. This is in a separate method since we need to post a
- // task (which cannot be done from the constructor).
- void Init(FileBasedPolicyLoader* loader);
-
- private:
- // FileBasedPolicyWatcher objects should only be deleted by
- // RefCountedThreadSafe.
- friend class base::RefCountedThreadSafe<FileBasedPolicyWatcher>;
- virtual ~FileBasedPolicyWatcher();
-
- // Actually sets up the watch with the FilePathWatcher code.
- void InitWatcher(const scoped_refptr<FileBasedPolicyLoader>& loader);
-
- // Wrapped watcher that takes care of the actual watching.
- FilePathWatcher watcher_;
-
- DISALLOW_COPY_AND_ASSIGN(FileBasedPolicyWatcher);
-};
-
} // namespace policy
#endif // CHROME_BROWSER_POLICY_FILE_BASED_POLICY_PROVIDER_H_