--- src/voicecall.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 45 insertions(+), 0 deletions(-) diff --git a/src/voicecall.c b/src/voicecall.c index ff1f0fc..e91ba42 100644 --- a/src/voicecall.c +++ b/src/voicecall.c @@ -37,11 +37,15 @@ #include "common.h" #include "simutil.h" #include "smsutil.h" +#include "storage.h" #define MAX_VOICE_CALLS 16 #define VOICECALL_FLAG_SIM_ECC_READY 0x1 +#define VOICECALL_STORE "voicecall" +#define LASTDIAL_GROUP "LastDial" + GSList *g_drivers = NULL; struct multi_release { @@ -71,6 +75,8 @@ struct ofono_voicecall { GQueue *toneq; guint tone_source; unsigned int hfp_watch; + GKeyFile *settings; + char *imsi; }; struct voicecall { @@ -1473,6 +1479,12 @@ static int voicecall_dial(struct ofono_voicecall *vc, const char *number, vc->driver->dial(vc, &ph, clir, cb, vc); + if (vc->settings) { + g_key_file_set_string(vc->settings, LASTDIAL_GROUP, + "Number", number); + storage_sync(vc->imsi, VOICECALL_STORE, vc->settings); + } + return 0; } @@ -2466,6 +2478,33 @@ static void emulator_hfp_unregister(struct ofono_atom *atom) __ofono_modem_remove_atom_watch(modem, vc->hfp_watch); } +static void voicecall_load_settings(struct ofono_voicecall *vc) +{ + const char *imsi; + + imsi = ofono_sim_get_imsi(vc->sim); + if (imsi == NULL) + return; + + vc->settings = storage_open(imsi, VOICECALL_STORE); + + if (vc->settings == NULL) + return; + + vc->imsi = g_strdup(imsi); +} + +static void voicecall_close_settings(struct ofono_voicecall *vc) +{ + if (vc->settings) { + storage_close(vc->imsi, VOICECALL_STORE, vc->settings, TRUE); + + g_free(vc->imsi); + vc->imsi = NULL; + vc->settings = NULL; + } +} + static void voicecall_unregister(struct ofono_atom *atom) { DBusConnection *conn = ofono_dbus_get_connection(); @@ -2476,6 +2515,8 @@ static void voicecall_unregister(struct ofono_atom *atom) emulator_hfp_unregister(atom); + voicecall_close_settings(vc); + if (vc->sim_state_watch) { ofono_sim_remove_state_watch(vc->sim, vc->sim_state_watch); vc->sim_state_watch = 0; @@ -2615,6 +2656,9 @@ static void sim_state_watch(enum ofono_sim_state new_state, void *user) free_sim_ecc_numbers(vc, FALSE); set_new_ecc(vc); + case OFONO_SIM_STATE_READY: + voicecall_load_settings(vc); + break; default: break; } @@ -2627,6 +2671,7 @@ static void sim_watch(struct ofono_atom *atom, struct ofono_sim *sim = __ofono_atom_get_data(atom); if (cond == OFONO_ATOM_WATCH_CONDITION_UNREGISTERED) { + voicecall_close_settings(vc); vc->sim_state_watch = 0; vc->sim = NULL; return; -- 1.7.1