mirror of git://git.sysmocom.de/ofono
Refactor: Run CLCC when initializing
When voicecall atom is initialized, we should run a CLCC query to populate our call list. This also notifies the core of the new calls
This commit is contained in:
parent
770586bfb7
commit
0fbaed38aa
|
@ -420,66 +420,17 @@ static void at_hangup(struct ofono_voicecall *vc,
|
||||||
|
|
||||||
static void clcc_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
static void clcc_cb(gboolean ok, GAtResult *result, gpointer user_data)
|
||||||
{
|
{
|
||||||
struct cb_data *cbd = user_data;
|
struct ofono_voicecall *vc = user_data;
|
||||||
ofono_call_list_cb_t cb = cbd->cb;
|
|
||||||
struct ofono_error error;
|
|
||||||
GSList *calls = NULL;
|
|
||||||
GSList *l;
|
|
||||||
struct ofono_call *list;
|
|
||||||
int num;
|
|
||||||
|
|
||||||
dump_response("clcc_cb", ok, result);
|
|
||||||
decode_at_error(&error, g_at_result_final_response(result));
|
|
||||||
|
|
||||||
if (!ok) {
|
|
||||||
cb(&error, 0, NULL, cbd->data);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
calls = at_util_parse_clcc(result);
|
|
||||||
|
|
||||||
if (calls == NULL) {
|
|
||||||
CALLBACK_WITH_FAILURE(cb, 0, NULL, cbd->data);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
list = g_try_new0(struct ofono_call, g_slist_length(calls));
|
|
||||||
|
|
||||||
if (!list) {
|
|
||||||
CALLBACK_WITH_FAILURE(cb, 0, NULL, cbd->data);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (num = 0, l = calls; l; l = l->next, num++)
|
|
||||||
memcpy(&list[num], l->data, sizeof(struct ofono_call));
|
|
||||||
|
|
||||||
cb(&error, num, list, cbd->data);
|
|
||||||
|
|
||||||
g_free(list);
|
|
||||||
|
|
||||||
out:
|
|
||||||
g_slist_foreach(calls, (GFunc) g_free, NULL);
|
|
||||||
g_slist_free(calls);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void at_list_calls(struct ofono_voicecall *vc, ofono_call_list_cb_t cb,
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
|
struct voicecall_data *vd = ofono_voicecall_get_data(vc);
|
||||||
struct cb_data *cbd = cb_data_new(cb, data);
|
GSList *l;
|
||||||
|
|
||||||
if (!cbd)
|
if (!ok)
|
||||||
goto error;
|
|
||||||
|
|
||||||
if (g_at_chat_send(vd->chat, "AT+CLCC", clcc_prefix,
|
|
||||||
clcc_cb, cbd, g_free) > 0)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
error:
|
vd->calls = at_util_parse_clcc(result);
|
||||||
if (cbd)
|
|
||||||
g_free(cbd);
|
|
||||||
|
|
||||||
CALLBACK_WITH_FAILURE(cb, 0, NULL, data);
|
for (l = vd->calls; l; l = l->next)
|
||||||
|
ofono_voicecall_notify(vc, l->data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void at_hold_all_active(struct ofono_voicecall *vc,
|
static void at_hold_all_active(struct ofono_voicecall *vc,
|
||||||
|
@ -893,6 +844,9 @@ static void at_voicecall_initialized(gboolean ok, GAtResult *result,
|
||||||
g_at_chat_register(vd->chat, "BUSY", busy_notify, FALSE, vc, NULL);
|
g_at_chat_register(vd->chat, "BUSY", busy_notify, FALSE, vc, NULL);
|
||||||
|
|
||||||
ofono_voicecall_register(vc);
|
ofono_voicecall_register(vc);
|
||||||
|
|
||||||
|
/* Populate the call list */
|
||||||
|
g_at_chat_send(vd->chat, "AT+CLCC", clcc_prefix, clcc_cb, vc, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int at_voicecall_probe(struct ofono_voicecall *vc, unsigned int vendor,
|
static int at_voicecall_probe(struct ofono_voicecall *vc, unsigned int vendor,
|
||||||
|
@ -933,7 +887,6 @@ static struct ofono_voicecall_driver driver = {
|
||||||
.dial = at_dial,
|
.dial = at_dial,
|
||||||
.answer = at_answer,
|
.answer = at_answer,
|
||||||
.hangup = at_hangup,
|
.hangup = at_hangup,
|
||||||
.list_calls = at_list_calls,
|
|
||||||
.hold_all_active = at_hold_all_active,
|
.hold_all_active = at_hold_all_active,
|
||||||
.release_all_held = at_release_all_held,
|
.release_all_held = at_release_all_held,
|
||||||
.set_udub = at_set_udub,
|
.set_udub = at_set_udub,
|
||||||
|
|
Loading…
Reference in New Issue