summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2009-07-22 12:55:26 +0200
committerMarcel Holtmann <marcel@holtmann.org>2009-07-22 12:55:26 +0200
commitf1d33fcac327890a4a32b6591025ad245c2f9a85 (patch)
tree25efd35350cb9e100c3c83c515302dc810d6932f
parent5b69740e1c72bd261bc37adc6fbbf09fa50cc5a2 (diff)
downloadconnman-f1d33fcac327890a4a32b6591025ad245c2f9a85.tar.gz
connman-f1d33fcac327890a4a32b6591025ad245c2f9a85.tar.bz2
connman-f1d33fcac327890a4a32b6591025ad245c2f9a85.zip
Add support for persistent storage of device power state
-rw-r--r--src/connman.h2
-rw-r--r--src/device.c124
-rw-r--r--src/element.c4
3 files changed, 80 insertions, 50 deletions
diff --git a/src/connman.h b/src/connman.h
index b30c893a..aa4c2ee4 100644
--- a/src/connman.h
+++ b/src/connman.h
@@ -214,7 +214,9 @@ void __connman_device_cleanup_networks(struct connman_device *device);
int __connman_device_scan(struct connman_device *device);
int __connman_device_enable(struct connman_device *device);
+int __connman_device_enable_persistent(struct connman_device *device);
int __connman_device_disable(struct connman_device *device);
+int __connman_device_disable_persistent(struct connman_device *device);
int __connman_device_connect(struct connman_device *device);
int __connman_device_disconnect(struct connman_device *device);
diff --git a/src/device.c b/src/device.c
index 53a6bd62..710c6cef 100644
--- a/src/device.c
+++ b/src/device.c
@@ -38,6 +38,7 @@ struct connman_device {
enum connman_device_mode mode;
connman_bool_t secondary;
connman_bool_t powered;
+ connman_bool_t powered_persistent;
connman_bool_t carrier;
connman_bool_t scanning;
connman_bool_t disconnected;
@@ -484,6 +485,10 @@ static DBusMessage *set_property(DBusConnection *conn,
dbus_message_iter_get_basic(&value, &powered);
+ device->powered_persistent = powered;
+
+ __connman_storage_save_device(device);
+
if (device->powered == powered)
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
@@ -522,6 +527,8 @@ static DBusMessage *set_property(DBusConnection *conn,
if (device->scan_interval != interval) {
device->scan_interval = interval;
+ __connman_storage_save_device(device);
+
reset_scan_trigger(device);
}
} else if (g_str_has_prefix(name, "IPv4.") == TRUE) {
@@ -543,8 +550,6 @@ static DBusMessage *set_property(DBusConnection *conn,
} else
return __connman_error_invalid_property(msg);
- __connman_storage_save_device(device);
-
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
@@ -656,46 +661,6 @@ static void unregister_interface(struct connman_element *element)
CONNMAN_DEVICE_INTERFACE);
}
-static void device_enable(struct connman_device *device)
-{
- DBG("device %p", device);
-
- if (device->powered == TRUE)
- return;
-
- if (device->driver->enable) {
- if (device->driver->enable(device) == 0) {
- enum connman_service_type type;
-
- device->powered = TRUE;
-
- type = __connman_device_get_service_type(device);
- __connman_notifier_enable(type);
- }
- }
-}
-
-static void device_disable(struct connman_device *device)
-{
- DBG("device %p", device);
-
- if (device->powered == FALSE)
- return;
-
- g_hash_table_remove_all(device->networks);
-
- if (device->driver->disable) {
- if (device->driver->disable(device) == 0) {
- enum connman_service_type type;
-
- device->powered = FALSE;
-
- type = __connman_device_get_service_type(device);
- __connman_notifier_disable(type);
- }
- }
-}
-
static int setup_device(struct connman_device *device)
{
int err;
@@ -721,7 +686,8 @@ static int setup_device(struct connman_device *device)
break;
}
- device_enable(device);
+ if (device->powered_persistent == TRUE)
+ __connman_device_enable(device);
return 0;
}
@@ -753,7 +719,7 @@ static void remove_device(struct connman_device *device)
{
DBG("device %p", device);
- device_disable(device);
+ __connman_device_disable(device);
switch (device->mode) {
case CONNMAN_DEVICE_MODE_UNKNOWN:
@@ -927,6 +893,8 @@ struct connman_device *connman_device_create(const char *node,
device->mode = CONNMAN_DEVICE_MODE_UNKNOWN;
device->secondary = FALSE;
+ device->powered_persistent = TRUE;
+
switch (type) {
case CONNMAN_DEVICE_TYPE_UNKNOWN:
case CONNMAN_DEVICE_TYPE_VENDOR:
@@ -1249,30 +1217,78 @@ int __connman_device_scan(struct connman_device *device)
int __connman_device_enable(struct connman_device *device)
{
+ enum connman_service_type type;
+ int err;
+
+ DBG("device %p", device);
+
if (!device->driver || !device->driver->enable)
return -EOPNOTSUPP;
if (device->powered == TRUE)
return -EALREADY;
- device_enable(device);
+ err = device->driver->enable(device);
+ if (err < 0)
+ return err;
+
+ device->powered = TRUE;
+
+ type = __connman_device_get_service_type(device);
+ __connman_notifier_enable(type);
return 0;
}
+int __connman_device_enable_persistent(struct connman_device *device)
+{
+ DBG("device %p", device);
+
+ device->powered_persistent = TRUE;
+
+ __connman_storage_save_device(device);
+
+ return __connman_device_enable(device);
+}
+
int __connman_device_disable(struct connman_device *device)
{
+ enum connman_service_type type;
+ int err;
+
+ DBG("device %p", device);
+
if (!device->driver || !device->driver->disable)
return -EOPNOTSUPP;
if (device->powered == FALSE)
return -ENOLINK;
- device_disable(device);
+ g_hash_table_remove_all(device->networks);
+
+ err = device->driver->disable(device);
+ if (err < 0)
+ return err;
+
+ device->powered = FALSE;
+
+ type = __connman_device_get_service_type(device);
+ __connman_notifier_disable(type);
return 0;
}
+int __connman_device_disable_persistent(struct connman_device *device)
+{
+ DBG("device %p", device);
+
+ device->powered_persistent = FALSE;
+
+ __connman_storage_save_device(device);
+
+ return __connman_device_disable(device);
+}
+
int __connman_device_connect(struct connman_device *device)
{
DBG("device %p", device);
@@ -1806,8 +1822,10 @@ static struct connman_driver device_driver = {
static int device_load(struct connman_device *device)
{
GKeyFile *keyfile;
+ GError *error = NULL;
gchar *pathname, *identifier, *data = NULL;
gsize length;
+ connman_bool_t powered;
int val;
DBG("device %p", device);
@@ -1838,6 +1856,12 @@ static int device_load(struct connman_device *device)
if (identifier == NULL)
goto done;
+ powered = g_key_file_get_boolean(keyfile, identifier,
+ "Powered", &error);
+ if (error == NULL)
+ device->powered_persistent = powered;
+ g_clear_error(&error);
+
switch (device->mode) {
case CONNMAN_DEVICE_MODE_UNKNOWN:
case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
@@ -1845,9 +1869,10 @@ static int device_load(struct connman_device *device)
case CONNMAN_DEVICE_MODE_NETWORK_SINGLE:
case CONNMAN_DEVICE_MODE_NETWORK_MULTIPLE:
val = g_key_file_get_integer(keyfile, identifier,
- "ScanInterval", NULL);
- if (val > 0)
+ "ScanInterval", &error);
+ if (error == NULL && val > 0)
device->scan_interval = val;
+ g_clear_error(&error);
break;
}
@@ -1890,6 +1915,9 @@ update:
if (identifier == NULL)
goto done;
+ g_key_file_set_boolean(keyfile, identifier,
+ "Powered", device->powered_persistent);
+
switch (device->mode) {
case CONNMAN_DEVICE_MODE_UNKNOWN:
case CONNMAN_DEVICE_MODE_TRANSPORT_IP:
diff --git a/src/element.c b/src/element.c
index b25ab302..c6b97d97 100644
--- a/src/element.c
+++ b/src/element.c
@@ -447,7 +447,7 @@ static gboolean enable_technology(GNode *node, gpointer user_data)
break;
}
- __connman_device_enable(element->device);
+ __connman_device_enable_persistent(element->device);
return FALSE;
}
@@ -496,7 +496,7 @@ static gboolean disable_technology(GNode *node, gpointer user_data)
break;
}
- __connman_device_disable(element->device);
+ __connman_device_disable_persistent(element->device);
return FALSE;
}