summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorPatrik Flykt <patrik.flykt@linux.intel.com>2013-03-27 13:54:01 +0200
committerPatrik Flykt <patrik.flykt@linux.intel.com>2013-04-04 10:26:28 +0300
commit89c862fd565f3a1aafa551015f4bd682c65470d9 (patch)
treedb3472063ac649604032718c11860c42464a1052 /client
parentd368f94c5dbff8a75d735b1adf31775f9924c701 (diff)
downloadconnman-89c862fd565f3a1aafa551015f4bd682c65470d9.tar.gz
connman-89c862fd565f3a1aafa551015f4bd682c65470d9.tar.bz2
connman-89c862fd565f3a1aafa551015f4bd682c65470d9.zip
client: Add support functions for setting properties
Add support functions for setting basic, dictionary and array properties.
Diffstat (limited to 'client')
-rw-r--r--client/dbus_helpers.c206
-rw-r--r--client/dbus_helpers.h23
2 files changed, 213 insertions, 16 deletions
diff --git a/client/dbus_helpers.c b/client/dbus_helpers.c
index ccdf695d..2cc6e619 100644
--- a/client/dbus_helpers.c
+++ b/client/dbus_helpers.c
@@ -157,27 +157,14 @@ end:
dbus_message_unref(reply);
}
-int __connmanctl_dbus_method_call(DBusConnection *connection, const char *path,
- const char *interface, const char *method,
- connmanctl_dbus_method_return_func_t cb, void * user_data,
- int arg1, ...)
+static int send_method_call(DBusConnection *connection,
+ DBusMessage *message, connmanctl_dbus_method_return_func_t cb,
+ void *user_data)
{
int res = -ENXIO;
- DBusMessage *message;
- va_list args;
DBusPendingCall *call;
struct dbus_callback *callback;
- message = dbus_message_new_method_call("net.connman", path,
- interface, method);
-
- if (message == NULL)
- return -ENOMEM;
-
- va_start(args, arg1);
- dbus_message_append_args_valist(message, arg1, args);
- va_end(args);
-
if (dbus_connection_send_with_reply(connection, message, &call,
TIMEOUT) == FALSE)
goto end;
@@ -198,3 +185,190 @@ end:
dbus_message_unref(message);
return res;
}
+
+static int append_variant(DBusMessageIter *iter, const char *property,
+ int type, void *value)
+{
+ DBusMessageIter variant;
+ char *type_str;
+
+ switch(type) {
+ case DBUS_TYPE_BOOLEAN:
+ type_str = DBUS_TYPE_BOOLEAN_AS_STRING;
+ break;
+ case DBUS_TYPE_BYTE:
+ type_str = DBUS_TYPE_BYTE_AS_STRING;
+ break;
+ case DBUS_TYPE_STRING:
+ type_str = DBUS_TYPE_STRING_AS_STRING;
+ break;
+ default:
+ return -EOPNOTSUPP;
+ }
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &property);
+ dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, type_str,
+ &variant);
+ dbus_message_iter_append_basic(&variant, type, value);
+ dbus_message_iter_close_container(iter, &variant);
+
+ return 0;
+}
+
+int __connmanctl_dbus_method_call(DBusConnection *connection, const char *path,
+ const char *interface, const char *method,
+ connmanctl_dbus_method_return_func_t cb, void *user_data,
+ int arg1, ...)
+{
+ DBusMessage *message;
+ va_list args;
+
+ message = dbus_message_new_method_call("net.connman", path,
+ interface, method);
+
+ if (message == NULL)
+ return -ENOMEM;
+
+ va_start(args, arg1);
+ dbus_message_append_args_valist(message, arg1, args);
+ va_end(args);
+
+ return send_method_call(connection, message, cb, user_data);
+}
+
+int __connmanctl_dbus_set_property(DBusConnection *connection,
+ const char *path, const char *interface,
+ connmanctl_dbus_method_return_func_t cb, void * user_data,
+ const char *property, int type, void *value)
+{
+ DBusMessage *message;
+ DBusMessageIter iter;
+
+ message = dbus_message_new_method_call("net.connman", path,
+ interface, "SetProperty");
+
+ if (message == NULL)
+ return -ENOMEM;
+
+ dbus_message_iter_init_append(message, &iter);
+
+ if (append_variant(&iter, property, type, value) < 0) {
+ dbus_message_unref(message);
+ return -EINVAL;
+ }
+
+ return send_method_call(connection, message, cb, user_data);
+}
+
+void __connmanctl_dbus_append_dict_entry(DBusMessageIter *iter, char *property,
+ int type, void *value)
+{
+ DBusMessageIter dict_entry;
+
+ dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL,
+ &dict_entry);
+
+ append_variant(&dict_entry, property, type, value);
+
+ dbus_message_iter_close_container(iter, &dict_entry);
+}
+
+int __connmanctl_dbus_set_property_dict(DBusConnection *connection,
+ const char *path, const char *interface,
+ connmanctl_dbus_method_return_func_t cb, void *user_data,
+ const char *property, int type,
+ connman_dbus_append_cb_t append_fn, void *append_user_data)
+{
+ DBusMessage *message;
+ DBusMessageIter iter, variant, dict;
+
+ message = dbus_message_new_method_call("net.connman", path,
+ interface, "SetProperty");
+
+ if (message == NULL)
+ return -ENOMEM;
+
+ dbus_message_iter_init_append(message, &iter);
+ dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &property);
+ dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_ARRAY_AS_STRING
+ DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING
+ DBUS_TYPE_VARIANT_AS_STRING
+ DBUS_DICT_ENTRY_END_CHAR_AS_STRING,
+ &variant);
+
+ dbus_message_iter_open_container(&variant, 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);
+
+ append_fn(&dict, append_user_data);
+
+ dbus_message_iter_close_container(&variant, &dict);
+ dbus_message_iter_close_container(&iter, &variant);
+
+ return send_method_call(connection, message, cb, user_data);
+}
+
+static void append_variant_array(DBusMessageIter *iter, const char *property,
+ connman_dbus_append_cb_t append_fn, void *append_user_data)
+{
+ DBusMessageIter variant, array;
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &property);
+ dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT,
+ DBUS_TYPE_ARRAY_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING,
+ &variant);
+
+ dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY,
+ DBUS_TYPE_STRING_AS_STRING, &array);
+
+ append_fn(&array, append_user_data);
+
+ dbus_message_iter_close_container(&variant, &array);
+ dbus_message_iter_close_container(iter, &variant);
+}
+
+void __connmanctl_dbus_append_dict_string_array(DBusMessageIter *iter,
+ const char *property, connman_dbus_append_cb_t append_fn,
+ void *append_user_data)
+{
+ DBusMessageIter dict_entry;
+
+ dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY, NULL,
+ &dict_entry);
+
+ append_variant_array(&dict_entry, property, append_fn,
+ append_user_data);
+
+ dbus_message_iter_close_container(iter, &dict_entry);
+}
+
+int __connmanctl_dbus_set_property_array(DBusConnection *connection,
+ const char *path, const char *interface,
+ connmanctl_dbus_method_return_func_t cb, void *user_data,
+ const char *property, int type,
+ connman_dbus_append_cb_t append_fn, void *append_user_data)
+{
+ DBusMessage *message;
+ DBusMessageIter iter;
+
+ if (type != DBUS_TYPE_STRING)
+ return -EOPNOTSUPP;
+
+ message = dbus_message_new_method_call("net.connman", path,
+ interface, "SetProperty");
+
+ if (message == NULL)
+ return -ENOMEM;
+
+ dbus_message_iter_init_append(message, &iter);
+
+ append_variant_array(&iter, property, append_fn, append_user_data);
+
+ return send_method_call(connection, message, cb, user_data);
+}
diff --git a/client/dbus_helpers.h b/client/dbus_helpers.h
index be312d7e..f014ac9f 100644
--- a/client/dbus_helpers.h
+++ b/client/dbus_helpers.h
@@ -24,6 +24,7 @@
#define __CONNMANCTL_DBUS_HELPERS_H
#include <dbus/dbus.h>
+#include "../include/dbus.h"
#ifdef __cplusplus
extern "C" {
@@ -39,6 +40,28 @@ int __connmanctl_dbus_method_call(DBusConnection *connection, const char *path,
connmanctl_dbus_method_return_func_t cb, void * user_data,
int arg1, ...);
+int __connmanctl_dbus_set_property(DBusConnection *connection,
+ const char *path, const char *interface,
+ connmanctl_dbus_method_return_func_t cb, void * user_data,
+ const char *property, int type, void *value);
+
+void __connmanctl_dbus_append_dict_entry(DBusMessageIter *iter, char *property,
+ int type, void *value);
+int __connmanctl_dbus_set_property_dict(DBusConnection *connection,
+ const char *path, const char *interface,
+ connmanctl_dbus_method_return_func_t cb, void * user_data,
+ const char *property, int type,
+ connman_dbus_append_cb_t append_fn, void *append_user_data);
+
+void __connmanctl_dbus_append_dict_string_array(DBusMessageIter *iter,
+ const char *property, connman_dbus_append_cb_t append_fn,
+ void *append_user_data);
+int __connmanctl_dbus_set_property_array(DBusConnection *connection,
+ const char *path, const char *interface,
+ connmanctl_dbus_method_return_func_t cb, void *user_data,
+ const char *property, int type,
+ connman_dbus_append_cb_t append_fn, void *append_user_data);
+
#ifdef __cplusplus
}
#endif