diff options
author | Denis Kenzior <denkenz@gmail.com> | 2009-11-05 17:06:21 -0600 |
---|---|---|
committer | Denis Kenzior <denkenz@gmail.com> | 2009-11-05 17:06:21 -0600 |
commit | a4189db20f408f409a6d07108795b11d42e9e9ae (patch) | |
tree | 8104a79743b275852b80027347d6fe2267c5ccca /src | |
parent | 55425238b0fce98859d34471162b3272136a2643 (diff) | |
download | ofono-a4189db20f408f409a6d07108795b11d42e9e9ae.tar.bz2 |
Add basic state saving for SMS atom
Message ID and Reference number for concatenated messages should be
persisted.
Diffstat (limited to 'src')
-rw-r--r-- | src/sms.c | 39 |
1 files changed, 39 insertions, 0 deletions
@@ -35,6 +35,7 @@ #include "common.h" #include "util.h" #include "smsutil.h" +#include "storage.h" #define uninitialized_var(x) x = x @@ -42,6 +43,9 @@ #define SMS_MANAGER_FLAG_CACHED 0x1 +#define SETTINGS_STORE "sms" +#define SETTINGS_GROUP "Settings" + #define TXQ_MAX_RETRIES 4 static gboolean tx_next(gpointer user_data); @@ -61,6 +65,8 @@ struct ofono_sms { struct ofono_message_waiting *mw; unsigned int mw_watch; struct ofono_sim *sim; + GKeyFile *settings; + char *imsi; const struct ofono_sms_driver *driver; void *driver_data; struct ofono_atom *atom; @@ -866,6 +872,19 @@ static void sms_remove(struct ofono_atom *atom) sms->txq = NULL; } + if (sms->settings) { + g_key_file_set_integer(sms->settings, SETTINGS_GROUP, + "NextMessageId", sms->next_msg_id); + g_key_file_set_integer(sms->settings, SETTINGS_GROUP, + "NextReference", sms->ref); + + storage_close(sms->imsi, SETTINGS_STORE, sms->settings, TRUE); + + g_free(sms->imsi); + sms->imsi = NULL; + sms->settings = NULL; + } + g_free(sms); } @@ -920,6 +939,24 @@ static void mw_watch(struct ofono_atom *atom, sms->mw = __ofono_atom_get_data(atom); } +static void sms_load_settings(struct ofono_sms *sms, const char *imsi) +{ + sms->settings = storage_open(imsi, SETTINGS_STORE); + + if (sms->settings == NULL) + return; + + sms->imsi = g_strdup(imsi); + + sms->next_msg_id = g_key_file_get_integer(sms->settings, SETTINGS_GROUP, + "NextMessageId", NULL); + sms->ref = g_key_file_get_integer(sms->settings, SETTINGS_GROUP, + "NextReference", NULL); + + if (sms->ref >= 65536) + sms->ref = 1; + +} void ofono_sms_register(struct ofono_sms *sms) { DBusConnection *conn = ofono_dbus_get_connection(); @@ -962,6 +999,8 @@ void ofono_sms_register(struct ofono_sms *sms) sms->sim = __ofono_atom_get_data(sim_atom); imsi = ofono_sim_get_imsi(sms->sim); sms->assembly = sms_assembly_new(imsi); + + sms_load_settings(sms, imsi); } else sms->assembly = sms_assembly_new(NULL); |