From 83bd9d00ec580988e38178ea1526505241535fdd Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Wed, 9 Jan 2008 16:48:33 +0100 Subject: [PATCH] Add support for retrieving network settings --- include/iface.h | 1 + src/iface.c | 176 ++++++++++++++++++++++++++++++++++++------------------- 2 files changed, 116 insertions(+), 61 deletions(-) diff --git a/include/iface.h b/include/iface.h index a7c9f09..601253d 100644 --- a/include/iface.h +++ b/include/iface.h @@ -81,6 +81,7 @@ struct connman_ipv4 { struct connman_network { char *essid; + char *psk; }; struct connman_iface { diff --git a/src/iface.c b/src/iface.c index a5327f5..f309893 100644 --- a/src/iface.c +++ b/src/iface.c @@ -525,6 +525,116 @@ static DBusMessage *set_policy(DBusConnection *conn, return reply; } +static void append_network(DBusMessage *reply, + struct connman_iface *iface, gboolean secrets) +{ + DBusMessageIter array, dict; + + dbus_message_iter_init_append(reply, &array); + + dbus_message_iter_open_container(&array, DBUS_TYPE_ARRAY, + DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING + DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING + DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict); + + if (iface->network.essid != NULL) + append_entry(&dict, "ESSID", + DBUS_TYPE_STRING, &iface->network.essid); + + if (secrets == TRUE && iface->network.psk != NULL) + append_entry(&dict, "PSK", + DBUS_TYPE_STRING, &iface->network.psk); + + dbus_message_iter_close_container(&array, &dict); +} + +static DBusMessage *get_network(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + struct connman_iface *iface = data; + DBusMessage *reply; + + DBG("conn %p", conn); + + reply = dbus_message_new_method_return(msg); + if (reply == NULL) + return NULL; + + append_network(reply, iface, TRUE); + + return reply; +} + +static DBusMessage *set_network(DBusConnection *conn, + DBusMessage *msg, void *data) +{ + struct connman_iface *iface = data; + DBusMessage *reply, *signal; + DBusMessageIter array, dict; + gboolean changed = FALSE; + + DBG("conn %p", conn); + + dbus_message_iter_init(msg, &array); + + dbus_message_iter_recurse(&array, &dict); + + while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) { + DBusMessageIter entry, value; + const char *key, *val; + + dbus_message_iter_recurse(&dict, &entry); + dbus_message_iter_get_basic(&entry, &key); + + dbus_message_iter_next(&entry); + + dbus_message_iter_recurse(&entry, &value); + + //type = dbus_message_iter_get_arg_type(&value); + dbus_message_iter_get_basic(&value, &val); + + if (g_strcasecmp(key, "ESSID") == 0) { + g_free(iface->network.essid); + iface->network.essid = g_strdup(val); + if (iface->driver->set_network) + iface->driver->set_network(iface, val); + changed = TRUE; + } + + if (g_strcasecmp(key, "PSK") == 0) { + g_free(iface->network.psk); + iface->network.psk = g_strdup(val); + if (iface->driver->set_network) + iface->driver->set_passphrase(iface, val); + changed = TRUE; + } + + dbus_message_iter_next(&dict); + } + + reply = dbus_message_new_method_return(msg); + if (reply == NULL) + return NULL; + + dbus_message_append_args(reply, DBUS_TYPE_INVALID); + + if (changed == TRUE) { + const char *path = dbus_message_get_path(msg); + + __connman_iface_store(iface); + + signal = dbus_message_new_signal(path, + CONNMAN_IFACE_INTERFACE, "NetworkChanged"); + if (signal != NULL) { + append_network(signal, iface, FALSE); + dbus_connection_send(conn, signal, NULL); + dbus_message_unref(signal); + } + } + + return reply; +} + static void append_ipv4(DBusMessage *reply, struct connman_iface *iface) { DBusMessageIter array, dict; @@ -581,7 +691,6 @@ static DBusMessage *set_ipv4(DBusConnection *conn, struct connman_iface *iface = data; DBusMessage *reply, *signal; DBusMessageIter array, dict; - const char *path; gboolean changed = FALSE; DBG("conn %p", conn); @@ -647,9 +756,9 @@ static DBusMessage *set_ipv4(DBusConnection *conn, dbus_message_append_args(reply, DBUS_TYPE_INVALID); - path = dbus_message_get_path(msg); - if (changed == TRUE) { + const char *path = dbus_message_get_path(msg); + __connman_iface_store(iface); signal = dbus_message_new_signal(path, @@ -664,62 +773,6 @@ static DBusMessage *set_ipv4(DBusConnection *conn, return reply; } -static DBusMessage *set_network(DBusConnection *conn, - DBusMessage *msg, void *data) -{ - struct connman_iface *iface = data; - DBusMessage *reply; - DBusMessageIter array, dict; - gboolean changed = FALSE; - - DBG("conn %p", conn); - - dbus_message_iter_init(msg, &array); - - dbus_message_iter_recurse(&array, &dict); - - while (dbus_message_iter_get_arg_type(&dict) == DBUS_TYPE_DICT_ENTRY) { - DBusMessageIter entry, value; - const char *key, *val; - - dbus_message_iter_recurse(&dict, &entry); - dbus_message_iter_get_basic(&entry, &key); - - dbus_message_iter_next(&entry); - - dbus_message_iter_recurse(&entry, &value); - - //type = dbus_message_iter_get_arg_type(&value); - dbus_message_iter_get_basic(&value, &val); - - if (g_strcasecmp(key, "ESSID") == 0) { - g_free(iface->network.essid); - iface->network.essid = g_strdup(val); - if (iface->driver->set_network) - iface->driver->set_network(iface, val); - changed = TRUE; - } - - if (g_strcasecmp(key, "PSK") == 0) { - if (iface->driver->set_network) - iface->driver->set_passphrase(iface, val); - } - - dbus_message_iter_next(&dict); - } - - reply = dbus_message_new_method_return(msg); - if (reply == NULL) - return NULL; - - dbus_message_append_args(reply, DBUS_TYPE_INVALID); - - if (changed == TRUE) - __connman_iface_store(iface); - - return reply; -} - static GDBusMethodTable iface_methods[] = { { "Scan", "", "", scan_iface }, { "GetProperties", "", "a{sv}", get_properties }, @@ -727,9 +780,10 @@ static GDBusMethodTable iface_methods[] = { { "GetSignal", "", "q", get_signal }, { "GetPolicy", "", "s", get_policy }, { "SetPolicy", "s", "", set_policy }, + { "GetNetwork", "", "a{sv}", get_network }, + { "SetNetwork", "a{sv}", "", set_network }, { "GetIPv4", "", "a{sv}", get_ipv4 }, { "SetIPv4", "a{sv}", "", set_ipv4 }, - { "SetNetwork", "a{sv}", "", set_network }, { }, }; @@ -737,8 +791,8 @@ static GDBusSignalTable iface_signals[] = { { "StateChanged", "s" }, { "SignalChanged", "q" }, { "PolicyChanged", "s" }, - { "IPv4Changed", "a{sv}" }, { "NetworkChanged", "a{sv}" }, + { "IPv4Changed", "a{sv}" }, { }, }; -- 1.7.9.5