diff --git a/src/bluetooth.c b/src/bluetooth.c index e6fafd5..1889bf7 100644 --- a/src/bluetooth.c +++ b/src/bluetooth.c @@ -456,7 +456,7 @@ dc_bluetooth_iterator_next (dc_iterator_t *abstract, void *out) INFO (abstract->context, "Discover: address=" DC_ADDRESS_FORMAT ", name=%s", 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; } diff --git a/src/descriptor-private.h b/src/descriptor-private.h index 06c2980..eaf7303 100644 --- a/src/descriptor-private.h +++ b/src/descriptor-private.h @@ -34,7 +34,7 @@ typedef struct dc_usb_desc_t { } dc_usb_desc_t; 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 } diff --git a/src/descriptor.c b/src/descriptor.c index 183d3d5..5acab3f 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -36,21 +36,31 @@ values, \ C_ARRAY_SIZE(values) - isnullterminated, \ 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_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_suunto (dc_transport_t transport, const void *userdata); -static int dc_filter_shearwater (dc_transport_t transport, const void *userdata); -static int dc_filter_hw (dc_transport_t transport, const void *userdata); -static int dc_filter_tecdiving (dc_transport_t transport, const void *userdata); -static int dc_filter_mares (dc_transport_t transport, const void *userdata); -static int dc_filter_divesystem (dc_transport_t transport, const void *userdata); -static int dc_filter_oceanic (dc_transport_t transport, const void *userdata); -static int dc_filter_mclean (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, void *params); +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, void *params); +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, void *params); +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, void *params); +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); @@ -463,13 +473,16 @@ dc_match_oceanic (const void *key, const void *value) } 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) return 0; for (size_t i = 0; i < count; ++i) { if (match (key, (const unsigned char *) values + i * size)) { + if (params_src && params_dst) { + memcpy (params_dst, params_src, params_size); + } return 1; } } @@ -484,7 +497,7 @@ static const char * const rfcomm[] = { 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[] = { "Aladin Smart Com", @@ -519,7 +532,7 @@ static int dc_filter_uwatec (dc_transport_t transport, const void *userdata) 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[] = { {0x1493, 0x0030}, // Eon Steel @@ -541,7 +554,7 @@ static int dc_filter_suunto (dc_transport_t transport, const void *userdata) 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[] = { "OSTC", @@ -557,7 +570,7 @@ static int dc_filter_hw (dc_transport_t transport, const void *userdata) 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[] = { "Predator", @@ -577,7 +590,7 @@ static int dc_filter_shearwater (dc_transport_t transport, const void *userdata) 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[] = { "DiveComputer", @@ -592,7 +605,7 @@ static int dc_filter_tecdiving (dc_transport_t transport, const void *userdata) 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[] = { "Mares bluelink pro", @@ -606,7 +619,7 @@ static int dc_filter_mares (dc_transport_t transport, const void *userdata) 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[] = { "DS", @@ -619,7 +632,7 @@ static int dc_filter_divesystem (dc_transport_t transport, const void *userdata) 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[] = { 0x4552, // Oceanic Pro Plus X @@ -641,7 +654,7 @@ static int dc_filter_oceanic (dc_transport_t transport, const void *userdata) 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[] = { "McLean Extreme", @@ -748,10 +761,10 @@ dc_descriptor_get_transports (dc_descriptor_t *descriptor) } 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) return 1; - return descriptor->filter (transport, userdata); + return descriptor->filter (transport, userdata, params); } diff --git a/src/irda.c b/src/irda.c index 89b7e50..448c57c 100644 --- a/src/irda.c +++ b/src/irda.c @@ -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", address, name, charset, hints); - if (!dc_descriptor_filter (descriptor, DC_TRANSPORT_IRDA, name)) { + if (!dc_descriptor_filter (descriptor, DC_TRANSPORT_IRDA, name, NULL)) { continue; } diff --git a/src/serial_posix.c b/src/serial_posix.c index cca501e..4fbcb96 100644 --- a/src/serial_posix.c +++ b/src/serial_posix.c @@ -230,7 +230,7 @@ dc_serial_iterator_next (dc_iterator_t *abstract, void *out) 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; } diff --git a/src/serial_win32.c b/src/serial_win32.c index b51aafd..8427a25 100644 --- a/src/serial_win32.c +++ b/src/serial_win32.c @@ -226,7 +226,7 @@ dc_serial_iterator_next (dc_iterator_t *abstract, void *out) // Null terminate the string. 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; } diff --git a/src/usbhid.c b/src/usbhid.c index 9ed6648..b16bcc3 100644 --- a/src/usbhid.c +++ b/src/usbhid.c @@ -435,7 +435,7 @@ dc_usbhid_iterator_next (dc_iterator_t *abstract, void *out) } 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; }