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