mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-14 18:37:17 +00:00
hidclass.sys: Split feature parsing to separate helper.
Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
54936bba46
commit
ef1247d77a
|
@ -406,6 +406,31 @@ static BOOL parse_end_collection( struct hid_parser_state *state )
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL parse_new_value_caps( struct hid_parser_state *state, HIDP_REPORT_TYPE type, struct collection *collection )
|
||||
{
|
||||
struct feature *feature;
|
||||
int j;
|
||||
|
||||
for (j = 0; j < state->items.report_count; j++)
|
||||
{
|
||||
if (!(feature = calloc( 1, sizeof(*feature) ))) return -1;
|
||||
list_add_tail( &collection->features, &feature->entry );
|
||||
feature->type = type;
|
||||
feature->isData = ((state->items.bit_field & INPUT_DATA_CONST) == 0);
|
||||
if (j < state->usages_size) state->items.usage_min = state->usages[j];
|
||||
copy_hidp_value_caps( &feature->caps, &state->items );
|
||||
feature->caps.ReportCount = 1;
|
||||
if (j + 1 >= state->usages_size)
|
||||
{
|
||||
feature->caps.ReportCount += state->items.report_count - (j + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
reset_local_items( state );
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void free_parser_state( struct hid_parser_state *state )
|
||||
{
|
||||
if (state->global_idx) ERR( "%u unpopped device caps on the stack\n", state->global_idx );
|
||||
|
@ -415,19 +440,6 @@ static void free_parser_state( struct hid_parser_state *state )
|
|||
free( state );
|
||||
}
|
||||
|
||||
static void parse_io_feature(unsigned int bSize, int itemVal, int bTag,
|
||||
struct feature *feature)
|
||||
{
|
||||
if (bSize == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
feature->isData = ((itemVal & INPUT_DATA_CONST) == 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void parse_collection(unsigned int bSize, int itemVal,
|
||||
struct collection *collection)
|
||||
{
|
||||
|
@ -447,15 +459,13 @@ static void parse_collection(unsigned int bSize, int itemVal,
|
|||
static int parse_descriptor( BYTE *descriptor, unsigned int index, unsigned int length,
|
||||
struct collection *collection, struct hid_parser_state *state )
|
||||
{
|
||||
int i, j;
|
||||
int i;
|
||||
UINT32 value;
|
||||
INT32 signed_value;
|
||||
struct feature *feature;
|
||||
|
||||
for (i = index; i < length;)
|
||||
{
|
||||
BYTE item = descriptor[i++];
|
||||
BYTE tag = item >> 4;
|
||||
int size = item & 0x03;
|
||||
|
||||
if (size == 3) size = 4;
|
||||
|
@ -482,29 +492,13 @@ static int parse_descriptor( BYTE *descriptor, unsigned int index, unsigned int
|
|||
switch (item & SHORT_ITEM(0xf,0x3))
|
||||
{
|
||||
case SHORT_ITEM(TAG_MAIN_INPUT, TAG_TYPE_MAIN):
|
||||
if (!parse_new_value_caps( state, HidP_Input, collection )) return -1;
|
||||
break;
|
||||
case SHORT_ITEM(TAG_MAIN_OUTPUT, TAG_TYPE_MAIN):
|
||||
if (!parse_new_value_caps( state, HidP_Output, collection )) return -1;
|
||||
break;
|
||||
case SHORT_ITEM(TAG_MAIN_FEATURE, TAG_TYPE_MAIN):
|
||||
for (j = 0; j < state->items.report_count; j++)
|
||||
{
|
||||
if (!(feature = calloc(1, sizeof(*feature)))) return -1;
|
||||
list_add_tail(&collection->features, &feature->entry);
|
||||
if (tag == TAG_MAIN_INPUT)
|
||||
feature->type = HidP_Input;
|
||||
else if (tag == TAG_MAIN_OUTPUT)
|
||||
feature->type = HidP_Output;
|
||||
else
|
||||
feature->type = HidP_Feature;
|
||||
parse_io_feature( size, value, tag, feature );
|
||||
if (j < state->usages_size) state->items.usage_min = state->usages[j];
|
||||
copy_hidp_value_caps( &feature->caps, &state->items );
|
||||
feature->caps.ReportCount = 1;
|
||||
if (j + 1 >= state->usages_size)
|
||||
{
|
||||
feature->caps.ReportCount += state->items.report_count - (j + 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
reset_local_items( state );
|
||||
if (!parse_new_value_caps( state, HidP_Feature, collection )) return -1;
|
||||
break;
|
||||
case SHORT_ITEM(TAG_MAIN_COLLECTION, TAG_TYPE_MAIN):
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue