Unregister AT notifiers when removing call-meter at modem driver.
---
 drivers/atmodem/call-meter.c |   55 ++++++++++++++++++++++++++++-------------
 1 files changed, 37 insertions(+), 18 deletions(-)

diff --git a/drivers/atmodem/call-meter.c b/drivers/atmodem/call-meter.c
index 38774d4..f36ff3c 100644
--- a/drivers/atmodem/call-meter.c
+++ b/drivers/atmodem/call-meter.c
@@ -45,6 +45,12 @@ static const char *cacm_prefix[] = { "+CACM:", NULL };
 static const char *camm_prefix[] = { "+CAMM:", NULL };
 static const char *cpuc_prefix[] = { "+CPUC:", NULL };
 
+struct cm_data {
+       GAtChat *chat;
+       guint cccm_id;
+       guint ccwv_id;
+};
+
 static void caoc_cacm_camm_query_cb(gboolean ok,
                GAtResult *result, gpointer user_data)
 {
@@ -113,14 +119,14 @@ static void at_caoc_query(struct ofono_call_meter *cm,
                                ofono_call_meter_query_cb_t cb,
                                void *data)
 {
-       GAtChat *chat = ofono_call_meter_get_data(cm);
+       struct cm_data *cd = ofono_call_meter_get_data(cm);
        struct cb_data *cbd = cb_data_new(cb, data);
 
        if (!cbd)
                goto error;
 
        cbd->user = "+CAOC:";
-       if (g_at_chat_send(chat, "AT+CAOC=0", caoc_prefix,
+       if (g_at_chat_send(cd->chat, "AT+CAOC=0", caoc_prefix,
                                caoc_cacm_camm_query_cb, cbd, g_free) > 0)
                return;
 
@@ -135,14 +141,14 @@ static void at_cacm_query(struct ofono_call_meter *cm,
                                ofono_call_meter_query_cb_t cb,
                                void *data)
 {
-       GAtChat *chat = ofono_call_meter_get_data(cm);
+       struct cm_data *cd = ofono_call_meter_get_data(cm);
        struct cb_data *cbd = cb_data_new(cb, data);
 
        if (!cbd)
                goto error;
 
        cbd->user = "+CACM:";
-       if (g_at_chat_send(chat, "AT+CACM?", cacm_prefix,
+       if (g_at_chat_send(cd->chat, "AT+CACM?", cacm_prefix,
                                caoc_cacm_camm_query_cb, cbd, g_free) > 0)
                return;
 
@@ -167,7 +173,7 @@ static void generic_set_cb(gboolean ok, GAtResult *result, 
gpointer user_data)
 static void at_cacm_set(struct ofono_call_meter *cm, const char *passwd,
                        ofono_call_meter_set_cb_t cb, void *data)
 {
-       GAtChat *chat = ofono_call_meter_get_data(cm);
+       struct cm_data *cd = ofono_call_meter_get_data(cm);
        struct cb_data *cbd = cb_data_new(cb, data);
        char buf[64];
 
@@ -176,7 +182,7 @@ static void at_cacm_set(struct ofono_call_meter *cm, const 
char *passwd,
 
        snprintf(buf, sizeof(buf), "AT+CACM=\"%s\"", passwd);
 
-       if (g_at_chat_send(chat, buf, none_prefix,
+       if (g_at_chat_send(cd->chat, buf, none_prefix,
                                generic_set_cb, cbd, g_free) > 0)
                return;
 
@@ -191,14 +197,14 @@ static void at_camm_query(struct ofono_call_meter *cm,
                                ofono_call_meter_query_cb_t cb,
                                void *data)
 {
-       GAtChat *chat = ofono_call_meter_get_data(cm);
+       struct cm_data *cd = ofono_call_meter_get_data(cm);
        struct cb_data *cbd = cb_data_new(cb, data);
 
        if (!cbd)
                goto error;
 
        cbd->user = "+CAMM:";
-       if (g_at_chat_send(chat, "AT+CAMM?", camm_prefix,
+       if (g_at_chat_send(cd->chat, "AT+CAMM?", camm_prefix,
                                caoc_cacm_camm_query_cb, cbd, g_free) > 0)
                return;
 
@@ -213,7 +219,7 @@ static void at_camm_set(struct ofono_call_meter *cm,
                        int accmax, const char *passwd,
                        ofono_call_meter_set_cb_t cb, void *data)
 {
-       GAtChat *chat = ofono_call_meter_get_data(cm);
+       struct cm_data *cd = ofono_call_meter_get_data(cm);
        struct cb_data *cbd = cb_data_new(cb, data);
        char buf[64];
 
@@ -222,7 +228,7 @@ static void at_camm_set(struct ofono_call_meter *cm,
 
        snprintf(buf, sizeof(buf), "AT+CAMM=\"%06X\",\"%s\"", accmax, passwd);
 
-       if (g_at_chat_send(chat, buf, none_prefix,
+       if (g_at_chat_send(cd->chat, buf, none_prefix,
                                generic_set_cb, cbd, g_free) > 0)
                return;
 
@@ -276,14 +282,14 @@ error:
 static void at_cpuc_query(struct ofono_call_meter *cm,
                                ofono_call_meter_puct_query_cb_t cb, void *data)
 {
-       GAtChat *chat = ofono_call_meter_get_data(cm);
+       struct cm_data *cd = ofono_call_meter_get_data(cm);
        struct cb_data *cbd = cb_data_new(cb, data);
 
        if (!cbd)
                goto error;
 
        cbd->user = "+CPUC:";
-       if (g_at_chat_send(chat, "AT+CPUC?", cpuc_prefix,
+       if (g_at_chat_send(cd->chat, "AT+CPUC?", cpuc_prefix,
                                cpuc_query_cb, cbd, g_free) > 0)
                return;
 
@@ -298,7 +304,7 @@ static void at_cpuc_set(struct ofono_call_meter *cm, const 
char *currency,
                        double ppu, const char *passwd,
                        ofono_call_meter_set_cb_t cb, void *data)
 {
-       GAtChat *chat = ofono_call_meter_get_data(cm);
+       struct cm_data *cd = ofono_call_meter_get_data(cm);
        struct cb_data *cbd = cb_data_new(cb, data);
        char buf[64];
 
@@ -308,7 +314,7 @@ static void at_cpuc_set(struct ofono_call_meter *cm, const 
char *currency,
        snprintf(buf, sizeof(buf), "AT+CPUC=\"%s\",\"%f\",\"%s\"",
                        currency, ppu, passwd);
 
-       if (g_at_chat_send(chat, buf, none_prefix,
+       if (g_at_chat_send(cd->chat, buf, none_prefix,
                                generic_set_cb, cbd, g_free) > 0)
                return;
 
@@ -335,10 +341,12 @@ static void at_call_meter_initialized(gboolean ok, 
GAtResult *result,
                                        gpointer user_data)
 {
        struct ofono_call_meter *cm = user_data;
-       GAtChat *chat = ofono_call_meter_get_data(cm);
+       struct cm_data *cd = ofono_call_meter_get_data(cm);
 
-       g_at_chat_register(chat, "+CCCM:", cccm_notify, FALSE, cm, NULL);
-       g_at_chat_register(chat, "+CCWV", ccwv_notify, FALSE, cm, NULL);
+       cd->cccm_id = g_at_chat_register(cd->chat, "+CCCM:", cccm_notify, FALSE,
+                                               cm, NULL);
+       cd->ccwv_id = g_at_chat_register(cd->chat, "+CCWV", ccwv_notify, FALSE,
+                                               cm, NULL);
 
        ofono_call_meter_register(cm);
 }
@@ -347,8 +355,13 @@ static int at_caoc_probe(struct ofono_call_meter *cm, 
unsigned int vendor,
                                void *data)
 {
        GAtChat *chat = data;
+       struct cm_data *cd;
+
+       cd = g_new0(struct cm_data, 1);
 
-       ofono_call_meter_set_data(cm, chat);
+       cd->chat = chat;
+
+       ofono_call_meter_set_data(cm, cd);
 
        g_at_chat_send(chat, "AT+CAOC=2", NULL, NULL, NULL, NULL);
        g_at_chat_send(chat, "AT+CCWE=1", NULL,
@@ -359,6 +372,12 @@ static int at_caoc_probe(struct ofono_call_meter *cm, 
unsigned int vendor,
 
 static void at_caoc_remove(struct ofono_call_meter *cm)
 {
+       struct cm_data *cd = ofono_call_meter_get_data(cm);
+
+       g_at_chat_unregister(cd->chat, cd->cccm_id);
+       g_at_chat_unregister(cd->chat, cd->ccwv_id);
+
+       g_free(cd);
 }
 
 static struct ofono_call_meter_driver driver = {
-- 
1.7.0.4

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to