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