blob: dfdabd885c86a2e0cba4a6dcbba0e133181d694a [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chromeos/printing/device_external_printers_settings_bridge.h"
#include <string>
#include <vector>
#include "base/bind.h"
#include "base/values.h"
#include "chrome/browser/chromeos/printing/device_external_printers_factory.h"
#include "chrome/browser/chromeos/printing/external_printers.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
namespace chromeos {
namespace {
// Extracts the list of strings named |policy_name| from |settings| and returns
// it.
std::vector<std::string> FromSettings(const CrosSettings* settings,
const std::string& policy_name) {
std::vector<std::string> string_list;
const base::ListValue* list = nullptr;
if (!settings->GetList(policy_name, &list) || !list) {
return string_list;
}
for (const base::Value& value : *list) {
if (value.is_string()) {
string_list.push_back(value.GetString());
}
}
return string_list;
}
} // namespace
DeviceExternalPrintersSettingsBridge::DeviceExternalPrintersSettingsBridge(
const ExternalPrinterPolicies& policies,
CrosSettings* settings)
: settings_(settings), policies_(policies) {
access_mode_subscription_ = settings->AddSettingsObserver(
policies_.access_mode,
base::BindRepeating(
&DeviceExternalPrintersSettingsBridge::AccessModeUpdated,
base::Unretained(this)));
blacklist_subscription_ = settings->AddSettingsObserver(
policies_.blacklist,
base::BindRepeating(
&DeviceExternalPrintersSettingsBridge::BlacklistUpdated,
base::Unretained(this)));
whitelist_subscription_ = settings->AddSettingsObserver(
policies_.whitelist,
base::BindRepeating(
&DeviceExternalPrintersSettingsBridge::WhitelistUpdated,
base::Unretained(this)));
Initialize();
}
DeviceExternalPrintersSettingsBridge::~DeviceExternalPrintersSettingsBridge() =
default;
void DeviceExternalPrintersSettingsBridge::Initialize() {
BlacklistUpdated();
WhitelistUpdated();
AccessModeUpdated();
}
void DeviceExternalPrintersSettingsBridge::AccessModeUpdated() {
int mode_val;
// Settings should contain value for access mode device setting.
// Even if it's not pushed with device policy, the default value should be
// set.
CHECK(settings_->GetInteger(policies_.access_mode, &mode_val));
ExternalPrinters::AccessMode mode =
static_cast<ExternalPrinters::AccessMode>(mode_val);
base::WeakPtr<ExternalPrinters> printers =
DeviceExternalPrintersFactory::Get()->GetForDevice();
if (printers)
printers->SetAccessMode(mode);
}
void DeviceExternalPrintersSettingsBridge::BlacklistUpdated() {
base::WeakPtr<ExternalPrinters> printers =
DeviceExternalPrintersFactory::Get()->GetForDevice();
if (printers)
printers->SetBlacklist(FromSettings(settings_, policies_.blacklist));
}
void DeviceExternalPrintersSettingsBridge::WhitelistUpdated() {
base::WeakPtr<ExternalPrinters> printers =
DeviceExternalPrintersFactory::Get()->GetForDevice();
if (printers)
printers->SetWhitelist(FromSettings(settings_, policies_.whitelist));
}
} // namespace chromeos