blob: 5e438889c13da1370f48b55ac2ca32bc25750f99 [file] [log] [blame]
// Copyright 2016 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 "printing/backend/test_print_backend.h"
#include <memory>
#include <string>
#include <utility>
#include "base/check.h"
#include "base/containers/contains.h"
#include "base/logging.h"
#include "printing/backend/print_backend.h"
namespace printing {
TestPrintBackend::TestPrintBackend() : PrintBackend(/*locale=*/std::string()) {}
TestPrintBackend::~TestPrintBackend() = default;
bool TestPrintBackend::EnumeratePrinters(PrinterList* printer_list) {
if (printer_map_.empty())
return false;
for (const auto& entry : printer_map_) {
const std::unique_ptr<PrinterData>& data = entry.second;
// Can only return basic info for printers which have registered info.
if (data->info)
printer_list->emplace_back(*data->info);
}
return true;
}
std::string TestPrintBackend::GetDefaultPrinterName() {
return default_printer_name_;
}
bool TestPrintBackend::GetPrinterBasicInfo(const std::string& printer_name,
PrinterBasicInfo* printer_info) {
auto found = printer_map_.find(printer_name);
if (found == printer_map_.end())
return false; // Matching entry not found.
// Basic info might not have been provided.
const std::unique_ptr<PrinterData>& data = found->second;
if (!data->info)
return false;
*printer_info = *data->info;
return true;
}
bool TestPrintBackend::GetPrinterSemanticCapsAndDefaults(
const std::string& printer_name,
PrinterSemanticCapsAndDefaults* printer_caps) {
auto found = printer_map_.find(printer_name);
if (found == printer_map_.end())
return false;
// Capabilities might not have been provided.
const std::unique_ptr<PrinterData>& data = found->second;
if (!data->caps)
return false;
*printer_caps = *data->caps;
return true;
}
bool TestPrintBackend::GetPrinterCapsAndDefaults(
const std::string& printer_name,
PrinterCapsAndDefaults* printer_caps) {
// not implemented
return false;
}
std::string TestPrintBackend::GetPrinterDriverInfo(
const std::string& printer_name) {
// not implemented
return "";
}
bool TestPrintBackend::IsValidPrinter(const std::string& printer_name) {
return base::Contains(printer_map_, printer_name);
}
void TestPrintBackend::SetDefaultPrinterName(const std::string& printer_name) {
if (default_printer_name_ == printer_name)
return;
auto found = printer_map_.find(printer_name);
if (found == printer_map_.end()) {
DLOG(ERROR) << "Unable to set an unknown printer as the default. Unknown "
<< "printer name: " << printer_name;
return;
}
// Previous default printer is no longer the default.
const std::unique_ptr<PrinterData>& new_default_data = found->second;
if (!default_printer_name_.empty())
printer_map_[default_printer_name_]->info->is_default = false;
// Now update new printer as default.
default_printer_name_ = printer_name;
if (!default_printer_name_.empty())
new_default_data->info->is_default = true;
}
void TestPrintBackend::AddValidPrinter(
const std::string& printer_name,
std::unique_ptr<PrinterSemanticCapsAndDefaults> caps,
std::unique_ptr<PrinterBasicInfo> info) {
DCHECK(!printer_name.empty());
const bool is_default = info && info->is_default;
printer_map_[printer_name] =
std::make_unique<PrinterData>(std::move(caps), std::move(info));
// Ensure that default settings are honored if more than one is attempted to
// be marked as default or if this prior default should no longer be so.
if (is_default)
SetDefaultPrinterName(printer_name);
else if (default_printer_name_ == printer_name)
default_printer_name_.clear();
}
TestPrintBackend::PrinterData::PrinterData(
std::unique_ptr<PrinterSemanticCapsAndDefaults> caps,
std::unique_ptr<PrinterBasicInfo> info)
: caps(std::move(caps)), info(std::move(info)) {}
TestPrintBackend::PrinterData::~PrinterData() = default;
} // namespace printing