#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "services/device/usb/usb_descriptors.h"
#include <stddef.h>
#include <algorithm>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/barrier_closure.h"
#include "base/functional/bind.h"
#include "base/memory/ref_counted_memory.h"
#include "services/device/public/cpp/usb/usb_utils.h"
#include "services/device/usb/usb_device_handle.h"
namespace device {
UsbAlternateInterfaceInfoPtr;
UsbConfigurationInfoPtr;
UsbControlTransferRecipient;
UsbControlTransferType;
UsbDeviceInfoPtr;
UsbEndpointInfoPtr;
UsbInterfaceInfoPtr;
UsbSynchronizationType;
UsbTransferDirection;
UsbTransferStatus;
UsbTransferType;
UsbUsageType;
namespace {
IndexMap;
IndexMapPtr;
const uint8_t kGetDescriptorRequest = …;
const uint8_t kDeviceDescriptorType = …;
const uint8_t kConfigurationDescriptorType = …;
const uint8_t kStringDescriptorType = …;
const uint8_t kInterfaceDescriptorType = …;
const uint8_t kEndpointDescriptorType = …;
const uint8_t kInterfaceAssociationDescriptorType = …;
const uint8_t kDeviceDescriptorLength = …;
const uint8_t kConfigurationDescriptorLength = …;
const uint8_t kInterfaceDescriptorLength = …;
const uint8_t kEndpointDescriptorLength = …;
const uint8_t kInterfaceAssociationDescriptorLength = …;
const int kControlTransferTimeoutMs = …;
struct UsbInterfaceAssociationDescriptor { … };
void ParseInterfaceAssociationDescriptors(
const std::vector<uint8_t>& buffer,
std::vector<UsbInterfaceAssociationDescriptor>* functions) { … }
void OnDoneReadingConfigDescriptors(
scoped_refptr<UsbDeviceHandle> device_handle,
std::unique_ptr<UsbDeviceDescriptor> desc,
base::OnceCallback<void(std::unique_ptr<UsbDeviceDescriptor>)> callback) { … }
void OnReadConfigDescriptor(UsbDeviceDescriptor* desc,
base::OnceClosure closure,
UsbTransferStatus status,
scoped_refptr<base::RefCountedBytes> buffer,
size_t length) { … }
void OnReadConfigDescriptorHeader(scoped_refptr<UsbDeviceHandle> device_handle,
UsbDeviceDescriptor* desc,
uint8_t index,
base::OnceClosure closure,
UsbTransferStatus status,
scoped_refptr<base::RefCountedBytes> header,
size_t length) { … }
void OnReadDeviceDescriptor(
scoped_refptr<UsbDeviceHandle> device_handle,
base::OnceCallback<void(std::unique_ptr<UsbDeviceDescriptor>)> callback,
UsbTransferStatus status,
scoped_refptr<base::RefCountedBytes> buffer,
size_t length) { … }
void StoreStringDescriptor(IndexMap::iterator it,
base::OnceClosure callback,
const std::u16string& string) { … }
void OnReadStringDescriptor(
base::OnceCallback<void(const std::u16string&)> callback,
UsbTransferStatus status,
scoped_refptr<base::RefCountedBytes> buffer,
size_t length) { … }
void ReadStringDescriptor(
scoped_refptr<UsbDeviceHandle> device_handle,
uint8_t index,
uint16_t language_id,
base::OnceCallback<void(const std::u16string&)> callback) { … }
void OnReadLanguageIds(scoped_refptr<UsbDeviceHandle> device_handle,
IndexMapPtr index_map,
base::OnceCallback<void(IndexMapPtr)> callback,
const std::u16string& languages) { … }
}
CombinedInterfaceInfo::CombinedInterfaceInfo(
const mojom::UsbInterfaceInfo* interface,
const mojom::UsbAlternateInterfaceInfo* alternate)
: … { … }
bool CombinedInterfaceInfo::IsValid() const { … }
UsbDeviceDescriptor::UsbDeviceDescriptor()
: … { … }
UsbDeviceDescriptor::~UsbDeviceDescriptor() = default;
bool UsbDeviceDescriptor::Parse(base::span<const uint8_t> buffer) { … }
void ReadUsbDescriptors(
scoped_refptr<UsbDeviceHandle> device_handle,
base::OnceCallback<void(std::unique_ptr<UsbDeviceDescriptor>)> callback) { … }
bool ParseUsbStringDescriptor(base::span<const uint8_t> descriptor,
std::u16string* output) { … }
void ReadUsbStringDescriptors(scoped_refptr<UsbDeviceHandle> device_handle,
IndexMapPtr index_map,
base::OnceCallback<void(IndexMapPtr)> callback) { … }
UsbEndpointInfoPtr BuildUsbEndpointInfoPtr(const uint8_t* data) { … }
UsbEndpointInfoPtr BuildUsbEndpointInfoPtr(uint8_t address,
uint8_t attributes,
uint16_t maximum_packet_size,
uint8_t polling_interval) { … }
UsbInterfaceInfoPtr BuildUsbInterfaceInfoPtr(const uint8_t* data) { … }
UsbInterfaceInfoPtr BuildUsbInterfaceInfoPtr(uint8_t interface_number,
uint8_t alternate_setting,
uint8_t interface_class,
uint8_t interface_subclass,
uint8_t interface_protocol) { … }
void AggregateInterfacesForConfig(mojom::UsbConfigurationInfo* config) { … }
CombinedInterfaceInfo FindInterfaceInfoFromConfig(
const mojom::UsbConfigurationInfo* config,
uint8_t interface_number,
uint8_t alternate_setting) { … }
UsbConfigurationInfoPtr BuildUsbConfigurationInfoPtr(const uint8_t* data) { … }
UsbConfigurationInfoPtr BuildUsbConfigurationInfoPtr(
uint8_t configuration_value,
bool self_powered,
bool remote_wakeup,
uint8_t maximum_power) { … }
void AssignFirstInterfaceNumbers(mojom::UsbConfigurationInfo* config) { … }
}