void set_powered_cb(struct ofono_error *error, gpointer user_data) { struct cb_data *cbd = user_data; struct ofono_data *od = cbd->user; telephony_result_cb cb = cbd->cb; struct telephony_error terr; if (error) { terr.code = 1; /* FIXME */ cb(&terr, cbd->data); goto cleanup; } if (od->power_target) { ofono_modem_set_online(od->modem, od->power_target, set_online_cb, cbd); } else { od->power_set_pending = false; cb(NULL, cbd->data); goto cleanup; } return; cleanup: g_free(cbd); }
void ofono_power_set(struct telephony_service *service, bool power, telephony_result_cb cb, void *data) { struct cb_data *cbd = cb_data_new(cb, data); struct ofono_data *od = telephony_service_get_data(service); bool powered = false; struct telephony_error error; if (od->power_set_pending) { error.code = TELEPHONY_ERROR_ALREADY_INPROGRESS; cb(&error, data); return; } od->power_set_pending = true; od->power_target = power; cbd->user = od; powered = ofono_modem_get_powered(od->modem); if (!powered) { ofono_modem_set_powered(od->modem, power, set_powered_cb, cbd); } else { ofono_modem_set_online(od->modem, power, set_online_cb, cbd); } }
static void test_modem_set_online() { int online; printf("please input online setting (0 - offline, else online):\n"); if (scanf("%d", &online) == EOF) return; ofono_modem_set_online(g_modem, online != 0, NULL, NULL); }