[connman] Added Tizen Wi-Fi Mesh
[platform/upstream/connman.git] / client / dbus_helpers.c
index a3e0843..8c6bdbb 100644 (file)
 
 #include <stdio.h>
 #include <errno.h>
+#include <inttypes.h>
 #include <glib.h>
 
 #include "input.h"
 #include "dbus_helpers.h"
 
-#define TIMEOUT         60000
+#define TIMEOUT         120000
 
 void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
                const char *dict, const char *sep)
@@ -35,13 +36,16 @@ void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
        int arg_type;
        dbus_bool_t b;
        unsigned char c;
-       unsigned int i;
+       dbus_uint16_t u16;
+       dbus_uint32_t u;
+       dbus_int32_t i;
+       dbus_uint64_t u64;
        double d;
 
        char *str;
        DBusMessageIter entry;
 
-       if (pre == NULL)
+       if (!pre)
                pre = "";
 
        while ((arg_type = dbus_message_iter_get_arg_type(iter))
@@ -85,7 +89,7 @@ void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
 
                case DBUS_TYPE_BOOLEAN:
                        dbus_message_iter_get_basic(iter, &b);
-                       if (b == FALSE)
+                       if (!b)
                                fprintf(stdout, "False");
                        else
                                fprintf(stdout, "True");
@@ -97,11 +101,25 @@ void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
                        break;
 
                case DBUS_TYPE_UINT16:
+                       dbus_message_iter_get_basic(iter, &u16);
+                       fprintf(stdout, "%u", u16);
+                       break;
+
                case DBUS_TYPE_UINT32:
+                       dbus_message_iter_get_basic(iter, &u);
+                       fprintf(stdout, "%d", u);
+                       break;
+
+               case DBUS_TYPE_INT32:
                        dbus_message_iter_get_basic(iter, &i);
                        fprintf(stdout, "%d", i);
                        break;
 
+               case DBUS_TYPE_UINT64:
+                       dbus_message_iter_get_basic(iter, &u64);
+                       fprintf(stdout, "%"PRIu64, u64);
+                       break;
+
                case DBUS_TYPE_DOUBLE:
                        dbus_message_iter_get_basic(iter, &d);
                        fprintf(stdout, "%f", d);
@@ -112,7 +130,7 @@ void __connmanctl_dbus_print(DBusMessageIter *iter, const char *pre,
                        break;
                }
 
-               if (dbus_message_iter_has_next(iter) == TRUE)
+               if (dbus_message_iter_has_next(iter))
                        fprintf(stdout, "%s", sep);
 
                dbus_message_iter_next(iter);
@@ -134,6 +152,7 @@ static void dbus_method_reply(DBusPendingCall *call, void *user_data)
        __connmanctl_save_rl();
 
        reply = dbus_pending_call_steal_reply(call);
+       dbus_pending_call_unref(call);
        if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR) {
                DBusError err;
 
@@ -166,14 +185,13 @@ static int send_method_call(DBusConnection *connection,
        DBusPendingCall *call;
        struct dbus_callback *callback;
 
-       if (dbus_connection_send_with_reply(connection, message, &call,
-                                       TIMEOUT) == FALSE)
+       if (!dbus_connection_send_with_reply(connection, message, &call, TIMEOUT))
                goto end;
 
-        if (call == NULL)
-                goto end;
+       if (!call)
+               goto end;
 
-       if (cb != NULL) {
+       if (cb) {
                callback = g_new0(struct dbus_callback, 1);
                callback->cb = cb;
                callback->user_data = user_data;
@@ -203,6 +221,14 @@ static int append_variant(DBusMessageIter *iter, const char *property,
         case DBUS_TYPE_STRING:
                 type_str = DBUS_TYPE_STRING_AS_STRING;
                 break;
+       case DBUS_TYPE_INT32:
+               type_str = DBUS_TYPE_INT32_AS_STRING;
+               break;
+#if defined TIZEN_EXT_WIFI_MESH
+       case DBUS_TYPE_UINT16:
+               type_str = DBUS_TYPE_UINT16_AS_STRING;
+               break;
+#endif
        default:
                return -EOPNOTSUPP;
        }
@@ -216,23 +242,25 @@ static int append_variant(DBusMessageIter *iter, const char *property,
        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, ...)
+int __connmanctl_dbus_method_call(DBusConnection *connection,
+               const char *service, const char *path, const char *interface,
+               const char *method, connmanctl_dbus_method_return_func_t cb,
+               void *user_data, connmanctl_dbus_append_func_t append_func,
+               void *append_data)
 {
        DBusMessage *message;
-       va_list args;
+       DBusMessageIter iter;
 
-       message = dbus_message_new_method_call("net.connman", path,
-                       interface, method);
+       message = dbus_message_new_method_call(service, path, interface,
+                       method);
 
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
-       va_start(args, arg1);
-       dbus_message_append_args_valist(message, arg1, args);
-       va_end(args);
+       if (append_func) {
+               dbus_message_iter_init_append(message, &iter);
+               append_func(&iter, append_data);
+       }
 
        return send_method_call(connection, message, cb, user_data);
 }
@@ -248,7 +276,7 @@ int __connmanctl_dbus_set_property(DBusConnection *connection,
        message = dbus_message_new_method_call("net.connman", path,
                        interface, "SetProperty");
 
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
@@ -261,6 +289,22 @@ int __connmanctl_dbus_set_property(DBusConnection *connection,
        return send_method_call(connection, message, cb, user_data);
 }
 
+void __connmanctl_dbus_append_dict(DBusMessageIter *iter,
+               connmanctl_dbus_append_func_t append_fn, void *append_data)
+{
+       DBusMessageIter dict;
+
+       dbus_message_iter_open_container(iter, 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 (append_fn)
+               append_fn(&dict, append_data);
+
+       dbus_message_iter_close_container(iter, &dict);
+}
+
 void __connmanctl_dbus_append_dict_entry(DBusMessageIter *iter,
                const char *property, int type, void *value)
 {
@@ -287,7 +331,7 @@ int __connmanctl_dbus_set_property_dict(DBusConnection *connection,
        message = dbus_message_new_method_call("net.connman", path,
                        interface, "SetProperty");
 
-       if (message == NULL)
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);
@@ -315,6 +359,50 @@ int __connmanctl_dbus_set_property_dict(DBusConnection *connection,
        return send_method_call(connection, message, cb, user_data);
 }
 
+#if defined TIZEN_EXT_WIFI_MESH
+int __connmanctl_dbus_mesh_dict(DBusConnection *connection,
+               const char *path, const char *interface,
+               connmanctl_dbus_method_return_func_t cb, void *user_data,
+               const char *property, int type,
+               connmanctl_dbus_append_func_t append_fn,
+               void *append_user_data)
+{
+       DBusMessage *message;
+       DBusMessageIter iter, variant, dict;
+
+       message = dbus_message_new_method_call(CONNMAN_SERVICE, path,
+                       interface, "MeshCommands");
+
+       if (!message)
+               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);
+
+       if (append_fn)
+               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);
+}
+#endif
+
 static void append_variant_array(DBusMessageIter *iter, const char *property,
                connmanctl_dbus_append_func_t append_fn,
                void *append_user_data)
@@ -367,7 +455,54 @@ int __connmanctl_dbus_set_property_array(DBusConnection *connection,
        message = dbus_message_new_method_call("net.connman", path,
                        interface, "SetProperty");
 
-       if (message == NULL)
+       if (!message)
+               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);
+}
+
+int __connmanctl_dbus_session_change(DBusConnection *connection,
+               const char *session_path,
+               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", session_path,
+                       "net.connman.Session", "Change");
+
+       if (!message)
+               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);
+}
+
+int __connmanctl_dbus_session_change_array(DBusConnection *connection,
+               const char *session_path,
+               connmanctl_dbus_method_return_func_t cb, void *user_data,
+               const char *property,
+               connmanctl_dbus_append_func_t append_fn,
+               void *append_user_data)
+{
+       DBusMessage *message;
+       DBusMessageIter iter;
+
+       message = dbus_message_new_method_call("net.connman", session_path,
+                       "net.connman.Session", "Change");
+
+       if (!message)
                return -ENOMEM;
 
        dbus_message_iter_init_append(message, &iter);