From: Denis Kenzior Date: Thu, 22 Oct 2009 23:00:33 +0000 (-0500) Subject: Refactor: Initialization code X-Git-Tag: 0.9~97 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=69c872f4009598e3504df7b18618df637f16c6df;p=platform%2Fupstream%2Fofono.git Refactor: Initialization code --- diff --git a/drivers/atmodem/gprs.c b/drivers/atmodem/gprs.c index a8d134b..af43d44 100644 --- a/drivers/atmodem/gprs.c +++ b/drivers/atmodem/gprs.c @@ -151,43 +151,39 @@ error: CALLBACK_WITH_FAILURE(cb, -1, -1, -1, -1, data); } -static void at_cgact_read_cb(gboolean ok, GAtResult *result, - gpointer user_data) +static void cgreg_notify(GAtResult *result, gpointer user_data) { struct ofono_gprs *gprs = user_data; - struct gprs_data *gd = ofono_gprs_get_data(gprs); - gint cid, state; GAtResultIter iter; - struct ofono_gprs_primary_context *ctx; - GSList *l; + gint status, tech = -1; + int lac = -1, ci = -1; + const char *str; - dump_response("cgact_read_cb", ok, result); + dump_response("cgreg_notify", TRUE, result); - if (!ok) + g_at_result_iter_init(&iter, result); + + if (!g_at_result_iter_next(&iter, "+CGREG:")) return; - while (g_at_result_iter_next(&iter, "+CGACT:")) { - if (!g_at_result_iter_next_number(&iter, &cid)) - continue; + g_at_result_iter_next_number(&iter, &status); - if (!g_at_result_iter_next_number(&iter, &state)) - continue; + if (g_at_result_iter_next_string(&iter, &str)) + lac = strtol(str, NULL, 16); + else + goto out; - l = g_slist_find_custom(gd->contexts, &cid, - context_id_compare); - if (!l) - continue; + if (g_at_result_iter_next_string(&iter, &str)) + ci = strtol(str, NULL, 16); + else + goto out; - ctx = l->data; - if (ctx->active != state) { - ctx->active = state; + g_at_result_iter_next_number(&iter, &tech); - if (state) - continue; +out: + ofono_debug("cgreg_notify: %d, %d, %d, %d", status, lac, ci, tech); - ofono_gprs_deactivated(gprs, ctx->id); - } - } + ofono_gprs_status_notify(gprs, status, lac, ci, tech); } static void cgev_notify(GAtResult *result, gpointer user_data) @@ -203,69 +199,22 @@ static void cgev_notify(GAtResult *result, gpointer user_data) if (!g_at_result_iter_next_unquoted_string(&iter, &event)) return; - if (g_str_has_prefix(event, "REJECT ")) - return; - - if (g_str_has_prefix(event, "NW REACT ") || - g_str_has_prefix(event, "NW DEACT ") || - g_str_has_prefix(event, "ME DEACT ")) { - /* Ask what primary contexts are active now */ - g_at_chat_send(gd->chat, "AT+CGACT?", cgact_prefix, - at_cgact_read_cb, gprs, NULL); - - return; - } - if (g_str_has_prefix(event, "NW DETACH ") || g_str_has_prefix(event, "ME DETACH ")) { - detached(gprs); - - ofono_gprs_detached(gprs); - + ofono_gprs_attach_notify(gprs, 0); return; } - - if (g_str_has_prefix(event, "NW CLASS ") || - g_str_has_prefix(event, "ME CLASS ")) - return; } -static void cgreg_notify(GAtResult *result, gpointer user_data) +static void gprs_initialized(gboolean ok, GAtResult *result, gpointer user_data) { struct ofono_gprs *gprs = user_data; - GAtResultIter iter; - gint status, tech = -1; - int lac = -1, ci = -1; - const char *str; - - dump_response("cgreg_notify", TRUE, result); - - g_at_result_iter_init(&iter, result); - - if (!g_at_result_iter_next(&iter, "+CGREG:")) - return; - - g_at_result_iter_next_number(&iter, &status); - - if (g_at_result_iter_next_string(&iter, &str)) - lac = strtol(str, NULL, 16); - else - goto out; - - if (g_at_result_iter_next_string(&iter, &str)) - ci = strtol(str, NULL, 16); - else - goto out; - - g_at_result_iter_next_number(&iter, &tech); - -out: - ofono_debug("cgreg_notify: %d, %d, %d, %d", status, lac, ci, tech); + struct gprs_data *gd = ofono_gprs_get_data(gprs); - if (status != 1 && status != 5) - detached(gprs); + g_at_chat_register(gd->chat, "+CGEV:", cgev_notify, FALSE, gprs, NULL); + g_at_chat_register(gd->chat, "+CGREG:", cgreg_notify, FALSE, gprs, NULL); - ofono_gprs_status_notify(gprs, status, lac, ci, tech); + ofono_gprs_register(gprs); } static void at_cgdcont_test_cb(gboolean ok, GAtResult *result, @@ -274,59 +223,47 @@ static void at_cgdcont_test_cb(gboolean ok, GAtResult *result, struct ofono_gprs *gprs = user_data; struct gprs_data *gd = ofono_gprs_get_data(gprs); GAtResultIter iter; - gint range[2]; - GSList *ranges = NULL; + int min, max; const char *pdp_type; + gboolean found = FALSE; if (!ok) goto error; g_at_result_iter_init(&iter, result); - while (g_at_result_iter_next(&iter, "+CGDCONT:")) { + while (!found && g_at_result_iter_next(&iter, "+CGDCONT:")) { if (!g_at_result_iter_open_list(&iter)) - goto next; + continue; - while (g_at_result_iter_next_range(&iter, &range[0], - &range[1])) - ranges = g_slist_prepend(ranges, - g_memdup(range, sizeof(range))); + if (g_at_result_iter_next_range(&iter, &min, &max) == FALSE) + continue; if (!g_at_result_iter_close_list(&iter)) - goto next; - - if (!ranges || range[1] < range[0]) - goto next; + continue; if (!g_at_result_iter_next_string(&iter, &pdp_type)) - goto next; + continue; /* We look for IP PDPs */ if (!strcmp(pdp_type, "IP")) - break; - -next: - if (ranges) { - g_slist_foreach(ranges, (GFunc) g_free, NULL); - g_slist_free(ranges); - ranges = NULL; - } + found = TRUE; } - if (!ranges) - goto error; - - gd->primary_id_range = g_slist_reverse(ranges); - ofono_debug("gprs_init: registering to notifications"); + if (found == FALSE) + goto error; - g_at_chat_register(gd->chat, "+CGEV:", cgev_notify, FALSE, gprs, NULL); - g_at_chat_register(gd->chat, "+CGREG:", cgreg_notify, FALSE, gprs, NULL); + ofono_gprs_set_cid_range(gprs, min, max); - ofono_gprs_register(gprs); + g_at_chat_send(gd->chat, "AT+CGREG=2", none_prefix, NULL, NULL, NULL); + g_at_chat_send(gd->chat, "AT+CGAUTO=0", none_prefix, NULL, NULL, NULL); + g_at_chat_send(gd->chat, "AT+CGEREP=2,1", none_prefix, + gprs_initialized, gprs, NULL); return; error: + ofono_info("GPRS not supported on this device"); ofono_gprs_remove(gprs); } @@ -341,11 +278,9 @@ static int at_gprs_probe(struct ofono_gprs *gprs, ofono_gprs_set_data(gprs, gd); - g_at_chat_send(chat, "AT+CGREG=2", NULL, NULL, NULL, NULL); - g_at_chat_send(chat, "AT+CGAUTO=0", NULL, NULL, NULL, NULL); - g_at_chat_send(chat, "AT+CGEREP=2,1", NULL, NULL, NULL, NULL); g_at_chat_send(chat, "AT+CGDCONT=?", cgdcont_prefix, at_cgdcont_test_cb, gprs, NULL); + return 0; }