[PATCH 4/6] hidclass.sys: Use HIDP_VALUE_CAPS instead of struct caps.
Rémi Bernon
rbernon at codeweavers.com
Mon Jun 7 04:06:59 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/hidclass.sys/descriptor.c | 160 +++++++--------------------------
1 file changed, 31 insertions(+), 129 deletions(-)
diff --git a/dlls/hidclass.sys/descriptor.c b/dlls/hidclass.sys/descriptor.c
index ec559f67f5f..869d1dc1a85 100644
--- a/dlls/hidclass.sys/descriptor.c
+++ b/dlls/hidclass.sys/descriptor.c
@@ -89,44 +89,9 @@ enum {
static const char* const feature_string[] =
{ "Input", "Output", "Feature" };
-struct caps {
- USAGE UsagePage;
- LONG LogicalMin;
- LONG LogicalMax;
- LONG PhysicalMin;
- LONG PhysicalMax;
- ULONG UnitsExp;
- ULONG Units;
- USHORT BitSize;
- UCHAR ReportID;
- USHORT ReportCount;
-
- BOOLEAN IsRange;
- BOOLEAN IsStringRange;
- BOOLEAN IsDesignatorRange;
- union {
- struct {
- USAGE UsageMin;
- USAGE UsageMax;
- USHORT StringMin;
- USHORT StringMax;
- USHORT DesignatorMin;
- USHORT DesignatorMax;
- } Range;
- struct {
- USHORT Usage;
- USAGE Reserved1;
- USHORT StringIndex;
- USHORT Reserved2;
- USHORT DesignatorIndex;
- USHORT Reserved3;
- } NotRange;
- } DUMMYUNIONNAME;
-};
-
struct feature {
struct list entry;
- struct caps caps;
+ HIDP_VALUE_CAPS caps;
HIDP_REPORT_TYPE type;
BOOLEAN isData;
@@ -155,7 +120,7 @@ static const char* const collection_string[] = {
struct collection {
struct list entry;
- struct caps caps;
+ HIDP_VALUE_CAPS caps;
unsigned int index;
unsigned int type;
struct collection *parent;
@@ -165,10 +130,10 @@ struct collection {
struct caps_stack {
struct list entry;
- struct caps caps;
+ HIDP_VALUE_CAPS caps;
};
-static const char* debugstr_usages(struct caps *caps)
+static const char* debugstr_usages(HIDP_VALUE_CAPS *caps)
{
if (!caps->IsRange)
return wine_dbg_sprintf("[0x%x]", caps->NotRange.Usage);
@@ -176,7 +141,7 @@ static const char* debugstr_usages(struct caps *caps)
return wine_dbg_sprintf("[0x%x - 0x%x]", caps->Range.UsageMin, caps->Range.UsageMax);
}
-static const char* debugstr_stringindex(struct caps *caps)
+static const char* debugstr_stringindex(HIDP_VALUE_CAPS *caps)
{
if (!caps->IsStringRange)
return wine_dbg_sprintf("%i", caps->NotRange.StringIndex);
@@ -184,7 +149,7 @@ static const char* debugstr_stringindex(struct caps *caps)
return wine_dbg_sprintf("[%i - %i]", caps->Range.StringMin, caps->Range.StringMax);
}
-static const char* debugstr_designatorindex(struct caps *caps)
+static const char* debugstr_designatorindex(HIDP_VALUE_CAPS *caps)
{
if (!caps->IsDesignatorRange)
return wine_dbg_sprintf("%i", caps->NotRange.DesignatorIndex);
@@ -192,7 +157,7 @@ static const char* debugstr_designatorindex(struct caps *caps)
return wine_dbg_sprintf("[%i - %i]", caps->Range.DesignatorMin, caps->Range.DesignatorMax);
}
-static void debugstr_caps(const char* type, struct caps *caps)
+static void debugstr_caps(const char* type, HIDP_VALUE_CAPS *caps)
{
if (!caps)
return;
@@ -446,7 +411,7 @@ static void parse_collection(unsigned int bSize, int itemVal,
}
}
-static void new_caps(struct caps *caps)
+static void new_caps(HIDP_VALUE_CAPS *caps)
{
caps->IsRange = 0;
caps->IsStringRange = 0;
@@ -456,7 +421,7 @@ static void new_caps(struct caps *caps)
static int parse_descriptor(BYTE *descriptor, unsigned int index, unsigned int length,
unsigned int *feature_index, unsigned int *collection_index,
- struct collection *collection, struct caps *caps,
+ struct collection *collection, HIDP_VALUE_CAPS *caps,
struct list *stack)
{
int usages_top = 0;
@@ -701,6 +666,7 @@ static void build_elements(WINE_HID_REPORT *wine_report, WINE_HID_ELEMENT *elems
struct feature* feature, USHORT *data_index)
{
WINE_HID_ELEMENT *wine_element = elems + wine_report->elementIdx + wine_report->elementCount;
+ ULONG index_count;
if (!feature->isData)
{
@@ -713,95 +679,31 @@ static void build_elements(WINE_HID_REPORT *wine_report, WINE_HID_ELEMENT *elems
wine_element->bitCount = (feature->caps.BitSize * feature->caps.ReportCount);
wine_report->bitSize += wine_element->bitCount;
- if (feature->caps.BitSize == 1)
+ wine_element->caps = feature->caps;
+ wine_element->caps.BitField = feature->BitField;
+ wine_element->caps.LinkCollection = feature->collection->index;
+ wine_element->caps.LinkUsage = feature->collection->caps.NotRange.Usage;
+ wine_element->caps.LinkUsagePage = feature->collection->caps.UsagePage;
+ wine_element->caps.IsAbsolute = feature->IsAbsolute;
+ wine_element->caps.HasNull = feature->HasNull;
+
+ if (wine_element->caps.IsRange)
{
- wine_element->ElementType = ButtonElement;
- wine_element->caps.UsagePage = feature->caps.UsagePage;
- wine_element->caps.ReportID = feature->caps.ReportID;
- wine_element->caps.BitField = feature->BitField;
- wine_element->caps.LinkCollection = feature->collection->index;
- wine_element->caps.LinkUsage = feature->collection->caps.NotRange.Usage;
- wine_element->caps.LinkUsagePage = feature->collection->caps.UsagePage;
- wine_element->caps.IsRange = feature->caps.IsRange;
- wine_element->caps.IsStringRange = feature->caps.IsStringRange;
- wine_element->caps.IsDesignatorRange = feature->caps.IsDesignatorRange;
- wine_element->caps.IsAbsolute = feature->IsAbsolute;
- if (wine_element->caps.IsRange)
- {
- wine_element->caps.Range.UsageMin = feature->caps.Range.UsageMin;
- wine_element->caps.Range.UsageMax = feature->caps.Range.UsageMax;
- wine_element->caps.Range.StringMin = feature->caps.Range.StringMin;
- wine_element->caps.Range.StringMax = feature->caps.Range.StringMax;
- wine_element->caps.Range.DesignatorMin = feature->caps.Range.DesignatorMin;
- wine_element->caps.Range.DesignatorMax = feature->caps.Range.DesignatorMax;
- wine_element->caps.Range.DataIndexMin = *data_index;
- wine_element->caps.Range.DataIndexMax = *data_index + wine_element->bitCount - 1;
- *data_index = *data_index + wine_element->bitCount;
- }
- else
- {
- wine_element->caps.NotRange.Usage = feature->caps.NotRange.Usage;
- wine_element->caps.NotRange.Reserved1 = feature->caps.NotRange.Usage;
- wine_element->caps.NotRange.StringIndex = feature->caps.NotRange.StringIndex;
- wine_element->caps.NotRange.Reserved2 = feature->caps.NotRange.StringIndex;
- wine_element->caps.NotRange.DesignatorIndex = feature->caps.NotRange.DesignatorIndex;
- wine_element->caps.NotRange.Reserved3 = feature->caps.NotRange.DesignatorIndex;
- wine_element->caps.NotRange.DataIndex = *data_index;
- wine_element->caps.NotRange.Reserved4 = *data_index;
- *data_index = *data_index + 1;
- }
+ if (wine_element->caps.BitSize == 1) index_count = wine_element->bitCount - 1;
+ else index_count = wine_element->caps.Range.UsageMax - wine_element->caps.Range.UsageMin;
+ wine_element->caps.Range.DataIndexMin = *data_index;
+ wine_element->caps.Range.DataIndexMax = *data_index + index_count;
+ *data_index = *data_index + index_count + 1;
}
else
{
- wine_element->ElementType = ValueElement;
- wine_element->caps.UsagePage = feature->caps.UsagePage;
- wine_element->caps.ReportID = feature->caps.ReportID;
- wine_element->caps.BitField = feature->BitField;
- wine_element->caps.LinkCollection = feature->collection->index;
- wine_element->caps.LinkUsage = feature->collection->caps.NotRange.Usage;
- wine_element->caps.LinkUsagePage = feature->collection->caps.UsagePage;
- wine_element->caps.IsRange = feature->caps.IsRange;
- wine_element->caps.IsStringRange = feature->caps.IsStringRange;
- wine_element->caps.IsDesignatorRange = feature->caps.IsDesignatorRange;
- wine_element->caps.IsAbsolute = feature->IsAbsolute;
- wine_element->caps.HasNull = feature->HasNull;
- wine_element->caps.BitSize = feature->caps.BitSize;
- wine_element->caps.ReportCount = feature->caps.ReportCount;
- wine_element->caps.UnitsExp = feature->caps.UnitsExp;
- wine_element->caps.Units = feature->caps.Units;
- wine_element->caps.LogicalMin = feature->caps.LogicalMin;
- wine_element->caps.LogicalMax = feature->caps.LogicalMax;
- wine_element->caps.PhysicalMin = feature->caps.PhysicalMin;
- wine_element->caps.PhysicalMax = feature->caps.PhysicalMax;
- if (wine_element->caps.IsRange)
- {
- wine_element->caps.Range.UsageMin = feature->caps.Range.UsageMin;
- wine_element->caps.Range.UsageMax = feature->caps.Range.UsageMax;
- wine_element->caps.Range.StringMin = feature->caps.Range.StringMin;
- wine_element->caps.Range.StringMax = feature->caps.Range.StringMax;
- wine_element->caps.Range.DesignatorMin = feature->caps.Range.DesignatorMin;
- wine_element->caps.Range.DesignatorMax = feature->caps.Range.DesignatorMax;
- wine_element->caps.Range.DataIndexMin = *data_index;
- wine_element->caps.Range.DataIndexMax = *data_index +
- (wine_element->caps.Range.UsageMax -
- wine_element->caps.Range.UsageMin);
- *data_index = *data_index +
- (wine_element->caps.Range.UsageMax -
- wine_element->caps.Range.UsageMin) + 1;
- }
- else
- {
- wine_element->caps.NotRange.Usage = feature->caps.NotRange.Usage;
- wine_element->caps.NotRange.Reserved1 = feature->caps.NotRange.Usage;
- wine_element->caps.NotRange.StringIndex = feature->caps.NotRange.StringIndex;
- wine_element->caps.NotRange.Reserved2 = feature->caps.NotRange.StringIndex;
- wine_element->caps.NotRange.DesignatorIndex = feature->caps.NotRange.DesignatorIndex;
- wine_element->caps.NotRange.Reserved3 = feature->caps.NotRange.DesignatorIndex;
- wine_element->caps.NotRange.DataIndex = *data_index;
- wine_element->caps.NotRange.Reserved4 = *data_index;
- *data_index = *data_index + 1;
- }
+ wine_element->caps.NotRange.DataIndex = *data_index;
+ wine_element->caps.NotRange.Reserved4 = *data_index;
+ *data_index = *data_index + 1;
}
+
+ if (feature->caps.BitSize == 1) wine_element->ElementType = ButtonElement;
+ else wine_element->ElementType = ValueElement;
wine_report->elementCount++;
}
@@ -973,7 +875,7 @@ WINE_HIDP_PREPARSED_DATA* ParseDescriptor(BYTE *descriptor, unsigned int length)
{
WINE_HIDP_PREPARSED_DATA *data = NULL;
struct collection *base;
- struct caps caps;
+ HIDP_VALUE_CAPS caps;
struct list caps_stack;
--
2.31.0
More information about the wine-devel
mailing list