summaryrefslogtreecommitdiffstats
path: root/drivers/qmimodem
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2012-06-24 23:31:49 -0700
committerMarcel Holtmann <marcel@holtmann.org>2012-06-24 23:31:49 -0700
commitb168c0f953838af09f611333a0e64ea3a6c586b2 (patch)
treea46bfe2b61a0d1c6c06d4f6675f9578ad7bc584e /drivers/qmimodem
parent29067f75bc8a873febe3a8d90edce4ccf4070169 (diff)
downloadofono-b168c0f953838af09f611333a0e64ea3a6c586b2.tar.bz2
qmimodem: Add support for unregister of individual notifications
Diffstat (limited to 'drivers/qmimodem')
-rw-r--r--drivers/qmimodem/qmi.c32
-rw-r--r--drivers/qmimodem/qmi.h1
2 files changed, 32 insertions, 1 deletions
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);