blob: b0664f8f71b0b8dae854a55cc40a9411816ebe62 (
plain)
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* Copyright (C) 2022 Richard Hughes <richard@hughsie.com>
*
* SPDX-License-Identifier: LGPL-2.1+
*/
/**
* SECTION:gusb-bos-descriptor
* @short_description: GLib wrapper around a USB BOS descriptor.
*
* This object is a thin glib wrapper around a `libusb_bos_dev_capability_descriptor`.
*
* All the data is copied when the object is created and the original descriptor can be destroyed
* at any point.
*/
#include "config.h"
#include <string.h>
#include "gusb-bos-descriptor-private.h"
struct _GUsbBosDescriptor
{
GObject parent_instance;
struct libusb_bos_dev_capability_descriptor bos_cap;
GBytes *extra;
};
G_DEFINE_TYPE (GUsbBosDescriptor, g_usb_bos_descriptor, G_TYPE_OBJECT)
static void
g_usb_bos_descriptor_finalize (GObject *object)
{
GUsbBosDescriptor *self = G_USB_BOS_DESCRIPTOR (object);
g_bytes_unref (self->extra);
G_OBJECT_CLASS (g_usb_bos_descriptor_parent_class)->finalize (object);
}
static void
g_usb_bos_descriptor_class_init (GUsbBosDescriptorClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->finalize = g_usb_bos_descriptor_finalize;
}
static void
g_usb_bos_descriptor_init (GUsbBosDescriptor *self)
{
}
/**
* _g_usb_bos_descriptor_new:
*
* Return value: a new #GUsbBosDescriptor object.
*
* Since: 0.4.0
**/
GUsbBosDescriptor *
_g_usb_bos_descriptor_new (const struct libusb_bos_dev_capability_descriptor *bos_cap)
{
GUsbBosDescriptor *self;
self = g_object_new (G_USB_TYPE_BOS_DESCRIPTOR, NULL);
/* copy the data */
memcpy (&self->bos_cap, bos_cap, sizeof (*bos_cap));
self->extra = g_bytes_new (bos_cap->dev_capability_data, bos_cap->bLength - 0x03);
return G_USB_BOS_DESCRIPTOR (self);
}
/**
* g_usb_bos_descriptor_get_capability:
* @self: a #GUsbBosDescriptor
*
* Gets the BOS descriptor capability.
*
* Return value: capability
*
* Since: 0.4.0
**/
guint8
g_usb_bos_descriptor_get_capability (GUsbBosDescriptor *self)
{
g_return_val_if_fail (G_USB_IS_BOS_DESCRIPTOR (self), 0);
return self->bos_cap.bDevCapabilityType;
}
/**
* g_usb_bos_descriptor_get_extra:
* @self: a #GUsbBosDescriptor
*
* Gets any extra data from the BOS descriptor.
*
* Return value: (transfer none): a #GBytes, or %NULL for failure
*
* Since: 0.4.0
**/
GBytes *
g_usb_bos_descriptor_get_extra (GUsbBosDescriptor *self)
{
g_return_val_if_fail (G_USB_IS_BOS_DESCRIPTOR (self), NULL);
return self->extra;
}
|