#include "alarm-stub.h"
#include <bundle.h>
#include <appsvc.h>
+#include <aul.h>
#define MAX_KEY_SIZE 256
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" */
/* 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)
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;
}
"[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
int ret;
int i = 0;
int j = 0;
+ int len = 0;
if (appid == NULL)
return ERR_ALARM_INVALID_PARAM;
return ret;
memset(service_name_mod, 'a', MAX_SERVICE_NAME_LEN-1);
- strncpy(service_name, appid, MAX_PKG_NAME_LEN);
+
+ len = strlen("ALARM.");
+ strncpy(service_name, "ALARM.", len);
+ strncpy(service_name + len, appid, strlen(appid));
j=0;
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);
}
g_thread_init(NULL);
-
+
dbus_g_thread_init();
ret = __sub_init();
return ret;
b_initialized = true;
-
+
return ALARMMGR_RESULT_SUCCESS;
}
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;
}
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");
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) {
(alarm_context, alarm_info, alarm_id, b,
&error_code)) {
return error_code;
- }
+ }
return ALARMMGR_RESULT_SUCCESS;
}
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;
}
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) {
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);
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)) {
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;
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;
}
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;
}
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;
}
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);
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)) {
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(¤t_time);
+
+ current_time += trigger_at_time;
+
+ localtime_r(¤t_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;
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;
}
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",
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;
+}