summaryrefslogtreecommitdiff
path: root/gusb/gusb-interface.c
diff options
context:
space:
mode:
Diffstat (limited to 'gusb/gusb-interface.c')
-rw-r--r--gusb/gusb-interface.c247
1 files changed, 247 insertions, 0 deletions
diff --git a/gusb/gusb-interface.c b/gusb/gusb-interface.c
new file mode 100644
index 0000000..8f8daa9
--- /dev/null
+++ b/gusb/gusb-interface.c
@@ -0,0 +1,247 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
+ *
+ * Copyright (C) 2015 Richard Hughes <richard@hughsie.com>
+ *
+ * Licensed under the GNU Lesser General Public License Version 2.1
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/**
+ * SECTION:gusb-interface
+ * @short_description: GLib interface integration for libusb
+ *
+ * This object is a thin glib wrapper around a libusb_interface_descriptor
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include "gusb-interface.h"
+#include "gusb-interface-private.h"
+
+/**
+ * GUsbInterfacePrivate:
+ *
+ * Private #GUsbInterface data
+ **/
+struct _GUsbInterfacePrivate
+{
+ struct libusb_interface_descriptor iface;
+ GBytes *extra;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE (GUsbInterface, g_usb_interface, G_TYPE_OBJECT)
+
+static void
+g_usb_interface_finalize (GObject *object)
+{
+ GUsbInterface *interface = G_USB_INTERFACE (object);
+ GUsbInterfacePrivate *priv = interface->priv;
+
+ g_bytes_unref (priv->extra);
+
+ G_OBJECT_CLASS (g_usb_interface_parent_class)->finalize (object);
+}
+
+static void
+g_usb_interface_class_init (GUsbInterfaceClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ object_class->finalize = g_usb_interface_finalize;
+}
+
+static void
+g_usb_interface_init (GUsbInterface *interface)
+{
+ interface->priv = g_usb_interface_get_instance_private (interface);
+}
+
+/**
+ * _g_usb_interface_new:
+ *
+ * Return value: a new #GUsbInterface object.
+ *
+ * Since: 0.2.8
+ **/
+GUsbInterface *
+_g_usb_interface_new (const struct libusb_interface_descriptor *iface)
+{
+ GUsbInterface *interface;
+ interface = g_object_new (G_USB_TYPE_INTERFACE, NULL);
+
+ /* copy the data */
+ memcpy (&interface->priv->iface,
+ iface,
+ sizeof (struct libusb_interface_descriptor));
+ interface->priv->extra = g_bytes_new (iface->extra, iface->extra_length);
+
+ return G_USB_INTERFACE (interface);
+}
+
+/**
+ * g_usb_interface_get_length:
+ * @interface: a #GUsbInterface
+ *
+ * Gets the USB bus number for the interface.
+ *
+ * Return value: The 8-bit bus number
+ *
+ * Since: 0.2.8
+ **/
+guint8
+g_usb_interface_get_length (GUsbInterface *interface)
+{
+ g_return_val_if_fail (G_USB_IS_INTERFACE (interface), 0);
+ return interface->priv->iface.bLength;
+}
+
+/**
+ * g_usb_interface_get_kind:
+ * @interface: a #GUsbInterface
+ *
+ * Gets the type of interface.
+ *
+ * Return value: The 8-bit address
+ *
+ * Since: 0.2.8
+ **/
+guint8
+g_usb_interface_get_kind (GUsbInterface *interface)
+{
+ g_return_val_if_fail (G_USB_IS_INTERFACE (interface), 0);
+ return interface->priv->iface.bDescriptorType;
+}
+
+/**
+ * g_usb_interface_get_number:
+ * @interface: a #GUsbInterface
+ *
+ * Gets the interface number.
+ *
+ * Return value: The interface ID
+ *
+ * Since: 0.2.8
+ **/
+guint8
+g_usb_interface_get_number (GUsbInterface *interface)
+{
+ g_return_val_if_fail (G_USB_IS_INTERFACE (interface), 0);
+ return interface->priv->iface.bInterfaceNumber;
+}
+
+/**
+ * g_usb_interface_get_alternate:
+ * @interface: a #GUsbInterface
+ *
+ * Gets the alternate setting for the interface.
+ *
+ * Return value: alt setting, typically zero.
+ *
+ * Since: 0.2.8
+ **/
+guint8
+g_usb_interface_get_alternate (GUsbInterface *interface)
+{
+ g_return_val_if_fail (G_USB_IS_INTERFACE (interface), 0);
+ return interface->priv->iface.bAlternateSetting;
+}
+
+/**
+ * g_usb_interface_get_class:
+ * @interface: a #GUsbInterface
+ *
+ * Gets the interface class, typically a #GUsbInterfaceClassCode.
+ *
+ * Return value: a interface class number, e.g. 0x09 is a USB hub.
+ *
+ * Since: 0.2.8
+ **/
+guint8
+g_usb_interface_get_class (GUsbInterface *interface)
+{
+ g_return_val_if_fail (G_USB_IS_INTERFACE (interface), 0);
+ return interface->priv->iface.bInterfaceClass;
+}
+
+/**
+ * g_usb_interface_get_subclass:
+ * @interface: a #GUsbInterface
+ *
+ * Gets the interface subclass qualified by the class number.
+ * See g_usb_interface_get_class().
+ *
+ * Return value: a interface subclass number.
+ *
+ * Since: 0.2.8
+ **/
+guint8
+g_usb_interface_get_subclass (GUsbInterface *interface)
+{
+ g_return_val_if_fail (G_USB_IS_INTERFACE (interface), 0);
+ return interface->priv->iface.bInterfaceSubClass;
+}
+
+/**
+ * g_usb_interface_get_protocol:
+ * @interface: a #GUsbInterface
+ *
+ * Gets the interface protocol qualified by the class and subclass numbers.
+ * See g_usb_interface_get_class() and g_usb_interface_get_subclass().
+ *
+ * Return value: a interface protocol number.
+ *
+ * Since: 0.2.8
+ **/
+guint8
+g_usb_interface_get_protocol (GUsbInterface *interface)
+{
+ g_return_val_if_fail (G_USB_IS_INTERFACE (interface), 0);
+ return interface->priv->iface.bInterfaceProtocol;
+}
+
+/**
+ * g_usb_interface_get_index:
+ * @interface: a #GUsbInterface
+ *
+ * Gets the index for the string descriptor.
+ *
+ * Return value: a string descriptor index.
+ *
+ * Since: 0.2.8
+ **/
+guint8
+g_usb_interface_get_index (GUsbInterface *interface)
+{
+ g_return_val_if_fail (G_USB_IS_INTERFACE (interface), 0);
+ return interface->priv->iface.iInterface;
+}
+
+/**
+ * g_usb_interface_get_extra:
+ * @interface: a #GUsbInterface
+ *
+ * Gets any extra data from the interface.
+ *
+ * Return value: (transfer none): a #GBytes, or %NULL for failure
+ *
+ * Since: 0.2.8
+ **/
+GBytes *
+g_usb_interface_get_extra (GUsbInterface *interface)
+{
+ g_return_val_if_fail (G_USB_IS_INTERFACE (interface), NULL);
+ return interface->priv->extra;
+}