This email list is read-only. Emails sent to this list will be discarded ---------------------------------- src/connman.h | 2 + src/device.c | 29 ++++++++++++++ src/manager.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++---- test/test-manager | 6 +++ 4 files changed, 134 insertions(+), 9 deletions(-)
New commits: commit b8df778e082b32d410f8c5f7a42a59de13427b1a Author: Marcel Holtmann <[email protected]> Date: Tue Jan 6 02:05:30 2009 +0100 Add support for basic flight mode implementation commit 64af510378fbd97f37553dc47db96d55e281afae Author: Marcel Holtmann <[email protected]> Date: Tue Jan 6 01:40:06 2009 +0100 Add support for showing flight mode Diff in this email is a maximum of 400 lines. diff --git a/src/connman.h b/src/connman.h index df2b4c4..b160719 100644 --- a/src/connman.h +++ b/src/connman.h @@ -157,6 +157,8 @@ void __connman_device_decrease_connections(struct connman_device *device); connman_bool_t __connman_device_has_driver(struct connman_device *device); +int __connman_device_set_flightmode(connman_bool_t flightmode); + #include <connman/network.h> int __connman_network_init(void); diff --git a/src/device.c b/src/device.c index f6bad3b..1d888e9 100644 --- a/src/device.c +++ b/src/device.c @@ -1062,6 +1062,35 @@ const char *connman_device_get_string(struct connman_device *device, return NULL; } +static void set_flightmode(struct connman_element *element, gpointer user_data) +{ + struct connman_device *device = element->device; + connman_bool_t flightmode = GPOINTER_TO_UINT(user_data); + connman_bool_t powered; + + DBG("element %p name %s", element, element->name); + + if (device == NULL) + return; + + powered = (flightmode == TRUE) ? FALSE : TRUE; + + if (device->powered == powered) + return; + + set_powered(device, powered); +} + +int __connman_device_set_flightmode(connman_bool_t flightmode) +{ + DBG("flightmode %d", flightmode); + + __connman_element_foreach(NULL, CONNMAN_ELEMENT_TYPE_DEVICE, + set_flightmode, GUINT_TO_POINTER(flightmode)); + + return 0; +} + void __connman_device_increase_connections(struct connman_device *device) { device->connections++; diff --git a/src/manager.c b/src/manager.c index ec579ff..7143974 100644 --- a/src/manager.c +++ b/src/manager.c @@ -27,6 +27,44 @@ #include "connman.h" +enum connman_policy { + CONNMAN_POLICY_UNKNOWN = 0, + CONNMAN_POLICY_SINGLE = 1, + CONNMAN_POLICY_MULTIPLE = 2, + CONNMAN_POLICY_ASK = 3, +}; + +static enum connman_policy global_policy = CONNMAN_POLICY_SINGLE; +static connman_bool_t global_flightmode = FALSE; + +static const char *policy2string(enum connman_policy policy) +{ + switch (policy) { + case CONNMAN_POLICY_UNKNOWN: + break; + case CONNMAN_POLICY_SINGLE: + return "single"; + case CONNMAN_POLICY_MULTIPLE: + return "multiple"; + case CONNMAN_POLICY_ASK: + return "ask"; + } + + return NULL; +} + +static enum connman_policy string2policy(const char *policy) +{ + if (g_str_equal(policy, "single") == TRUE) + return CONNMAN_POLICY_SINGLE; + else if (g_str_equal(policy, "multiple") == TRUE) + return CONNMAN_POLICY_MULTIPLE; + else if (g_str_equal(policy, "ask") == TRUE) + return CONNMAN_POLICY_ASK; + else + return CONNMAN_POLICY_UNKNOWN; +} + static void append_profiles(DBusMessageIter *dict) { DBusMessageIter entry, value, iter; @@ -110,7 +148,7 @@ static DBusMessage *get_properties(DBusConnection *conn, { DBusMessage *reply; DBusMessageIter array, dict; - const char *state, *policy = "single"; + const char *str; DBG("conn %p", conn); @@ -131,21 +169,70 @@ static DBusMessage *get_properties(DBusConnection *conn, append_connections(&dict); if (__connman_element_count(NULL, CONNMAN_ELEMENT_TYPE_CONNECTION) > 0) - state = "online"; + str = "online"; else - state = "offline"; + str = "offline"; connman_dbus_dict_append_variant(&dict, "State", - DBUS_TYPE_STRING, &state); + DBUS_TYPE_STRING, &str); - connman_dbus_dict_append_variant(&dict, "Policy", - DBUS_TYPE_STRING, &policy); + str = policy2string(global_policy); + if (str != NULL) + connman_dbus_dict_append_variant(&dict, "Policy", + DBUS_TYPE_STRING, &str); + + connman_dbus_dict_append_variant(&dict, "FlightMode", + DBUS_TYPE_BOOLEAN, &global_flightmode); dbus_message_iter_close_container(&array, &dict); return reply; } +static DBusMessage *set_property(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + DBusMessageIter iter, value; + const char *name; + + DBG("conn %p", conn); + + if (dbus_message_iter_init(msg, &iter) == FALSE) + return __connman_error_invalid_arguments(msg); + + dbus_message_iter_get_basic(&iter, &name); + dbus_message_iter_next(&iter); + dbus_message_iter_recurse(&iter, &value); + + if (__connman_security_check_privileges(msg) < 0) + return __connman_error_permission_denied(msg); + + if (g_str_equal(name, "Policy") == TRUE) { + enum connman_policy policy; + const char *str; + + dbus_message_iter_get_basic(&value, &str); + policy = string2policy(str); + if (policy == CONNMAN_POLICY_UNKNOWN) + return __connman_error_invalid_arguments(msg); + + global_policy = policy; + } else if (g_str_equal(name, "FlightMode") == TRUE) { + connman_bool_t flightmode; + + dbus_message_iter_get_basic(&value, &flightmode); + + if (global_flightmode == flightmode) + return __connman_error_invalid_arguments(msg); + + global_flightmode = flightmode; + + __connman_device_set_flightmode(flightmode); + } + + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); +} + static DBusMessage *register_agent(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -195,9 +282,10 @@ static DBusMessage *unregister_agent(DBusConnection *conn, } static GDBusMethodTable manager_methods[] = { - { "GetProperties", "", "a{sv}", get_properties }, - { "RegisterAgent", "o", "", register_agent }, - { "UnregisterAgent", "o", "", unregister_agent }, + { "GetProperties", "", "a{sv}", get_properties }, + { "SetProperty", "sv", "", set_property }, + { "RegisterAgent", "o", "", register_agent }, + { "UnregisterAgent", "o", "", unregister_agent }, { }, }; diff --git a/test/test-manager b/test/test-manager index 09c6e19..ea976ca 100755 --- a/test/test-manager +++ b/test/test-manager @@ -54,6 +54,12 @@ def print_properties(key, value): for key in properties.keys(): if key in ["Profiles", "Devices", "Connections"]: print_properties(key, properties[key]) + elif key in ["FlightMode"]: + print "%s" % (key) + if properties[key] == dbus.Boolean(1): + print " true" + else: + print " false" else: print "%s" % (key) print " %s" % (properties[key]) _______________________________________________ Commits mailing list [email protected] https://lists.moblin.org/mailman/listinfo/commits
