diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2009-12-31 01:31:45 -0800 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2009-12-31 01:31:45 -0800 |
commit | 2b1e2d01d040dceac55aa3efca707a7ce8521f9c (patch) | |
tree | b50f254d852c4cebd465c908151ec91ffc220628 /tools/supplicant-dbus.c | |
parent | cd07fbeb1af81232dfb452ec7494bdc33051371e (diff) | |
download | connman-2b1e2d01d040dceac55aa3efca707a7ce8521f9c.tar.gz connman-2b1e2d01d040dceac55aa3efca707a7ce8521f9c.tar.bz2 connman-2b1e2d01d040dceac55aa3efca707a7ce8521f9c.zip |
Add interface creation function to supplicant test program
Diffstat (limited to 'tools/supplicant-dbus.c')
-rw-r--r-- | tools/supplicant-dbus.c | 143 |
1 files changed, 142 insertions, 1 deletions
diff --git a/tools/supplicant-dbus.c b/tools/supplicant-dbus.c index e0e0432e..c95f2e77 100644 --- a/tools/supplicant-dbus.c +++ b/tools/supplicant-dbus.c @@ -32,7 +32,7 @@ #define TIMEOUT 5000 -static DBusConnection *connection; +static DBusConnection *connection = NULL; void supplicant_dbus_setup(DBusConnection *conn) { @@ -137,6 +137,9 @@ int supplicant_dbus_property_get_all(const char *path, const char *interface, DBusMessage *message; DBusPendingCall *call; + if (connection == NULL) + return -EINVAL; + if (path == NULL || interface == NULL) return -EINVAL; @@ -221,6 +224,9 @@ int supplicant_dbus_property_set(const char *path, const char *interface, DBusMessageIter iter, value; DBusPendingCall *call; + if (connection == NULL) + return -EINVAL; + if (path == NULL || interface == NULL) return -EINVAL; @@ -272,3 +278,138 @@ int supplicant_dbus_property_set(const char *path, const char *interface, return 0; } + +struct method_call_data { + supplicant_dbus_result_function function; + void *user_data; +}; + +static void method_call_reply(DBusPendingCall *call, void *user_data) +{ + struct method_call_data *data = user_data; + DBusMessage *reply; + DBusMessageIter iter; + const char *error; + + reply = dbus_pending_call_steal_reply(call); + if (reply == NULL) + return; + + if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) + error = dbus_message_get_error_name(reply); + else + error = NULL; + + if (dbus_message_iter_init(reply, &iter) == FALSE) + goto done; + + if (data->function != NULL) + data->function(error, &iter, data->user_data); + +done: + dbus_message_unref(reply); +} + +int supplicant_dbus_method_call(const char *path, + const char *interface, const char *method, + supplicant_dbus_setup_function setup, + supplicant_dbus_result_function function, + void *user_data) +{ + struct method_call_data *data; + DBusMessage *message; + DBusMessageIter iter; + DBusPendingCall *call; + + if (connection == NULL) + return -EINVAL; + + if (path == NULL || interface == NULL) + return -EINVAL; + + if (method == NULL || setup == NULL) + return -EINVAL; + + data = dbus_malloc0(sizeof(*data)); + if (data == NULL) + return -ENOMEM; + + message = dbus_message_new_method_call(SUPPLICANT_SERVICE, path, + interface, method); + if (message == NULL) { + dbus_free(data); + return -ENOMEM; + } + + dbus_message_set_auto_start(message, FALSE); + + dbus_message_iter_init_append(message, &iter); + setup(&iter, user_data); + + if (dbus_connection_send_with_reply(connection, message, + &call, TIMEOUT) == FALSE) { + dbus_message_unref(message); + dbus_free(data); + return -EIO; + } + + if (call == NULL) { + dbus_message_unref(message); + dbus_free(data); + return -EIO; + } + + data->function = function; + data->user_data = user_data; + + dbus_pending_call_set_notify(call, method_call_reply, + data, dbus_free); + + dbus_message_unref(message); + + return 0; +} + +void supplicant_dbus_property_append_basic(DBusMessageIter *iter, + const char *key, int type, void *val) +{ + DBusMessageIter value; + const char *signature; + + dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &key); + + switch (type) { + case DBUS_TYPE_BOOLEAN: + signature = DBUS_TYPE_BOOLEAN_AS_STRING; + break; + case DBUS_TYPE_STRING: + signature = DBUS_TYPE_STRING_AS_STRING; + break; + case DBUS_TYPE_BYTE: + signature = DBUS_TYPE_BYTE_AS_STRING; + break; + case DBUS_TYPE_UINT16: + signature = DBUS_TYPE_UINT16_AS_STRING; + break; + case DBUS_TYPE_INT16: + signature = DBUS_TYPE_INT16_AS_STRING; + break; + case DBUS_TYPE_UINT32: + signature = DBUS_TYPE_UINT32_AS_STRING; + break; + case DBUS_TYPE_INT32: + signature = DBUS_TYPE_INT32_AS_STRING; + break; + case DBUS_TYPE_OBJECT_PATH: + signature = DBUS_TYPE_OBJECT_PATH_AS_STRING; + break; + default: + signature = DBUS_TYPE_VARIANT_AS_STRING; + break; + } + + dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, + signature, &value); + dbus_message_iter_append_basic(&value, type, val); + dbus_message_iter_close_container(iter, &value); +} |