Add license file
[framework/appfw/alarm-manager.git] / alarm-lib.c
index 2bb484a..049bff5 100755 (executable)
@@ -41,6 +41,7 @@
 #include "alarm-stub.h"
 #include <bundle.h>
 #include <appsvc.h>
+#include <aul.h>
 
 #define MAX_KEY_SIZE 256
 
@@ -62,12 +63,74 @@ static int __alarmmgr_init_appsvc(void);
 bool alarm_power_off(int *error_code);
 int alarmmgr_check_next_duetime(void);
 
+typedef struct _alarm_cb_info_t {
+       int alarm_id;
+       alarm_cb_t cb_func;
+       void *priv_data;
+       struct _alarm_cb_info_t *next;
+} alarm_cb_info_t;
 
+static alarm_cb_info_t *alarmcb_head = NULL;
+
+static void __add_resultcb(int alarm_id, alarm_cb_t cb_func,
+                        void *data)
+{
+       alarm_cb_info_t *info;
+
+       info = (alarm_cb_info_t *) malloc(sizeof(alarm_cb_info_t));
+       if(info == NULL)
+               return;
+       info->alarm_id = alarm_id;
+       info->cb_func = cb_func;
+       info->priv_data = data;
+
+       info->next = alarmcb_head;
+       alarmcb_head = info;
+}
+
+static alarm_cb_info_t *__find_resultcb(int alarm_id)
+{
+       alarm_cb_info_t *tmp;
+
+       tmp = alarmcb_head;
+       while (tmp) {
+               if (tmp->alarm_id == alarm_id)
+                       return tmp;
+               tmp = tmp->next;
+       }
+       return NULL;
+}
+
+static void __remove_resultcb(alarm_cb_info_t *info)
+{
+       alarm_cb_info_t *tmp;
+
+       if (alarmcb_head == NULL || info == NULL)
+               return;
+
+       if (alarmcb_head == info) {
+               alarmcb_head = info->next;
+               free(info);
+               return;
+       }
+
+       tmp = alarmcb_head;
+       while (tmp) {
+               if (tmp->next == info) {
+                       tmp->next = info->next;
+                       free(info);
+                       return;
+               }
+               tmp = tmp->next;
+       }
+}
 
 static DBusHandlerResult __expire_alarm_filter(DBusConnection *connection,
                                               DBusMessage *message,
                                               void *user_data)
 {
+       alarm_cb_info_t *info;
+
        if (dbus_message_get_type(message) == DBUS_MESSAGE_TYPE_METHOD_CALL) {
                const char *method_name = dbus_message_get_member(message);
                /*"alarm_expired" */
@@ -100,12 +163,18 @@ static DBusHandlerResult __expire_alarm_filter(DBusConnection *connection,
                                /* alarm_context.alarm_handler(alarm_id); */
                                alarm_context.alarm_handler(alarm_id,
                                        alarm_context.user_param);
+                       info = __find_resultcb(alarm_id);
+
+                       if( info && info->cb_func ) {
+                               info->cb_func(alarm_id, info->priv_data);
+                       //      __remove_resultcb(info);
+                       }
+
                        return DBUS_HANDLER_RESULT_HANDLED;
                }
        }
 
        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
 }
 
 static int __alarm_validate_date(alarm_date_t *date, int *error_code)
@@ -183,7 +252,7 @@ static int __sub_init()
        GError *error = NULL;
 
        if (sub_initialized) {
-               ALARM_MGR_EXCEPTION_PRINT("__sub_init was already called.\n");
+               //ALARM_MGR_LOG_PRINT("__sub_init was already called.\n");
                return ALARMMGR_RESULT_SUCCESS;
        }
 
@@ -225,7 +294,7 @@ bool alarm_power_off(int *error_code)
                        "[alarm-lib]:ALARM_BOOT feature is not supported. "
                            "so we return false.\n");
        if (error_code)
-               *error_code = -1;       /*-1 means that system failed 
+               *error_code = -1;       /*-1 means that system failed
                                                        internally.*/
        return false;
 #endif
@@ -250,7 +319,7 @@ int alarmmgr_check_next_duetime()
        return ALARMMGR_RESULT_SUCCESS;
 }
 
-EXPORT_API int alarmmgr_init(const char *pkg_name)
+EXPORT_API int alarmmgr_init(const char *appid)
 {
        DBusError derror;
        int request_name_result = 0;
@@ -260,11 +329,12 @@ EXPORT_API int alarmmgr_init(const char *pkg_name)
        int ret;
        int i = 0;
        int j = 0;
+       int len = 0;
 
-       if (pkg_name == NULL)
+       if (appid == NULL)
                return ERR_ALARM_INVALID_PARAM;
 
-       if (strlen(pkg_name) >= MAX_PKG_NAME_LEN)
+       if (strlen(appid) >= MAX_PKG_NAME_LEN)
                return ERR_ALARM_INVALID_PARAM;
 
        if (b_initialized) {
@@ -279,7 +349,10 @@ EXPORT_API int alarmmgr_init(const char *pkg_name)
                return ret;
 
        memset(service_name_mod, 'a', MAX_SERVICE_NAME_LEN-1);
-       strncpy(service_name, pkg_name, MAX_PKG_NAME_LEN);
+
+       len = strlen("ALARM.");
+       strncpy(service_name, "ALARM.", len);
+       strncpy(service_name + len, appid, strlen(appid));
 
        j=0;
 
@@ -296,10 +369,8 @@ EXPORT_API int alarmmgr_init(const char *pkg_name)
                 j++;
         }
 
-       strncat(service_name, ".ALARM", strlen(".ALARM"));
-
-       strncat(service_name_mod, ".ALARM", strlen(".ALARM"));
-
+       ALARM_MGR_LOG_PRINT("[alarm-lib]: service_name %s\n", service_name);
+       ALARM_MGR_LOG_PRINT("[alarm-lib]: service_name_mod %s\n", service_name_mod);
 
        dbus_error_init(&derror);
 
@@ -515,7 +586,7 @@ static int __alarmmgr_init_appsvc(void)
        }
 
        g_thread_init(NULL);
-       
+
        dbus_g_thread_init();
 
        ret = __sub_init();
@@ -523,7 +594,7 @@ static int __alarmmgr_init_appsvc(void)
                return ret;
 
        b_initialized = true;
-       
+
        return ALARMMGR_RESULT_SUCCESS;
 
 }
@@ -595,9 +666,12 @@ EXPORT_API int alarmmgr_add_alarm_appsvc_with_localtime(alarm_entry_t *alarm, vo
        alarm_info_t *alarm_info = NULL;        /* = (alarm_info_t*)alarm; */
        const char *operation = NULL;
        int error_code = 0;
+       char *appid = NULL;
 
        bundle *b=(bundle *)bundle_data;
 
+       ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
+
        if (alarm == NULL) {
                return ERR_ALARM_INVALID_PARAM;
        }
@@ -608,7 +682,7 @@ EXPORT_API int alarmmgr_add_alarm_appsvc_with_localtime(alarm_entry_t *alarm, vo
                return ERR_ALARM_INVALID_PARAM;
        }
        operation = appsvc_get_operation(b);
-       
+
        if (NULL == operation)
        {
                ALARM_MGR_EXCEPTION_PRINT("Invalid parameter bundle [appsvc operation not present]\n");
@@ -623,16 +697,25 @@ EXPORT_API int alarmmgr_add_alarm_appsvc_with_localtime(alarm_entry_t *alarm, vo
 
        alarm_info = (alarm_info_t *) alarm;
 
+       appid = appsvc_get_appid(b);
+
+       if (NULL == appid && (alarm_info->alarm_type & ALARM_TYPE_NOLAUNCH) )
+       {
+               ALARM_MGR_EXCEPTION_PRINT("Invalid parameter\n");
+               return ERR_ALARM_INVALID_PARAM;
+       }
+
        if (alarm_info == NULL || alarm_id == NULL) {
                ALARM_MGR_EXCEPTION_PRINT("Invalid parameter\n");
                return ERR_ALARM_INVALID_PARAM;
        }
        alarm_mode_t *mode = &alarm_info->mode;
 
-       ALARM_MGR_LOG_PRINT("alarm_info->start.year(%d), "
-                           "alarm_info->start.month(%d), alarm_info->start.day(%d)",
-                           alarm_info->start.year, alarm_info->start.month,
-                           alarm_info->start.day);
+       ALARM_MGR_LOG_PRINT("start(%d-%d-%d, %02d:%02d:%02d), end(%d-%d-%d), repeat(%d), interval(%d), type(%d)",
+               alarm_info->start.day, alarm_info->start.month, alarm_info->start.year,
+               alarm_info->start.hour, alarm_info->start.min, alarm_info->start.sec,
+               alarm_info->end.year, alarm_info->end.month, alarm_info->end.day,
+               alarm_info->mode.repeat, alarm_info->mode.u_interval, alarm_info->alarm_type);
 
        /* TODO: This should be changed to > ALARM_REPEAT_MODE_MAX ? */
        if (mode->repeat >= ALARM_REPEAT_MODE_MAX) {
@@ -659,7 +742,7 @@ EXPORT_API int alarmmgr_add_alarm_appsvc_with_localtime(alarm_entry_t *alarm, vo
            (alarm_context, alarm_info, alarm_id, b,
             &error_code)) {
                return error_code;
-       }       
+       }
 
        return ALARMMGR_RESULT_SUCCESS;
 }
@@ -678,6 +761,8 @@ EXPORT_API int alarmmgr_add_alarm_with_localtime(alarm_entry_t *alarm,
        int i = 0;
        int j = 0;
 
+       ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
+
        if (alarm == NULL) {
                return ERR_ALARM_INVALID_PARAM;
        }
@@ -694,12 +779,11 @@ EXPORT_API int alarmmgr_add_alarm_with_localtime(alarm_entry_t *alarm,
        if (ret < 0)
                return ret;
 
-       ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
-
-       ALARM_MGR_LOG_PRINT("alarm_info->start.year(%d), "
-                           "alarm_info->start.month(%d), alarm_info->start.day(%d)",
-                           alarm_info->start.year, alarm_info->start.month,
-                           alarm_info->start.day);
+       ALARM_MGR_LOG_PRINT("start(%d-%d-%d, %02d:%02d:%02d), end(%d-%d-%d), repeat(%d), interval(%d), type(%d)",
+               alarm_info->start.day, alarm_info->start.month, alarm_info->start.year,
+               alarm_info->start.hour, alarm_info->start.min, alarm_info->start.sec,
+               alarm_info->end.year, alarm_info->end.month, alarm_info->end.day,
+               alarm_info->mode.repeat, alarm_info->mode.u_interval, alarm_info->alarm_type);
 
        /* TODO: This should be changed to > ALARM_REPEAT_MODE_MAX ? */
        if (mode->repeat >= ALARM_REPEAT_MODE_MAX) {
@@ -729,8 +813,8 @@ EXPORT_API int alarmmgr_add_alarm_with_localtime(alarm_entry_t *alarm,
 
        if (destination != NULL) {
                memset(dst_service_name, 0,
-                      strlen(destination) + strlen(".ALARM") + 2);
-               snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "%s",
+                      strlen(destination) + strlen("ALARM.") + 2);
+               snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "ALARM.%s",
                         destination);
 
                memset(dst_service_name_mod,'a',MAX_SERVICE_NAME_LEN-1);
@@ -751,9 +835,6 @@ EXPORT_API int alarmmgr_add_alarm_with_localtime(alarm_entry_t *alarm,
                        j++;
                }
 
-               strncat(dst_service_name, ".ALARM", strlen(".ALARM"));
-               strncat(dst_service_name_mod, ".ALARM", strlen(".ALARM"));
-
                if (!_send_alarm_create
                    (alarm_context, alarm_info, alarm_id, dst_service_name, dst_service_name_mod,
                     &error_code)) {
@@ -779,6 +860,9 @@ EXPORT_API int alarmmgr_add_alarm_appsvc(int alarm_type, time_t trigger_at_time,
        struct tm duetime_tm;
        alarm_info_t alarm_info;
        const char *operation = NULL;
+       char *appid = NULL;
+
+       ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
 
        bundle *b=(bundle *)bundle_data;
 
@@ -788,21 +872,27 @@ EXPORT_API int alarmmgr_add_alarm_appsvc(int alarm_type, time_t trigger_at_time,
                return ERR_ALARM_INVALID_PARAM;
        }
        operation = appsvc_get_operation(b);
-       
+
        if (NULL == operation)
        {
                ALARM_MGR_EXCEPTION_PRINT("Invalid parameter bundle [appsvc operation not present]\n");
                return ERR_ALARM_INVALID_PARAM;
        }
 
+       appid = appsvc_get_appid(b);
+
+       if (NULL == appid && (alarm_type & ALARM_TYPE_NOLAUNCH) )
+       {
+               ALARM_MGR_EXCEPTION_PRINT("Invalid parameter\n");
+               return ERR_ALARM_INVALID_PARAM;
+       }
+
        if (__alarmmgr_init_appsvc() < 0)
        {
                ALARM_MGR_EXCEPTION_PRINT("Unable to initialize dbus!!!\n");
                return ERR_ALARM_SYSTEM_FAIL;
        }
 
-       ALARM_MGR_LOG_PRINT("interval(%d)", interval);
-
        if (alarm_id == NULL) {
                return ERR_ALARM_INVALID_PARAM;
        }
@@ -840,11 +930,16 @@ EXPORT_API int alarmmgr_add_alarm_appsvc(int alarm_type, time_t trigger_at_time,
                alarm_info.mode.u_interval.interval = interval;
        }
 
+       ALARM_MGR_LOG_PRINT("trigger_at_time(%d), start(%d-%d-%d, %02d:%02d:%02d), repeat(%d), interval(%d), type(%d)",
+               trigger_at_time, alarm_info.start.day, alarm_info.start.month, alarm_info.start.year,
+               alarm_info.start.hour, alarm_info.start.min, alarm_info.start.sec,
+               alarm_info.mode.repeat, alarm_info.mode.u_interval, alarm_info.alarm_type);
+
        if (!_send_alarm_create_appsvc
            (alarm_context, &alarm_info, alarm_id, b,
             &error_code)) {
                return error_code;
-       }       
+       }
 
        return ALARMMGR_RESULT_SUCCESS;
 }
@@ -864,14 +959,12 @@ EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
        alarm_info_t alarm_info;
        int ret;
 
+       ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
+
        ret = __sub_init();
        if (ret < 0)
                return ret;
 
-       ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
-
-       ALARM_MGR_LOG_PRINT("interval(%d)", interval);
-
        if (alarm_id == NULL) {
                return ERR_ALARM_INVALID_PARAM;
        }
@@ -914,10 +1007,15 @@ EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
                alarm_info.mode.u_interval.interval = interval;
        }
 
+       ALARM_MGR_LOG_PRINT("trigger_at_time(%d), start(%d-%d-%d, %02d:%02d:%02d), repeat(%d), interval(%d), type(%d)",
+               trigger_at_time, alarm_info.start.day, alarm_info.start.month, alarm_info.start.year,
+               alarm_info.start.hour, alarm_info.start.min, alarm_info.start.sec,
+               alarm_info.mode.repeat, alarm_info.mode.u_interval, alarm_info.alarm_type);
+
        if (destination != NULL) {
                memset(dst_service_name, 0,
-                      strlen(destination) + strlen(".ALARM") + 2);
-               snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "%s",
+                      strlen(destination) + strlen("ALARM.") + 2);
+               snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "ALARM.%s",
                         destination);
                memset(dst_service_name_mod,'a',MAX_SERVICE_NAME_LEN-1);
 
@@ -937,9 +1035,6 @@ EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
                        j++;
                }
 
-               strncat(dst_service_name, ".ALARM", strlen(".ALARM"));
-               strncat(dst_service_name_mod, ".ALARM", strlen(".ALARM"));
-
                if (!_send_alarm_create
                    (alarm_context, &alarm_info, alarm_id, dst_service_name,dst_service_name_mod,
                     &error_code)) {
@@ -954,16 +1049,89 @@ EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
        return ALARMMGR_RESULT_SUCCESS;
 }
 
+EXPORT_API int alarmmgr_add_alarm_withcb(int alarm_type, time_t trigger_at_time,
+                                 time_t interval, alarm_cb_t handler, void *user_param, alarm_id_t *alarm_id)
+{
+       char dst_service_name[MAX_SERVICE_NAME_LEN] = { 0 };
+       char dst_service_name_mod[MAX_SERVICE_NAME_LEN] = { 0 };
+       int i = 0;
+       int j = 0;
+       int error_code;
+       time_t current_time;
+       struct tm duetime_tm;
+       alarm_info_t alarm_info;
+       int ret;
+       char appid[256];
+
+        ret = aul_app_get_appid_bypid(getpid(), appid, sizeof(appid));
+        if (ret != AUL_R_OK)
+               return ERR_ALARM_SYSTEM_FAIL;
+
+       ret = alarmmgr_init(appid);
+       if (ret < 0)
+               return ret;
+
+       ALARM_MGR_LOG_PRINT("[alarm-lib]:alarmmgr_add_alarm_withcb() is called\n");
+
+       ALARM_MGR_LOG_PRINT("interval(%d)", interval);
+
+       if (alarm_id == NULL) {
+               return ERR_ALARM_INVALID_PARAM;
+       }
+
+       if (trigger_at_time < 0) {
+               return ERR_ALARM_INVALID_PARAM;
+       }
+
+       alarm_info.alarm_type = alarm_type;
+       alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
+       alarm_info.alarm_type |= ALARM_TYPE_WITHCB;
+
+       time(&current_time);
+
+       current_time += trigger_at_time;
+
+       localtime_r(&current_time, &duetime_tm);
+
+       alarm_info.start.year = duetime_tm.tm_year + 1900;
+       alarm_info.start.month = duetime_tm.tm_mon + 1;
+       alarm_info.start.day = duetime_tm.tm_mday;
+
+       alarm_info.end.year = 0;
+       alarm_info.end.month = 0;
+       alarm_info.end.day = 0;
+
+       alarm_info.start.hour = duetime_tm.tm_hour;
+       alarm_info.start.min = duetime_tm.tm_min;
+       alarm_info.start.sec = duetime_tm.tm_sec;
+
+       if (interval <= 0) {
+               alarm_info.mode.repeat = ALARM_REPEAT_MODE_ONCE;
+               alarm_info.mode.u_interval.interval = 0;
+       } else {
+               alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT;
+               alarm_info.mode.u_interval.interval = interval;
+       }
+
+       if (!_send_alarm_create(alarm_context, &alarm_info, alarm_id, "null","null", &error_code)) {
+               return error_code;
+       }
+       __add_resultcb(*alarm_id, handler, user_param);
+
+       return ALARMMGR_RESULT_SUCCESS;
+}
+
 EXPORT_API int alarmmgr_remove_alarm(alarm_id_t alarm_id)
 {
        int error_code;
        int ret;
+       alarm_cb_info_t *info;
 
        ret = __sub_init();
        if (ret < 0)
                return ret;
 
-       ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_delete() is called\n");
+       ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_delete(%d) is called\n", alarm_id);
 
        if (alarm_id <= 0) {
                return ERR_ALARM_INVALID_ID;
@@ -972,6 +1140,9 @@ EXPORT_API int alarmmgr_remove_alarm(alarm_id_t alarm_id)
        if (!_send_alarm_delete(alarm_context, alarm_id, &error_code))
                return error_code;
 
+       info = __find_resultcb(alarm_id);
+       __remove_resultcb(info);
+
        return ALARMMGR_RESULT_SUCCESS;
 }
 
@@ -1022,6 +1193,16 @@ EXPORT_API int alarmmgr_enum_alarm_ids(alarm_enum_fn_t fn, void *user_param)
        if (return_code != 0) {
                return return_code;
        } else {
+               if (error != NULL) {
+                       ALARM_MGR_LOG_PRINT(
+                               "Alarm server not ready dbus error message %s\n", error->message);
+                       return ERR_ALARM_SYSTEM_FAIL;
+               }
+               if (NULL == alarm_array) {
+                       ALARM_MGR_LOG_PRINT(
+                               "alarm server not initilized\n");
+                       return ERR_ALARM_SYSTEM_FAIL;
+               }
                for (i = 0; i < alarm_array->len && i < maxnum_of_ids; i++) {
                        alarm_id = g_array_index(alarm_array, alarm_id_t, i);
                        (*fn) (alarm_id, user_param);
@@ -1115,8 +1296,8 @@ int alarmmgr_create(alarm_info_t *alarm_info, char *destination,
 
        if (destination != NULL) {
                memset(dst_service_name, 0,
-                      strlen(destination) + strlen(".ALARM") + 2);
-               snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "%s.ALARM",
+                      strlen(destination) + strlen("ALARM.") + 2);
+               snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "ALARM.%s",
                         destination);
                if (!_send_alarm_create
                    (alarm_context, alarm_info, alarm_id, dst_service_name,"null",
@@ -1172,3 +1353,19 @@ int alarmmgr_get_list_of_ids(int maxnum_of_ids, alarm_id_t *alarm_id,
 
        return ALARMMGR_RESULT_SUCCESS;
 }
+
+EXPORT_API int alarmmgr_get_next_duetime(alarm_id_t alarm_id, time_t* duetime)
+{
+       int error_code;
+       ALARM_MGR_LOG_PRINT("[alarm-lib]:alarmmgr_get_next_duetime() is called\n");
+
+       if (duetime == NULL) {
+               return ERR_ALARM_INVALID_PARAM;
+       }
+
+       if (!_send_alarm_get_next_duetime
+               (alarm_context, alarm_id, duetime, &error_code))
+               return error_code;
+
+       return ALARMMGR_RESULT_SUCCESS;
+}