summaryrefslogtreecommitdiffstats
path: root/lib/libusbhid/parse.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2012-09-20 18:56:27 +0000
committermav <mav@FreeBSD.org>2012-09-20 18:56:27 +0000
commit3a2b0e2811fa295dd198978ef2dcb53b37c2570d (patch)
treec4bb13c59030ccd9fce54c69846a554e23212d84 /lib/libusbhid/parse.c
parent4e994ee0cd8c584f856f8ce211add093547f82b3 (diff)
downloadFreeBSD-src-3a2b0e2811fa295dd198978ef2dcb53b37c2570d.zip
FreeBSD-src-3a2b0e2811fa295dd198978ef2dcb53b37c2570d.tar.gz
Restore handling of the third argument (id) of hid_start_parse(), same as
it is done in NetBSD/OpenBSD, and as it was here before r205728. I personally think this API or its implementation is incorrect, as it is not correct to filter collections based on report ID, as they are orthogonal in general case, but I see no harm from supporting this feature. PR: usb/171810 Submitted by: Vitaly Magerya <vmagerya@gmail.com> MFC after: 1 month
Diffstat (limited to 'lib/libusbhid/parse.c')
-rw-r--r--lib/libusbhid/parse.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/libusbhid/parse.c b/lib/libusbhid/parse.c
index 041e289..7a2b3f4 100644
--- a/lib/libusbhid/parse.c
+++ b/lib/libusbhid/parse.c
@@ -70,6 +70,7 @@ struct hid_data {
uint8_t iusage; /* current "usages_min/max" index */
uint8_t ousage; /* current "usages_min/max" offset */
uint8_t susage; /* usage set flags */
+ int32_t reportid; /* requested report ID */
};
/*------------------------------------------------------------------------*
@@ -149,7 +150,7 @@ hid_switch_rid(struct hid_data *s, struct hid_item *c, int32_t next_rID)
* hid_start_parse
*------------------------------------------------------------------------*/
hid_data_t
-hid_start_parse(report_desc_t d, int kindset, int id __unused)
+hid_start_parse(report_desc_t d, int kindset, int id)
{
struct hid_data *s;
@@ -158,6 +159,7 @@ hid_start_parse(report_desc_t d, int kindset, int id __unused)
s->start = s->p = d->data;
s->end = d->data + d->size;
s->kindset = kindset;
+ s->reportid = id;
return (s);
}
@@ -207,8 +209,8 @@ hid_get_byte(struct hid_data *s, const uint16_t wSize)
/*------------------------------------------------------------------------*
* hid_get_item
*------------------------------------------------------------------------*/
-int
-hid_get_item(hid_data_t s, hid_item_t *h)
+static int
+hid_get_item_raw(hid_data_t s, hid_item_t *h)
{
hid_item_t *c;
unsigned int bTag, bType, bSize;
@@ -509,6 +511,19 @@ hid_get_item(hid_data_t s, hid_item_t *h)
}
int
+hid_get_item(hid_data_t s, hid_item_t *h)
+{
+ int r;
+
+ for (;;) {
+ r = hid_get_item_raw(s, h);
+ if (r <= 0 || s->reportid == -1 || h->report_ID == s->reportid)
+ break;
+ }
+ return (r);
+}
+
+int
hid_report_size(report_desc_t r, enum hid_kind k, int id)
{
struct hid_data *d;
@@ -523,7 +538,7 @@ hid_report_size(report_desc_t r, enum hid_kind k, int id)
memset(&h, 0, sizeof h);
for (d = hid_start_parse(r, 1 << k, id); hid_get_item(d, &h); ) {
- if ((h.report_ID == id || id < 0) && h.kind == k) {
+ if (h.kind == k) {
/* compute minimum */
if (lpos > h.pos)
lpos = h.pos;
OpenPOWER on IntegriCloud