Add support for filter parameters
The filter parameter provides a mechanism to pass some additional information, needed to configure the I/O stream, back to the caller.
This commit is contained in:
parent
edacbb2f13
commit
57f0ce6d79
@ -456,7 +456,7 @@ dc_bluetooth_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
INFO (abstract->context, "Discover: address=" DC_ADDRESS_FORMAT ", name=%s",
|
INFO (abstract->context, "Discover: address=" DC_ADDRESS_FORMAT ", name=%s",
|
||||||
address, name ? name : "");
|
address, name ? name : "");
|
||||||
|
|
||||||
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_BLUETOOTH, name)) {
|
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_BLUETOOTH, name, NULL)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -34,7 +34,7 @@ typedef struct dc_usb_desc_t {
|
|||||||
} dc_usb_desc_t;
|
} dc_usb_desc_t;
|
||||||
|
|
||||||
int
|
int
|
||||||
dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata);
|
dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata, void *params);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|||||||
@ -36,21 +36,31 @@
|
|||||||
values, \
|
values, \
|
||||||
C_ARRAY_SIZE(values) - isnullterminated, \
|
C_ARRAY_SIZE(values) - isnullterminated, \
|
||||||
C_ARRAY_ITEMSIZE(values), \
|
C_ARRAY_ITEMSIZE(values), \
|
||||||
match)
|
match, \
|
||||||
|
NULL, NULL, 0)
|
||||||
|
|
||||||
|
#define DC_FILTER_INTERNAL_WITH_PARAMS(key, values, isnullterminated, match, params_dst, params_src) \
|
||||||
|
dc_filter_internal( \
|
||||||
|
key, \
|
||||||
|
values, \
|
||||||
|
C_ARRAY_SIZE(values) - isnullterminated, \
|
||||||
|
C_ARRAY_ITEMSIZE(values), \
|
||||||
|
match, \
|
||||||
|
params_dst, params_src, sizeof *(params_src))
|
||||||
|
|
||||||
typedef int (*dc_match_t)(const void *, const void *);
|
typedef int (*dc_match_t)(const void *, const void *);
|
||||||
|
|
||||||
typedef int (*dc_filter_t) (dc_transport_t transport, const void *userdata);
|
typedef int (*dc_filter_t) (dc_transport_t transport, const void *userdata, void *params);
|
||||||
|
|
||||||
static int dc_filter_uwatec (dc_transport_t transport, const void *userdata);
|
static int dc_filter_uwatec (dc_transport_t transport, const void *userdata, void *params);
|
||||||
static int dc_filter_suunto (dc_transport_t transport, const void *userdata);
|
static int dc_filter_suunto (dc_transport_t transport, const void *userdata, void *params);
|
||||||
static int dc_filter_shearwater (dc_transport_t transport, const void *userdata);
|
static int dc_filter_shearwater (dc_transport_t transport, const void *userdata, void *params);
|
||||||
static int dc_filter_hw (dc_transport_t transport, const void *userdata);
|
static int dc_filter_hw (dc_transport_t transport, const void *userdata, void *params);
|
||||||
static int dc_filter_tecdiving (dc_transport_t transport, const void *userdata);
|
static int dc_filter_tecdiving (dc_transport_t transport, const void *userdata, void *params);
|
||||||
static int dc_filter_mares (dc_transport_t transport, const void *userdata);
|
static int dc_filter_mares (dc_transport_t transport, const void *userdata, void *params);
|
||||||
static int dc_filter_divesystem (dc_transport_t transport, const void *userdata);
|
static int dc_filter_divesystem (dc_transport_t transport, const void *userdata, void *params);
|
||||||
static int dc_filter_oceanic (dc_transport_t transport, const void *userdata);
|
static int dc_filter_oceanic (dc_transport_t transport, const void *userdata, void *params);
|
||||||
static int dc_filter_mclean (dc_transport_t transport, const void *userdata);
|
static int dc_filter_mclean (dc_transport_t transport, const void *userdata, void *params);
|
||||||
|
|
||||||
static dc_status_t dc_descriptor_iterator_next (dc_iterator_t *iterator, void *item);
|
static dc_status_t dc_descriptor_iterator_next (dc_iterator_t *iterator, void *item);
|
||||||
|
|
||||||
@ -463,13 +473,16 @@ dc_match_oceanic (const void *key, const void *value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
dc_filter_internal (const void *key, const void *values, size_t count, size_t size, dc_match_t match)
|
dc_filter_internal (const void *key, const void *values, size_t count, size_t size, dc_match_t match, void *params_dst, const void *params_src, size_t params_size)
|
||||||
{
|
{
|
||||||
if (key == NULL)
|
if (key == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (size_t i = 0; i < count; ++i) {
|
for (size_t i = 0; i < count; ++i) {
|
||||||
if (match (key, (const unsigned char *) values + i * size)) {
|
if (match (key, (const unsigned char *) values + i * size)) {
|
||||||
|
if (params_src && params_dst) {
|
||||||
|
memcpy (params_dst, params_src, params_size);
|
||||||
|
}
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -484,7 +497,7 @@ static const char * const rfcomm[] = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static int dc_filter_uwatec (dc_transport_t transport, const void *userdata)
|
static int dc_filter_uwatec (dc_transport_t transport, const void *userdata, void *params)
|
||||||
{
|
{
|
||||||
static const char * const irda[] = {
|
static const char * const irda[] = {
|
||||||
"Aladin Smart Com",
|
"Aladin Smart Com",
|
||||||
@ -519,7 +532,7 @@ static int dc_filter_uwatec (dc_transport_t transport, const void *userdata)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_suunto (dc_transport_t transport, const void *userdata)
|
static int dc_filter_suunto (dc_transport_t transport, const void *userdata, void *params)
|
||||||
{
|
{
|
||||||
static const dc_usb_desc_t usbhid[] = {
|
static const dc_usb_desc_t usbhid[] = {
|
||||||
{0x1493, 0x0030}, // Eon Steel
|
{0x1493, 0x0030}, // Eon Steel
|
||||||
@ -541,7 +554,7 @@ static int dc_filter_suunto (dc_transport_t transport, const void *userdata)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_hw (dc_transport_t transport, const void *userdata)
|
static int dc_filter_hw (dc_transport_t transport, const void *userdata, void *params)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"OSTC",
|
"OSTC",
|
||||||
@ -557,7 +570,7 @@ static int dc_filter_hw (dc_transport_t transport, const void *userdata)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_shearwater (dc_transport_t transport, const void *userdata)
|
static int dc_filter_shearwater (dc_transport_t transport, const void *userdata, void *params)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"Predator",
|
"Predator",
|
||||||
@ -577,7 +590,7 @@ static int dc_filter_shearwater (dc_transport_t transport, const void *userdata)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_tecdiving (dc_transport_t transport, const void *userdata)
|
static int dc_filter_tecdiving (dc_transport_t transport, const void *userdata, void *params)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"DiveComputer",
|
"DiveComputer",
|
||||||
@ -592,7 +605,7 @@ static int dc_filter_tecdiving (dc_transport_t transport, const void *userdata)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_mares (dc_transport_t transport, const void *userdata)
|
static int dc_filter_mares (dc_transport_t transport, const void *userdata, void *params)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"Mares bluelink pro",
|
"Mares bluelink pro",
|
||||||
@ -606,7 +619,7 @@ static int dc_filter_mares (dc_transport_t transport, const void *userdata)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_divesystem (dc_transport_t transport, const void *userdata)
|
static int dc_filter_divesystem (dc_transport_t transport, const void *userdata, void *params)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"DS",
|
"DS",
|
||||||
@ -619,7 +632,7 @@ static int dc_filter_divesystem (dc_transport_t transport, const void *userdata)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_oceanic (dc_transport_t transport, const void *userdata)
|
static int dc_filter_oceanic (dc_transport_t transport, const void *userdata, void *params)
|
||||||
{
|
{
|
||||||
static const unsigned int model[] = {
|
static const unsigned int model[] = {
|
||||||
0x4552, // Oceanic Pro Plus X
|
0x4552, // Oceanic Pro Plus X
|
||||||
@ -641,7 +654,7 @@ static int dc_filter_oceanic (dc_transport_t transport, const void *userdata)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dc_filter_mclean(dc_transport_t transport, const void *userdata)
|
static int dc_filter_mclean(dc_transport_t transport, const void *userdata, void *params)
|
||||||
{
|
{
|
||||||
static const char * const bluetooth[] = {
|
static const char * const bluetooth[] = {
|
||||||
"McLean Extreme",
|
"McLean Extreme",
|
||||||
@ -748,10 +761,10 @@ dc_descriptor_get_transports (dc_descriptor_t *descriptor)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata)
|
dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata, void *params)
|
||||||
{
|
{
|
||||||
if (descriptor == NULL || descriptor->filter == NULL)
|
if (descriptor == NULL || descriptor->filter == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
return descriptor->filter (transport, userdata);
|
return descriptor->filter (transport, userdata, params);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -231,7 +231,7 @@ dc_irda_iterator_new (dc_iterator_t **out, dc_context_t *context, dc_descriptor_
|
|||||||
INFO (context, "Discover: address=%08x, name=%s, charset=%02x, hints=%04x",
|
INFO (context, "Discover: address=%08x, name=%s, charset=%02x, hints=%04x",
|
||||||
address, name, charset, hints);
|
address, name, charset, hints);
|
||||||
|
|
||||||
if (!dc_descriptor_filter (descriptor, DC_TRANSPORT_IRDA, name)) {
|
if (!dc_descriptor_filter (descriptor, DC_TRANSPORT_IRDA, name, NULL)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -230,7 +230,7 @@ dc_serial_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
return DC_STATUS_NOMEMORY;
|
return DC_STATUS_NOMEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_SERIAL, filename)) {
|
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_SERIAL, filename, NULL)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -226,7 +226,7 @@ dc_serial_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
// Null terminate the string.
|
// Null terminate the string.
|
||||||
data[data_len] = 0;
|
data[data_len] = 0;
|
||||||
|
|
||||||
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_SERIAL, data)) {
|
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_SERIAL, data, NULL)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -435,7 +435,7 @@ dc_usbhid_iterator_next (dc_iterator_t *abstract, void *out)
|
|||||||
}
|
}
|
||||||
|
|
||||||
dc_usb_desc_t usb = {dev.idVendor, dev.idProduct};
|
dc_usb_desc_t usb = {dev.idVendor, dev.idProduct};
|
||||||
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_USBHID, &usb)) {
|
if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_USBHID, &usb, NULL)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user