---
 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

_______________________________________________
ofono mailing list
[email protected]
http://lists.ofono.org/listinfo/ofono

Reply via email to