Refactor: Initialization code
authorDenis Kenzior <denis.kenzior@intel.com>
Thu, 22 Oct 2009 23:00:33 +0000 (18:00 -0500)
committerDenis Kenzior <denkenz@gmail.com>
Fri, 23 Oct 2009 22:05:55 +0000 (17:05 -0500)
drivers/atmodem/gprs.c

index a8d134b..af43d44 100644 (file)
@@ -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;
 }