blob: 3a44536e16cee06a388d3944de4fa56708543550 [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "extensions/common/api/printer_provider/usb_printer_manifest_data.h"
#include <utility>
#include "base/strings/utf_string_conversions.h"
#include "extensions/common/api/extensions_manifest_types.h"
#include "extensions/common/manifest_constants.h"
#include "services/device/public/cpp/usb/usb_utils.h"
#include "services/device/public/mojom/usb_enumeration_options.mojom.h"
namespace extensions {
UsbPrinterManifestData::UsbPrinterManifestData() {
}
UsbPrinterManifestData::~UsbPrinterManifestData() {
}
// static
const UsbPrinterManifestData* UsbPrinterManifestData::Get(
const Extension* extension) {
return static_cast<UsbPrinterManifestData*>(
extension->GetManifestData(manifest_keys::kUsbPrinters));
}
// static
std::unique_ptr<UsbPrinterManifestData> UsbPrinterManifestData::FromValue(
const base::Value& value,
std::u16string* error) {
auto usb_printers =
api::extensions_manifest_types::UsbPrinters::FromValue(value);
if (!usb_printers.has_value()) {
*error = std::move(usb_printers).error();
return nullptr;
}
auto result = std::make_unique<UsbPrinterManifestData>();
for (const auto& input : usb_printers->filters) {
if (input.product_id && input.interface_class) {
*error = u"Only one of productId or interfaceClass may be specified.";
return nullptr;
}
auto output = device::mojom::UsbDeviceFilter::New();
output->has_vendor_id = true;
output->vendor_id = input.vendor_id;
if (input.product_id) {
output->has_product_id = true;
output->product_id = *input.product_id;
}
if (input.interface_class) {
output->has_class_code = true;
output->class_code = *input.interface_class;
if (input.interface_subclass) {
output->has_subclass_code = true;
output->subclass_code = *input.interface_subclass;
if (input.interface_protocol) {
output->has_protocol_code = true;
output->protocol_code = *input.interface_protocol;
}
}
}
result->filters_.push_back(std::move(output));
}
return result;
}
bool UsbPrinterManifestData::SupportsDevice(
const device::mojom::UsbDeviceInfo& device) const {
for (const auto& filter : filters_) {
if (device::UsbDeviceFilterMatches(*filter, device))
return true;
}
return false;
}
} // namespace extensions