Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / ownership / owner_settings_service_chromeos.h
index 3ef3d7e..1e6415f 100644 (file)
@@ -5,12 +5,14 @@
 #ifndef CHROME_BROWSER_CHROMEOS_OWNERSHIP_OWNER_SETTINGS_SERVICE_CHROMEOS_H_
 #define CHROME_BROWSER_CHROMEOS_OWNERSHIP_OWNER_SETTINGS_SERVICE_CHROMEOS_H_
 
-#include <deque>
+#include <string>
 #include <vector>
 
 #include "base/callback_forward.h"
-#include "base/compiler_specific.h"
+#include "base/containers/scoped_ptr_hash_map.h"
 #include "base/macros.h"
+#include "base/values.h"
+#include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
 #include "chrome/browser/chromeos/settings/device_settings_service.h"
 #include "chromeos/dbus/session_manager_client.h"
 #include "components/keyed_service/core/keyed_service.h"
@@ -27,8 +29,6 @@ class OwnerKeyUtil;
 
 namespace chromeos {
 
-class SessionManagerOperation;
-
 // The class is a profile-keyed service which holds public/private
 // keypair corresponds to a profile. The keypair is reloaded automatically when
 // profile is created and TPM token is ready. Note that the private part of a
@@ -38,24 +38,32 @@ class SessionManagerOperation;
 // (crbug.com/230018).
 class OwnerSettingsServiceChromeOS : public ownership::OwnerSettingsService,
                                      public content::NotificationObserver,
-                                     public SessionManagerClient::Observer {
+                                     public SessionManagerClient::Observer,
+                                     public DeviceSettingsService::Observer {
  public:
   virtual ~OwnerSettingsServiceChromeOS();
 
   void OnTPMTokenReady(bool tpm_token_enabled);
 
   // ownership::OwnerSettingsService implementation:
-  virtual void SignAndStorePolicyAsync(
-      scoped_ptr<enterprise_management::PolicyData> policy,
-      const base::Closure& callback) OVERRIDE;
+  virtual bool HandlesSetting(const std::string& setting) override;
+  virtual bool Set(const std::string& setting,
+                   const base::Value& value) override;
+  virtual bool CommitTentativeDeviceSettings(
+      scoped_ptr<enterprise_management::PolicyData> policy) override;
 
   // NotificationObserver implementation:
   virtual void Observe(int type,
                        const content::NotificationSource& source,
-                       const content::NotificationDetails& details) OVERRIDE;
+                       const content::NotificationDetails& details) override;
 
   // SessionManagerClient::Observer:
-  virtual void OwnerKeySet(bool success) OVERRIDE;
+  virtual void OwnerKeySet(bool success) override;
+
+  // DeviceSettingsService::Observer:
+  virtual void OwnershipStatusChanged() override;
+  virtual void DeviceSettingsUpdated() override;
+  virtual void OnDeviceSettingsServiceShutdown() override;
 
   // Checks if the user is the device owner, without the user profile having to
   // been initialized. Should be used only if login state is in safe mode.
@@ -64,13 +72,28 @@ class OwnerSettingsServiceChromeOS : public ownership::OwnerSettingsService,
       const scoped_refptr<ownership::OwnerKeyUtil>& owner_key_util,
       const IsOwnerCallback& callback);
 
-  static void SetDeviceSettingsServiceForTesting(
-      DeviceSettingsService* device_settings_service);
+  // Assembles PolicyData based on |settings|, |policy_data| and
+  // |user_id|.
+  static scoped_ptr<enterprise_management::PolicyData> AssemblePolicy(
+      const std::string& user_id,
+      const enterprise_management::PolicyData* policy_data,
+      const enterprise_management::ChromeDeviceSettingsProto* settings);
+
+  // Updates device |settings|.
+  static void UpdateDeviceSettings(
+      const std::string& path,
+      const base::Value& value,
+      enterprise_management::ChromeDeviceSettingsProto& settings);
+
+  bool has_pending_changes() const {
+    return !pending_changes_.empty() || tentative_settings_.get();
+  }
 
  private:
   friend class OwnerSettingsServiceChromeOSFactory;
 
   OwnerSettingsServiceChromeOS(
+      DeviceSettingsService* device_settings_service,
       Profile* profile,
       const scoped_refptr<ownership::OwnerKeyUtil>& owner_key_util);
 
@@ -80,18 +103,25 @@ class OwnerSettingsServiceChromeOS : public ownership::OwnerSettingsService,
   virtual void ReloadKeypairImpl(const base::Callback<
       void(const scoped_refptr<ownership::PublicKey>& public_key,
            const scoped_refptr<ownership::PrivateKey>& private_key)>& callback)
-      OVERRIDE;
+      override;
 
   // Possibly notifies DeviceSettingsService that owner's keypair is loaded.
-  virtual void OnPostKeypairLoadedActions() OVERRIDE;
+  virtual void OnPostKeypairLoadedActions() override;
 
-  // Performs next operation in the queue.
-  void StartNextOperation();
+  // Tries to apply recent changes to device settings proto, sign it and store.
+  void StorePendingChanges();
 
-  // Called when sign-and-store operation completes it's work.
-  void HandleCompletedOperation(const base::Closure& callback,
-                                SessionManagerOperation* operation,
-                                DeviceSettingsService::Status status);
+  // Called when current device settings are successfully signed.
+  // Sends signed settings for storage.
+  void OnPolicyAssembledAndSigned(
+      scoped_ptr<enterprise_management::PolicyFetchResponse> policy_response);
+
+  // Called by DeviceSettingsService when modified and signed device
+  // settings are stored. Notifies observers and tries to store device
+  // settings again.
+  void OnSignedPolicyStored(bool success);
+
+  DeviceSettingsService* device_settings_service_;
 
   // Profile this service instance belongs to.
   Profile* profile_;
@@ -105,14 +135,19 @@ class OwnerSettingsServiceChromeOS : public ownership::OwnerSettingsService,
   // Whether TPM token still needs to be initialized.
   bool waiting_for_tpm_token_;
 
-  // The queue of pending sign-and-store operations. The first operation on the
-  // queue is currently active; it gets removed and destroyed once it completes.
-  std::deque<SessionManagerOperation*> pending_operations_;
+  // A set of pending changes to device settings.
+  base::ScopedPtrHashMap<std::string, base::Value> pending_changes_;
+
+  // A protobuf containing pending changes to device settings.
+  scoped_ptr<enterprise_management::ChromeDeviceSettingsProto>
+      tentative_settings_;
 
   content::NotificationRegistrar registrar_;
 
   base::WeakPtrFactory<OwnerSettingsServiceChromeOS> weak_factory_;
 
+  base::WeakPtrFactory<OwnerSettingsServiceChromeOS> store_settings_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(OwnerSettingsServiceChromeOS);
 };