--- src/emulator.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 54 insertions(+), 0 deletions(-) diff --git a/src/emulator.c b/src/emulator.c index c17b901..fe2132d 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -241,6 +241,59 @@ error: return; } +static gboolean resume_ppp(gpointer user_data) +{ + struct ofono_emulator *em = user_data; + + g_at_server_suspend(em->server); + g_at_ppp_resume(em->ppp); + + return FALSE; +} + +static void dun_ato_cb(GAtServer *server, GAtServerRequestType type, + GAtResult *result, gpointer user_data) +{ + struct ofono_emulator *em = user_data; + GAtResultIter iter; + int val; + + DBG(""); + + if (em->ppp == NULL) { + g_at_server_send_final(server, G_AT_SERVER_RESULT_NO_CARRIER); + return; + } + + switch (type) { + case G_AT_SERVER_REQUEST_TYPE_SET: + g_at_result_iter_init(&iter, result); + g_at_result_iter_next(&iter, ""); + + if (g_at_result_iter_next_number(&iter, &val) == FALSE) + goto error; + + if (val != 0) + goto error; + + g_at_server_send_intermediate(em->server, "CONNECT"); + em->source = g_idle_add(resume_ppp, em); + break; + + case G_AT_SERVER_REQUEST_TYPE_COMMAND_ONLY: + g_at_server_send_intermediate(em->server, "CONNECT"); + em->source = g_idle_add(resume_ppp, em); + break; + + default: +error: + g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR); + break; + } + + return; +} + static struct indicator *find_indicator(struct ofono_emulator *em, const char *name, int *index) { @@ -775,6 +828,7 @@ void ofono_emulator_register(struct ofono_emulator *em, int fd) case OFONO_EMULATOR_TYPE_DUN: g_at_server_register(em->server, "D", dial_cb, em, NULL); g_at_server_register(em->server, "H", dun_ath_cb, em, NULL); + g_at_server_register(em->server, "O", dun_ato_cb, em, NULL); break; case OFONO_EMULATOR_TYPE_HFP: g_at_server_set_echo(em->server, FALSE); -- 1.7.1