Disable direct access to the filter function
Replace the small helper function to retrieve the function pointer and then call the function, with another helper function to call the filter function directly. This way the function pointer doesn't need to be exposed at all.
This commit is contained in:
parent
6986840c0d
commit
edacbb2f13
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user