4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Venkatesha Sarpangala <sarpangala.v@samsung.com>, Jayoun Lee <airjany@samsung.com>,
7 * Sewook Park <sewook7.park@samsung.com>, Jaeho Lee <jaeho81.lee@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
28 #include <sys/types.h>
34 #include "alarm-internal.h"
35 #include "alarm-mgr-stub.h"
40 #include <security-server.h>
41 #include <pkgmgr-info.h>
43 #define MAX_KEY_SIZE 256
44 #define MAX_PROC_NAME_LEN 512
46 static alarm_context_t alarm_context = { NULL, NULL, NULL, NULL, -1 };
48 static bool b_initialized = false;
49 static bool sub_initialized = false;
51 pthread_mutex_t init_lock = PTHREAD_MUTEX_INITIALIZER;
53 static void __handle_expiry_method_call(GDBusConnection *conn,
54 const gchar *name, const gchar *path, const gchar *interface,
55 const gchar *method, GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data);
57 static int __alarm_validate_date(alarm_date_t *date, int *error_code);
58 static bool __alarm_validate_time(alarm_date_t *date, int *error_code);
59 static int __sub_init(void);
60 static int __alarmmgr_init_appsvc(void);
62 typedef struct _alarm_cb_info_t {
66 struct _alarm_cb_info_t *next;
69 static alarm_cb_info_t *alarmcb_head = NULL;
71 guint registration_id = 0;
73 static GDBusNodeInfo *introspection_data = NULL;
75 static const gchar introspection_xml[] =
76 "<node name='/org/tizen/alarm/client'>"
77 " <interface name='org.tizen.alarm.client'>"
78 " <method name='alarm_expired'>"
79 " <arg type='i' name='alarm_id' direction='in'/>"
80 " <arg type='s' name='service_name' direction='in'/>"
85 static const GDBusInterfaceVTable interface_vtable =
87 __handle_expiry_method_call,
92 static int __bg_category_func(const char *name, void *user_data)
94 bg_category_cb_info_t *info = (bg_category_cb_info_t *)user_data;
95 ALARM_MGR_LOG_PRINT("appid[%s], bg name = %s", info->appid, name);
97 strncmp("enable", name, strlen(name)) && strncmp("disable", name, strlen(name))) {
105 static void __add_resultcb(alarm_id_t alarm_id, alarm_cb_t cb_func, void *data)
107 alarm_cb_info_t *info;
109 info = (alarm_cb_info_t *) malloc(sizeof(alarm_cb_info_t));
112 info->alarm_id = alarm_id;
113 info->cb_func = cb_func;
114 info->priv_data = data;
116 info->next = alarmcb_head;
120 static alarm_cb_info_t *__find_resultcb(alarm_id_t alarm_id)
122 alarm_cb_info_t *tmp;
126 if (tmp->alarm_id == alarm_id) {
127 ALARM_MGR_LOG_PRINT("matched alarm id = %d", alarm_id);
135 static void __remove_resultcb(alarm_cb_info_t *info)
137 alarm_cb_info_t *tmp;
139 if (alarmcb_head == NULL || info == NULL)
142 if (alarmcb_head == info) {
143 alarmcb_head = info->next;
150 if (tmp->next == info) {
151 tmp->next = info->next;
159 static void __handle_expiry_method_call(GDBusConnection *conn,
160 const gchar *name, const gchar *path, const gchar *interface,
161 const gchar *method, GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
163 if (method && strcmp(method, "alarm_expired") == 0) {
164 gchar *package_name = NULL;
165 alarm_id_t alarm_id = 0;
166 alarm_cb_info_t *info = NULL;
167 g_variant_get(param, "(is)", &alarm_id, &package_name);
168 ALARM_MGR_EXCEPTION_PRINT("[alarm-lib] : Alarm expired for [%s] : Alarm id [%d]", package_name, alarm_id);
170 if (alarm_context.alarm_handler != NULL) {
171 alarm_context.alarm_handler(alarm_id, alarm_context.user_param);
174 info = __find_resultcb(alarm_id);
175 if (info && info->cb_func) {
176 info->cb_func(alarm_id, info->priv_data);
178 g_free(package_name);
182 static int __alarm_validate_date(alarm_date_t *date, int *error_code)
185 if (date->year == 0 && date->month == 0 && date->day == 0) {
189 int year = date->year;
190 int month = date->month;
193 if (month < 1 || month > 12) {
195 *error_code = ERR_ALARM_INVALID_DATE;
199 if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8
200 || month == 10 || month == 12)
201 && (day < 1 || day > 31)) {
203 *error_code = ERR_ALARM_INVALID_DATE;
207 if ((month == 4 || month == 6 || month == 9 || month == 11)
208 && (day < 1 || day > 30)) {
210 *error_code = ERR_ALARM_INVALID_DATE;
215 if ((year % 100 != 0 && year % 4 == 0) || (year % 400 == 0)) {
216 if (day < 1 || day > 29) {
218 *error_code = ERR_ALARM_INVALID_DATE;
222 if (day < 1 || day > 28) {
224 *error_code = ERR_ALARM_INVALID_DATE;
235 static bool __alarm_validate_time(alarm_date_t *date, int *error_code)
237 if (date->hour < 0 || date->hour > 23) {
239 *error_code = ERR_ALARM_INVALID_TIME;
243 if (date->min < 0 || date->min > 59) {
245 *error_code = ERR_ALARM_INVALID_TIME;
252 static bool __is_permitted(const char *app_id, int alarm_type)
254 if (app_id == NULL) {
255 ALARM_MGR_EXCEPTION_PRINT("app_id is NULL. Only expicit launch is permitted\n");
259 pkgmgrinfo_appinfo_h handle = NULL;
261 bool _return = false;
263 ret = pkgmgrinfo_appinfo_get_appinfo(app_id, &handle);
264 if (ret != PMINFO_R_OK) {
265 ALARM_MGR_EXCEPTION_PRINT("Failed to get appinfo [%s]\n", app_id);
267 char *app_type = NULL;
268 ret = pkgmgrinfo_appinfo_get_component_type(handle, &app_type);
269 if (app_type && strcmp("uiapp", app_type) == 0) {
270 ALARM_MGR_LOG_PRINT("[%s] is ui application. It is allowed", app_id);
273 } else if (app_type && strcmp("svcapp", app_type) == 0) {
274 ALARM_MGR_LOG_PRINT("[%s] is service application.", app_id);
276 bg_category_cb_info_t info = {
281 if (alarm_type & ALARM_TYPE_INEXACT) {
282 ret = pkgmgrinfo_appinfo_foreach_background_category(handle, __bg_category_func, &info);
283 if (ret == PMINFO_R_OK && info.has_bg) {
284 ALARM_MGR_LOG_PRINT("[%s] has background categories.", app_id);
288 ALARM_MGR_EXCEPTION_PRINT("Failed to foreach background category. [%s] is not allowed\n", app_id);
296 pkgmgrinfo_appinfo_destroy_appinfo(handle);
300 static int __sub_init()
302 GError *error = NULL;
303 char proc_file[MAX_PROC_NAME_LEN] = {0, };
304 char process_name[MAX_PROC_NAME_LEN] = {0, };
307 const int MAX_LEN = MAX_PROC_NAME_LEN;
309 pthread_mutex_lock(&init_lock);
311 if (sub_initialized) {
312 pthread_mutex_unlock(&init_lock);
313 return ALARMMGR_RESULT_SUCCESS;
316 #if !GLIB_CHECK_VERSION(2,32,0)
321 alarm_context.connection = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &error);
322 if (alarm_context.connection == NULL) {
323 ALARM_MGR_EXCEPTION_PRINT("g_bus_get_sync() is failed.");
325 ALARM_MGR_EXCEPTION_PRINT("dbus error message: %s", error->message);
328 pthread_mutex_unlock(&init_lock);
329 return ERR_ALARM_SYSTEM_FAIL;
332 alarm_context.proxy = g_dbus_proxy_new_sync(alarm_context.connection,
333 G_DBUS_PROXY_FLAGS_NONE,
335 "org.tizen.alarm.manager",
336 "/org/tizen/alarm/manager",
337 "org.tizen.alarm.manager",
341 if (alarm_context.proxy == NULL) {
342 ALARM_MGR_EXCEPTION_PRINT("Creating a proxy is failed.");
343 g_object_unref (alarm_context.connection);
344 pthread_mutex_unlock(&init_lock);
345 return ERR_ALARM_SYSTEM_FAIL;
348 // Only webapp which has a pid of WebProcess uses the sid. Otherwise, the pid is used.
349 snprintf(proc_file, MAX_LEN, "/proc/%d/cmdline", getpid());
350 fd = open(proc_file, O_RDONLY);
352 SECURE_LOGE("Unable to get the proc file(%d).\n", getpid());
353 g_object_unref(alarm_context.proxy);
354 g_object_unref(alarm_context.connection);
355 pthread_mutex_unlock(&init_lock);
356 return ERR_ALARM_SYSTEM_FAIL;
359 ret = read(fd, process_name, MAX_LEN - 1);
362 ALARM_MGR_EXCEPTION_PRINT("Unable to read the proc file(%d).", getpid());
363 g_object_unref(alarm_context.proxy);
364 g_object_unref(alarm_context.connection);
365 pthread_mutex_unlock(&init_lock);
366 return ERR_ALARM_SYSTEM_FAIL;
369 if (strncmp(process_name, "/usr/bin/WebProcess", strlen("/usr/bin/WebProcess")) == 0) {
370 alarm_context.pid = getsid(getpid());
371 SECURE_LOGD("alarm_context.pid is set to sessionID, %d.", alarm_context.pid);
374 alarm_context.pid = getpid();
375 SECURE_LOGD("alarm_context.pid is set to processID, %d.", alarm_context.pid);
380 sub_initialized = true;
382 pthread_mutex_unlock(&init_lock);
384 return ALARMMGR_RESULT_SUCCESS;
387 EXPORT_API int alarmmgr_init(const char *appid)
389 SECURE_LOGD("Enter");
390 char service_name[MAX_SERVICE_NAME_LEN] = { 0 };
391 char service_name_mod[MAX_SERVICE_NAME_LEN]= { 0 };
392 int ret = ALARMMGR_RESULT_SUCCESS;
399 return ERR_ALARM_INVALID_PARAM;
401 if (strlen(appid) >= MAX_PKG_NAME_LEN)
402 return ERR_ALARM_INVALID_PARAM;
405 SECURE_LOGD("alarm was already initialized. app_service_name=%s",
406 g_quark_to_string(alarm_context.quark_app_service_name));
407 return ALARMMGR_RESULT_SUCCESS;
414 memset(service_name_mod, 'a', MAX_SERVICE_NAME_LEN - 1);
416 len = strlen("ALARM.");
417 strncpy(service_name, "ALARM.", len);
418 strncpy(service_name + len, appid, strlen(appid));
420 for(i = 0; i <= strlen(service_name); i++) {
421 if (service_name[i] == '.') {
422 service_name_mod[j] = service_name[i];
426 service_name_mod[j] = service_name[i];
431 SECURE_LOGD("[alarm-lib]: dbus own name: %s", service_name_mod);
432 owner_id = g_bus_own_name_on_connection(alarm_context.connection, service_name_mod,
433 G_BUS_NAME_OWNER_FLAGS_NONE, NULL, NULL, NULL, NULL);
435 ALARM_MGR_EXCEPTION_PRINT("Acquiring the own name is failed. %s", service_name_mod);
439 introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL);
440 if (introspection_data == NULL) {
441 ALARM_MGR_EXCEPTION_PRINT("g_dbus_node_info_new_for_xml() is failed.");
445 registration_id = g_dbus_connection_register_object(alarm_context.connection,
446 "/org/tizen/alarm/client",
447 introspection_data->interfaces[0],
448 &interface_vtable, NULL, NULL, NULL);
449 if (registration_id == 0) {
450 ALARM_MGR_EXCEPTION_PRINT("Registering the callback is failed.");
454 alarm_context.quark_app_service_name = g_quark_from_string(service_name);
455 alarm_context.quark_app_service_name_mod= g_quark_from_string(service_name_mod);
457 b_initialized = true;
459 SECURE_LOGD("Leave");
460 return ALARMMGR_RESULT_SUCCESS;
463 if (introspection_data) {
464 g_dbus_node_info_unref(introspection_data);
466 if (registration_id != 0) {
467 g_dbus_connection_unregister_object(alarm_context.connection, registration_id);
469 g_object_unref(alarm_context.proxy);
470 alarm_context.proxy = NULL;
472 g_object_unref(alarm_context.connection);
473 alarm_context.connection = NULL;
475 sub_initialized = false;
476 return ERR_ALARM_INVALID_PARAM;
479 EXPORT_API void alarmmgr_fini()
481 SECURE_LOGD("Enter");
482 if (introspection_data) {
483 g_dbus_node_info_unref(introspection_data);
486 if (alarm_context.connection != NULL && registration_id != 0) {
487 g_dbus_connection_unregister_object(alarm_context.connection, registration_id);
490 if (alarm_context.proxy) {
491 g_object_unref(alarm_context.proxy);
492 alarm_context.proxy = NULL;
495 if (alarm_context.connection) {
496 g_object_unref(alarm_context.connection);
497 alarm_context.connection = NULL;
500 b_initialized = false;
501 sub_initialized = false;
503 SECURE_LOGD("Leave");
506 EXPORT_API int alarmmgr_set_cb(alarm_cb_t handler, void *user_param)
508 SECURE_LOGD("Enter");
510 if (handler == NULL) {
511 ALARM_MGR_EXCEPTION_PRINT("callback is NULL.");
512 return ERR_ALARM_INVALID_PARAM;
514 alarm_context.alarm_handler = handler;
515 alarm_context.user_param = user_param;
517 SECURE_LOGD("Leave");
518 return ALARMMGR_RESULT_SUCCESS;
521 EXPORT_API alarm_entry_t *alarmmgr_create_alarm(void)
523 alarm_info_t *alarm = (alarm_info_t *) malloc(sizeof(alarm_info_t));
530 alarm->start.year = 0;
531 alarm->start.month = 0;
532 alarm->start.day = 0;
533 alarm->start.hour = 0;
534 alarm->start.min = 0;
535 alarm->start.sec = 0;
538 alarm->end.month = 0;
544 alarm->mode.repeat = ALARM_REPEAT_MODE_ONCE;
545 alarm->mode.u_interval.interval = 0;
547 alarm->alarm_type = ALARM_TYPE_DEFAULT;
549 alarm->reserved_info = 0;
551 return (alarm_entry_t *) alarm;
554 EXPORT_API int alarmmgr_free_alarm(alarm_entry_t *alarm)
557 return ERR_ALARM_INVALID_PARAM;
561 return ALARMMGR_RESULT_SUCCESS;
564 EXPORT_API int alarmmgr_set_time(alarm_entry_t *alarm, alarm_date_t time)
566 alarm_info_t *alarm_info; /*= (alarm_info_t*)alarm;*/
570 return ERR_ALARM_INVALID_PARAM;
573 alarm_info = (alarm_info_t *) alarm;
575 if (!__alarm_validate_date(&time, &error_code)) {
576 ALARM_MGR_EXCEPTION_PRINT("start date error\n");
580 if (!__alarm_validate_time(&time, &error_code)) {
581 ALARM_MGR_EXCEPTION_PRINT("start time error\n");
585 memcpy(&alarm_info->start, &time, sizeof(alarm_date_t));
587 return ALARMMGR_RESULT_SUCCESS;
590 EXPORT_API int alarmmgr_get_time(const alarm_entry_t *alarm,
593 alarm_info_t *alarm_info = (alarm_info_t *) alarm;
596 return ERR_ALARM_INVALID_PARAM;
600 memcpy(time, &alarm_info->start, sizeof(alarm_date_t));
602 return ALARMMGR_RESULT_SUCCESS;
605 EXPORT_API int alarmmgr_set_repeat_mode(alarm_entry_t *alarm,
606 alarm_repeat_mode_t repeat,
609 alarm_info_t *alarm_info = (alarm_info_t *) alarm;
611 if (repeat >= ALARM_REPEAT_MODE_MAX) {
612 return ERR_ALARM_INVALID_PARAM;
615 alarm_info->mode.repeat = repeat;
616 if (repeat == ALARM_REPEAT_MODE_REPEAT || repeat == ALARM_REPEAT_MODE_WEEKLY) {
618 return ERR_ALARM_INVALID_PARAM;
620 alarm_info->mode.u_interval.interval = interval;
623 return ALARMMGR_RESULT_SUCCESS;
626 EXPORT_API int alarmmgr_get_repeat_mode(const alarm_entry_t *alarm,
627 alarm_repeat_mode_t *repeat,
630 alarm_info_t *alarm_info = (alarm_info_t *) alarm;
633 return ERR_ALARM_INVALID_PARAM;
637 *repeat = alarm_info->mode.repeat;
638 if (interval != NULL)
639 *interval = alarm_info->mode.u_interval.interval;
641 return ALARMMGR_RESULT_SUCCESS;
644 EXPORT_API int alarmmgr_set_type(alarm_entry_t *alarm, int alarm_type)
646 alarm_info_t *alarm_info; /*= (alarm_info_t*)alarm;*/
649 return ERR_ALARM_INVALID_PARAM;
652 alarm_info = (alarm_info_t *) alarm;
654 alarm_info->alarm_type = alarm_type;
655 alarm_info->alarm_type &= (~ALARM_TYPE_RELATIVE);
657 return ALARMMGR_RESULT_SUCCESS;
660 EXPORT_API int alarmmgr_get_type(const alarm_entry_t *alarm, int *alarm_type)
662 alarm_info_t *alarm_info = (alarm_info_t *) alarm;
665 return ERR_ALARM_INVALID_PARAM;
668 if (alarm_type != NULL)
669 *alarm_type = alarm_info->alarm_type;
671 return ALARMMGR_RESULT_SUCCESS;
675 static int __alarmmgr_init_appsvc(void)
678 ALARM_MGR_EXCEPTION_PRINT("alarm was already initialized.");
679 return ALARMMGR_RESULT_SUCCESS;
682 int ret = __sub_init();
686 b_initialized = true;
687 return ALARMMGR_RESULT_SUCCESS;
690 EXPORT_API void *alarmmgr_get_alarm_appsvc_info(alarm_id_t alarm_id, int *return_code){
702 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarmmgr_get_alarm_appsvc_info() is called.");
706 *return_code = ERR_ALARM_INVALID_ID;
711 return _send_alarm_get_appsvc_info(alarm_context, alarm_id, return_code);
715 EXPORT_API int alarmmgr_set_rtc_time(alarm_date_t *time){
721 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter time\n");
722 return ERR_ALARM_INVALID_PARAM;
730 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarmmgr_set_rtc_time() is called\n");
732 if (!__alarm_validate_date(time, &error_code)) {
733 ALARM_MGR_EXCEPTION_PRINT("RTC date error\n");
737 if (!__alarm_validate_time(time, &error_code)) {
738 ALARM_MGR_EXCEPTION_PRINT("RTC time error\n");
745 if (!_send_alarm_set_rtc_time
746 (alarm_context, time, &error_code)){
750 return ALARMMGR_RESULT_SUCCESS;
754 EXPORT_API int alarmmgr_add_alarm_appsvc_with_localtime(alarm_entry_t *alarm, void *bundle_data, alarm_id_t *alarm_id)
756 alarm_info_t *alarm_info = NULL; /* = (alarm_info_t*)alarm; */
757 const char *operation = NULL;
759 const char *appid = NULL;
761 bundle *b=(bundle *)bundle_data;
763 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
766 return ERR_ALARM_INVALID_PARAM;
771 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter bundle\n");
772 return ERR_ALARM_INVALID_PARAM;
775 operation = appsvc_get_operation(b);
777 if (NULL == operation)
779 appsvc_set_operation(b, APPSVC_OPERATION_DEFAULT);
782 if (__alarmmgr_init_appsvc() < 0)
784 ALARM_MGR_EXCEPTION_PRINT("Unable to initialize dbus!!!\n");
785 return ERR_ALARM_SYSTEM_FAIL;
788 alarm_info = (alarm_info_t *) alarm;
790 appid = appsvc_get_appid(b);
792 if ( (NULL == appid && (alarm_info->alarm_type & ALARM_TYPE_NOLAUNCH)) ||
793 (NULL == appid && operation && !strcmp(operation, APPSVC_OPERATION_DEFAULT)) )
795 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter\n");
796 return ERR_ALARM_INVALID_PARAM;
799 // Checking api version
802 pkgmgrinfo_pkginfo_h pkginfo = NULL;
803 char pkgid[512] = {0, };
804 const char *api_version = "2.4";
806 if (aul_app_get_pkgid_bypid(getpid(), pkgid, sizeof(pkgid)) != AUL_R_OK) {
807 ALARM_MGR_EXCEPTION_PRINT("aul_app_get_pkgid_bypid() is failed. PID %d may not be app.", getpid());
809 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &pkginfo);
810 if (ret != PMINFO_R_OK) {
811 ALARM_MGR_EXCEPTION_PRINT("Failed to get pkginfo\n");
814 ret = pkgmgrinfo_pkginfo_check_api_version(pkginfo, api_version, &result);
815 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
817 ALARM_MGR_EXCEPTION_PRINT("Failed to check api version [%d]\n", ret);
818 return ERR_ALARM_SYSTEM_FAIL;
823 if (result >= 0 && //Since 2.4
824 !__is_permitted(appid, alarm_info->alarm_type)) {
825 ALARM_MGR_EXCEPTION_PRINT("[%s] is not permitted \n", appid);
826 return ERR_ALARM_NOT_PERMITTED_APP;
829 if (alarm_info == NULL || alarm_id == NULL) {
830 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter\n");
831 return ERR_ALARM_INVALID_PARAM;
833 alarm_mode_t *mode = &alarm_info->mode;
835 ALARM_MGR_EXCEPTION_PRINT("start(%d-%d-%d, %02d:%02d:%02d), end(%d-%d-%d), repeat(%d), interval(%d), type(%d)",
836 alarm_info->start.day, alarm_info->start.month, alarm_info->start.year,
837 alarm_info->start.hour, alarm_info->start.min, alarm_info->start.sec,
838 alarm_info->end.year, alarm_info->end.month, alarm_info->end.day,
839 alarm_info->mode.repeat, alarm_info->mode.u_interval, alarm_info->alarm_type);
841 /* TODO: This should be changed to > ALARM_REPEAT_MODE_MAX ? */
842 if (mode->repeat >= ALARM_REPEAT_MODE_MAX) {
843 return ERR_ALARM_INVALID_PARAM;
846 if (!__alarm_validate_date(&alarm_info->start, &error_code)) {
847 ALARM_MGR_EXCEPTION_PRINT("start date error\n");
851 if (!__alarm_validate_time(&alarm_info->start, &error_code)) {
852 ALARM_MGR_EXCEPTION_PRINT("start time error\n");
856 if (!__alarm_validate_date(&alarm_info->end, &error_code)) {
857 ALARM_MGR_EXCEPTION_PRINT("end date error\n");
862 if (!_send_alarm_create_appsvc(alarm_context, alarm_info, alarm_id, b, &error_code)) {
866 return ALARMMGR_RESULT_SUCCESS;
872 EXPORT_API int alarmmgr_add_alarm_with_localtime(alarm_entry_t *alarm,
873 const char *destination,
874 alarm_id_t *alarm_id)
876 char dst_service_name[MAX_SERVICE_NAME_LEN] = { 0 };
877 char dst_service_name_mod[MAX_SERVICE_NAME_LEN] = { 0 };
878 alarm_info_t *alarm_info; /* = (alarm_info_t*)alarm; */
883 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
886 return ERR_ALARM_INVALID_PARAM;
889 alarm_info = (alarm_info_t *) alarm;
890 if (alarm_info == NULL || alarm_id == NULL) {
891 return ERR_ALARM_INVALID_PARAM;
895 alarm_mode_t *mode = &alarm_info->mode;
901 ALARM_MGR_EXCEPTION_PRINT("start(%d-%d-%d, %02d:%02d:%02d), end(%d-%d-%d), repeat(%d), interval(%d), type(%d)",
902 alarm_info->start.day, alarm_info->start.month, alarm_info->start.year,
903 alarm_info->start.hour, alarm_info->start.min, alarm_info->start.sec,
904 alarm_info->end.year, alarm_info->end.month, alarm_info->end.day,
905 alarm_info->mode.repeat, alarm_info->mode.u_interval, alarm_info->alarm_type);
907 /* TODO: This should be changed to > ALARM_REPEAT_MODE_MAX ? */
908 if (mode->repeat >= ALARM_REPEAT_MODE_MAX) {
909 return ERR_ALARM_INVALID_PARAM;
912 if (destination && strlen(destination) >= MAX_PKG_NAME_LEN){
913 ALARM_MGR_EXCEPTION_PRINT("[alarm-lib]: destination name is too long!\n");
914 return ERR_ALARM_INVALID_PARAM;
918 if (!__alarm_validate_date(&alarm_info->start, &error_code)) {
919 ALARM_MGR_EXCEPTION_PRINT("start date error\n");
923 if (!__alarm_validate_time(&alarm_info->start, &error_code)) {
924 ALARM_MGR_EXCEPTION_PRINT("start time error\n");
928 if (!__alarm_validate_date(&alarm_info->end, &error_code)) {
929 ALARM_MGR_EXCEPTION_PRINT("end date error\n");
933 if (destination != NULL) {
934 memset(dst_service_name, 0, strlen(destination) + strlen("ALARM.") + 2);
935 snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "ALARM.%s", destination);
936 memset(dst_service_name_mod, 'a', MAX_SERVICE_NAME_LEN-1);
938 for (i=0; i<=strlen(dst_service_name); i++)
940 if (dst_service_name[i] == '.' )
942 dst_service_name_mod[j] = dst_service_name[i];
947 dst_service_name_mod[j] = dst_service_name[i];
952 if (!_send_alarm_create(alarm_context, alarm_info, alarm_id, dst_service_name, dst_service_name_mod, &error_code)) {
956 if (!_send_alarm_create(alarm_context, alarm_info, alarm_id, "null", "null", &error_code)) {
961 return ALARMMGR_RESULT_SUCCESS;
966 EXPORT_API int alarmmgr_add_alarm_appsvc(int alarm_type, time_t trigger_at_time,
967 time_t interval, void *bundle_data,
968 alarm_id_t *alarm_id)
971 struct timeval current_time;
972 struct tm duetime_tm;
973 alarm_info_t alarm_info;
974 const char *operation = NULL;
975 const char *appid = NULL;
977 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
979 bundle *b=(bundle *)bundle_data;
983 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter bundle\n");
984 return ERR_ALARM_INVALID_PARAM;
986 operation = appsvc_get_operation(b);
988 if (NULL == operation)
990 appsvc_set_operation(b, APPSVC_OPERATION_DEFAULT);
993 appid = appsvc_get_appid(b);
995 if ( (NULL == appid && (alarm_type & ALARM_TYPE_NOLAUNCH)) ||
996 (NULL == appid && operation && !strcmp(operation, APPSVC_OPERATION_DEFAULT)) )
998 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter\n");
999 return ERR_ALARM_INVALID_PARAM;
1002 if (__alarmmgr_init_appsvc() < 0)
1004 ALARM_MGR_EXCEPTION_PRINT("Unable to initialize dbus!!!\n");
1005 return ERR_ALARM_SYSTEM_FAIL;
1008 if (alarm_id == NULL) {
1009 return ERR_ALARM_INVALID_PARAM;
1012 if (trigger_at_time < 0) {
1013 return ERR_ALARM_INVALID_PARAM;
1016 alarm_info.alarm_type = alarm_type;
1017 alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
1019 // Checking api version
1022 pkgmgrinfo_pkginfo_h pkginfo = NULL;
1023 char pkgid[512] = {0, };
1024 const char *api_version = "2.4";
1026 if (aul_app_get_pkgid_bypid(getpid(), pkgid, sizeof(pkgid)) != AUL_R_OK) {
1027 ALARM_MGR_EXCEPTION_PRINT("aul_app_get_pkgid_bypid() is failed. PID %d may not be app.", getpid());
1029 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &pkginfo);
1030 if (ret != PMINFO_R_OK) {
1031 ALARM_MGR_EXCEPTION_PRINT("Failed to get pkginfo\n");
1034 ret = pkgmgrinfo_pkginfo_check_api_version(pkginfo, api_version, &result);
1035 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
1037 ALARM_MGR_EXCEPTION_PRINT("Failed to check api version [%d]\n", ret);
1038 return ERR_ALARM_SYSTEM_FAIL;
1044 if (alarm_info.alarm_type & ALARM_TYPE_INEXACT) {
1045 alarm_info.alarm_type ^= ALARM_TYPE_INEXACT;
1047 } else { //Since 2.4
1048 if (!__is_permitted(appid, alarm_info.alarm_type)) {
1049 ALARM_MGR_EXCEPTION_PRINT("[%s] is not permitted \n", appid);
1050 return ERR_ALARM_NOT_PERMITTED_APP;
1054 gettimeofday(¤t_time, NULL);
1056 if (current_time.tv_usec > 500 * 1000)
1058 // When the millisecond part of the current_time is bigger than 500ms,
1059 // the duetime increases by extra 1sec.
1060 current_time.tv_sec += (trigger_at_time + 1);
1064 current_time.tv_sec += trigger_at_time;
1067 tzset(); // Processes the TZ environment variable, and Set timezone, daylight, and tzname.
1068 localtime_r(¤t_time.tv_sec, &duetime_tm);
1070 alarm_info.start.year = duetime_tm.tm_year + 1900;
1071 alarm_info.start.month = duetime_tm.tm_mon + 1;
1072 alarm_info.start.day = duetime_tm.tm_mday;
1074 alarm_info.end.year = 0;
1075 alarm_info.end.month = 0;
1076 alarm_info.end.day = 0;
1078 alarm_info.start.hour = duetime_tm.tm_hour;
1079 alarm_info.start.min = duetime_tm.tm_min;
1080 alarm_info.start.sec = duetime_tm.tm_sec;
1082 if ((alarm_info.alarm_type & ALARM_TYPE_INEXACT) && interval < MIN_INEXACT_INTERVAL) {
1083 interval = MIN_INEXACT_INTERVAL;
1086 if (interval <= 0) {
1087 alarm_info.mode.repeat = ALARM_REPEAT_MODE_ONCE;
1088 alarm_info.mode.u_interval.interval = 0;
1090 alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT;
1091 alarm_info.mode.u_interval.interval = interval;
1094 ALARM_MGR_EXCEPTION_PRINT("trigger_at_time(%d), start(%d-%d-%d, %02d:%02d:%02d), repeat(%d), interval(%d), type(%d)",
1095 trigger_at_time, alarm_info.start.day, alarm_info.start.month, alarm_info.start.year,
1096 alarm_info.start.hour, alarm_info.start.min, alarm_info.start.sec,
1097 alarm_info.mode.repeat, alarm_info.mode.u_interval.interval, alarm_info.alarm_type);
1099 if (!_send_alarm_create_appsvc(alarm_context, &alarm_info, alarm_id, b, &error_code)) {
1103 return ALARMMGR_RESULT_SUCCESS;
1107 EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
1108 time_t interval, const char *destination,
1109 alarm_id_t *alarm_id)
1111 char dst_service_name[MAX_SERVICE_NAME_LEN] = { 0 };
1112 char dst_service_name_mod[MAX_SERVICE_NAME_LEN] = { 0 };
1116 struct timeval current_time;
1117 struct tm duetime_tm;
1118 alarm_info_t alarm_info;
1121 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
1127 if (alarm_id == NULL) {
1128 return ERR_ALARM_INVALID_PARAM;
1131 if (trigger_at_time < 0) {
1132 return ERR_ALARM_INVALID_PARAM;
1135 if (destination && strlen(destination) >= MAX_PKG_NAME_LEN){
1136 ALARM_MGR_EXCEPTION_PRINT("[alarm-lib]: destination name is too long!\n");
1137 return ERR_ALARM_INVALID_PARAM;
1140 alarm_info.alarm_type = alarm_type;
1141 alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
1143 gettimeofday(¤t_time, NULL);
1145 if (current_time.tv_usec > 500 * 1000)
1147 // When the millisecond part of the current_time is bigger than 500ms,
1148 // the duetime increases by extra 1sec.
1149 current_time.tv_sec += (trigger_at_time + 1);
1153 current_time.tv_sec += trigger_at_time;
1156 tzset(); // Processes the TZ environment variable, and Set timezone, daylight, and tzname.
1157 localtime_r(¤t_time.tv_sec, &duetime_tm);
1159 alarm_info.start.year = duetime_tm.tm_year + 1900;
1160 alarm_info.start.month = duetime_tm.tm_mon + 1;
1161 alarm_info.start.day = duetime_tm.tm_mday;
1163 alarm_info.end.year = 0;
1164 alarm_info.end.month = 0;
1165 alarm_info.end.day = 0;
1167 alarm_info.start.hour = duetime_tm.tm_hour;
1168 alarm_info.start.min = duetime_tm.tm_min;
1169 alarm_info.start.sec = duetime_tm.tm_sec;
1171 if (interval <= 0) {
1172 alarm_info.mode.repeat = ALARM_REPEAT_MODE_ONCE;
1173 alarm_info.mode.u_interval.interval = 0;
1175 alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT;
1176 alarm_info.mode.u_interval.interval = interval;
1179 ALARM_MGR_EXCEPTION_PRINT("trigger_at_time(%d), start(%d-%d-%d, %02d:%02d:%02d), repeat(%d), interval(%d), type(%d)",
1180 trigger_at_time, alarm_info.start.day, alarm_info.start.month, alarm_info.start.year,
1181 alarm_info.start.hour, alarm_info.start.min, alarm_info.start.sec,
1182 alarm_info.mode.repeat, alarm_info.mode.u_interval, alarm_info.alarm_type);
1184 if (destination != NULL) {
1185 memset(dst_service_name, 0,
1186 strlen(destination) + strlen("ALARM.") + 2);
1187 snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "ALARM.%s",
1189 memset(dst_service_name_mod,'a',MAX_SERVICE_NAME_LEN-1);
1193 for(i=0;i<=strlen(dst_service_name);i++)
1195 if (dst_service_name[i] == '.')
1197 dst_service_name_mod[j]=dst_service_name[i];
1202 dst_service_name_mod[j]=dst_service_name[i];
1207 if (!_send_alarm_create
1208 (alarm_context, &alarm_info, alarm_id, dst_service_name,dst_service_name_mod,
1213 if (!_send_alarm_create
1214 (alarm_context, &alarm_info, alarm_id, "null","null", &error_code)) {
1218 return ALARMMGR_RESULT_SUCCESS;
1221 EXPORT_API int alarmmgr_add_alarm_withcb(int alarm_type, time_t trigger_at_time,
1222 time_t interval, alarm_cb_t handler, void *user_param, alarm_id_t *alarm_id)
1225 struct timeval current_time;
1226 struct tm duetime_tm;
1227 alarm_info_t alarm_info;
1229 char appid[256] = {0,};
1231 if (aul_app_get_appid_bypid(getpid(), appid, sizeof(appid)) != AUL_R_OK) {
1232 ALARM_MGR_LOG_PRINT("aul_app_get_appid_bypid() is failed. PID %d may not be app.", getpid());
1235 ret = alarmmgr_init(appid);
1239 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarmmgr_add_alarm_withcb() is called");
1241 if (alarm_id == NULL) {
1242 return ERR_ALARM_INVALID_PARAM;
1245 if (trigger_at_time < 0) {
1246 return ERR_ALARM_INVALID_PARAM;
1249 alarm_info.alarm_type = alarm_type;
1250 alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
1251 alarm_info.alarm_type |= ALARM_TYPE_WITHCB;
1253 gettimeofday(¤t_time, NULL);
1255 if (current_time.tv_usec > 500 * 1000)
1257 // When the millisecond part of the current_time is bigger than 500ms,
1258 // the duetime increases by extra 1sec.
1259 current_time.tv_sec += (trigger_at_time + 1);
1263 current_time.tv_sec += trigger_at_time;
1266 tzset(); // Processes the TZ environment variable, and Set timezone, daylight, and tzname.
1267 localtime_r(¤t_time.tv_sec, &duetime_tm);
1269 alarm_info.start.year = duetime_tm.tm_year + 1900;
1270 alarm_info.start.month = duetime_tm.tm_mon + 1;
1271 alarm_info.start.day = duetime_tm.tm_mday;
1273 alarm_info.end.year = 0;
1274 alarm_info.end.month = 0;
1275 alarm_info.end.day = 0;
1277 alarm_info.start.hour = duetime_tm.tm_hour;
1278 alarm_info.start.min = duetime_tm.tm_min;
1279 alarm_info.start.sec = duetime_tm.tm_sec;
1281 if (interval <= 0) {
1282 alarm_info.mode.repeat = ALARM_REPEAT_MODE_ONCE;
1283 alarm_info.mode.u_interval.interval = 0;
1285 alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT;
1286 alarm_info.mode.u_interval.interval = interval;
1289 ALARM_MGR_EXCEPTION_PRINT("trigger_at_time(%d), start(%d-%d-%d, %02d:%02d:%02d), repeat(%d), interval(%d), type(%d)",
1290 trigger_at_time, alarm_info.start.day, alarm_info.start.month, alarm_info.start.year,
1291 alarm_info.start.hour, alarm_info.start.min, alarm_info.start.sec,
1292 alarm_info.mode.repeat, alarm_info.mode.u_interval.interval, alarm_info.alarm_type);
1294 if (!_send_alarm_create(alarm_context, &alarm_info, alarm_id, "null","null", &error_code)) {
1297 __add_resultcb(*alarm_id, handler, user_param);
1299 return ALARMMGR_RESULT_SUCCESS;
1302 EXPORT_API int alarmmgr_remove_alarm(alarm_id_t alarm_id)
1306 alarm_cb_info_t *info;
1312 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_delete(%d) is called\n", alarm_id);
1314 if (alarm_id <= 0) {
1315 return ERR_ALARM_INVALID_ID;
1318 if (!_send_alarm_delete(alarm_context, alarm_id, &error_code))
1321 info = __find_resultcb(alarm_id);
1322 __remove_resultcb(info);
1324 return ALARMMGR_RESULT_SUCCESS;
1327 EXPORT_API int alarmmgr_remove_all(void)
1330 int return_code = ALARMMGR_RESULT_SUCCESS;
1331 int ret = __sub_init();
1337 if (!_send_alarm_delete_all(alarm_context, &error_code))
1343 EXPORT_API int alarmmgr_enum_alarm_ids(alarm_enum_fn_t fn, void *user_param)
1345 SECURE_LOGD("Enter");
1346 GError *error = NULL;
1347 GVariant *alarm_array = NULL;
1348 int return_code = 0;
1349 int maxnum_of_ids = 0;
1351 alarm_id_t alarm_id = -1;
1353 char *e_cookie = NULL;
1354 char cookie[256] = {0,};
1356 GVariantIter *iter = NULL;
1359 return ERR_ALARM_INVALID_PARAM;
1362 size = security_server_get_cookie_size();
1363 ret = security_server_request_cookie(cookie, size);
1365 ALARM_MGR_EXCEPTION_PRINT("security_server_request_cookie() is failed.");
1366 return ERR_ALARM_SYSTEM_FAIL;
1369 e_cookie = g_base64_encode((const guchar *)cookie, size);
1370 if (e_cookie == NULL) {
1371 ALARM_MGR_EXCEPTION_PRINT("g_base64_encode() is failed.");
1372 return ERR_ALARM_SYSTEM_FAIL;
1377 ALARM_MGR_EXCEPTION_PRINT("__sub_init() is failed.");
1382 SECURE_LOGD("alarm_manager_call_alarm_get_number_of_ids_sync() is called");
1383 if (!alarm_manager_call_alarm_get_number_of_ids_sync(
1384 (AlarmManager*)alarm_context.proxy, alarm_context.pid, e_cookie, &maxnum_of_ids, &return_code, NULL, &error)) {
1385 /* dbus error. error_code should be set */
1386 ALARM_MGR_EXCEPTION_PRINT("alarm_manager_call_alarm_get_number_of_ids_sync() is failed by dbus. return_code[%d]", return_code);
1388 ALARM_MGR_EXCEPTION_PRINT("dbus error message: %s", error->message);
1389 g_error_free(error);
1392 return ERR_ALARM_SYSTEM_FAIL;
1397 if (return_code != ALARMMGR_RESULT_SUCCESS) {
1398 ALARM_MGR_EXCEPTION_PRINT("alarm_manager_call_alarm_get_number_of_ids_sync() is failed. return_code[%d]", return_code);
1401 ALARM_MGR_LOG_PRINT("maxnum_of_ids[%d]", maxnum_of_ids);
1404 SECURE_LOGD("alarm_manager_call_alarm_get_list_of_ids_sync() is called");
1405 if (!alarm_manager_call_alarm_get_list_of_ids_sync(
1406 (AlarmManager*)alarm_context.proxy, alarm_context.pid, maxnum_of_ids, &alarm_array, &num_of_ids, &return_code, NULL, &error)) {
1407 /* dbus error. error_code should be set */
1408 ALARM_MGR_EXCEPTION_PRINT(
1409 "alarm_manager_call_alarm_get_list_of_ids_sync() failed by dbus. num_of_ids[%d], return_code[%d].", num_of_ids, return_code);
1411 ALARM_MGR_EXCEPTION_PRINT("dbus error message: %s.", error->message);
1412 g_error_free(error);
1414 return ERR_ALARM_SYSTEM_FAIL;
1417 if (return_code != ALARMMGR_RESULT_SUCCESS) {
1421 if (alarm_array == NULL) {
1422 ALARM_MGR_LOG_PRINT("alarm server is not initilized.");
1423 return ERR_ALARM_SYSTEM_FAIL;
1426 g_variant_get(alarm_array, "ai", &iter);
1427 while (g_variant_iter_loop(iter, "i", &alarm_id))
1429 (*fn) (alarm_id, user_param);
1430 ALARM_MGR_LOG_PRINT("alarm_id (%d)", alarm_id);
1432 g_variant_iter_free(iter);
1433 g_variant_unref(alarm_array);
1435 SECURE_LOGD("Leave");
1436 return ALARMMGR_RESULT_SUCCESS;
1439 EXPORT_API int alarmmgr_get_info(alarm_id_t alarm_id, alarm_entry_t *alarm)
1442 alarm_info_t *alarm_info = (alarm_info_t *) alarm;
1450 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_get_info() is called\n");
1452 if (alarm_id < 0 || alarm_info == NULL) {
1453 return ERR_ALARM_INVALID_PARAM;
1456 if (!_send_alarm_get_info(alarm_context, alarm_id, alarm_info, &error_code)) {
1460 return ALARMMGR_RESULT_SUCCESS;
1463 int alarmmgr_create(alarm_info_t *alarm_info, char *destination,
1464 alarm_id_t *alarm_id)
1466 char dst_service_name[MAX_SERVICE_NAME_LEN] = { 0 };
1467 alarm_mode_t *mode = &alarm_info->mode;
1470 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
1472 if (alarm_info == NULL || alarm_id == NULL) {
1473 return ERR_ALARM_INVALID_PARAM;
1476 ALARM_MGR_LOG_PRINT("alarm_info->start.year(%d), "
1477 "alarm_info->start.month(%d), alarm_info->start.day(%d)",
1478 alarm_info->start.year, alarm_info->start.month,
1479 alarm_info->start.day);
1481 /* TODO: This should be changed to > ALARM_REPEAT_MODE_MAX ? */
1482 if (mode->repeat >= ALARM_REPEAT_MODE_MAX) {
1483 return ERR_ALARM_INVALID_PARAM;
1486 if (!__alarm_validate_date(&alarm_info->start, &error_code)) {
1487 ALARM_MGR_EXCEPTION_PRINT("start date error\n");
1491 if (!__alarm_validate_time(&alarm_info->start, &error_code)) {
1492 ALARM_MGR_EXCEPTION_PRINT("start time error\n");
1496 if (!__alarm_validate_date(&alarm_info->end, &error_code)) {
1497 ALARM_MGR_EXCEPTION_PRINT("end date error\n");
1501 if (destination != NULL) {
1502 memset(dst_service_name, 0,
1503 strlen(destination) + strlen("ALARM.") + 2);
1504 snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "ALARM.%s",
1506 if (!_send_alarm_create
1507 (alarm_context, alarm_info, alarm_id, dst_service_name,"null",
1512 /*TODO: Currently this API is not exported. Hence not modifying*/
1513 if (!_send_alarm_create
1514 (alarm_context, alarm_info, alarm_id, "null", "null", &error_code)) {
1518 return ALARMMGR_RESULT_SUCCESS;
1522 int alarmmgr_get_number_of_ids(int *num_of_ids)
1525 ALARM_MGR_LOG_PRINT("[alarm-lib]: alarm_get_number_of_ids() is called.");
1527 if (num_of_ids == NULL) {
1528 return ERR_ALARM_INVALID_PARAM;
1530 ALARM_MGR_LOG_PRINT("call alarm_get_number_of_ids\n");
1531 if (!_send_alarm_get_number_of_ids(alarm_context, num_of_ids, &error_code)) {
1535 return ALARMMGR_RESULT_SUCCESS;
1538 int alarmmgr_get_list_of_ids(int maxnum_of_ids, alarm_id_t *alarm_id,
1542 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_get_list_of_ids() is called.");
1544 if (maxnum_of_ids < 0 || alarm_id == NULL || num_of_ids == NULL) {
1545 return ERR_ALARM_INVALID_PARAM;
1548 if (maxnum_of_ids == 0) {
1550 return ALARMMGR_RESULT_SUCCESS;
1553 if (!_send_alarm_get_list_of_ids
1554 (alarm_context, maxnum_of_ids, alarm_id, num_of_ids, &error_code)) {
1558 return ALARMMGR_RESULT_SUCCESS;
1561 EXPORT_API int alarmmgr_get_next_duetime(alarm_id_t alarm_id, time_t* duetime)
1564 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarmmgr_get_next_duetime() is called.");
1566 if (duetime == NULL) {
1567 return ERR_ALARM_INVALID_PARAM;
1570 if (!_send_alarm_get_next_duetime(alarm_context, alarm_id, duetime, &error_code)) {
1574 return ALARMMGR_RESULT_SUCCESS;
1577 EXPORT_API int alarmmgr_get_all_info(char **db_path)
1580 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarmmgr_get_all_info() is called.");
1582 if (db_path == NULL) {
1583 return ERR_ALARM_INVALID_PARAM;
1586 if (!_send_alarm_get_all_info(alarm_context, db_path, &error_code)) {
1590 ALARM_MGR_LOG_PRINT("[alarm-lib]: successfully save info in %s.", *db_path);
1591 return ALARMMGR_RESULT_SUCCESS;
1594 EXPORT_API int alarmmgr_add_periodic_alarm_withcb(int interval, periodic_method_e method,
1595 alarm_cb_t handler, void *user_param, alarm_id_t *alarm_id)
1598 alarm_info_t alarm_info;
1600 char appid[256] = {0,};
1602 if (aul_app_get_appid_bypid(getpid(), appid, sizeof(appid)) != AUL_R_OK) {
1603 ALARM_MGR_LOG_PRINT("aul_app_get_appid_bypid() is failed. PID %d may not be app.",
1607 ret = alarmmgr_init(appid);
1611 if (alarm_id == NULL) {
1612 return ERR_ALARM_INVALID_PARAM;
1615 if (!_send_alarm_create_periodic(alarm_context, interval, 0, (int)method, alarm_id,
1619 __add_resultcb(*alarm_id, handler, user_param);
1621 return ALARMMGR_RESULT_SUCCESS;
1624 EXPORT_API int alarmmgr_add_reference_periodic_alarm_withcb(int interval,
1625 alarm_cb_t handler, void *user_param, alarm_id_t *alarm_id)
1628 alarm_info_t alarm_info;
1630 char appid[256] = {0,};
1632 if (aul_app_get_appid_bypid(getpid(), appid, sizeof(appid)) != AUL_R_OK) {
1633 ALARM_MGR_LOG_PRINT("aul_app_get_appid_bypid() is failed. PID %d may not be app.",
1637 ret = alarmmgr_init(appid);
1641 if (alarm_id == NULL) {
1642 return ERR_ALARM_INVALID_PARAM;
1645 if (!_send_alarm_create_periodic(alarm_context, interval, 1, 0,
1646 alarm_id, &error_code)) {
1650 __add_resultcb(*alarm_id, handler, user_param);
1652 return ALARMMGR_RESULT_SUCCESS;
1655 EXPORT_API int alarmmgr_set_systime(int new_time)
1658 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarmmgr_set_systime(%d) is called.", new_time);
1660 if (__sub_init() < 0) {
1661 return ERR_ALARM_SYSTEM_FAIL;
1664 if (!_send_alarm_set_time(alarm_context, new_time, &error_code)) {
1665 ALARM_MGR_EXCEPTION_PRINT("Failed to set time. error: %d", error_code);
1669 ALARM_MGR_LOG_PRINT("[alarm-lib]: successfully set the time(%d) by pid(%d).", new_time, alarm_context.pid);
1670 return ALARMMGR_RESULT_SUCCESS;
1673 EXPORT_API int alarmmgr_set_systime_with_propagation_delay(struct timespec new_time, struct timespec req_time)
1676 ALARM_MGR_LOG_PRINT("[alarm-lib] New: %d(sec) %09d(nsec), Requested: %d(sec) %09d(nsec)",
1677 new_time.tv_sec, new_time.tv_nsec, req_time.tv_sec, req_time.tv_nsec);
1679 if (__sub_init() < 0) {
1680 return ERR_ALARM_SYSTEM_FAIL;
1683 if (!_send_alarm_set_time_with_propagation_delay(alarm_context, new_time.tv_sec, new_time.tv_nsec, req_time.tv_sec, req_time.tv_nsec, &error_code)) {
1684 ALARM_MGR_EXCEPTION_PRINT("Failed to set time with propagation delay. error: %d", error_code);
1688 ALARM_MGR_LOG_PRINT("[alarm-lib]: successfully set the time by pid(%d).", alarm_context.pid);
1689 return ALARMMGR_RESULT_SUCCESS;
1692 EXPORT_API int alarmmgr_set_timezone(char *tzpath_str)
1695 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarmmgr_set_timezone() is called.");
1697 if (tzpath_str == NULL) {
1698 return ERR_ALARM_INVALID_PARAM;
1701 if (__sub_init() < 0) {
1702 return ERR_ALARM_SYSTEM_FAIL;
1705 if (!_send_alarm_set_timezone(alarm_context, tzpath_str, &error_code)) {
1709 ALARM_MGR_LOG_PRINT("[alarm-lib]: successfully set the timezone(%s) by pid(%d)", tzpath_str, alarm_context.pid);
1710 return ALARMMGR_RESULT_SUCCESS;