blob: 5bd9b94acc332b70f2272f175e26522f42a05af0 [file] [log] [blame]
// Copyright 2015 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 "extensions/common/api/printer_provider/usb_printer_manifest_data.h"
#include <memory>
#include <utility>
#include "base/strings/utf_string_conversions.h"
#include "device/usb/public/cpp/usb_utils.h"
#include "device/usb/public/mojom/device_manager.mojom.h"
#include "device/usb/usb_device.h"
#include "extensions/common/api/extensions_manifest_types.h"
#include "extensions/common/manifest_constants.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,
base::string16* error) {
std::unique_ptr<api::extensions_manifest_types::UsbPrinters> usb_printers =
api::extensions_manifest_types::UsbPrinters::FromValue(value, error);
if (!usb_printers) {
return nullptr;
}
auto result = std::make_unique<UsbPrinterManifestData>();
for (const auto& input : usb_printers->filters) {
if (input.product_id && input.interface_class) {
*error = base::ASCIIToUTF16(
"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::UsbDevice& device) const {
for (const auto& filter : filters_) {
if (UsbDeviceFilterMatches(*filter, device))
return true;
}
return false;
}
} // namespace extensions