Added a dbus property 'TimeUpdated'
[platform/upstream/connman.git] / src / clock.c
old mode 100644 (file)
new mode 100755 (executable)
index 5562e52..40729b2
@@ -2,7 +2,7 @@
  *
  *  Connection Manager
  *
- *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
+ *  Copyright (C) 2007-2013  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
 
 #include "connman.h"
 
-enum time_updates {
-       TIME_UPDATES_UNKNOWN = 0,
-       TIME_UPDATES_MANUAL  = 1,
-       TIME_UPDATES_AUTO    = 2,
-};
-
 enum timezone_updates {
        TIMEZONE_UPDATES_UNKNOWN = 0,
        TIMEZONE_UPDATES_MANUAL  = 1,
@@ -45,6 +39,9 @@ static enum time_updates time_updates_config = TIME_UPDATES_AUTO;
 static enum timezone_updates timezone_updates_config = TIMEZONE_UPDATES_AUTO;
 
 static char *timezone_config = NULL;
+#if defined TIZEN_EXT
+static bool time_updated = false;
+#endif
 
 static const char *time_updates2string(enum time_updates value)
 {
@@ -94,15 +91,79 @@ static enum timezone_updates string2timezone_updates(const char *value)
         return TIMEZONE_UPDATES_UNKNOWN;
 }
 
+static void clock_properties_load(void)
+{
+       GKeyFile *keyfile;
+       char *str;
+       enum time_updates time_value;
+       enum timezone_updates timezone_value;
+
+       keyfile = __connman_storage_load_global();
+       if (!keyfile)
+               return;
+
+       str = g_key_file_get_string(keyfile, "global", "TimeUpdates", NULL);
+
+       time_value = string2time_updates(str);
+       if (time_value != TIME_UPDATES_UNKNOWN)
+               time_updates_config = time_value;
+
+       g_free(str);
+
+       str = g_key_file_get_string(keyfile, "global", "TimezoneUpdates",
+                       NULL);
+
+       timezone_value = string2timezone_updates(str);
+       if (timezone_value != TIMEZONE_UPDATES_UNKNOWN)
+               timezone_updates_config = timezone_value;
+
+       g_free(str);
+
+       g_key_file_free(keyfile);
+}
+
+static void clock_properties_save(void)
+{
+       GKeyFile *keyfile;
+       const char *str;
+
+       keyfile = __connman_storage_load_global();
+       if (!keyfile)
+               keyfile = g_key_file_new();
+
+       str = time_updates2string(time_updates_config);
+       if (str)
+               g_key_file_set_string(keyfile, "global", "TimeUpdates", str);
+       else
+               g_key_file_remove_key(keyfile, "global", "TimeUpdates", NULL);
+
+       str = timezone_updates2string(timezone_updates_config);
+       if (str)
+               g_key_file_set_string(keyfile, "global", "TimezoneUpdates",
+                               str);
+       else
+               g_key_file_remove_key(keyfile, "global", "TimezoneUpdates",
+                               NULL);
+
+       __connman_storage_save_global(keyfile);
+
+       g_key_file_free(keyfile);
+}
+
+enum time_updates __connman_clock_timeupdates(void)
+{
+       return time_updates_config;
+}
+
 static void append_timeservers(DBusMessageIter *iter, void *user_data)
 {
        int i;
        char **timeservers = __connman_timeserver_system_get();
 
-       if (timeservers == NULL)
+       if (!timeservers)
                return;
 
-       for (i = 0; timeservers[i] != NULL; i++) {
+       for (i = 0; timeservers[i]; i++) {
                dbus_message_iter_append_basic(iter,
                                DBUS_TYPE_STRING, &timeservers[i]);
        }
@@ -117,17 +178,26 @@ static DBusMessage *get_properties(DBusConnection *conn,
        DBusMessageIter array, dict;
        struct timeval tv;
        const char *str;
+#if defined TIZEN_EXT
+       dbus_bool_t val = time_updated;
+#endif
 
        DBG("conn %p", conn);
 
        reply = dbus_message_new_method_return(msg);
-       if (reply == NULL)
+       if (!reply)
                return NULL;
 
        dbus_message_iter_init_append(reply, &array);
 
        connman_dbus_dict_open(&array, &dict);
 
+#if defined TIZEN_EXT
+       connman_dbus_dict_append_basic(&dict, "TimeUpdated",
+                                               DBUS_TYPE_BOOLEAN,
+                                               &val);
+#endif
+
        if (gettimeofday(&tv, NULL) == 0) {
                dbus_uint64_t val = tv.tv_sec;
 
@@ -136,16 +206,16 @@ static DBusMessage *get_properties(DBusConnection *conn,
        }
 
        str = time_updates2string(time_updates_config);
-       if (str != NULL)
+       if (str)
                connman_dbus_dict_append_basic(&dict, "TimeUpdates",
                                                DBUS_TYPE_STRING, &str);
 
-       if (timezone_config != NULL)
+       if (timezone_config)
                connman_dbus_dict_append_basic(&dict, "Timezone",
                                        DBUS_TYPE_STRING, &timezone_config);
 
        str = timezone_updates2string(timezone_updates_config);
-       if (str != NULL)
+       if (str)
                connman_dbus_dict_append_basic(&dict, "TimezoneUpdates",
                                                DBUS_TYPE_STRING, &str);
 
@@ -166,7 +236,7 @@ static DBusMessage *set_property(DBusConnection *conn,
 
        DBG("conn %p", conn);
 
-       if (dbus_message_iter_init(msg, &iter) == FALSE)
+       if (!dbus_message_iter_init(msg, &iter))
                return __connman_error_invalid_arguments(msg);
 
        if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
@@ -182,7 +252,12 @@ static DBusMessage *set_property(DBusConnection *conn,
 
        type = dbus_message_iter_get_arg_type(&value);
 
-       if (g_str_equal(name, "Time") == TRUE) {
+       if (g_str_equal(name, "Time")) {
+#if defined TIZEN_EXT
+               /* Tizen updates time (ntp) by system service */
+
+               return __connman_error_permission_denied(msg);
+#else
                struct timeval tv;
                dbus_uint64_t newval;
 
@@ -203,7 +278,8 @@ static DBusMessage *set_property(DBusConnection *conn,
                connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
                                CONNMAN_CLOCK_INTERFACE, "Time",
                                DBUS_TYPE_UINT64, &newval);
-       } else if (g_str_equal(name, "TimeUpdates") == TRUE) {
+#endif
+       } else if (g_str_equal(name, "TimeUpdates")) {
                const char *strval;
                enum time_updates newval;
 
@@ -221,10 +297,11 @@ static DBusMessage *set_property(DBusConnection *conn,
 
                time_updates_config = newval;
 
+               clock_properties_save();
                connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
                                CONNMAN_CLOCK_INTERFACE, "TimeUpdates",
                                DBUS_TYPE_STRING, &strval);
-       } else if (g_str_equal(name, "Timezone") == TRUE) {
+       } else if (g_str_equal(name, "Timezone")) {
                const char *strval;
 
                if (type != DBUS_TYPE_STRING)
@@ -236,8 +313,8 @@ static DBusMessage *set_property(DBusConnection *conn,
                dbus_message_iter_get_basic(&value, &strval);
 
                if (__connman_timezone_change(strval) < 0)
-                        return __connman_error_invalid_arguments(msg);
-       } else if (g_str_equal(name, "TimezoneUpdates") == TRUE) {
+                       return __connman_error_invalid_arguments(msg);
+       } else if (g_str_equal(name, "TimezoneUpdates")) {
                const char *strval;
                enum timezone_updates newval;
 
@@ -255,10 +332,11 @@ static DBusMessage *set_property(DBusConnection *conn,
 
                timezone_updates_config = newval;
 
+               clock_properties_save();
                connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
                                CONNMAN_CLOCK_INTERFACE, "TimezoneUpdates",
                                DBUS_TYPE_STRING, &strval);
-       } else if (g_str_equal(name, "Timeservers") == TRUE) {
+       } else if (g_str_equal(name, "Timeservers")) {
                DBusMessageIter entry;
                char **str = NULL;
                GSList *list = NULL;
@@ -284,10 +362,10 @@ static DBusMessage *set_property(DBusConnection *conn,
                        dbus_message_iter_next(&entry);
                }
 
-               if (list != NULL) {
+               if (list) {
                        str = g_new0(char *, count+1);
 
-                       while (list != NULL) {
+                       while (list) {
                                count--;
                                str[count] = list->data;
                                list = g_slist_delete_link(list, list);
@@ -296,7 +374,7 @@ static DBusMessage *set_property(DBusConnection *conn,
 
                __connman_timeserver_system_set(str);
 
-               if (str != NULL)
+               if (str)
                        g_strfreev(str);
 
                connman_dbus_property_changed_array(CONNMAN_MANAGER_PATH,
@@ -309,23 +387,30 @@ static DBusMessage *set_property(DBusConnection *conn,
 }
 
 static const GDBusMethodTable clock_methods[] = {
-       { _GDBUS_METHOD("GetProperties", "", "a{sv}",
+       { GDBUS_METHOD("GetProperties",
                        NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
                        get_properties) },
-       { _GDBUS_METHOD("SetProperty", "sv", "",
+       { GDBUS_METHOD("SetProperty",
                        GDBUS_ARGS({ "name", "s" }, { "value", "v" }), NULL,
                        set_property)   },
        { },
 };
 
 static const GDBusSignalTable clock_signals[] = {
-       { _GDBUS_SIGNAL("PropertyChanged", "sv",
+       { GDBUS_SIGNAL("PropertyChanged",
                        GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
        { },
 };
 
 static DBusConnection *connection = NULL;
 
+#if defined TIZEN_EXT
+void __connman_clock_set_time_updated(bool updated)
+{
+       time_updated = updated;
+}
+#endif
+
 void __connman_clock_update_timezone(void)
 {
        DBG("");
@@ -333,7 +418,7 @@ void __connman_clock_update_timezone(void)
        g_free(timezone_config);
        timezone_config = __connman_timezone_lookup();
 
-       if (timezone_config == NULL)
+       if (!timezone_config)
                return;
 
        connman_dbus_property_changed_basic(CONNMAN_MANAGER_PATH,
@@ -346,7 +431,7 @@ int __connman_clock_init(void)
        DBG("");
 
        connection = connman_dbus_get_connection();
-       if (connection == NULL)
+       if (!connection)
                return -1;
 
        __connman_timezone_init();
@@ -358,6 +443,7 @@ int __connman_clock_init(void)
                                                clock_methods, clock_signals,
                                                NULL, NULL, NULL);
 
+       clock_properties_load();
        return 0;
 }
 
@@ -365,7 +451,7 @@ void __connman_clock_cleanup(void)
 {
        DBG("");
 
-       if (connection == NULL)
+       if (!connection)
                return;
 
        g_dbus_unregister_interface(connection, CONNMAN_MANAGER_PATH,