blob: e4f45736243e5b79b86425477c9a4552f6932af9 [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/scanning/fake_lorgnette_scanner_manager.h"
#include <utility>
#include "base/functional/bind.h"
#include "base/location.h"
#include "base/task/single_thread_task_runner.h"
#include "third_party/re2/src/re2/re2.h"
namespace ash {
namespace {
// A list of Epson models that do not rotate alternating ADF scanned pages
// to be excluded in IsRotateAlternate().
constexpr char kEpsonNoFlipModels[] =
"\\b("
"DS-790WN"
"|LP-M8180A"
"|LP-M8180F"
"|LX-10020M"
"|LX-10050KF"
"|LX-10050MF"
"|LX-6050MF"
"|LX-7550MF"
"|PX-M7070FX"
"|PX-M7080FX"
"|PX-M7090FX"
"|PX-M7110F"
"|PX-M7110FP"
"|PX-M860F"
"|PX-M880FX"
"|WF-6530"
"|WF-6590"
"|WF-6593"
"|WF-C20600"
"|WF-C20600a"
"|WF-C20600c"
"|WF-C20750"
"|WF-C20750a"
"|WF-C20750c"
"|WF-C21000"
"|WF-C21000a"
"|WF-C21000c"
"|WF-C579R"
"|WF-C579Ra"
"|WF-C8610"
"|WF-C8690"
"|WF-C8690a"
"|WF-C869R"
"|WF-C869Ra"
"|WF-C878R"
"|WF-C878Ra"
"|WF-C879R"
"|WF-C879Ra"
"|WF-M21000"
"|WF-M21000a"
"|WF-M21000c"
")\\b";
} // namespace
FakeLorgnetteScannerManager::FakeLorgnetteScannerManager() = default;
FakeLorgnetteScannerManager::~FakeLorgnetteScannerManager() = default;
void FakeLorgnetteScannerManager::GetScannerNames(
GetScannerNamesCallback callback) {
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), scanner_names_));
}
void FakeLorgnetteScannerManager::GetScannerCapabilities(
const std::string& scanner_name,
GetScannerCapabilitiesCallback callback) {
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), scanner_capabilities_));
}
bool FakeLorgnetteScannerManager::IsRotateAlternate(
const std::string& scanner_name,
const std::string& source_name) {
if (!RE2::PartialMatch(source_name, RE2("(?i)adf duplex"))) {
return false;
}
// No implementation of GetUsableDeviceNameAndProtocol() available
// so assume scanner name is formatted as device_name.
std::string exclude_regex = std::string("^(airscan|ippusb).*(EPSON\\s+)?") +
std::string(kEpsonNoFlipModels);
if (RE2::PartialMatch(scanner_name, RE2("^(epsonds|epson2)")) ||
RE2::PartialMatch(scanner_name, RE2(exclude_regex))) {
return false;
}
return RE2::PartialMatch(scanner_name, RE2("(?i)epson"));
}
void FakeLorgnetteScannerManager::Scan(const std::string& scanner_name,
const lorgnette::ScanSettings& settings,
ProgressCallback progress_callback,
PageCallback page_callback,
CompletionCallback completion_callback) {
if (scan_data_.has_value()) {
uint32_t page_number = 1;
for (const std::string& page_data : scan_data_.value()) {
if (progress_callback) {
for (const uint32_t progress : {7, 22, 40, 42, 59, 74, 95}) {
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE,
base::BindOnce(progress_callback, progress, page_number));
}
}
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, base::BindOnce(page_callback, page_data, page_number++));
}
}
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE,
base::BindOnce(std::move(completion_callback),
scan_data_.has_value()
? lorgnette::SCAN_FAILURE_MODE_NO_FAILURE
: lorgnette::SCAN_FAILURE_MODE_DEVICE_BUSY));
}
void FakeLorgnetteScannerManager::CancelScan(CancelCallback cancel_callback) {
base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
FROM_HERE, base::BindOnce(std::move(cancel_callback), true));
}
void FakeLorgnetteScannerManager::SetGetScannerNamesResponse(
const std::vector<std::string>& scanner_names) {
scanner_names_ = scanner_names;
}
void FakeLorgnetteScannerManager::SetGetScannerCapabilitiesResponse(
const absl::optional<lorgnette::ScannerCapabilities>&
scanner_capabilities) {
scanner_capabilities_ = scanner_capabilities;
}
void FakeLorgnetteScannerManager::SetScanResponse(
const absl::optional<std::vector<std::string>>& scan_data) {
scan_data_ = scan_data;
}
} // namespace ash