diff options
author | Denis Kenzior <denkenz@gmail.com> | 2010-12-15 13:41:16 -0600 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2010-12-16 18:40:19 -0600 |
commit | f2baa88d7577649358f1f8587e5a9b6aa730ca41 (patch) | |
tree | 34bb75af6cd263d2a22025af127e65fbfe6929ee | |
parent | f46e0fb73b4ced620c82d9551b6e76108d340360 (diff) | |
download | ofono-f2baa88d7577649358f1f8587e5a9b6aa730ca41.tar.bz2 |
atmodem: Unify COLR/CNAP/CLIP/COLP parser
-rw-r--r-- | drivers/atmodem/call-settings.c | 115 |
1 files changed, 22 insertions, 93 deletions
diff --git a/drivers/atmodem/call-settings.c b/drivers/atmodem/call-settings.c index ea31fcc2..3340d5a0 100644 --- a/drivers/atmodem/call-settings.c +++ b/drivers/atmodem/call-settings.c @@ -138,8 +138,8 @@ error: CALLBACK_WITH_FAILURE(cb, data); } - -static void clip_query_cb(gboolean ok, GAtResult *result, gpointer user_data) +static void query_template(const char *prefix, gboolean ok, + GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_call_settings_status_cb_t cb = cbd->cb; @@ -156,18 +156,28 @@ static void clip_query_cb(gboolean ok, GAtResult *result, gpointer user_data) g_at_result_iter_init(&iter, result); - if (!g_at_result_iter_next(&iter, "+CLIP:")) { - CALLBACK_WITH_FAILURE(cb, -1, cbd->data); - return; - } + if (g_at_result_iter_next(&iter, prefix) == FALSE) + goto error; /* Skip the local presentation setting */ - g_at_result_iter_skip_next(&iter); - g_at_result_iter_next_number(&iter, &status); + if (g_at_result_iter_skip_next(&iter) == FALSE) + goto error; - DBG("network: %d", status); + if (g_at_result_iter_next_number(&iter, &status) == FALSE) + goto error; + + DBG("prefix: %s, network: %d", prefix, status); cb(&error, status, cbd->data); + return; + +error: + CALLBACK_WITH_FAILURE(cb, -1, cbd->data); +} + +static void clip_query_cb(gboolean ok, GAtResult *result, gpointer user_data) +{ + query_template("+CLIP:", ok, result, user_data); } static void at_clip_query(struct ofono_call_settings *cs, @@ -191,35 +201,7 @@ error: static void cnap_query_cb(gboolean ok, GAtResult *result, gpointer user_data) { - struct cb_data *cbd = user_data; - ofono_call_settings_status_cb_t cb = cbd->cb; - struct ofono_error error; - GAtResultIter iter; - int status; - - decode_at_error(&error, g_at_result_final_response(result)); - - if (!ok) { - cb(&error, -1, cbd->data); - return; - } - - g_at_result_iter_init(&iter, result); - - if (g_at_result_iter_next(&iter, "+CNAP:") == FALSE) - goto error; - - /* Skip the local presentation setting */ - g_at_result_iter_skip_next(&iter); - g_at_result_iter_next_number(&iter, &status); - - DBG("network: %d", status); - - cb(&error, status, cbd->data); - return; - -error: - CALLBACK_WITH_FAILURE(cb, -1, cbd->data); + query_template("+CNAP:", ok, result, user_data); } static void at_cnap_query(struct ofono_call_settings *cs, @@ -243,33 +225,7 @@ error: static void colp_query_cb(gboolean ok, GAtResult *result, gpointer user_data) { - struct cb_data *cbd = user_data; - ofono_call_settings_status_cb_t cb = cbd->cb; - struct ofono_error error; - GAtResultIter iter; - int status; - - decode_at_error(&error, g_at_result_final_response(result)); - - if (!ok) { - cb(&error, -1, cbd->data); - return; - } - - g_at_result_iter_init(&iter, result); - - if (!g_at_result_iter_next(&iter, "+COLP:")) { - CALLBACK_WITH_FAILURE(cb, -1, cbd->data); - return; - } - - /* Skip the local presentation setting */ - g_at_result_iter_skip_next(&iter); - g_at_result_iter_next_number(&iter, &status); - - DBG("network: %d", status); - - cb(&error, status, cbd->data); + query_template("+COLP:", ok, result, user_data); } static void at_colp_query(struct ofono_call_settings *cs, @@ -375,34 +331,7 @@ error: static void colr_query_cb(gboolean ok, GAtResult *result, gpointer user_data) { - struct cb_data *cbd = user_data; - ofono_call_settings_status_cb_t cb = cbd->cb; - struct ofono_error error; - GAtResultIter iter; - int status; - - decode_at_error(&error, g_at_result_final_response(result)); - - if (!ok) { - cb(&error, -1, cbd->data); - return; - } - - g_at_result_iter_init(&iter, result); - - if (g_at_result_iter_next(&iter, "+COLR:") == FALSE) - goto error; - - if (g_at_result_iter_next_number(&iter, &status) == FALSE) - goto error; - - DBG("network: %d", status); - - cb(&error, status, cbd->data); - return; - -error: - CALLBACK_WITH_FAILURE(cb, -1, cbd->data); + query_template("+COLR:", ok, result, user_data); } static void at_colr_query(struct ofono_call_settings *cs, |