Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Unified Diff: chrome/browser/policy/file_based_policy_provider.h

Issue 5562002: Refactor FileBasedPolicyProvider, introduce AsynchronousPolicyProvider. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove extra provider in tests Created 10 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/policy/file_based_policy_provider.h
diff --git a/chrome/browser/policy/file_based_policy_provider.h b/chrome/browser/policy/file_based_policy_provider.h
index a4e989d9158e9f948d498972e65f15a3d2fd6415..f180737e09f201a046b96b3c43d029b15165575f 100644
--- a/chrome/browser/policy/file_based_policy_provider.h
+++ b/chrome/browser/policy/file_based_policy_provider.h
@@ -14,6 +14,7 @@
#include "base/time.h"
#include "base/weak_ptr.h"
#include "chrome/browser/file_path_watcher.h"
+#include "chrome/browser/policy/asynchronous_policy_provider.h"
#include "chrome/browser/policy/configuration_policy_provider.h"
class CancelableTask;
@@ -22,20 +23,45 @@ class MessageLoop;
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:
+ class WatcherDelegate : public FilePathWatcher::Delegate {
Mattias Nissler (ping if slow) 2010/12/02 18:16:00 Seems like you can declare this in the implementat
danno 2010/12/03 17:05:38 Done.
+ public:
+ WatcherDelegate(
+ const FilePath& config_file_path,
+ AsynchronousPolicyProvider::PolicyChangeObserver* observer);
+ void Init();
+ void Stop();
+
+ // FilePathWatcher implementation.
+ void OnFilePathChanged(const FilePath& path);
+ void OnError();
+
+ private:
+ friend class base::RefCountedThreadSafe<WatcherDelegate>;
+ virtual ~WatcherDelegate() {}
+
+ scoped_ptr<FilePathWatcher> watcher_;
+ FilePath config_file_path_;
+ scoped_ptr<AsynchronousPolicyProvider::PolicyChangeObserver> observer_;
+
+ DISALLOW_COPY_AND_ASSIGN(WatcherDelegate);
+ };
+
// 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();
+
+ void Init(AsynchronousPolicyProvider::PolicyChangeObserver* observer);
Mattias Nissler (ping if slow) 2010/12/02 18:16:00 Missing a marker what is overriden from the Delega
danno 2010/12/03 17:05:38 Done.
+ void Stop();
+
+ bool IsSafeToReloadPolicy(const base::Time& now,
+ base::TimeDelta* delay);
// Loads the policy information. Ownership of the return value is
// transferred to the caller.
@@ -48,152 +74,38 @@ class FileBasedPolicyProvider
const FilePath& config_file_path() { return config_file_path_; }
- protected:
- explicit Delegate(const FilePath& config_file_path);
-
private:
+ // Watches for changes to the configuration directory.
+ FilePathWatcher watcher_;
Mattias Nissler (ping if slow) 2010/12/02 18:16:00 Another watcher?
danno 2010/12/03 17:05:38 Done.
+ scoped_refptr<WatcherDelegate> watcher_delegate_;
+
// The path at which we look for configuration files.
const FilePath config_file_path_;
- DISALLOW_COPY_AND_ASSIGN(Delegate);
+ // Settle interval.
+ const int settle_interval_seconds_;
+
+ // 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(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_

Powered by Google App Engine
This is Rietveld 408576698