diff --git a/src/bluetooth.c b/src/bluetooth.c index 282a31a..e6fafd5 100644 --- a/src/bluetooth.c +++ b/src/bluetooth.c @@ -79,7 +79,7 @@ static dc_status_t dc_bluetooth_iterator_free (dc_iterator_t *iterator); typedef struct dc_bluetooth_iterator_t { dc_iterator_t base; - dc_filter_t filter; + dc_descriptor_t *descriptor; #ifdef _WIN32 HANDLE hLookup; #else @@ -376,7 +376,7 @@ dc_bluetooth_iterator_new (dc_iterator_t **out, dc_context_t *context, dc_descri iterator->count = ndevices; iterator->current = 0; #endif - iterator->filter = dc_descriptor_get_filter (descriptor); + iterator->descriptor = descriptor; *out = (dc_iterator_t *) iterator; @@ -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 (iterator->filter && !iterator->filter (DC_TRANSPORT_BLUETOOTH, name)) { + if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_BLUETOOTH, name)) { continue; } diff --git a/src/descriptor-private.h b/src/descriptor-private.h index 5023f7f..06c2980 100644 --- a/src/descriptor-private.h +++ b/src/descriptor-private.h @@ -33,10 +33,8 @@ typedef struct dc_usb_desc_t { unsigned short pid; } dc_usb_desc_t; -typedef int (*dc_filter_t) (dc_transport_t transport, const void *userdata); - -dc_filter_t -dc_descriptor_get_filter (dc_descriptor_t *descriptor); +int +dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata); #ifdef __cplusplus } diff --git a/src/descriptor.c b/src/descriptor.c index 7f2de39..183d3d5 100644 --- a/src/descriptor.c +++ b/src/descriptor.c @@ -40,6 +40,8 @@ typedef int (*dc_match_t)(const void *, const void *); +typedef int (*dc_filter_t) (dc_transport_t transport, const void *userdata); + 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); @@ -745,11 +747,11 @@ dc_descriptor_get_transports (dc_descriptor_t *descriptor) return descriptor->transports; } -dc_filter_t -dc_descriptor_get_filter (dc_descriptor_t *descriptor) +int +dc_descriptor_filter (dc_descriptor_t *descriptor, dc_transport_t transport, const void *userdata) { - if (descriptor == NULL) - return NULL; + if (descriptor == NULL || descriptor->filter == NULL) + return 1; - return descriptor->filter; + return descriptor->filter (transport, userdata); } diff --git a/src/irda.c b/src/irda.c index 214e39f..89b7e50 100644 --- a/src/irda.c +++ b/src/irda.c @@ -212,8 +212,6 @@ dc_irda_iterator_new (dc_iterator_t **out, dc_context_t *context, dc_descriptor_ S_CLOSE (fd); dc_socket_exit (context); - dc_filter_t filter = dc_descriptor_get_filter (descriptor); - unsigned int count = 0; #ifdef _WIN32 for (size_t i = 0; i < list->numDevice; ++i) { @@ -233,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 (filter && !filter (DC_TRANSPORT_IRDA, name)) { + if (!dc_descriptor_filter (descriptor, DC_TRANSPORT_IRDA, name)) { continue; } diff --git a/src/serial_posix.c b/src/serial_posix.c index 897b428..cca501e 100644 --- a/src/serial_posix.c +++ b/src/serial_posix.c @@ -88,7 +88,7 @@ struct dc_serial_device_t { typedef struct dc_serial_iterator_t { dc_iterator_t base; - dc_filter_t filter; + dc_descriptor_t *descriptor; DIR *dp; } dc_serial_iterator_t; @@ -189,7 +189,7 @@ dc_serial_iterator_new (dc_iterator_t **out, dc_context_t *context, dc_descripto goto error_free; } - iterator->filter = dc_descriptor_get_filter (descriptor); + iterator->descriptor = descriptor; *out = (dc_iterator_t *) iterator; @@ -230,7 +230,7 @@ dc_serial_iterator_next (dc_iterator_t *abstract, void *out) return DC_STATUS_NOMEMORY; } - if (iterator->filter && !iterator->filter (DC_TRANSPORT_SERIAL, filename)) { + if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_SERIAL, filename)) { continue; } diff --git a/src/serial_win32.c b/src/serial_win32.c index 3cb10ff..b51aafd 100644 --- a/src/serial_win32.c +++ b/src/serial_win32.c @@ -57,7 +57,7 @@ struct dc_serial_device_t { typedef struct dc_serial_iterator_t { dc_iterator_t base; - dc_filter_t filter; + dc_descriptor_t *descriptor; HKEY hKey; DWORD count; DWORD current; @@ -180,7 +180,7 @@ dc_serial_iterator_new (dc_iterator_t **out, dc_context_t *context, dc_descripto } } - iterator->filter = dc_descriptor_get_filter (descriptor); + iterator->descriptor = descriptor; iterator->hKey = hKey; iterator->count = count; iterator->current = 0; @@ -226,7 +226,7 @@ dc_serial_iterator_next (dc_iterator_t *abstract, void *out) // Null terminate the string. data[data_len] = 0; - if (iterator->filter && !iterator->filter (DC_TRANSPORT_SERIAL, data)) { + if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_SERIAL, data)) { continue; } diff --git a/src/usbhid.c b/src/usbhid.c index e26d42b..9ed6648 100644 --- a/src/usbhid.c +++ b/src/usbhid.c @@ -102,7 +102,7 @@ static dc_status_t dc_usbhid_close (dc_iostream_t *iostream); typedef struct dc_usbhid_iterator_t { dc_iterator_t base; - dc_filter_t filter; + dc_descriptor_t *descriptor; dc_usbhid_session_t *session; #if defined(USE_LIBUSB) struct libusb_device **devices; @@ -398,7 +398,7 @@ dc_usbhid_iterator_new (dc_iterator_t **out, dc_context_t *context, dc_descripto iterator->devices = devices; iterator->current = devices; #endif - iterator->filter = dc_descriptor_get_filter (descriptor); + iterator->descriptor = descriptor; *out = (dc_iterator_t *) iterator; @@ -435,7 +435,7 @@ dc_usbhid_iterator_next (dc_iterator_t *abstract, void *out) } dc_usb_desc_t usb = {dev.idVendor, dev.idProduct}; - if (iterator->filter && !iterator->filter (DC_TRANSPORT_USBHID, &usb)) { + if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_USBHID, &usb)) { continue; } @@ -518,7 +518,7 @@ dc_usbhid_iterator_next (dc_iterator_t *abstract, void *out) iterator->current = current->next; dc_usb_desc_t usb = {current->vendor_id, current->product_id}; - if (iterator->filter && !iterator->filter (DC_TRANSPORT_USBHID, &usb)) { + if (!dc_descriptor_filter (iterator->descriptor, DC_TRANSPORT_USBHID, &usb)) { continue; }