1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
// 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
|