From b168c0f953838af09f611333a0e64ea3a6c586b2 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sun, 24 Jun 2012 23:31:49 -0700 Subject: qmimodem: Add support for unregister of individual notifications --- drivers/qmimodem/qmi.c | 32 +++++++++++++++++++++++++++++++- drivers/qmimodem/qmi.h | 1 + 2 files changed, 32 insertions(+), 1 deletion(-) (limited to 'drivers/qmimodem') diff --git a/drivers/qmimodem/qmi.c b/drivers/qmimodem/qmi.c index 24aed4ef..69c38285 100644 --- a/drivers/qmimodem/qmi.c +++ b/drivers/qmimodem/qmi.c @@ -95,7 +95,7 @@ struct qmi_request { }; struct qmi_notify { - unsigned int id; + uint16_t id; uint16_t message; qmi_result_func_t callback; void *user_data; @@ -215,6 +215,14 @@ static void __notify_free(gpointer data, gpointer user_data) g_free(notify); } +static gint __notify_compare(gconstpointer a, gconstpointer b) +{ + const struct qmi_notify *notify = a; + uint16_t id = GPOINTER_TO_UINT(b); + + return notify->id - id; +} + static void __hexdump(const char dir, const unsigned char *buf, size_t len, qmi_debug_func_t function, void *user_data) { @@ -1741,6 +1749,28 @@ uint16_t qmi_service_register(struct qmi_service *service, return notify->id; } +bool qmi_service_unregister(struct qmi_service *service, uint16_t id) +{ + struct qmi_notify *notify; + GList *list; + + if (!service || !id) + return false; + + list = g_list_find_custom(service->notify_list, + GUINT_TO_POINTER(id), __notify_compare); + if (!list) + return false; + + notify = list->data; + + service->notify_list = g_list_delete_link(service->notify_list, list); + + __notify_free(notify, NULL); + + return true; +} + bool qmi_service_unregister_all(struct qmi_service *service) { if (!service) diff --git a/drivers/qmimodem/qmi.h b/drivers/qmimodem/qmi.h index 1bf139cc..40684df8 100644 --- a/drivers/qmimodem/qmi.h +++ b/drivers/qmimodem/qmi.h @@ -144,4 +144,5 @@ bool qmi_service_cancel(struct qmi_service *service, uint16_t tid); uint16_t qmi_service_register(struct qmi_service *service, uint16_t message, qmi_result_func_t func, void *user_data, qmi_destroy_func_t destroy); +bool qmi_service_unregister(struct qmi_service *service, uint16_t id); bool qmi_service_unregister_all(struct qmi_service *service); -- cgit v1.2.3