It less error prone to have hfp_slc_info allocated dynamically than having it allocated statically, as it makes the verification that it was already de-allocated more direct. --- drivers/hfpmodem/slc.c | 9 ++++++++- drivers/hfpmodem/slc.h | 3 ++- plugins/hfp_hf_bluez4.c | 35 ++++++++++++++++++----------------- plugins/phonesim.c | 4 ++-- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/drivers/hfpmodem/slc.c b/drivers/hfpmodem/slc.c index 646befa..825b8a9 100644 --- a/drivers/hfpmodem/slc.c +++ b/drivers/hfpmodem/slc.c @@ -52,8 +52,13 @@ struct slc_establish_data { gpointer userdata; }; -void hfp_slc_info_init(struct hfp_slc_info *info, guint16 version) +struct hfp_slc_info *hfp_slc_info_init(GAtChat *chat, guint16 version) { + struct hfp_slc_info *info; + + info = g_new0(struct hfp_slc_info, 1); + info->chat = g_at_chat_ref(chat); + info->ag_features = 0; info->ag_mpty_features = 0; @@ -75,6 +80,8 @@ void hfp_slc_info_init(struct hfp_slc_info *info, guint16 version) done: memset(info->cind_val, 0, sizeof(info->cind_val)); memset(info->cind_pos, 0, sizeof(info->cind_pos)); + + return info; } static void slc_establish_data_unref(gpointer userdata) diff --git a/drivers/hfpmodem/slc.h b/drivers/hfpmodem/slc.h index b71ffe9..8ae8d2f 100644 --- a/drivers/hfpmodem/slc.h +++ b/drivers/hfpmodem/slc.h @@ -55,7 +55,8 @@ struct hfp_slc_info { unsigned int cind_val[HFP_INDICATOR_LAST]; }; -void hfp_slc_info_init(struct hfp_slc_info *info, guint16 version); +struct hfp_slc_info *hfp_slc_info_init(GAtChat *chat, guint16 version); + void hfp_slc_info_free(struct hfp_slc_info *info); void hfp_slc_establish(struct hfp_slc_info *info, hfp_slc_cb_t connect_cb, diff --git a/plugins/hfp_hf_bluez4.c b/plugins/hfp_hf_bluez4.c index 450c183..b0aa1aa 100644 --- a/plugins/hfp_hf_bluez4.c +++ b/plugins/hfp_hf_bluez4.c @@ -62,7 +62,7 @@ static DBusConnection *connection; static GHashTable *modem_hash = NULL; struct hfp_data { - struct hfp_slc_info info; + struct hfp_slc_info *info; char *handsfree_path; char *handsfree_address; DBusMessage *slc_msg; @@ -109,8 +109,8 @@ static void slc_failed(gpointer userdata) ofono_error("Service level connection failed"); ofono_modem_set_powered(modem, FALSE); - g_at_chat_unref(data->info.chat); - data->info.chat = NULL; + g_at_chat_unref(data->info->chat); + data->info->chat = NULL; } static void hfp_disconnected_cb(gpointer user_data) @@ -120,12 +120,13 @@ static void hfp_disconnected_cb(gpointer user_data) ofono_modem_set_powered(modem, FALSE); - g_at_chat_unref(data->info.chat); - data->info.chat = NULL; + g_at_chat_unref(data->info->chat); + data->info->chat = NULL; } /* either oFono or Phone could request SLC connection */ -static int service_level_connection(struct ofono_modem *modem, int fd) +static int service_level_connection(struct ofono_modem *modem, int fd, + guint16 version) { struct hfp_data *data = ofono_modem_get_data(modem); GIOChannel *io; @@ -152,8 +153,10 @@ static int service_level_connection(struct ofono_modem *modem, int fd) if (getenv("OFONO_AT_DEBUG")) g_at_chat_set_debug(chat, hfp_debug, ""); - data->info.chat = chat; - hfp_slc_establish(&data->info, slc_established, slc_failed, modem); + data->info = hfp_slc_info_init(chat, version); + g_at_chat_unref(chat); + + hfp_slc_establish(data->info, slc_established, slc_failed, modem); return -EINPROGRESS; } @@ -170,9 +173,7 @@ static DBusMessage *hfp_agent_new_connection(DBusConnection *conn, DBUS_TYPE_UINT16, &version, DBUS_TYPE_INVALID)) return __ofono_error_invalid_args(msg); - hfp_slc_info_init(&hfp_data->info, version); - - err = service_level_connection(modem, fd); + err = service_level_connection(modem, fd, version); if (err < 0 && err != -EINPROGRESS) return __ofono_error_failed(msg); @@ -462,8 +463,8 @@ static int hfp_disable(struct ofono_modem *modem) DBG("%p", modem); - g_at_chat_unref(data->info.chat); - data->info.chat = NULL; + g_at_chat_unref(data->info->chat); + data->info->chat = NULL; if (data->agent_registered) { status = bluetooth_send_with_reply(data->handsfree_path, @@ -486,10 +487,10 @@ static void hfp_pre_sim(struct ofono_modem *modem) DBG("%p", modem); ofono_devinfo_create(modem, 0, "hfpmodem", data->handsfree_address); - ofono_voicecall_create(modem, 0, "hfpmodem", &data->info); - ofono_netreg_create(modem, 0, "hfpmodem", &data->info); - ofono_call_volume_create(modem, 0, "hfpmodem", &data->info); - ofono_handsfree_create(modem, 0, "hfpmodem", &data->info); + ofono_voicecall_create(modem, 0, "hfpmodem", data->info); + ofono_netreg_create(modem, 0, "hfpmodem", data->info); + ofono_call_volume_create(modem, 0, "hfpmodem", data->info); + ofono_handsfree_create(modem, 0, "hfpmodem", data->info); } static void hfp_post_sim(struct ofono_modem *modem) diff --git a/plugins/phonesim.c b/plugins/phonesim.c index 26f96d0..9210e02 100644 --- a/plugins/phonesim.c +++ b/plugins/phonesim.c @@ -929,8 +929,8 @@ static int localhfp_enable(struct ofono_modem *modem) g_at_chat_set_disconnect_function(chat, slc_failed, modem); - hfp_slc_info_init(info, HFP_VERSION_LATEST); - info->chat = chat; + info = hfp_slc_info_init(chat, HFP_VERSION_LATEST); + g_at_chat_unref(chat); hfp_slc_establish(info, slc_established, slc_failed, modem); return -EINPROGRESS; -- 1.8.1.1