From 1ff069be5a9296bdc37a5da333b304024f81d43a Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Mon, 2 Nov 2009 14:42:10 -0600 Subject: [PATCH] Add Basic save/restore code for GPRS setting --- src/gprs.c | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/src/gprs.c b/src/gprs.c index cdcf3367..ffb710f8 100644 --- a/src/gprs.c +++ b/src/gprs.c @@ -33,12 +33,15 @@ #include "ofono.h" #include "common.h" +#include "storage.h" #define DATA_CONNECTION_MANAGER_INTERFACE "org.ofono.DataConnectionManager" #define DATA_CONTEXT_INTERFACE "org.ofono.PrimaryDataContext" #define GPRS_FLAG_ATTACHING 0x1 +#define SETTINGS_STORE "gprs" +#define SETTINGS_GROUP "Settings" #define MAX_CONTEXT_NAME_LENGTH 127 #define MAX_CONTEXTS 256 @@ -70,6 +73,8 @@ struct ofono_gprs { struct ofono_netreg *netreg; unsigned int netreg_watch; unsigned int status_watch; + GKeyFile *settings; + char *imsi; DBusMessage *pending; struct ofono_gprs_context *context_driver; const struct ofono_gprs_driver *driver; @@ -702,6 +707,14 @@ static DBusMessage *gprs_set_property(DBusConnection *conn, gprs->roaming_allowed = value; + if (gprs->settings) { + g_key_file_set_integer(gprs->settings, SETTINGS_GROUP, + "RoamingAllowed", + gprs->roaming_allowed); + storage_sync(gprs->imsi, SETTINGS_STORE, + gprs->settings); + } + gprs_netreg_update(gprs); } else if (!strcmp(property, "Powered")) { if (!gprs->driver->set_attached) @@ -717,6 +730,13 @@ static DBusMessage *gprs_set_property(DBusConnection *conn, gprs->powered = value; + if (gprs->settings) { + g_key_file_set_integer(gprs->settings, SETTINGS_GROUP, + "Powered", gprs->powered); + storage_sync(gprs->imsi, SETTINGS_STORE, + gprs->settings); + } + gprs_netreg_update(gprs); } else return __ofono_error_invalid_args(msg); @@ -1178,6 +1198,15 @@ static void gprs_unregister(struct ofono_atom *atom) const char *path = __ofono_atom_get_path(atom); GSList *l; + if (gprs->settings) { + storage_close(gprs->imsi, SETTINGS_STORE, + gprs->settings, TRUE); + + g_free(gprs->imsi); + gprs->imsi = NULL; + gprs->settings = NULL; + } + for (l = gprs->contexts; l; l = l->next) { struct pri_context *context = l->data; @@ -1284,12 +1313,50 @@ static void netreg_watch(struct ofono_atom *atom, gprs_netreg_update(gprs); } +static void gprs_load_settings(struct ofono_gprs *gprs, const char *imsi) +{ + GError *error = NULL; + + gprs->settings = storage_open(imsi, SETTINGS_STORE); + + if (gprs->settings == NULL) + return; + + gprs->imsi = g_strdup(imsi); + + gprs->powered = g_key_file_get_boolean(gprs->settings, SETTINGS_GROUP, + "Powered", &error); + + /* + * If any error occurs, simply switch to defaults. + * Default to Powered = True + * and RoamingAllowed = True + */ + if (error) { + gprs->powered = TRUE; + g_key_file_set_boolean(gprs->settings, SETTINGS_GROUP, + "Powered", gprs->powered); + } + + gprs->roaming_allowed = g_key_file_get_boolean(gprs->settings, + SETTINGS_GROUP, + "RoamingAllowed", NULL); + + if (error) { + gprs->roaming_allowed = TRUE; + g_key_file_set_boolean(gprs->settings, SETTINGS_GROUP, + "RoamingAllowed", + gprs->roaming_allowed); + } +} + void ofono_gprs_register(struct ofono_gprs *gprs) { DBusConnection *conn = ofono_dbus_get_connection(); struct ofono_modem *modem = __ofono_atom_get_modem(gprs->atom); const char *path = __ofono_atom_get_path(gprs->atom); struct ofono_atom *netreg_atom; + struct ofono_atom *sim_atom; if (!g_dbus_register_interface(conn, path, DATA_CONNECTION_MANAGER_INTERFACE, @@ -1303,9 +1370,6 @@ void ofono_gprs_register(struct ofono_gprs *gprs) ofono_modem_add_interface(modem, DATA_CONNECTION_MANAGER_INTERFACE); - /* TODO: Read Powered from SIM store */ - gprs->powered = TRUE; - gprs->netreg_watch = __ofono_modem_add_atom_watch(modem, OFONO_ATOM_TYPE_NETREG, netreg_watch, gprs, NULL); @@ -1316,6 +1380,15 @@ void ofono_gprs_register(struct ofono_gprs *gprs) netreg_watch(netreg_atom, OFONO_ATOM_WATCH_CONDITION_REGISTERED, gprs); + sim_atom = __ofono_modem_find_atom(modem, OFONO_ATOM_TYPE_SIM); + + if (sim_atom) { + struct ofono_sim *sim = __ofono_atom_get_data(sim_atom); + const char *imsi = ofono_sim_get_imsi(sim); + + gprs_load_settings(gprs, imsi); + } + __ofono_atom_register(gprs->atom, gprs_unregister); }