changed operation string
[framework/appfw/alarm-manager.git] / alarm-manager.c
index 70cfe46..cd900f4 100755 (executable)
 #include<dbus/dbus.h>
 #include<dbus/dbus-glib-lowlevel.h>
 #include<glib.h>
+#if !GLIB_CHECK_VERSION (2, 31, 0)
 #include <glib/gmacros.h>
+#else
+#endif
 
 /*#include "global-gconf.h"*/
 #include"alarm.h"
@@ -51,8 +54,6 @@
 #include <vconf.h>
 #include <vconf-keys.h>
 
-#include <ITapiMisc.h>
-
 #define SIG_TIMER 0x32
 #define WAKEUP_ALARM_APP_ID       "org.tizen.alarm.ALARM"
        /* alarm ui application's alarm's dbus_service name instead of 21
@@ -76,6 +77,10 @@ GSList *g_scheduled_alarm_list = NULL;
 
 GSList *g_expired_alarm_list = NULL;
 
+#ifndef RTC_WKALM_BOOT_SET
+#define RTC_WKALM_BOOT_SET _IOW('p', 0x80, struct rtc_wkalrm)
+#endif
+
 #ifdef __ALARM_BOOT
 bool enable_power_on_alarm;
 bool alarm_boot;
@@ -241,8 +246,6 @@ int _set_rtc_time(time_t _time)
        const char *rtc1 = default_rtc;
        struct tm *_tm;
        struct tm time_r;
-       int tapi_ret;
-       tapi_misc_time_zone_info_type info = { 0, };
 
        fd0 = open(rtc0, O_RDONLY);
        fd1 = open(rtc1, O_RDONLY);
@@ -291,24 +294,6 @@ int _set_rtc_time(time_t _time)
        }
        close(fd1);
 
-       /* set modem */
-       info.time_zone_valid = TAPI_MISC_NITZ_RTC_BKUP_PHONE;
-       info.year = time_r.tm_year;
-       info.month = time_r.tm_mon;
-       info.day = time_r.tm_mday;
-       info.hour = time_r.tm_hour;
-       info.minute = time_r.tm_min;
-       info.second = 0;
-       ALARM_MGR_LOG_PRINT("***********Set timezone info*********\n");
-       ALARM_MGR_LOG_PRINT("***********info.year:%d\t*********\n", info.year);
-       ALARM_MGR_LOG_PRINT("***********info.month:%d\t*********\n",
-                           info.month);
-       ALARM_MGR_LOG_PRINT("***********info.day:%d\t*********\n", info.day);
-       ALARM_MGR_LOG_PRINT("***********info.hour:%d\t*********\n", info.hour);
-       ALARM_MGR_LOG_PRINT("***********info.minute:%d\t*********\n",
-                           info.minute);
-       tapi_ret = tel_set_misc_timezone_info(&info);
-
        return 1;
 }
 
@@ -742,18 +727,14 @@ static bool __alarm_create_appsvc(alarm_info_t *alarm_info, alarm_id_t *alarm_id
        __alarm_info->quark_bundle=g_quark_from_string(bundle_data);
        __alarm_info->quark_app_service_name = g_quark_from_string("null");
        __alarm_info->quark_dst_service_name = g_quark_from_string("null");
+       __alarm_info->quark_app_service_name_mod = g_quark_from_string("null");
+       __alarm_info->quark_dst_service_name_mod = g_quark_from_string("null");
 
        __alarm_set_start_and_end_time(alarm_info, __alarm_info);
        memcpy(&(__alarm_info->alarm_info), alarm_info, sizeof(alarm_info_t));
 
        time(&current_time);
 
-       ALARM_MGR_LOG_PRINT("[alarm-server]:pid=%d, app_unique_name=%s, "
-               "app_bundle_encoded_val=%s,c_due_time=%d", \
-               pid, g_quark_to_string(__alarm_info->quark_app_unique_name), \
-               g_quark_to_string(__alarm_info->quark_bundle), \
-                           alarm_context.c_due_time);
-
        if (alarm_context.c_due_time < current_time) {
                ALARM_MGR_EXCEPTION_PRINT("Caution!! alarm_context.c_due_time "
                "(%d) is less than current time(%d)", alarm_context.c_due_time,
@@ -1407,7 +1388,7 @@ static void __alarm_expired()
                                {
                                        snprintf(alarm_id_val,31,"%d",alarm_id);
 
-                                       if (bundle_add(b,"slp.alarm.data.ID", alarm_id_val)){
+                                       if (bundle_add(b,"http://tizen.org/appcontrol/data/alarm_id", alarm_id_val)){
                                                ALARM_MGR_EXCEPTION_PRINT("Unable to add alarm id to the bundle\n");
                                        }
                                        else
@@ -1419,9 +1400,9 @@ static void __alarm_expired()
                                                else
                                                {
                                                        ALARM_MGR_LOG_PRINT("Successfuly ran app svc\n");
-                                                       bundle_free(b);
                                                }
                                        }
+                                       bundle_free(b);
                                }
 
                }
@@ -1641,6 +1622,12 @@ static void __on_system_time_changed(keynode_t *node, void *data)
                            alarm_context.c_due_time);
 
        _set_time(_time);
+
+       vconf_set_dbl(VCONFKEY_SYSTEM_TIMEDIFF, diff_time);
+
+       if (heynoti_publish(SYSTEM_TIME_CHANGED))
+               ALARM_MGR_EXCEPTION_PRINT("alarm-server: Unable to publish heynoti for system time change\n");
+
        __alarm_update_due_time_of_all_items_in_list(diff_time);
 
        ALARM_MGR_LOG_PRINT("2.alarm_context.c_due_time is %d\n",
@@ -1662,6 +1649,134 @@ this value to 0(zero)
        return;
 }
 
+gboolean alarm_manager_alarm_set_rtc_time(void *pObject, int pid,
+                               int year, int mon, int day,
+                               int hour, int min, int sec, char *e_cookie,
+                               int *return_code){
+       guchar *cookie = NULL;
+       gsize size;
+       int retval = 0;
+       gboolean result = true;
+       gid_t call_gid;
+
+       const char *rtc = power_rtc;
+       int fd = 0;
+       struct rtc_time rtc_tm = {0,};
+       struct rtc_wkalrm rtc_wk;
+       struct tm *alarm_tm = NULL;
+       struct tm due_tm = {0,};
+
+
+       if (return_code){
+               *return_code = ALARMMGR_RESULT_SUCCESS;
+       }
+
+       cookie = g_base64_decode(e_cookie, &size);
+       if (NULL == cookie)
+       {
+               if (return_code)
+                       *return_code = ERR_ALARM_NO_PERMISSION;
+               ALARM_MGR_EXCEPTION_PRINT("Unable to decode cookie!!!\n");
+               return true;
+       }
+
+       call_gid = security_server_get_gid("alarm");
+
+       ALARM_MGR_LOG_PRINT("call_gid : %d\n", call_gid);
+
+       retval = security_server_check_privilege((const char *)cookie, call_gid);
+       if (retval < 0) {
+               if (retval == SECURITY_SERVER_API_ERROR_ACCESS_DENIED) {
+                       ALARM_MGR_EXCEPTION_PRINT(
+                               "%s", "access has been denied\n");
+               }
+               ALARM_MGR_EXCEPTION_PRINT("Error has occurred in security_server_check_privilege()\n");
+               if (return_code)
+                       *return_code = ERR_ALARM_NO_PERMISSION;
+       }
+       else {
+
+               /*extract day of the week, day in the year &
+               daylight saving time from system*/
+               time_t ctime;
+               ctime = time(NULL);
+               alarm_tm = localtime(&ctime);
+
+               alarm_tm->tm_year = year;
+               alarm_tm->tm_mon = mon;
+               alarm_tm->tm_mday = day;
+               alarm_tm->tm_hour = hour;
+               alarm_tm->tm_min = min;
+               alarm_tm->tm_sec = sec;
+
+               /*convert to calendar time representation*/
+               time_t rtc_time = mktime(alarm_tm);
+
+               /*convert to Coordinated Universal Time (UTC)*/
+               gmtime_r(&rtc_time, &due_tm);
+
+               fd = open(rtc, O_RDONLY);
+               if (fd == -1) {
+                       ALARM_MGR_EXCEPTION_PRINT("RTC open failed.\n");
+                       if (return_code)
+                               *return_code = ERR_ALARM_SYSTEM_FAIL;
+                       return result;
+               }
+
+               /* Read the RTC time/date */
+               retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
+               if (retval == -1) {
+                       ALARM_MGR_EXCEPTION_PRINT("RTC_RD_TIME ioctl failed");
+                       close(fd);
+                       if (return_code)
+                               *return_code = ERR_ALARM_SYSTEM_FAIL;
+                       return result;
+               }
+
+               rtc_tm.tm_mday = due_tm.tm_mday;
+               rtc_tm.tm_mon = due_tm.tm_mon;
+               rtc_tm.tm_year = due_tm.tm_year;
+               rtc_tm.tm_hour = due_tm.tm_hour;
+               rtc_tm.tm_min = due_tm.tm_min;
+               rtc_tm.tm_sec = due_tm.tm_sec;
+
+               memcpy(&rtc_wk.time, &rtc_tm, sizeof(rtc_tm));
+
+               rtc_wk.enabled = 1;
+               rtc_wk.pending = 0;
+
+               retval = ioctl(fd, RTC_WKALM_BOOT_SET, &rtc_wk);
+               if (retval == -1) {
+                       if (errno == ENOTTY) {
+                               ALARM_MGR_EXCEPTION_PRINT("\nAlarm IRQs not"
+                                                         "supported.\n");
+                       }
+                       ALARM_MGR_EXCEPTION_PRINT("RTC_ALM_SET ioctl");
+                       close(fd);
+                       if (return_code)
+                               *return_code = ERR_ALARM_SYSTEM_FAIL;
+               }
+               else{
+                       ALARM_MGR_LOG_PRINT("[alarm-server]RTC alarm is setted");
+                       /* Enable alarm interrupts */
+                       retval = ioctl(fd, RTC_AIE_ON, 0);
+                       if (retval == -1) {
+                               ALARM_MGR_EXCEPTION_PRINT("RTC_AIE_ON ioctl failed");
+                               if (return_code)
+                                       *return_code = ERR_ALARM_SYSTEM_FAIL;
+                       }
+                       close(fd);
+               }
+       }
+
+       if (cookie){
+               g_free(cookie);
+               cookie = NULL;
+       }
+
+       return result;
+
+}
 
 gboolean alarm_manager_alarm_create_appsvc(void *pObject, int pid,
                                    int start_year,
@@ -2070,6 +2185,81 @@ gboolean alarm_manager_alarm_get_list_of_ids(void *pObject, int pid,
        return true;
 }
 
+gboolean alarm_manager_alarm_get_appsvc_info(void *pObject, int pid, alarm_id_t alarm_id,
+                               char *e_cookie, gchar **b_data, int *return_code)
+{
+       bool found = false;
+
+       GSList *gs_iter = NULL;
+       __alarm_info_t *entry = NULL;
+
+       guchar *cookie = NULL;
+       gsize size;
+       int retval = 0;
+       gid_t call_gid;
+
+       ALARM_MGR_LOG_PRINT("called for  pid(%d) and alarm_id(%d)\n", pid,
+                           alarm_id);
+
+       cookie = g_base64_decode(e_cookie, &size);
+       if (NULL == cookie)
+       {
+               if (return_code)
+                       *return_code = ERR_ALARM_SYSTEM_FAIL;
+               ALARM_MGR_EXCEPTION_PRINT("Unable to decode cookie!!!\n");
+               return true;
+       }
+       call_gid = security_server_get_gid("alarm");
+
+       ALARM_MGR_LOG_PRINT("call_gid : %d\n", call_gid);
+
+       retval = security_server_check_privilege((const char *)cookie, call_gid);
+       if (retval < 0) {
+               if (retval == SECURITY_SERVER_API_ERROR_ACCESS_DENIED) {
+                       ALARM_MGR_EXCEPTION_PRINT(
+                               "%s", "access has been denied\n");
+               }
+               ALARM_MGR_EXCEPTION_PRINT("%s", "Error has occurred\n");
+
+               if (return_code)
+                       *return_code = ERR_ALARM_NO_PERMISSION;
+
+               if (cookie)
+                       g_free(cookie);
+
+               return true;
+       }
+
+       if (return_code)
+               *return_code = 0;
+
+       for (gs_iter = alarm_context.alarms; gs_iter != NULL;
+            gs_iter = g_slist_next(gs_iter)) {
+               entry = gs_iter->data;
+               if (entry->alarm_id == alarm_id) {
+                       found = true;
+                       *b_data = g_strdup(g_quark_to_string(entry->quark_bundle));
+                       break;
+               }
+       }
+
+       if (found) {
+               if ( *b_data && strlen(*b_data) == 4 && strncmp(*b_data,"null",4) == 0){
+                       ALARM_MGR_EXCEPTION_PRINT("Regular alarm,not svc alarm");
+                       if (return_code)
+                               *return_code = ERR_ALARM_INVALID_TYPE;
+               }
+       } else {
+               if (return_code)
+                       *return_code = ERR_ALARM_INVALID_ID;
+       }
+
+       if (cookie)
+               g_free(cookie);
+
+       return true;
+}
+
 gboolean alarm_manager_alarm_get_info(void *pObject, int pid,
                                      alarm_id_t alarm_id, int *start_year,
                                      int *start_month, int *start_day,
@@ -2102,7 +2292,7 @@ gboolean alarm_manager_alarm_get_info(void *pObject, int pid,
        {
                ALARM_MGR_EXCEPTION_PRINT("alarm id(%d) was not found\n",
                                          alarm_id);
-               *return_code = ERR_ALARM_INVALID_PARAM; /*TODO: ERR_ALARM_INVALID_ID?*/
+               *return_code = ERR_ALARM_INVALID_ID;
        } else {
                ALARM_MGR_LOG_PRINT("alarm was found\n");
                *start_year = alarm_info->start.year;