[PATCH v3 2/2] winebus.sys: Move hidraw_device code around.
Rémi Bernon
rbernon at codeweavers.com
Mon Sep 27 04:32:48 CDT 2021
To keep lnxev_device functions and related helpers all together.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/winebus.sys/bus_udev.c | 375 ++++++++++++++++++------------------
1 file changed, 186 insertions(+), 189 deletions(-)
diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index fce3a7672d9..909d91667e1 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -215,6 +215,191 @@ static struct base_device *find_device_from_udev(struct udev_device *dev)
return NULL;
}
+static void hidraw_device_destroy(struct unix_device *iface)
+{
+ struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
+
+ udev_device_unref(impl->base.udev_device);
+}
+
+static NTSTATUS hidraw_device_start(struct unix_device *iface)
+{
+ pthread_mutex_lock(&udev_cs);
+ start_polling_device(iface);
+ pthread_mutex_unlock(&udev_cs);
+ return STATUS_SUCCESS;
+}
+
+static void hidraw_device_stop(struct unix_device *iface)
+{
+ struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
+
+ pthread_mutex_lock(&udev_cs);
+ stop_polling_device(iface);
+ list_remove(&impl->base.unix_device.entry);
+ pthread_mutex_unlock(&udev_cs);
+}
+
+static NTSTATUS hidraw_device_get_report_descriptor(struct unix_device *iface, BYTE *buffer,
+ DWORD length, DWORD *out_length)
+{
+#ifdef HAVE_LINUX_HIDRAW_H
+ struct hidraw_report_descriptor descriptor;
+ struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
+
+ if (ioctl(impl->base.device_fd, HIDIOCGRDESCSIZE, &descriptor.size) == -1)
+ {
+ WARN("ioctl(HIDIOCGRDESCSIZE) failed: %d %s\n", errno, strerror(errno));
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ *out_length = descriptor.size;
+
+ if (length < descriptor.size)
+ return STATUS_BUFFER_TOO_SMALL;
+ if (!descriptor.size)
+ return STATUS_SUCCESS;
+
+ if (ioctl(impl->base.device_fd, HIDIOCGRDESC, &descriptor) == -1)
+ {
+ WARN("ioctl(HIDIOCGRDESC) failed: %d %s\n", errno, strerror(errno));
+ return STATUS_UNSUCCESSFUL;
+ }
+
+ memcpy(buffer, descriptor.value, descriptor.size);
+ return STATUS_SUCCESS;
+#else
+ return STATUS_NOT_IMPLEMENTED;
+#endif
+}
+
+static void hidraw_device_read_report(struct unix_device *iface)
+{
+ struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
+ BYTE report_buffer[1024];
+
+ int size = read(impl->base.device_fd, report_buffer, sizeof(report_buffer));
+ if (size == -1)
+ TRACE_(hid_report)("Read failed. Likely an unplugged device %d %s\n", errno, strerror(errno));
+ else if (size == 0)
+ TRACE_(hid_report)("Failed to read report\n");
+ else
+ bus_event_queue_input_report(&event_queue, iface, report_buffer, size);
+}
+
+static void hidraw_device_set_output_report(struct unix_device *iface, HID_XFER_PACKET *packet, IO_STATUS_BLOCK *io)
+{
+ struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
+ ULONG length = packet->reportBufferLen;
+ BYTE buffer[8192];
+ int count = 0;
+
+ if ((buffer[0] = packet->reportId))
+ count = write(impl->base.device_fd, packet->reportBuffer, length);
+ else if (length > sizeof(buffer) - 1)
+ ERR_(hid_report)("id %d length %u >= 8192, cannot write\n", packet->reportId, length);
+ else
+ {
+ memcpy(buffer + 1, packet->reportBuffer, length);
+ count = write(impl->base.device_fd, buffer, length + 1);
+ }
+
+ if (count > 0)
+ {
+ io->Information = count;
+ io->Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ ERR_(hid_report)("id %d write failed error: %d %s\n", packet->reportId, errno, strerror(errno));
+ io->Information = 0;
+ io->Status = STATUS_UNSUCCESSFUL;
+ }
+}
+
+static void hidraw_device_get_feature_report(struct unix_device *iface, HID_XFER_PACKET *packet,
+ IO_STATUS_BLOCK *io)
+{
+#if defined(HAVE_LINUX_HIDRAW_H) && defined(HIDIOCGFEATURE)
+ struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
+ ULONG length = packet->reportBufferLen;
+ BYTE buffer[8192];
+ int count = 0;
+
+ if ((buffer[0] = packet->reportId) && length <= 0x1fff)
+ count = ioctl(impl->base.device_fd, HIDIOCGFEATURE(length), packet->reportBuffer);
+ else if (length > sizeof(buffer) - 1)
+ ERR_(hid_report)("id %d length %u >= 8192, cannot read\n", packet->reportId, length);
+ else
+ {
+ count = ioctl(impl->base.device_fd, HIDIOCGFEATURE(length + 1), buffer);
+ memcpy(packet->reportBuffer, buffer + 1, length);
+ }
+
+ if (count > 0)
+ {
+ io->Information = count;
+ io->Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ ERR_(hid_report)("id %d read failed, error: %d %s\n", packet->reportId, errno, strerror(errno));
+ io->Information = 0;
+ io->Status = STATUS_UNSUCCESSFUL;
+ }
+#else
+ io->Information = 0;
+ io->Status = STATUS_NOT_IMPLEMENTED;
+#endif
+}
+
+static void hidraw_device_set_feature_report(struct unix_device *iface, HID_XFER_PACKET *packet,
+ IO_STATUS_BLOCK *io)
+{
+#if defined(HAVE_LINUX_HIDRAW_H) && defined(HIDIOCSFEATURE)
+ struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
+ ULONG length = packet->reportBufferLen;
+ BYTE buffer[8192];
+ int count = 0;
+
+ if ((buffer[0] = packet->reportId) && length <= 0x1fff)
+ count = ioctl(impl->base.device_fd, HIDIOCSFEATURE(length), packet->reportBuffer);
+ else if (length > sizeof(buffer) - 1)
+ ERR_(hid_report)("id %d length %u >= 8192, cannot write\n", packet->reportId, length);
+ else
+ {
+ memcpy(buffer + 1, packet->reportBuffer, length);
+ count = ioctl(impl->base.device_fd, HIDIOCSFEATURE(length + 1), buffer);
+ }
+
+ if (count > 0)
+ {
+ io->Information = count;
+ io->Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ ERR_(hid_report)("id %d write failed, error: %d %s\n", packet->reportId, errno, strerror(errno));
+ io->Information = 0;
+ io->Status = STATUS_UNSUCCESSFUL;
+ }
+#else
+ io->Information = 0;
+ io->Status = STATUS_NOT_IMPLEMENTED;
+#endif
+}
+
+static const struct raw_device_vtbl hidraw_device_vtbl =
+{
+ hidraw_device_destroy,
+ hidraw_device_start,
+ hidraw_device_stop,
+ hidraw_device_get_report_descriptor,
+ hidraw_device_set_output_report,
+ hidraw_device_get_feature_report,
+ hidraw_device_set_feature_report,
+};
+
#ifdef HAS_PROPER_INPUT_HEADER
static const char *get_device_syspath(struct udev_device *dev)
@@ -529,194 +714,6 @@ static BOOL set_report_from_event(struct unix_device *iface, struct input_event
return FALSE;
}
}
-#endif
-
-static void hidraw_device_destroy(struct unix_device *iface)
-{
- struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
-
- udev_device_unref(impl->base.udev_device);
-}
-
-static NTSTATUS hidraw_device_start(struct unix_device *iface)
-{
- pthread_mutex_lock(&udev_cs);
- start_polling_device(iface);
- pthread_mutex_unlock(&udev_cs);
- return STATUS_SUCCESS;
-}
-
-static void hidraw_device_stop(struct unix_device *iface)
-{
- struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
-
- pthread_mutex_lock(&udev_cs);
- stop_polling_device(iface);
- list_remove(&impl->base.unix_device.entry);
- pthread_mutex_unlock(&udev_cs);
-}
-
-static NTSTATUS hidraw_device_get_report_descriptor(struct unix_device *iface, BYTE *buffer,
- DWORD length, DWORD *out_length)
-{
-#ifdef HAVE_LINUX_HIDRAW_H
- struct hidraw_report_descriptor descriptor;
- struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
-
- if (ioctl(impl->base.device_fd, HIDIOCGRDESCSIZE, &descriptor.size) == -1)
- {
- WARN("ioctl(HIDIOCGRDESCSIZE) failed: %d %s\n", errno, strerror(errno));
- return STATUS_UNSUCCESSFUL;
- }
-
- *out_length = descriptor.size;
-
- if (length < descriptor.size)
- return STATUS_BUFFER_TOO_SMALL;
- if (!descriptor.size)
- return STATUS_SUCCESS;
-
- if (ioctl(impl->base.device_fd, HIDIOCGRDESC, &descriptor) == -1)
- {
- WARN("ioctl(HIDIOCGRDESC) failed: %d %s\n", errno, strerror(errno));
- return STATUS_UNSUCCESSFUL;
- }
-
- memcpy(buffer, descriptor.value, descriptor.size);
- return STATUS_SUCCESS;
-#else
- return STATUS_NOT_IMPLEMENTED;
-#endif
-}
-
-static void hidraw_device_read_report(struct unix_device *iface)
-{
- struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
- BYTE report_buffer[1024];
-
- int size = read(impl->base.device_fd, report_buffer, sizeof(report_buffer));
- if (size == -1)
- TRACE_(hid_report)("Read failed. Likely an unplugged device %d %s\n", errno, strerror(errno));
- else if (size == 0)
- TRACE_(hid_report)("Failed to read report\n");
- else
- bus_event_queue_input_report(&event_queue, iface, report_buffer, size);
-}
-
-static void hidraw_device_set_output_report(struct unix_device *iface, HID_XFER_PACKET *packet, IO_STATUS_BLOCK *io)
-{
- struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
- ULONG length = packet->reportBufferLen;
- BYTE buffer[8192];
- int count = 0;
-
- if ((buffer[0] = packet->reportId))
- count = write(impl->base.device_fd, packet->reportBuffer, length);
- else if (length > sizeof(buffer) - 1)
- ERR_(hid_report)("id %d length %u >= 8192, cannot write\n", packet->reportId, length);
- else
- {
- memcpy(buffer + 1, packet->reportBuffer, length);
- count = write(impl->base.device_fd, buffer, length + 1);
- }
-
- if (count > 0)
- {
- io->Information = count;
- io->Status = STATUS_SUCCESS;
- }
- else
- {
- ERR_(hid_report)("id %d write failed error: %d %s\n", packet->reportId, errno, strerror(errno));
- io->Information = 0;
- io->Status = STATUS_UNSUCCESSFUL;
- }
-}
-
-static void hidraw_device_get_feature_report(struct unix_device *iface, HID_XFER_PACKET *packet,
- IO_STATUS_BLOCK *io)
-{
-#if defined(HAVE_LINUX_HIDRAW_H) && defined(HIDIOCGFEATURE)
- struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
- ULONG length = packet->reportBufferLen;
- BYTE buffer[8192];
- int count = 0;
-
- if ((buffer[0] = packet->reportId) && length <= 0x1fff)
- count = ioctl(impl->base.device_fd, HIDIOCGFEATURE(length), packet->reportBuffer);
- else if (length > sizeof(buffer) - 1)
- ERR_(hid_report)("id %d length %u >= 8192, cannot read\n", packet->reportId, length);
- else
- {
- count = ioctl(impl->base.device_fd, HIDIOCGFEATURE(length + 1), buffer);
- memcpy(packet->reportBuffer, buffer + 1, length);
- }
-
- if (count > 0)
- {
- io->Information = count;
- io->Status = STATUS_SUCCESS;
- }
- else
- {
- ERR_(hid_report)("id %d read failed, error: %d %s\n", packet->reportId, errno, strerror(errno));
- io->Information = 0;
- io->Status = STATUS_UNSUCCESSFUL;
- }
-#else
- io->Information = 0;
- io->Status = STATUS_NOT_IMPLEMENTED;
-#endif
-}
-
-static void hidraw_device_set_feature_report(struct unix_device *iface, HID_XFER_PACKET *packet,
- IO_STATUS_BLOCK *io)
-{
-#if defined(HAVE_LINUX_HIDRAW_H) && defined(HIDIOCSFEATURE)
- struct hidraw_device *impl = hidraw_impl_from_unix_device(iface);
- ULONG length = packet->reportBufferLen;
- BYTE buffer[8192];
- int count = 0;
-
- if ((buffer[0] = packet->reportId) && length <= 0x1fff)
- count = ioctl(impl->base.device_fd, HIDIOCSFEATURE(length), packet->reportBuffer);
- else if (length > sizeof(buffer) - 1)
- ERR_(hid_report)("id %d length %u >= 8192, cannot write\n", packet->reportId, length);
- else
- {
- memcpy(buffer + 1, packet->reportBuffer, length);
- count = ioctl(impl->base.device_fd, HIDIOCSFEATURE(length + 1), buffer);
- }
-
- if (count > 0)
- {
- io->Information = count;
- io->Status = STATUS_SUCCESS;
- }
- else
- {
- ERR_(hid_report)("id %d write failed, error: %d %s\n", packet->reportId, errno, strerror(errno));
- io->Information = 0;
- io->Status = STATUS_UNSUCCESSFUL;
- }
-#else
- io->Information = 0;
- io->Status = STATUS_NOT_IMPLEMENTED;
-#endif
-}
-
-static const struct raw_device_vtbl hidraw_device_vtbl =
-{
- hidraw_device_destroy,
- hidraw_device_start,
- hidraw_device_stop,
- hidraw_device_get_report_descriptor,
- hidraw_device_set_output_report,
- hidraw_device_get_feature_report,
- hidraw_device_set_feature_report,
-};
-
-#ifdef HAS_PROPER_INPUT_HEADER
static void lnxev_device_destroy(struct unix_device *iface)
{
@@ -812,7 +809,7 @@ static const struct hid_device_vtbl lnxev_device_vtbl =
lnxev_device_stop,
lnxev_device_haptics_start,
};
-#endif
+#endif /* HAS_PROPER_INPUT_HEADER */
static void get_device_subsystem_info(struct udev_device *dev, char const *subsystem, struct device_desc *desc)
{
--
2.33.0
More information about the wine-devel
mailing list