--- src/gprs.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 63 insertions(+), 1 deletions(-)
diff --git a/src/gprs.c b/src/gprs.c index 00f6d6d..04432c3 100644 --- a/src/gprs.c +++ b/src/gprs.c @@ -90,6 +90,7 @@ struct ofono_gprs { struct ofono_netreg *netreg; unsigned int netreg_watch; unsigned int status_watch; + unsigned int dun_watch; GKeyFile *settings; char *imsi; DBusMessage *pending; @@ -2294,7 +2295,7 @@ struct ofono_modem *ofono_gprs_context_get_modem(struct ofono_gprs_context *gc) } void ofono_gprs_context_set_type(struct ofono_gprs_context *gc, - enum ofono_gprs_context_type type) + enum ofono_gprs_context_type type) { DBG("type %d", type); @@ -2862,12 +2863,63 @@ static void provision_contexts(struct ofono_gprs *gprs, const char *mcc, __ofono_gprs_provision_free_settings(settings, count); } +/* Process the usual AT+CGDCONT command + */ +static void cgdcont_cb(struct ofono_emulator *em, + struct ofono_emulator_request *req, void *userdata) +{ + struct ofono_error result; + char buf[256]; + + result.error = 0; + + switch (ofono_emulator_request_get_type(req)) { + case OFONO_EMULATOR_REQUEST_TYPE_SUPPORT: + /* TODO: check additionnal parameters */ + snprintf(buf, 255, "+CGDCONT: (1-2),\"IP\",,,(0-2),(0,1,2,3,4)"); + ofono_emulator_send_info(em, buf, FALSE); + result.type = OFONO_ERROR_TYPE_NO_ERROR; + ofono_emulator_send_final(em, &result); + break; + + case OFONO_EMULATOR_REQUEST_TYPE_COMMAND_ONLY: + result.type = OFONO_ERROR_TYPE_FAILURE; + ofono_emulator_send_final(em, &result); + break; + + case OFONO_EMULATOR_REQUEST_TYPE_QUERY: + result.type = OFONO_ERROR_TYPE_FAILURE; + ofono_emulator_send_final(em, &result); + break; + case OFONO_EMULATOR_REQUEST_TYPE_SET: + result.type = OFONO_ERROR_TYPE_FAILURE; + ofono_emulator_send_final(em, &result); + break; + default: + result.type = OFONO_ERROR_TYPE_FAILURE; + ofono_emulator_send_final(em, &result); + }; +} + +static void gprs_dun_watch(struct ofono_atom *atom, + enum ofono_atom_watch_condition cond, void *data) +{ + struct ofono_emulator *em = __ofono_atom_get_data(atom); + + if (cond == OFONO_ATOM_WATCH_CONDITION_UNREGISTERED) + return; + + ofono_emulator_add_handler(em, "+CGDCONT", cgdcont_cb, data, NULL); +} + + static void ofono_gprs_finish_register(struct ofono_gprs *gprs) { DBusConnection *conn = ofono_dbus_get_connection(); struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom); const char *path = __ofono_atom_get_path(gprs->atom); struct ofono_atom *netreg_atom; + struct ofono_atom *dun_atom; if (gprs->contexts == NULL) /* Automatic provisioning failed */ add_context(gprs, NULL, OFONO_GPRS_CONTEXT_TYPE_INTERNET); @@ -2896,6 +2948,16 @@ static void ofono_gprs_finish_register(struct ofono_gprs *gprs) netreg_watch(netreg_atom, OFONO_ATOM_WATCH_CONDITION_REGISTERED, gprs); + gprs->dun_watch = __ofono_modem_add_atom_watch(modem, + OFONO_ATOM_TYPE_EMULATOR_DUN, + gprs_dun_watch, gprs, NULL); + + dun_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_EMULATOR_DUN); + + if (dun_atom && __ofono_atom_get_registered(dun_atom)) + gprs_dun_watch(dun_atom, OFONO_ATOM_WATCH_CONDITION_REGISTERED, + gprs); + __ofono_atom_register(gprs->atom, gprs_unregister); } -- 1.7.1 _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono