Merge branch 'master' into tizen_2.1 tizen_2.1 submit/tizen_2.1/20130514.050845
authorJaeho Lee <jaeho81.lee@samsung.com>
Mon, 6 May 2013 07:09:27 +0000 (16:09 +0900)
committerJaeho Lee <jaeho81.lee@samsung.com>
Mon, 6 May 2013 07:09:27 +0000 (16:09 +0900)
Conflicts:
packaging/alarm-manager.spec

added new API

Signed-off-by: Jaeho Lee <jaeho81.lee@samsung.com>
alarm-manager.c
packaging/60-alarm-manager-rtc.rules [new file with mode: 0644]
packaging/alarm-manager.spec [changed mode: 0644->0755]

index 7dff97d..951b96b 100755 (executable)
@@ -134,6 +134,7 @@ static void __alarm_handler(int sigNum, siginfo_t *pSigInfo, void *pUContext);
 static void __clean_registry();
 static bool __alarm_manager_reset();
 static void __on_system_time_changed(keynode_t *node, void *data);
+static void __on_system_time_external_changed(keynode_t *node, void *data);
 static void __initialize_timer();
 static void __initialize_alarm_list();
 static void __initialize_scheduled_alarm_lsit();
@@ -273,7 +274,7 @@ int _set_rtc_time(time_t _time)
        rtc_tm.tm_year = time_r.tm_year;
        rtc_tm.tm_hour = time_r.tm_hour;
        rtc_tm.tm_min = time_r.tm_min;
-       rtc_tm.tm_sec = 0;
+       rtc_tm.tm_sec = time_r.tm_sec;
 
 
        retval0 = ioctl(fd0, RTC_SET_TIME, &rtc_tm);
@@ -1361,7 +1362,12 @@ static void __alarm_expired()
                current_time, interval);
 
        if (alarm_context.c_due_time > current_time) {
-               ALARM_MGR_LOG_PRINT("[alarm-server]: False Alarm\n");
+               ALARM_MGR_LOG_PRINT("[alarm-server]: False Alarm (time changed to past)\n");
+               goto done;
+       }
+       // 3 seconds is maximum permitted delay from timer expire to this function
+       if (alarm_context.c_due_time + 3 < current_time) {
+               ALARM_MGR_LOG_PRINT("[alarm-server]: False Alarm (time changed to future)\n");
                goto done;
        }
 
@@ -1666,6 +1672,55 @@ this value to 0(zero)
        return;
 }
 
+static void __on_system_time_external_changed(keynode_t *node, void *data)
+{
+       double diff_time;
+       time_t cur_time = 0;
+
+       _alarm_disable_timer(alarm_context);
+
+       if (node) {
+               diff_time = vconf_keynode_get_dbl(node);
+       } else {
+               vconf_get_dbl(VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL, &diff_time);
+       }
+
+       tzset();
+
+       ALARM_MGR_ASSERT_PRINT("diff_time is %f\n", diff_time);
+
+       ALARM_MGR_LOG_PRINT("[alarm-server] System time has been changed externally\n");
+       ALARM_MGR_LOG_PRINT("1.alarm_context.c_due_time is %d\n",
+                           alarm_context.c_due_time);
+
+       // set rtc time only because the linux time is set externally
+       time(&cur_time);
+       _set_rtc_time(cur_time);
+
+       vconf_set_dbl(VCONFKEY_SYSTEM_TIMEDIFF, diff_time);
+       vconf_set_int(VCONFKEY_SYSTEM_TIME_CHANGED,(int)diff_time);
+
+       __alarm_update_due_time_of_all_items_in_list(diff_time);
+
+       ALARM_MGR_LOG_PRINT("2.alarm_context.c_due_time is %d\n",
+                           alarm_context.c_due_time);
+       _clear_scheduled_alarm_list();
+       _alarm_schedule();
+       __rtc_set();
+#ifdef __ALARM_BOOT
+       /*alarm boot */
+       if (enable_power_on_alarm) {
+/* orginally first arg's value was 21(app_id, WAKEUP_ALARM_
+APP_ID) in a platform with app-server. because _alarm_power_
+on(..) fuction don't use first parameter internally, we set
+this value to 0(zero)
+*/
+               __alarm_power_on(0, enable_power_on_alarm, NULL);
+       }
+#endif
+       return;
+}
+
 static void __on_time_zone_changed(keynode_t *node, void *data)
 {
        double diff_time = 0;
@@ -2476,7 +2531,13 @@ static bool __initialize_noti()
        if (vconf_notify_key_changed
            (VCONFKEY_SETAPPL_TIMEZONE_ID, __on_time_zone_changed, NULL) < 0) {
                ALARM_MGR_LOG_PRINT(
-                       "Failed to add callback for time changing event\n");
+                       "Failed to add callback for time zone changing event\n");
+       }
+
+       if (vconf_notify_key_changed
+           (VCONFKEY_SYSTEM_TIMECHANGE_EXTERNAL, __on_system_time_external_changed, NULL) < 0) {
+               ALARM_MGR_LOG_PRINT(
+                       "Failed to add callback for time external changing event\n");
        }
 
        return true;
diff --git a/packaging/60-alarm-manager-rtc.rules b/packaging/60-alarm-manager-rtc.rules
new file mode 100644 (file)
index 0000000..a41d5e8
--- /dev/null
@@ -0,0 +1 @@
+KERNEL=="rtc0" SYMLINK="rtc1"
old mode 100644 (file)
new mode 100755 (executable)
index 60bbd04..7ee7d8c
@@ -1,11 +1,12 @@
 Name:       alarm-manager
 Summary:    Alarm library
-Version:    0.4.66
+Version:    0.4.70
 Release:    1
 Group:      System/Libraries
 License:    Apache License, Version 2.0
 Source0:    %{name}-%{version}.tar.gz
 Source101:  packaging/alarm-server.service
+Source102:  packaging/60-alarm-manager-rtc.rules
 
 Requires(post): /sbin/ldconfig
 Requires(post): /usr/bin/systemctl
@@ -93,6 +94,8 @@ install -d %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants
 install -m0644 %{SOURCE101} %{buildroot}%{_libdir}/systemd/system/
 ln -sf ../alarm-server.service %{buildroot}%{_libdir}/systemd/system/multi-user.target.wants/alarm-server.service
 
+mkdir -p %{buildroot}/%{_sysconfdir}/udev/rules.d
+install -m0644  %{SOURCE102} %{buildroot}%{_sysconfdir}/udev/rules.d/
 
 %preun -n alarm-server
 if [ $1 == 0 ]; then
@@ -102,7 +105,8 @@ fi
 %post -n alarm-server
 /sbin/ldconfig
 
-vconftool set -t int db/system/timechange 0 -i
+vconftool set -t int db/system/timechange 0
+vconftool set -t double db/system/timechange_external 0
 vconftool set -t int memory/system/timechanged 0 -i -g 5000
 
 systemctl daemon-reload
@@ -125,6 +129,11 @@ fi
 %attr(0755,root,root) %{_sysconfdir}/rc.d/rc5.d/S80alarm-server
 %{_libdir}/systemd/system/multi-user.target.wants/alarm-server.service
 %{_libdir}/systemd/system/alarm-server.service
+%ifarch %{arm}
+ %exclude %{_sysconfdir}/udev/rules.d/60-alarm-manager-rtc.rules
+%else
+ %{_sysconfdir}/udev/rules.d/60-alarm-manager-rtc.rules
+%endif
 
 %files -n libalarm
 %manifest alarm-lib.manifest