static void at_cgsms_query_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_sms_bearer_query_cb_t cb = cbd->cb; struct ofono_error error; GAtResultIter iter; int bearer; 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, "+CGSMS:")) goto err; g_at_result_iter_next_number(&iter, &bearer); cb(&error, bearer, cbd->data); return; err: CALLBACK_WITH_FAILURE(cb, -1, cbd->data); }
static void at_creg_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_netreg_status_cb_t cb = cbd->cb; int status, lac, ci, tech; struct ofono_error error; struct netreg_data *nd = cbd->user; decode_at_error(&error, g_at_result_final_response(result)); if (!ok) { cb(&error, -1, -1, -1, -1, cbd->data); return; } if (at_util_parse_reg(result, "+CREG:", NULL, &status, &lac, &ci, &tech, nd->vendor) == FALSE) { CALLBACK_WITH_FAILURE(cb, -1, -1, -1, -1, cbd->data); return; } if ((status == 1 || status == 5) && (tech == -1)) tech = nd->tech; cb(&error, status, lac, ci, tech, cbd->data); }
static void cops_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; struct netreg_data *nd = ofono_netreg_get_data(cbd->user); ofono_netreg_operator_cb_t cb = cbd->cb; struct ofono_network_operator op; GAtResultIter iter; int format, tech; const char *name; struct ofono_error error; decode_at_error(&error, g_at_result_final_response(result)); if (!ok) goto error; g_at_result_iter_init(&iter, result); if (!g_at_result_iter_next(&iter, "+COPS:")) goto error; g_at_result_iter_skip_next(&iter); ok = g_at_result_iter_next_number(&iter, &format); if (ok == FALSE || format != 0) goto error; if (g_at_result_iter_next_string(&iter, &name) == FALSE) goto error; /* Default to GSM */ if (g_at_result_iter_next_number(&iter, &tech) == FALSE) tech = ACCESS_TECHNOLOGY_GSM; strncpy(op.name, name, OFONO_MAX_OPERATOR_NAME_LENGTH); op.name[OFONO_MAX_OPERATOR_NAME_LENGTH] = '\0'; strncpy(op.mcc, nd->mcc, OFONO_MAX_MCC_LENGTH); op.mcc[OFONO_MAX_MCC_LENGTH] = '\0'; strncpy(op.mnc, nd->mnc, OFONO_MAX_MNC_LENGTH); op.mnc[OFONO_MAX_MNC_LENGTH] = '\0'; /* Set to current */ op.status = 2; op.tech = tech; DBG("cops_cb: %s, %s %s %d", name, nd->mcc, nd->mnc, tech); cb(&error, &op, cbd->data); g_free(cbd); return; error: cb(&error, NULL, cbd->data); g_free(cbd); }
static void cgdcont_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct ofono_gprs_context *gc = user_data; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); char buf[64]; DBG("ok %d", ok); if (!ok) { struct ofono_error error; gcd->active_context = 0; decode_at_error(&error, g_at_result_final_response(result)); gcd->cb(&error, gcd->cb_data); return; } snprintf(buf, sizeof(buf), "AT+CGACT=1,%u", gcd->active_context); if (g_at_chat_send(gcd->chat, buf, none_prefix, cgact_enable_cb, gc, NULL)) return; CALLBACK_WITH_FAILURE(gcd->cb, gcd->cb_data); }
static void at_cmgs_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; GAtResultIter iter; ofono_sms_submit_cb_t cb = cbd->cb; struct ofono_error error; int mr; 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, "+CMGS:")) goto err; if (!g_at_result_iter_next_number(&iter, &mr)) goto err; DBG("Got MR: %d", mr); cb(&error, mr, cbd->data); return; err: CALLBACK_WITH_FAILURE(cb, -1, cbd->data); }
static void mbm_cgdcont_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_gprs_context_up_cb_t cb = cbd->cb; struct ofono_gprs_context *gc = cbd->user; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); struct cb_data *ncbd; char buf[64]; if (!ok) { struct ofono_error error; gcd->active_context = 0; decode_at_error(&error, g_at_result_final_response(result)); cb(&error, NULL, 0, NULL, NULL, NULL, NULL, cbd->data); return; } ncbd = g_memdup(cbd, sizeof(struct cb_data)); snprintf(buf, sizeof(buf), "AT*ENAP=1,%u", gcd->active_context); if (g_at_chat_send(gcd->chat, buf, none_prefix, mbm_enap_up_cb, ncbd, g_free) > 0) return; if (ncbd) g_free(ncbd); gcd->active_context = 0; CALLBACK_WITH_FAILURE(cb, NULL, 0, NULL, NULL, NULL, NULL, cbd->data); }
static void mbm_enap_up_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_gprs_context_up_cb_t cb = cbd->cb; struct ofono_gprs_context *gc = cbd->user; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); struct ofono_error error; if (ok) { gcd->mbm_state = MBM_ENABLING; gcd->up_cb = cb; gcd->cb_data = cbd->data; if (gcd->have_e2nap == FALSE) g_at_chat_send(gcd->chat, "AT*ENAP?", enap_prefix, mbm_enap_poll_cb, gc, NULL); return; } gcd->active_context = 0; decode_at_error(&error, g_at_result_final_response(result)); cb(&error, NULL, FALSE, NULL, NULL, NULL, NULL, cbd->data); }
static void telit_gps_enable_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_location_reporting_enable_cb_t cb = cbd->cb; struct ofono_location_reporting *lr = cbd->user; struct gps_data *gd = ofono_location_reporting_get_data(lr); struct ofono_error error; DBG("lr=%p ok=%d", lr, ok); decode_at_error(&error, g_at_result_final_response(result)); if (!ok) { cb(&error, -1, cbd->data); g_free(cbd); return; } if (g_at_chat_send(gd->chat, "AT$GPSNMUN=1,0,0,0,0,0,0", none_prefix, telit_gps_ctl_cb, cbd, g_free) > 0) return; CALLBACK_WITH_FAILURE(cb, -1, cbd->data); g_free(cbd); }
static void xctms_query_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_ctm_query_cb_t cb = cbd->cb; struct ofono_error error; GAtResultIter iter; int value; ofono_bool_t enable; 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, "+XCTMS:") == FALSE) goto error; if (g_at_result_iter_next_number(&iter, &value) == FALSE) goto error; /* FULL TTY mode status only sent to oFono */ enable = (value == 1) ? TRUE : FALSE; cb(&error, enable, cbd->data); return; error: CALLBACK_WITH_FAILURE(cb, -1, cbd->data); }
static void rat_query_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_radio_settings_rat_mode_query_cb_t cb = cbd->cb; enum ofono_radio_access_mode mode; struct ofono_error error; GAtResultIter iter; int value; 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, "+CFUN:")) goto err; if (!g_at_result_iter_next_number(&iter, &value)) goto err; if (!ste_mode_to_ofono_mode(value, &mode)) goto err; CALLBACK_WITH_SUCCESS(cb, mode, cbd->data); return; err: CALLBACK_WITH_FAILURE(cb, -1, cbd->data); }
static void telit_gps_ctl_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_location_reporting_enable_cb_t cb = cbd->cb; struct ofono_location_reporting *lr = cbd->user; struct ofono_error error; int fd; DBG("lr=%p ok=%d", lr, ok); decode_at_error(&error, g_at_result_final_response(result)); if (!ok) { cb(&error, -1, cbd->data); return; } fd = enable_data_stream(lr); if (fd < 0) { CALLBACK_WITH_FAILURE(cb, -1, cbd->data); return; } cb(&error, fd, cbd->data); close(fd); }
static void at_cgdcont_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct ofono_gprs_context *gc = user_data; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); char buf[64]; if (!ok) { struct ofono_error error; gcd->active_context = 0; gcd->state = STATE_IDLE; decode_at_error(&error, g_at_result_final_response(result)); gcd->up_cb(&error, NULL, 0, NULL, NULL, NULL, NULL, gcd->cb_data); return; } sprintf(buf, "AT+CGDATA=\"PPP\",%u", gcd->active_context); if (g_at_chat_send(gcd->chat, buf, none_prefix, at_cgdata_cb, gc, NULL) > 0) return; gcd->active_context = 0; gcd->state = STATE_IDLE; CALLBACK_WITH_FAILURE(gcd->up_cb, NULL, 0, NULL, NULL, NULL, NULL, gcd->cb_data); }
static void ctm_query_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; struct ofono_error error; GAtResultIter iter; ofono_ctm_query_cb_t cb = cbd->cb; int value; 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, "+PTTY:") == FALSE) goto error; if (g_at_result_iter_next_number(&iter, &value) == FALSE) goto error; cb(&error, value, cbd->data); return; error: CALLBACK_WITH_FAILURE(cb, -1, cbd->data); }
static void at_cgact_up_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_gprs_context_cb_t cb = cbd->cb; struct ofono_gprs_context *gc = cbd->user; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); struct ofono_error error; decode_at_error(&error, g_at_result_final_response(result)); if (ok == FALSE) goto done; ofono_gprs_context_set_interface(gc, gcd->interface); if (gcd->proto == OFONO_GPRS_PROTO_IP || gcd->proto == OFONO_GPRS_PROTO_IPV4V6) ofono_gprs_context_set_ipv4_address(gc, NULL, FALSE); if (gcd->proto == OFONO_GPRS_PROTO_IPV6 || gcd->proto == OFONO_GPRS_PROTO_IPV4V6) { ofono_gprs_context_set_ipv6_address(gc, "fe80::1"); ofono_gprs_context_set_ipv6_prefix_length(gc, 10); } done: cb(&error, cbd->data); }
static void csq_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_netreg_strength_cb_t cb = cbd->cb; int strength; GAtResultIter iter; struct ofono_error error; 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, "+CSQ:")) { CALLBACK_WITH_FAILURE(cb, -1, cbd->data); return; } g_at_result_iter_next_number(&iter, &strength); DBG("csq_cb: %d", strength); if (strength == 99) strength = -1; else strength = (strength * 100) / 31; cb(&error, strength, cbd->data); }
static void ccfc_query_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_call_forwarding_query_cb_t cb = cbd->cb; struct ofono_error error; GAtResultIter iter; int num = 0; struct ofono_call_forwarding_condition *list = NULL; int i; int maxlen; decode_at_error(&error, g_at_result_final_response(result)); if (!ok) goto out; g_at_result_iter_init(&iter, result); while (g_at_result_iter_next(&iter, "+CCFC:")) num += 1; /* Specification is really unclear about this * generate status=0 for all classes just in case */ if (num == 0) { list = g_new0(struct ofono_call_forwarding_condition, 1); num = 1; list->status = 0; list->cls = GPOINTER_TO_INT(cbd->user); goto out; }
static void set_online_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_modem_online_cb_t cb = cbd->cb; struct ofono_error error; decode_at_error(&error, g_at_result_final_response(result)); cb(&error, cbd->data); }
static void ipsys_modify_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_radio_settings_rat_mode_set_cb_t cb = cbd->cb; struct ofono_error error; decode_at_error(&error, g_at_result_final_response(result)); cb(&error, cbd->data); }
static void at_cgact_down_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_gprs_context_cb_t cb = cbd->cb; struct ofono_error error; decode_at_error(&error, g_at_result_final_response(result)); cb(&error, cbd->data); }
static void cdma_generic_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_cdma_voicecall_cb_t cb = cbd->cb; struct ofono_error error; decode_at_error(&error, g_at_result_final_response(result)); cb(&error, cbd->data); }
static void bcc_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_handsfree_card_connect_cb_t cb = cbd->cb; struct ofono_error error; decode_at_error(&error, g_at_result_final_response(result)); cb(&error, cbd->data); }
static void cops_numeric_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; struct netreg_data *nd = ofono_netreg_get_data(cbd->user); ofono_netreg_operator_cb_t cb = cbd->cb; GAtResultIter iter; const char *str; int format; int len; struct ofono_error error; decode_at_error(&error, g_at_result_final_response(result)); if (!ok) goto error; g_at_result_iter_init(&iter, result); if (!g_at_result_iter_next(&iter, "+COPS:")) goto error; g_at_result_iter_skip_next(&iter); ok = g_at_result_iter_next_number(&iter, &format); if (ok == FALSE || format != 2) goto error; if (g_at_result_iter_next_string(&iter, &str) == FALSE) goto error; len = strspn(str, "0123456789"); if (len != 5 && len != 6) goto error; extract_mcc_mnc(str, nd->mcc, nd->mnc); DBG("Cops numeric got mcc: %s, mnc: %s", nd->mcc, nd->mnc); ok = g_at_chat_send(nd->chat, "AT+COPS=3,0", none_prefix, NULL, NULL, NULL); if (ok) ok = g_at_chat_send(nd->chat, "AT+COPS?", cops_prefix, cops_cb, cbd, NULL); if (ok) return; error: cb(&error, NULL, cbd->data); g_free(cbd); }
static void notify_callback(GAtResult *result, gpointer user_data) { GAtResultIter iter; g_at_result_iter_init(&iter, result); if (g_at_result_iter_next(&iter, NULL) == TRUE) printf("%s\n", g_at_result_iter_raw_line(&iter)); printf("==> %s\n", g_at_result_final_response(result)); }
static void hfp_siri_eyes_free_mode_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_siri_cb_t cb = cbd->cb; struct ofono_siri *siri = cbd->data; struct ofono_error error; decode_at_error(&error, g_at_result_final_response(result)); cb(&error, siri); }
static void xctms_modify_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_ctm_set_cb_t cb = cbd->cb; struct ofono_error error; decode_at_error(&error, g_at_result_final_response(result)); /* TODO: Audio path configuration */ cb(&error, cbd->data); }
static void generic_callback(gboolean ok, GAtResult *result, gpointer user_data) { GAtResultIter iter; g_at_result_iter_init(&iter, result); if (g_at_result_iter_next(&iter, NULL) == TRUE) printf("%s\n", g_at_result_iter_raw_line(&iter)); printf("==> %s (%d)\n", g_at_result_final_response(result), ok); }
static void ste_cgdcont_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_gprs_context_up_cb_t cb = cbd->cb; struct ofono_gprs_context *gc = cbd->user; struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc); struct cb_data *ncbd = NULL; char buf[128]; struct conn_info *conn; GSList *l; if (!ok) { struct ofono_error error; gcd->active_context = 0; decode_at_error(&error, g_at_result_final_response(result)); cb(&error, NULL, 0, NULL, NULL, NULL, NULL, cbd->data); return; } ncbd = g_memdup(cbd, sizeof(struct cb_data)); l = g_slist_find_custom(g_caif_devices, GUINT_TO_POINTER(0), conn_compare_by_cid); if (!l) { DBG("at_cgdcont_cb, no more available devices"); goto error; } conn = l->data; conn->cid = gcd->active_context; snprintf(buf, sizeof(buf), "AT*EPPSD=1,%u,%u", conn->channel_id, conn->cid); if (g_at_chat_send(gcd->chat, buf, NULL, ste_eppsd_up_cb, ncbd, g_free) > 0) return; error: if (ncbd) g_free(ncbd); gcd->active_context = 0; CALLBACK_WITH_FAILURE(cb, NULL, 0, NULL, NULL, NULL, NULL, cbd->data); }
static void xrat_query_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_radio_settings_rat_mode_query_cb_t cb = cbd->cb; enum ofono_radio_access_mode mode; struct ofono_error error; GAtResultIter iter; int value, preferred; 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, "+XRAT:") == FALSE) goto error; if (g_at_result_iter_next_number(&iter, &value) == FALSE) goto error; if (g_at_result_iter_next_number(&iter, &preferred) == FALSE) goto error; switch (value) { case 0: mode = OFONO_RADIO_ACCESS_MODE_GSM; break; case 1: mode = OFONO_RADIO_ACCESS_MODE_ANY; break; case 2: mode = OFONO_RADIO_ACCESS_MODE_UMTS; break; default: CALLBACK_WITH_FAILURE(cb, -1, cbd->data); return; } cb(&error, mode, cbd->data); return; error: CALLBACK_WITH_FAILURE(cb, -1, cbd->data); }
static void rat_modify_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; ofono_radio_settings_rat_mode_set_cb_t cb = cbd->cb; struct ofono_error error; decode_at_error(&error, g_at_result_final_response(result)); if (!ok) { cb(&error, cbd->data); return; } CALLBACK_WITH_SUCCESS(cb, cbd->data); }
static void at_discover_apps_cb(gboolean ok, GAtResult *result, gpointer user_data) { struct cb_data *cbd = user_data; GAtResultIter iter; ofono_sim_list_apps_cb_t cb = cbd->cb; struct ofono_error error; const unsigned char *dataobj; gint linelen; unsigned char *buffer; int len; decode_at_error(&error, g_at_result_final_response(result)); if (!ok) { cb(&error, NULL, 0, cbd->data); return; } g_at_result_iter_init(&iter, result); len = 0; while (g_at_result_iter_next(&iter, "+CUAD:")) { if (!g_at_result_iter_next_hexstring(&iter, NULL, &linelen)) goto error; len += linelen; } g_at_result_iter_init(&iter, result); buffer = g_malloc(len); len = 0; while (g_at_result_iter_next(&iter, "+CUAD:")) { g_at_result_iter_next_hexstring(&iter, &dataobj, &linelen); memcpy(buffer + len, dataobj, linelen); len += linelen; } cb(&error, buffer, len, cbd->data); g_free(buffer); return; error: CALLBACK_WITH_FAILURE(cb, NULL, 0, cbd->data); }