blob: d63a3896ceebce61da80a7db96d22ae3d50648da [file] [log] [blame]
// Copyright 2019 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/printers_map.h"
#include "base/stl_util.h"
namespace chromeos {
namespace {
bool IsProtocolSecure(const Printer& printer) {
return !printer.HasNetworkProtocol() ||
printer.GetProtocol() == Printer::kIpps;
}
} // namespace
PrintersMap::PrintersMap() = default;
PrintersMap::~PrintersMap() = default;
base::Optional<Printer> PrintersMap::Get(const std::string& printer_id) const {
for (const auto& kv : printers_) {
const PrinterClass& printer_class = kv.first;
const auto& printer_list = kv.second;
if (IsPrinterInClass(printer_class, printer_id)) {
return printer_list.at(printer_id);
}
}
return base::nullopt;
}
base::Optional<Printer> PrintersMap::Get(PrinterClass printer_class,
const std::string& printer_id) const {
if (!IsPrinterInClass(printer_class, printer_id)) {
return base::nullopt;
}
return printers_.at(printer_class).at(printer_id);
}
std::vector<Printer> PrintersMap::Get(PrinterClass printer_class) const {
if (!HasPrintersInClass(printer_class)) {
return std::vector<Printer>();
}
std::vector<Printer> result;
result.reserve(printers_.at(printer_class).size());
for (const auto& kv : printers_.at(printer_class)) {
const Printer& printer = kv.second;
result.push_back(printer);
}
return result;
}
std::vector<Printer> PrintersMap::Get() const {
std::vector<Printer> result;
for (const auto& outer_map_entry : printers_) {
const auto& printer_class = outer_map_entry.second;
for (const auto& inner_map_entry : printer_class) {
const Printer& printer = inner_map_entry.second;
result.push_back(printer);
}
}
return result;
}
void PrintersMap::Insert(PrinterClass printer_class, const Printer& printer) {
DCHECK(!IsExistingPrinter(printer.id()));
printers_[printer_class][printer.id()] = printer;
}
void PrintersMap::Clear(PrinterClass printer_class) {
printers_[printer_class].clear();
}
void PrintersMap::ReplacePrintersInClass(PrinterClass printer_class,
const std::vector<Printer>& printers) {
Clear(printer_class);
for (const auto& printer : printers) {
Insert(printer_class, printer);
}
}
std::vector<Printer> PrintersMap::GetSecurePrinters() const {
std::vector<Printer> result;
for (const auto& kv : printers_) {
const PrinterClass& printer_class = kv.first;
auto printers = GetSecurePrinters(printer_class);
result.insert(result.end(), std::make_move_iterator(printers.begin()),
std::make_move_iterator(printers.end()));
}
return result;
}
std::vector<Printer> PrintersMap::GetSecurePrinters(
PrinterClass printer_class) const {
if (!HasPrintersInClass(printer_class)) {
return std::vector<Printer>();
}
std::vector<Printer> result;
result.reserve(printers_.at(printer_class).size());
for (const auto& kv : printers_.at(printer_class)) {
const Printer& printer = kv.second;
if (IsProtocolSecure(printer)) {
result.push_back(printer);
}
}
return result;
}
void PrintersMap::Remove(PrinterClass printer_class,
const std::string& printer_id) {
if (!IsPrinterInClass(printer_class, printer_id)) {
return;
}
printers_[printer_class].erase(printer_id);
DCHECK(!IsExistingPrinter(printer_id));
}
bool PrintersMap::HasPrintersInClass(PrinterClass printer_class) const {
return base::Contains(printers_, printer_class);
}
bool PrintersMap::IsPrinterInClass(PrinterClass printer_class,
const std::string& printer_id) const {
return HasPrintersInClass(printer_class) &&
base::Contains(printers_.at(printer_class), printer_id);
}
bool PrintersMap::IsExistingPrinter(const std::string& printer_id) const {
return Get(printer_id).has_value();
}
} // namespace chromeos