Hi Frédéric, On 03/30/2011 08:49 AM, Frédéric Danis wrote: > --- > src/sim.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 58 insertions(+), 0 deletions(-) > > diff --git a/src/sim.c b/src/sim.c > index 98d4cc4..a9e73e6 100644 > --- a/src/sim.c > +++ b/src/sim.c > @@ -106,6 +106,7 @@ struct ofono_sim { > const struct ofono_sim_driver *driver; > void *driver_data; > struct ofono_atom *atom; > + unsigned int hfp_watch; > }; > > struct msisdn_set_request { > @@ -2519,6 +2520,56 @@ struct ofono_sim *ofono_sim_create(struct ofono_modem > *modem, > return sim; > } > > +static void emulator_cnum_cb(struct ofono_emulator *em, > + struct ofono_emulator_request *req, void *userdata) > +{ > + struct ofono_sim *sim = userdata; > + struct ofono_error result; > + GSList *l; > + const char *phone; > + /* > + * '+CNUM: ,"+",,,4' + phone number + phone type on 3 digits max > + * + terminating null > + */ > + char buf[OFONO_MAX_PHONE_NUMBER_LENGTH + 18 + 1]; > + > + result.error = 0; > + > + switch (ofono_emulator_request_get_type(req)) { > + case OFONO_EMULATOR_REQUEST_TYPE_COMMAND_ONLY: > + for (l = sim->own_numbers; l; l = l->next) { > + struct ofono_phone_number *ph = l->data; > + > + phone = phone_number_to_string(ph); > + sprintf(buf, "+CNUM: ,\"%s\",%d,,4", phone, ph->type); > + ofono_emulator_send_info(em, buf, TRUE);
You should only use TRUE on the last CNUM. Please see the documentation for g_at_server_send_info in gatserver.h for more details. > + } > + > + result.type = OFONO_ERROR_TYPE_NO_ERROR; > + ofono_emulator_send_final(em, &result); > + break; > + > + default: > + result.type = OFONO_ERROR_TYPE_FAILURE; > + ofono_emulator_send_final(em, &result); > + }; > +} > + > +static void emulator_hfp_init(struct ofono_atom *atom, void *data) > +{ > + struct ofono_emulator *em = __ofono_atom_get_data(atom); > + > + ofono_emulator_add_handler(em, "+CNUM", emulator_cnum_cb, data, NULL); > +} > + > +static void emulator_hfp_watch(struct ofono_atom *atom, > + enum ofono_atom_watch_condition cond, > + void *data) > +{ > + if (cond == OFONO_ATOM_WATCH_CONDITION_REGISTERED) > + emulator_hfp_init(atom, data); > +} > + > void ofono_sim_register(struct ofono_sim *sim) > { > DBusConnection *conn = ofono_dbus_get_connection(); > @@ -2545,6 +2596,13 @@ void ofono_sim_register(struct ofono_sim *sim) > > if (sim->state > OFONO_SIM_STATE_NOT_PRESENT) > sim_initialize(sim); > + > + sim->hfp_watch = __ofono_modem_add_atom_watch(modem, > + OFONO_ATOM_TYPE_EMULATOR_HFP, > + emulator_hfp_watch, sim, NULL); > + > + __ofono_modem_foreach_atom(modem, OFONO_ATOM_TYPE_EMULATOR_HFP, > + emulator_hfp_init, sim); With the new add_atom_watch semantics the foreach should not be necessary any longer. > } > > void ofono_sim_remove(struct ofono_sim *sim) Regards, -Denis _______________________________________________ ofono mailing list ofono@ofono.org http://lists.ofono.org/listinfo/ofono