diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2008-12-02 18:31:13 +0100 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2008-12-02 18:31:13 +0100 |
commit | 6193c90589d84e3a8ba09350e6be4479c74c3b38 (patch) | |
tree | 8c59804a5f57ed04f2076bae8c347bca47f54983 /src | |
parent | eed198d63d2396eb77f63f01460ecaab3508653e (diff) | |
download | connman-6193c90589d84e3a8ba09350e6be4479c74c3b38.tar.gz connman-6193c90589d84e3a8ba09350e6be4479c74c3b38.tar.bz2 connman-6193c90589d84e3a8ba09350e6be4479c74c3b38.zip |
Make property setting a little bit more generic
Diffstat (limited to 'src')
-rw-r--r-- | src/element.c | 95 |
1 files changed, 71 insertions, 24 deletions
diff --git a/src/element.c b/src/element.c index 9fd4a018..a05f2cf3 100644 --- a/src/element.c +++ b/src/element.c @@ -223,6 +223,41 @@ static void add_common_properties(struct connman_element *element, __connman_element_unlock(element); } +static void set_common_property(struct connman_element *element, + const char *name, DBusMessageIter *value) +{ + GSList *list; + + if (g_str_equal(name, "Priority") == TRUE) { + dbus_message_iter_get_basic(value, &element->priority); + return; + } + + __connman_element_lock(element); + + for (list = element->properties; list; list = list->next) { + struct connman_property *property = list->data; + const char *str; + + if (g_str_equal(property->name, name) == FALSE) + continue; + + if (property->flags & CONNMAN_PROPERTY_FLAG_STATIC) + continue; + + property->flags &= ~CONNMAN_PROPERTY_FLAG_REFERENCE; + + if (property->type == DBUS_TYPE_STRING) { + dbus_message_iter_get_basic(value, &str); + g_free(property->value); + property->value = g_strdup(str); + } else + property->value = NULL; + } + + __connman_element_unlock(element); +} + static DBusMessage *get_properties(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -374,6 +409,40 @@ static DBusMessage *get_network_properties(DBusConnection *conn, return reply; } +static DBusMessage *set_network_property(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + struct connman_element *element = data; + DBusMessageIter iter; + DBusMessageIter 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, "WiFi.Passphrase") == TRUE) { + const char *str; + + dbus_message_iter_get_basic(&value, &str); + g_free(element->wifi.passphrase); + element->wifi.passphrase = g_strdup(str); + } else + set_common_property(element, name, &value); + + __connman_element_store(element); + + return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); +} + static DBusMessage *get_connection_properties(DBusConnection *conn, DBusMessage *msg, void *data) { @@ -408,7 +477,6 @@ static DBusMessage *set_property(DBusConnection *conn, DBusMessageIter iter; DBusMessageIter value; const char *name; - GSList *list; DBG("conn %p", conn); @@ -422,29 +490,7 @@ static DBusMessage *set_property(DBusConnection *conn, if (__connman_security_check_privileges(msg) < 0) return __connman_error_permission_denied(msg); - __connman_element_lock(element); - - for (list = element->properties; list; list = list->next) { - struct connman_property *property = list->data; - const char *str; - - if (g_str_equal(property->name, name) == FALSE) - continue; - - if (property->flags & CONNMAN_PROPERTY_FLAG_STATIC) - continue; - - property->flags &= ~CONNMAN_PROPERTY_FLAG_REFERENCE; - - if (property->type == DBUS_TYPE_STRING) { - dbus_message_iter_get_basic(&value, &str); - g_free(property->value); - property->value = g_strdup(str); - } else - property->value = NULL; - } - - __connman_element_unlock(element); + set_common_property(element, name, &value); return g_dbus_create_reply(msg, DBUS_TYPE_INVALID); } @@ -584,6 +630,7 @@ static GDBusMethodTable device_methods[] = { static GDBusMethodTable network_methods[] = { { "GetProperties", "", "a{sv}", get_network_properties }, + { "SetProperty", "sv", "", set_network_property }, { }, }; |