Index: chrome/browser/policy/device_token_fetcher.h |
diff --git a/chrome/browser/policy/device_token_fetcher.h b/chrome/browser/policy/device_token_fetcher.h |
index 7704d35cdc0c4391fbba84be422896a6ed321de8..1bfff13a5e0f7e1f8c4f988ad04b96161a2120d1 100644 |
--- a/chrome/browser/policy/device_token_fetcher.h |
+++ b/chrome/browser/policy/device_token_fetcher.h |
@@ -7,8 +7,10 @@ |
#pragma once |
#include <string> |
+#include <vector> |
#include "base/file_path.h" |
+#include "base/observer_list.h" |
#include "base/ref_counted.h" |
#include "base/waitable_event.h" |
#include "chrome/browser/policy/device_management_backend.h" |
@@ -31,6 +33,38 @@ class DeviceTokenFetcher |
public DeviceManagementBackend::DeviceRegisterResponseDelegate, |
public base::RefCountedThreadSafe<DeviceTokenFetcher> { |
public: |
+ class Observer { |
+ public: |
+ virtual void OnTokenSuccess() = 0; |
+ virtual void OnTokenError() = 0; |
+ virtual void OnNotManaged() = 0; |
+ virtual ~Observer() {} |
+ }; |
+ |
+ class ObserverRegistrar { |
+ public: |
+ void Init(DeviceTokenFetcher* token_fetcher) { |
+ token_fetcher_ = token_fetcher; |
+ } |
+ ~ObserverRegistrar() { |
+ RemoveAll(); |
+ } |
+ void AddObserver(DeviceTokenFetcher::Observer* observer) { |
+ observers_.push_back(observer); |
+ token_fetcher_->AddObserver(observer); |
+ } |
+ void RemoveAll() { |
+ for (std::vector<DeviceTokenFetcher::Observer*>::iterator it = |
+ observers_.begin(); it != observers_.end(); ++it) { |
+ token_fetcher_->RemoveObserver(*it); |
+ } |
+ observers_.clear(); |
+ } |
+ private: |
+ DeviceTokenFetcher* token_fetcher_; |
+ std::vector<DeviceTokenFetcher::Observer*> observers_; |
+ }; |
+ |
// Requests to the device management server are sent through |backend|. It |
// obtains the authentication token from |token_service|. The fetcher stores |
// the device token to |token_path| once it's retrieved from the server. |
@@ -49,6 +83,9 @@ class DeviceTokenFetcher |
const em::DeviceRegisterResponse& response); |
virtual void OnError(DeviceManagementBackend::ErrorCode code); |
+ // Re-initializes this DeviceTokenFetcher |
+ void Restart(); |
+ |
// Called by subscribers of the device management token to indicate that they |
// will need the token in the future. Must be called on the UI thread. |
void StartFetching(); |
@@ -87,7 +124,8 @@ class DeviceTokenFetcher |
kStateReadyToRequestDeviceTokenFromServer, |
kStateRequestingDeviceTokenFromServer, |
kStateHasDeviceToken, |
- kStateFailure |
+ kStateFailure, |
+ kStateNotManaged, |
}; |
// Moves the fetcher into a new state. If the fetcher has the device token |
@@ -114,6 +152,26 @@ class DeviceTokenFetcher |
// available. |
void SendServerRequestIfPossible(); |
+ void AddObserver(Observer* obs) { |
+ observer_list_.AddObserver(obs); |
+ } |
+ |
+ void RemoveObserver(Observer* obs) { |
+ observer_list_.RemoveObserver(obs); |
+ } |
+ |
+ void NotifyTokenSuccess() { |
+ FOR_EACH_OBSERVER(Observer, observer_list_, OnTokenSuccess()); |
+ } |
+ |
+ void NotifyTokenError() { |
+ FOR_EACH_OBSERVER(Observer, observer_list_, OnTokenError()); |
+ } |
+ |
+ void NotifyNotManaged() { |
+ FOR_EACH_OBSERVER(Observer, observer_list_, OnNotManaged()); |
+ } |
+ |
// Saves the device management token to disk once it has been retrieved from |
// the server. Must be called on the FILE thread. |
static void WriteDeviceTokenToDisk(const FilePath& path, |
@@ -124,6 +182,7 @@ class DeviceTokenFetcher |
// management server and generate the device token. |
static std::string GenerateNewDeviceID(); |
+ ObserverList<Observer, true> observer_list_; |
FilePath token_path_; |
DeviceManagementBackend* backend_; // weak |
TokenService* token_service_; |