dundee: Watch for signals only on DUNDEE_SERVICE
[framework/connectivity/connman.git] / src / clock.c
index db4974d..e2cc19f 100644 (file)
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2010  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License version 2 as
@@ -169,8 +169,15 @@ static DBusMessage *set_property(DBusConnection *conn,
        if (dbus_message_iter_init(msg, &iter) == FALSE)
                return __connman_error_invalid_arguments(msg);
 
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+               return __connman_error_invalid_arguments(msg);
+
        dbus_message_iter_get_basic(&iter, &name);
        dbus_message_iter_next(&iter);
+
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
+               return __connman_error_invalid_arguments(msg);
+
        dbus_message_iter_recurse(&iter, &value);
 
        type = dbus_message_iter_get_arg_type(&value);
@@ -179,11 +186,6 @@ static DBusMessage *set_property(DBusConnection *conn,
                struct timeval tv;
                dbus_uint64_t newval;
 
-               if (type == DBUS_TYPE_VARIANT) {
-                       DBusMessageIter variant = value;
-                       dbus_message_iter_recurse(&variant, &value);
-                       type = dbus_message_iter_get_arg_type(&value);
-               }
                if (type != DBUS_TYPE_UINT64)
                        return __connman_error_invalid_arguments(msg);
 
@@ -205,11 +207,6 @@ static DBusMessage *set_property(DBusConnection *conn,
                const char *strval;
                enum time_updates newval;
 
-               if (type == DBUS_TYPE_VARIANT) {
-                       DBusMessageIter variant = value;
-                       dbus_message_iter_recurse(&variant, &value);
-                       type = dbus_message_iter_get_arg_type(&value);
-               }
                if (type != DBUS_TYPE_STRING)
                        return __connman_error_invalid_arguments(msg);
 
@@ -230,11 +227,6 @@ static DBusMessage *set_property(DBusConnection *conn,
        } else if (g_str_equal(name, "Timezone") == TRUE) {
                const char *strval;
 
-               if (type == DBUS_TYPE_VARIANT) {
-                       DBusMessageIter variant = value;
-                       dbus_message_iter_recurse(&variant, &value);
-                       type = dbus_message_iter_get_arg_type(&value);
-               }
                if (type != DBUS_TYPE_STRING)
                        return __connman_error_invalid_arguments(msg);
 
@@ -249,11 +241,6 @@ static DBusMessage *set_property(DBusConnection *conn,
                const char *strval;
                enum timezone_updates newval;
 
-               if (type == DBUS_TYPE_VARIANT) {
-                       DBusMessageIter variant = value;
-                       dbus_message_iter_recurse(&variant, &value);
-                       type = dbus_message_iter_get_arg_type(&value);
-               }
                if (type != DBUS_TYPE_STRING)
                        return __connman_error_invalid_arguments(msg);
 
@@ -273,28 +260,45 @@ static DBusMessage *set_property(DBusConnection *conn,
                                DBUS_TYPE_STRING, &strval);
        } else if (g_str_equal(name, "Timeservers") == TRUE) {
                DBusMessageIter entry;
+               char **str = NULL;
+               GSList *list = NULL;
+               int count = 0;
 
-               if (type == DBUS_TYPE_VARIANT) {
-                       DBusMessageIter variant = value;
-                       dbus_message_iter_recurse(&variant, &value);
-                       type = dbus_message_iter_get_arg_type(&value);
-               }
                if (type != DBUS_TYPE_ARRAY)
                        return __connman_error_invalid_arguments(msg);
 
                dbus_message_iter_recurse(&value, &entry);
 
-               if (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_INVALID)
-                       __connman_timeserver_system_append(NULL);
-
                while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) {
                        const char *val;
+                       GSList *new_head;
 
                        dbus_message_iter_get_basic(&entry, &val);
-                       __connman_timeserver_system_append(val);
+
+                       new_head = __connman_timeserver_add_list(list, val);
+                       if (list != new_head) {
+                               count++;
+                               list = new_head;
+                       }
+
                        dbus_message_iter_next(&entry);
                }
 
+               if (list != NULL) {
+                       str = g_new0(char *, count+1);
+
+                       while (list != NULL) {
+                               count--;
+                               str[count] = list->data;
+                               list = g_slist_delete_link(list, list);
+                       };
+               }
+
+               __connman_timeserver_system_set(str);
+
+               if (str != NULL)
+                       g_strfreev(str);
+
                connman_dbus_property_changed_array(CONNMAN_MANAGER_PATH,
                                CONNMAN_CLOCK_INTERFACE, "Timeservers",
                                DBUS_TYPE_STRING, append_timeservers, NULL);
@@ -304,14 +308,19 @@ static DBusMessage *set_property(DBusConnection *conn,
        return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
-static GDBusMethodTable clock_methods[] = {
-       { "GetProperties", "",   "a{sv}", get_properties },
-       { "SetProperty",   "sv", "",      set_property   },
+static const GDBusMethodTable clock_methods[] = {
+       { GDBUS_METHOD("GetProperties",
+                       NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
+                       get_properties) },
+       { GDBUS_METHOD("SetProperty",
+                       GDBUS_ARGS({ "name", "s" }, { "value", "v" }), NULL,
+                       set_property)   },
        { },
 };
 
-static GDBusSignalTable clock_signals[] = {
-       { "PropertyChanged", "sv" },
+static const GDBusSignalTable clock_signals[] = {
+       { GDBUS_SIGNAL("PropertyChanged",
+                       GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
        { },
 };