libweave: Extract weave::Settings struct

This will help to avoid a log of getters in BuffetConfig interface.

BUG=brillo:1242
TEST='FEATURES=test emerge-gizmo buffet'

Change-Id: I76399760d77df950c6471d113f8cc0671faaa040
Reviewed-on: https://chromium-review.googlesource.com/286591
Trybot-Ready: Vitaly Buka <vitalybuka@chromium.org>
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/manager.cc b/buffet/manager.cc
index dd1ba79..572963e 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -264,15 +264,15 @@
   dbus_adaptor_.SetStatus(weave::EnumToString(status));
 }
 
-void Manager::OnConfigChanged(const weave::BuffetConfig& config) {
-  dbus_adaptor_.SetDeviceId(config.device_id());
-  dbus_adaptor_.SetOemName(config.oem_name());
-  dbus_adaptor_.SetModelName(config.model_name());
-  dbus_adaptor_.SetModelId(config.model_id());
-  dbus_adaptor_.SetName(config.name());
-  dbus_adaptor_.SetDescription(config.description());
-  dbus_adaptor_.SetLocation(config.location());
-  dbus_adaptor_.SetAnonymousAccessRole(config.local_anonymous_access_role());
+void Manager::OnConfigChanged(const weave::Settings& settings) {
+  dbus_adaptor_.SetDeviceId(settings.device_id);
+  dbus_adaptor_.SetOemName(settings.oem_name);
+  dbus_adaptor_.SetModelName(settings.model_name);
+  dbus_adaptor_.SetModelId(settings.model_id);
+  dbus_adaptor_.SetName(settings.name);
+  dbus_adaptor_.SetDescription(settings.description);
+  dbus_adaptor_.SetLocation(settings.location);
+  dbus_adaptor_.SetAnonymousAccessRole(settings.local_anonymous_access_role);
 }
 
 void Manager::UpdateWiFiBootstrapState(weave::WifiSetupState state) {
diff --git a/buffet/manager.h b/buffet/manager.h
index feb6b9d..6db50fe 100644
--- a/buffet/manager.h
+++ b/buffet/manager.h
@@ -102,7 +102,7 @@
 
   void OnStateChanged();
   void OnRegistrationChanged(weave::RegistrationStatus status);
-  void OnConfigChanged(const weave::BuffetConfig& config);
+  void OnConfigChanged(const weave::Settings& settings);
   void UpdateWiFiBootstrapState(weave::WifiSetupState state);
   void OnPairingStart(const std::string& session_id,
                       weave::PairingType pairing_type,
diff --git a/libweave/src/buffet_config.cc b/libweave/src/buffet_config.cc
index 5355566..a4a38da 100644
--- a/libweave/src/buffet_config.cc
+++ b/libweave/src/buffet_config.cc
@@ -91,6 +91,28 @@
 
 }  // namespace config_keys
 
+Settings BuffetConfig::CreateDefaultSettings() {
+  Settings result;
+  result.client_id = "58855907228.apps.googleusercontent.com";
+  result.client_secret = "eHSAREAHrIqPsHBxCE9zPPBi";
+  result.api_key = "AIzaSyDSq46gG-AxUnC3zoqD9COIPrjolFsMfMA";
+  result.oauth_url = "https://accounts.google.com/o/oauth2/";
+  result.service_url = "https://www.googleapis.com/clouddevices/v1/";
+  result.name = "Developer device";
+  result.local_anonymous_access_role = "viewer";
+  result.local_discovery_enabled = true;
+  result.local_pairing_enabled = true;
+  result.oem_name = "Chromium";
+  result.model_name = "Brillo";
+  result.model_id = "AAAAA";
+  result.device_kind = "vendor";
+  result.polling_period = base::TimeDelta::FromSeconds(7);
+  result.backup_polling_period = base::TimeDelta::FromMinutes(30);
+  result.wifi_auto_setup_enabled = true;
+  result.pairing_modes.emplace(PairingType::kPinCode);
+  return result;
+}
+
 BuffetConfig::BuffetConfig(std::unique_ptr<StorageInterface> storage)
     : storage_{std::move(storage)} {
 }
@@ -100,6 +122,16 @@
           std::unique_ptr<StorageInterface>{new FileStorage{state_path}}} {
 }
 
+void BuffetConfig::AddOnChangedCallback(const OnChangedCallback& callback) {
+  on_changed_.push_back(callback);
+  // Force to read current state.
+  callback.Run(settings_);
+}
+
+const Settings& BuffetConfig::GetSettings() const {
+  return settings_;
+}
+
 void BuffetConfig::Load(const base::FilePath& config_path) {
   chromeos::KeyValueStore store;
   if (base::PathExists(config_path)) {
@@ -113,45 +145,46 @@
   Transaction change{this};
   change.save_ = false;
 
-  store.GetString(config_keys::kClientId, &client_id_);
-  CHECK(!client_id_.empty());
+  store.GetString(config_keys::kClientId, &settings_.client_id);
+  CHECK(!settings_.client_id.empty());
 
-  store.GetString(config_keys::kClientSecret, &client_secret_);
-  CHECK(!client_secret_.empty());
+  store.GetString(config_keys::kClientSecret, &settings_.client_secret);
+  CHECK(!settings_.client_secret.empty());
 
-  store.GetString(config_keys::kApiKey, &api_key_);
-  CHECK(!api_key_.empty());
+  store.GetString(config_keys::kApiKey, &settings_.api_key);
+  CHECK(!settings_.api_key.empty());
 
-  store.GetString(config_keys::kOAuthURL, &oauth_url_);
-  CHECK(!oauth_url_.empty());
+  store.GetString(config_keys::kOAuthURL, &settings_.oauth_url);
+  CHECK(!settings_.oauth_url.empty());
 
-  store.GetString(config_keys::kServiceURL, &service_url_);
-  CHECK(!service_url_.empty());
+  store.GetString(config_keys::kServiceURL, &settings_.service_url);
+  CHECK(!settings_.service_url.empty());
 
-  store.GetString(config_keys::kOemName, &oem_name_);
-  CHECK(!oem_name_.empty());
+  store.GetString(config_keys::kOemName, &settings_.oem_name);
+  CHECK(!settings_.oem_name.empty());
 
-  store.GetString(config_keys::kModelName, &model_name_);
-  CHECK(!model_name_.empty());
+  store.GetString(config_keys::kModelName, &settings_.model_name);
+  CHECK(!settings_.model_name.empty());
 
-  store.GetString(config_keys::kModelId, &model_id_);
-  device_kind_ = GetDeviceKind(model_id_);
+  store.GetString(config_keys::kModelId, &settings_.model_id);
+  settings_.device_kind = GetDeviceKind(settings_.model_id);
 
   std::string polling_period_str;
   if (store.GetString(config_keys::kPollingPeriodMs, &polling_period_str))
-    CHECK(StringToTimeDelta(polling_period_str, &polling_period_));
+    CHECK(StringToTimeDelta(polling_period_str, &settings_.polling_period));
 
   if (store.GetString(config_keys::kBackupPollingPeriodMs, &polling_period_str))
-    CHECK(StringToTimeDelta(polling_period_str, &backup_polling_period_));
+    CHECK(StringToTimeDelta(polling_period_str,
+                            &settings_.backup_polling_period));
 
   store.GetBoolean(config_keys::kWifiAutoSetupEnabled,
-                   &wifi_auto_setup_enabled_);
+                   &settings_.wifi_auto_setup_enabled);
 
   std::string embedded_code_path;
   if (store.GetString(config_keys::kEmbeddedCodePath, &embedded_code_path)) {
-    embedded_code_path_ = base::FilePath(embedded_code_path);
-    if (!embedded_code_path_.empty())
-      pairing_modes_ = {PairingType::kEmbeddedCode};
+    settings_.embedded_code_path = base::FilePath(embedded_code_path);
+    if (!settings_.embedded_code_path.empty())
+      settings_.pairing_modes = {PairingType::kEmbeddedCode};
   }
 
   std::string modes_str;
@@ -163,25 +196,26 @@
       CHECK(StringToEnum(mode, &pairing_mode));
       pairing_modes.insert(pairing_mode);
     }
-    pairing_modes_ = std::move(pairing_modes);
+    settings_.pairing_modes = std::move(pairing_modes);
   }
 
   // Empty name set by user or server is allowed, still we expect some
   // meaningfull config value.
-  store.GetString(config_keys::kName, &name_);
-  CHECK(!name_.empty());
+  store.GetString(config_keys::kName, &settings_.name);
+  CHECK(!settings_.name.empty());
 
-  store.GetString(config_keys::kDescription, &description_);
-  store.GetString(config_keys::kLocation, &location_);
+  store.GetString(config_keys::kDescription, &settings_.description);
+  store.GetString(config_keys::kLocation, &settings_.location);
 
   store.GetString(config_keys::kLocalAnonymousAccessRole,
-                  &local_anonymous_access_role_);
-  CHECK(IsValidAccessRole(local_anonymous_access_role_))
-      << "Invalid role: " << local_anonymous_access_role_;
+                  &settings_.local_anonymous_access_role);
+  CHECK(IsValidAccessRole(settings_.local_anonymous_access_role))
+      << "Invalid role: " << settings_.local_anonymous_access_role;
 
   store.GetBoolean(config_keys::kLocalDiscoveryEnabled,
-                   &local_discovery_enabled_);
-  store.GetBoolean(config_keys::kLocalPairingEnabled, &local_pairing_enabled_);
+                   &settings_.local_discovery_enabled);
+  store.GetBoolean(config_keys::kLocalPairingEnabled,
+                   &settings_.local_pairing_enabled);
 
   change.LoadState();
 }
@@ -247,23 +281,25 @@
   if (!storage_)
     return false;
   base::DictionaryValue dict;
-  dict.SetString(config_keys::kClientId, client_id_);
-  dict.SetString(config_keys::kClientSecret, client_secret_);
-  dict.SetString(config_keys::kApiKey, api_key_);
-  dict.SetString(config_keys::kOAuthURL, oauth_url_);
-  dict.SetString(config_keys::kServiceURL, service_url_);
-  dict.SetString(config_keys::kRefreshToken, refresh_token_);
-  dict.SetString(config_keys::kDeviceId, device_id_);
-  dict.SetString(config_keys::kRobotAccount, robot_account_);
-  dict.SetString(config_keys::kLastConfiguredSsid, last_configured_ssid_);
-  dict.SetString(config_keys::kName, name_);
-  dict.SetString(config_keys::kDescription, description_);
-  dict.SetString(config_keys::kLocation, location_);
+  dict.SetString(config_keys::kClientId, settings_.client_id);
+  dict.SetString(config_keys::kClientSecret, settings_.client_secret);
+  dict.SetString(config_keys::kApiKey, settings_.api_key);
+  dict.SetString(config_keys::kOAuthURL, settings_.oauth_url);
+  dict.SetString(config_keys::kServiceURL, settings_.service_url);
+  dict.SetString(config_keys::kRefreshToken, settings_.refresh_token);
+  dict.SetString(config_keys::kDeviceId, settings_.device_id);
+  dict.SetString(config_keys::kRobotAccount, settings_.robot_account);
+  dict.SetString(config_keys::kLastConfiguredSsid,
+                 settings_.last_configured_ssid);
+  dict.SetString(config_keys::kName, settings_.name);
+  dict.SetString(config_keys::kDescription, settings_.description);
+  dict.SetString(config_keys::kLocation, settings_.location);
   dict.SetString(config_keys::kLocalAnonymousAccessRole,
-                 local_anonymous_access_role_);
+                 settings_.local_anonymous_access_role);
   dict.SetBoolean(config_keys::kLocalDiscoveryEnabled,
-                  local_discovery_enabled_);
-  dict.SetBoolean(config_keys::kLocalPairingEnabled, local_pairing_enabled_);
+                  settings_.local_discovery_enabled);
+  dict.SetBoolean(config_keys::kLocalPairingEnabled,
+                  settings_.local_pairing_enabled);
 
   return storage_->Save(dict);
 }
@@ -278,7 +314,7 @@
     LOG(ERROR) << "Invalid role: " << role;
     return false;
   }
-  config_->local_anonymous_access_role_ = role;
+  settings_->local_anonymous_access_role = role;
   return true;
 }
 
@@ -288,7 +324,7 @@
   if (save_)
     config_->Save();
   for (const auto& cb : config_->on_changed_)
-    cb.Run(*config_);
+    cb.Run(*settings_);
   config_ = nullptr;
 }
 
diff --git a/libweave/src/buffet_config.h b/libweave/src/buffet_config.h
index d384b89..d0296da 100644
--- a/libweave/src/buffet_config.h
+++ b/libweave/src/buffet_config.h
@@ -20,20 +20,46 @@
 
 class StorageInterface;
 
+struct Settings {
+  std::string client_id;
+  std::string client_secret;
+  std::string api_key;
+  std::string oauth_url;
+  std::string service_url;
+  std::string name;
+  std::string description;
+  std::string location;
+  std::string local_anonymous_access_role;
+  bool local_discovery_enabled{true};
+  bool local_pairing_enabled{true};
+  std::string oem_name;
+  std::string model_name;
+  std::string model_id;
+  std::string device_kind;
+  base::TimeDelta polling_period;
+  base::TimeDelta backup_polling_period;
+
+  bool wifi_auto_setup_enabled{true};
+  std::set<PairingType> pairing_modes;
+  base::FilePath embedded_code_path;
+
+  std::string device_id;
+  std::string refresh_token;
+  std::string robot_account;
+  std::string last_configured_ssid;
+};
+
 // Handles reading buffet config and state files.
 class BuffetConfig final {
  public:
-  using OnChangedCallback = base::Callback<void(const BuffetConfig&)>;
+  using OnChangedCallback = base::Callback<void(const Settings&)>;
 
   explicit BuffetConfig(std::unique_ptr<StorageInterface> storage);
 
   explicit BuffetConfig(const base::FilePath& state_path);
 
-  void AddOnChangedCallback(const OnChangedCallback& callback) {
-    on_changed_.push_back(callback);
-    // Force to read current state.
-    callback.Run(*this);
-  }
+  void AddOnChangedCallback(const OnChangedCallback& callback);
+  const Settings& GetSettings() const;
 
   void Load(const base::FilePath& config_path);
   void Load(const chromeos::KeyValueStore& store);
@@ -44,44 +70,45 @@
   // object.
   class Transaction final {
    public:
-    explicit Transaction(BuffetConfig* config) : config_(config) {
+    explicit Transaction(BuffetConfig* config)
+        : config_(config), settings_(&config->settings_) {
       CHECK(config_);
     }
 
     ~Transaction();
 
-    void set_client_id(const std::string& id) { config_->client_id_ = id; }
+    void set_client_id(const std::string& id) { settings_->client_id = id; }
     void set_client_secret(const std::string& secret) {
-      config_->client_secret_ = secret;
+      settings_->client_secret = secret;
     }
-    void set_api_key(const std::string& key) { config_->api_key_ = key; }
-    void set_oauth_url(const std::string& url) { config_->oauth_url_ = url; }
+    void set_api_key(const std::string& key) { settings_->api_key = key; }
+    void set_oauth_url(const std::string& url) { settings_->oauth_url = url; }
     void set_service_url(const std::string& url) {
-      config_->service_url_ = url;
+      settings_->service_url = url;
     }
-    void set_name(const std::string& name) { config_->name_ = name; }
+    void set_name(const std::string& name) { settings_->name = name; }
     void set_description(const std::string& description) {
-      config_->description_ = description;
+      settings_->description = description;
     }
     void set_location(const std::string& location) {
-      config_->location_ = location;
+      settings_->location = location;
     }
     bool set_local_anonymous_access_role(const std::string& role);
     void set_local_discovery_enabled(bool enabled) {
-      config_->local_discovery_enabled_ = enabled;
+      settings_->local_discovery_enabled = enabled;
     }
     void set_local_pairing_enabled(bool enabled) {
-      config_->local_pairing_enabled_ = enabled;
+      settings_->local_pairing_enabled = enabled;
     }
-    void set_device_id(const std::string& id) { config_->device_id_ = id; }
+    void set_device_id(const std::string& id) { settings_->device_id = id; }
     void set_refresh_token(const std::string& token) {
-      config_->refresh_token_ = token;
+      settings_->refresh_token = token;
     }
     void set_robot_account(const std::string& account) {
-      config_->robot_account_ = account;
+      settings_->robot_account = account;
     }
     void set_last_configured_ssid(const std::string& ssid) {
-      config_->last_configured_ssid_ = ssid;
+      settings_->last_configured_ssid = ssid;
     }
 
     void Commit();
@@ -90,74 +117,57 @@
     friend class BuffetConfig;
     void LoadState();
     BuffetConfig* config_;
+    Settings* settings_;
     bool save_{true};
   };
 
-  const std::string& client_id() const { return client_id_; }
-  const std::string& client_secret() const { return client_secret_; }
-  const std::string& api_key() const { return api_key_; }
-  const std::string& oauth_url() const { return oauth_url_; }
-  const std::string& service_url() const { return service_url_; }
-  const std::string& oem_name() const { return oem_name_; }
-  const std::string& model_name() const { return model_name_; }
-  const std::string& model_id() const { return model_id_; }
-  const std::string& device_kind() const { return device_kind_; }
-  base::TimeDelta polling_period() const { return polling_period_; }
+  const std::string& client_id() const { return settings_.client_id; }
+  const std::string& client_secret() const { return settings_.client_secret; }
+  const std::string& api_key() const { return settings_.api_key; }
+  const std::string& oauth_url() const { return settings_.oauth_url; }
+  const std::string& service_url() const { return settings_.service_url; }
+  const std::string& oem_name() const { return settings_.oem_name; }
+  const std::string& model_name() const { return settings_.model_name; }
+  const std::string& model_id() const { return settings_.model_id; }
+  const std::string& device_kind() const { return settings_.device_kind; }
+  base::TimeDelta polling_period() const { return settings_.polling_period; }
   base::TimeDelta backup_polling_period() const {
-    return backup_polling_period_;
+    return settings_.backup_polling_period;
   }
 
-  bool wifi_auto_setup_enabled() const { return wifi_auto_setup_enabled_; }
-  const std::set<PairingType>& pairing_modes() const { return pairing_modes_; }
+  bool wifi_auto_setup_enabled() const {
+    return settings_.wifi_auto_setup_enabled;
+  }
+  const std::set<PairingType>& pairing_modes() const {
+    return settings_.pairing_modes;
+  }
   const base::FilePath& embedded_code_path() const {
-    return embedded_code_path_;
+    return settings_.embedded_code_path;
   }
 
-  const std::string& name() const { return name_; }
-  const std::string& description() const { return description_; }
-  const std::string& location() const { return location_; }
+  const std::string& name() const { return settings_.name; }
+  const std::string& description() const { return settings_.description; }
+  const std::string& location() const { return settings_.location; }
   const std::string& local_anonymous_access_role() const {
-    return local_anonymous_access_role_;
+    return settings_.local_anonymous_access_role;
   }
-  bool local_pairing_enabled() const { return local_pairing_enabled_; }
-  bool local_discovery_enabled() const { return local_discovery_enabled_; }
+  bool local_pairing_enabled() const { return settings_.local_pairing_enabled; }
+  bool local_discovery_enabled() const {
+    return settings_.local_discovery_enabled;
+  }
 
-  const std::string& device_id() const { return device_id_; }
-  const std::string& refresh_token() const { return refresh_token_; }
-  const std::string& robot_account() const { return robot_account_; }
+  const std::string& device_id() const { return settings_.device_id; }
+  const std::string& refresh_token() const { return settings_.refresh_token; }
+  const std::string& robot_account() const { return settings_.robot_account; }
   const std::string& last_configured_ssid() const {
-    return last_configured_ssid_;
+    return settings_.last_configured_ssid;
   }
 
  private:
   bool Save();
+  static Settings CreateDefaultSettings();
 
-  std::string client_id_{"58855907228.apps.googleusercontent.com"};
-  std::string client_secret_{"eHSAREAHrIqPsHBxCE9zPPBi"};
-  std::string api_key_{"AIzaSyDSq46gG-AxUnC3zoqD9COIPrjolFsMfMA"};
-  std::string oauth_url_{"https://accounts.google.com/o/oauth2/"};
-  std::string service_url_{"https://www.googleapis.com/clouddevices/v1/"};
-  std::string name_{"Developer device"};
-  std::string description_;
-  std::string location_;
-  std::string local_anonymous_access_role_{"viewer"};
-  bool local_discovery_enabled_{true};
-  bool local_pairing_enabled_{true};
-  std::string oem_name_{"Chromium"};
-  std::string model_name_{"Brillo"};
-  std::string model_id_{"AAAAA"};
-  std::string device_kind_{"vendor"};
-  base::TimeDelta polling_period_{base::TimeDelta::FromSeconds(7)};
-  base::TimeDelta backup_polling_period_{base::TimeDelta::FromMinutes(30)};
-
-  bool wifi_auto_setup_enabled_{true};
-  std::set<PairingType> pairing_modes_{PairingType::kPinCode};
-  base::FilePath embedded_code_path_;
-
-  std::string device_id_;
-  std::string refresh_token_;
-  std::string robot_account_;
-  std::string last_configured_ssid_;
+  Settings settings_ = CreateDefaultSettings();
 
   // Serialization interface to save and load buffet state.
   std::unique_ptr<StorageInterface> storage_;
diff --git a/libweave/src/buffet_config_unittest.cc b/libweave/src/buffet_config_unittest.cc
index a286c34..7811814 100644
--- a/libweave/src/buffet_config_unittest.cc
+++ b/libweave/src/buffet_config_unittest.cc
@@ -31,7 +31,7 @@
         base::Bind(&BuffetConfigTest::OnConfigChanged, base::Unretained(this)));
   }
 
-  MOCK_METHOD1(OnConfigChanged, void(const BuffetConfig&));
+  MOCK_METHOD1(OnConfigChanged, void(const Settings&));
 
   StorageInterface* storage_{nullptr};
   std::unique_ptr<BuffetConfig> config_;
diff --git a/libweave/src/privet/cloud_delegate.cc b/libweave/src/privet/cloud_delegate.cc
index c5efb4d..9ef680d 100644
--- a/libweave/src/privet/cloud_delegate.cc
+++ b/libweave/src/privet/cloud_delegate.cc
@@ -249,7 +249,7 @@
     CHECK(command_owners_.erase(command->GetID()));
   }
 
-  void OnConfigChanged(const BuffetConfig&) { NotifyOnDeviceInfoChanged(); }
+  void OnConfigChanged(const Settings&) { NotifyOnDeviceInfoChanged(); }
 
   void OnRegistrationChanged(RegistrationStatus status) {
     if (status == RegistrationStatus::kUnconfigured) {