From 255c6ba0d9e34d517bd17614d12e44573eea62a9 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Mon, 17 Aug 2009 15:14:05 -0500 Subject: [PATCH] Cleanup atom watches properly --- src/call-barring.c | 19 +++++++++++++++---- src/call-forwarding.c | 8 +++++++- src/call-settings.c | 8 +++++++- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/call-barring.c b/src/call-barring.c index 61177a2d..4961bc35 100644 --- a/src/call-barring.c +++ b/src/call-barring.c @@ -61,6 +61,8 @@ struct ofono_call_barring { struct ofono_ussd *ussd; unsigned int incoming_bar_watch; unsigned int outgoing_bar_watch; + unsigned int ssn_watch; + unsigned int ussd_watch; const struct ofono_call_barring_driver *driver; void *driver_data; struct ofono_atom *atom; @@ -1059,7 +1061,7 @@ static void call_barring_unregister(struct ofono_atom *atom) struct ofono_call_barring *cb = __ofono_atom_get_data(atom); const char *path = __ofono_atom_get_path(cb->atom); DBusConnection *conn = ofono_dbus_get_connection(); - struct ofono_modem *modem= __ofono_atom_get_modem(cb->atom); + struct ofono_modem *modem = __ofono_atom_get_modem(cb->atom); ofono_modem_remove_interface(modem, OFONO_CALL_BARRING_INTERFACE); g_dbus_unregister_interface(conn, path, OFONO_CALL_BARRING_INTERFACE); @@ -1071,6 +1073,12 @@ static void call_barring_unregister(struct ofono_atom *atom) __ofono_ssn_mo_watch_remove(cb->ssn, cb->incoming_bar_watch); if (cb->outgoing_bar_watch) __ofono_ssn_mt_watch_remove(cb->ssn, cb->outgoing_bar_watch); + + if (cb->ssn_watch) + __ofono_modem_remove_atom_watch(modem, cb->ssn_watch); + + if (cb->ussd_watch) + __ofono_modem_remove_atom_watch(modem, cb->ussd_watch); } static void call_barring_remove(struct ofono_atom *atom) @@ -1187,15 +1195,18 @@ void ofono_call_barring_register(struct ofono_call_barring *cb) ofono_modem_add_interface(modem, OFONO_CALL_BARRING_INTERFACE); - __ofono_modem_add_atom_watch(modem, OFONO_ATOM_TYPE_SSN, - ssn_watch, cb, NULL); + cb->ssn_watch = __ofono_modem_add_atom_watch(modem, OFONO_ATOM_TYPE_SSN, + ssn_watch, cb, NULL); + ssn_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SSN); if (ssn_atom && __ofono_atom_get_registered(ssn_atom)) ssn_watch(ssn_atom, OFONO_ATOM_WATCH_CONDITION_REGISTERED, cb); - __ofono_modem_add_atom_watch(modem, OFONO_ATOM_TYPE_USSD, + cb->ussd_watch = __ofono_modem_add_atom_watch(modem, + OFONO_ATOM_TYPE_USSD, ussd_watch, cb, NULL); + ussd_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_USSD); if (ussd_atom && __ofono_atom_get_registered(ussd_atom)) diff --git a/src/call-forwarding.c b/src/call-forwarding.c index b5e26360..90f8579f 100644 --- a/src/call-forwarding.c +++ b/src/call-forwarding.c @@ -51,6 +51,7 @@ struct ofono_call_forwarding { int query_end; struct cf_ss_request *ss_req; struct ofono_ussd *ussd; + unsigned int ussd_watch; const struct ofono_call_forwarding_driver *driver; void *driver_data; struct ofono_atom *atom; @@ -1115,6 +1116,9 @@ static void call_forwarding_unregister(struct ofono_atom *atom) if (cf->ussd) cf_unregister_ss_controls(cf); + + if (cf->ussd_watch) + __ofono_modem_remove_atom_watch(modem, cf->ussd_watch); } static void call_forwarding_remove(struct ofono_atom *atom) @@ -1202,8 +1206,10 @@ void ofono_call_forwarding_register(struct ofono_call_forwarding *cf) ofono_modem_add_interface(modem, OFONO_CALL_FORWARDING_INTERFACE); - __ofono_modem_add_atom_watch(modem, OFONO_ATOM_TYPE_USSD, + cf->ussd_watch = __ofono_modem_add_atom_watch(modem, + OFONO_ATOM_TYPE_USSD, ussd_watch, cf, NULL); + ussd_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_USSD); if (ussd_atom && __ofono_atom_get_registered(ussd_atom)) diff --git a/src/call-settings.c b/src/call-settings.c index 249ff508..6928ee2e 100644 --- a/src/call-settings.c +++ b/src/call-settings.c @@ -61,6 +61,7 @@ struct ofono_call_settings { int ss_req_cls; enum call_setting_type ss_setting; struct ofono_ussd *ussd; + unsigned int ussd_watch; const struct ofono_call_settings_driver *driver; void *driver_data; struct ofono_atom *atom; @@ -1178,6 +1179,9 @@ static void call_settings_unregister(struct ofono_atom *atom) if (cs->ussd) cs_unregister_ss_controls(cs); + + if (cs->ussd_watch) + __ofono_modem_remove_atom_watch(modem, cs->ussd_watch); } static void call_settings_remove(struct ofono_atom *atom) @@ -1268,8 +1272,10 @@ void ofono_call_settings_register(struct ofono_call_settings *cs) ofono_modem_add_interface(modem, OFONO_CALL_SETTINGS_INTERFACE); - __ofono_modem_add_atom_watch(modem, OFONO_ATOM_TYPE_USSD, + cs->ussd_watch = __ofono_modem_add_atom_watch(modem, + OFONO_ATOM_TYPE_USSD, ussd_watch, cs, NULL); + ussd_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_USSD); if (ussd_atom && __ofono_atom_get_registered(ussd_atom))