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.
34 #include<dbus/dbus-glib.h>
37 #include <dbus/dbus-glib-lowlevel.h>
40 #include "alarm-internal.h"
41 #include "alarm-stub.h"
45 #define MAX_KEY_SIZE 256
47 static alarm_context_t alarm_context = { NULL, NULL, NULL, NULL, -1 };
49 static bool b_initialized = false;
50 static bool sub_initialized = false;
52 #define MAX_OBJECT_PATH_LEN 256
53 #define DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT 0
55 static DBusHandlerResult __expire_alarm_filter(DBusConnection *connection,
58 static int __alarm_validate_date(alarm_date_t *date, int *error_code);
59 static bool __alarm_validate_time(alarm_date_t *date, int *error_code);
60 static int __sub_init(void);
61 static int __alarmmgr_init_appsvc(void);
62 bool alarm_power_off(int *error_code);
63 int alarmmgr_check_next_duetime(void);
67 static DBusHandlerResult __expire_alarm_filter(DBusConnection *connection,
71 if (dbus_message_get_type(message) == DBUS_MESSAGE_TYPE_METHOD_CALL) {
72 const char *method_name = dbus_message_get_member(message);
75 if (strcmp(method_name, "alarm_expired") == 0) {
78 const char *service_name =
79 dbus_message_get_destination(message);
80 const char *object_path =
81 dbus_message_get_path(message);
82 /* "/org/tizen/alarm/client" */
83 const char *interface_name =
84 dbus_message_get_interface(message);
85 /* "org.tizen.alarm.client" */
87 dbus_message_iter_init(message, &iter);
88 dbus_message_iter_get_basic(&iter, &alarm_id);
90 ALARM_MGR_LOG_PRINT("[alarm-lib]:service_name=%s, "
91 "object_path=%s, interface_name=%s, method_name=%s, "
92 "alarm_id=%d, handler=%s\n",
93 service_name ? service_name : "no name",
94 object_path ? object_path : "no path",
95 interface_name ? interface_name : "no interface",
96 method_name ? method_name : "no method", alarm_id,
97 alarm_context.alarm_handler ? "ok" : "no handler");
99 if (alarm_context.alarm_handler != NULL)
100 /* alarm_context.alarm_handler(alarm_id); */
101 alarm_context.alarm_handler(alarm_id,
102 alarm_context.user_param);
103 return DBUS_HANDLER_RESULT_HANDLED;
107 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
111 static int __alarm_validate_date(alarm_date_t *date, int *error_code)
114 if (date->year == 0 && date->month == 0 && date->day == 0) {
118 int year = date->year;
119 int month = date->month;
122 if (month < 1 || month > 12) {
124 *error_code = ERR_ALARM_INVALID_DATE;
128 if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8
129 || month == 10 || month == 12)
130 && (day < 1 || day > 31)) {
132 *error_code = ERR_ALARM_INVALID_DATE;
136 if ((month == 4 || month == 6 || month == 9 || month == 11)
137 && (day < 1 || day > 30)) {
139 *error_code = ERR_ALARM_INVALID_DATE;
144 if ((year % 100 != 0 && year % 4 == 0) || (year % 400 == 0)) {
145 if (day < 1 || day > 29) {
147 *error_code = ERR_ALARM_INVALID_DATE;
151 if (day < 1 || day > 28) {
153 *error_code = ERR_ALARM_INVALID_DATE;
164 static bool __alarm_validate_time(alarm_date_t *date, int *error_code)
166 if (date->hour < 0 || date->hour > 23) {
168 *error_code = ERR_ALARM_INVALID_TIME;
172 if (date->min < 0 || date->min > 59) {
174 *error_code = ERR_ALARM_INVALID_TIME;
181 static int __sub_init()
183 GError *error = NULL;
185 if (sub_initialized) {
186 ALARM_MGR_EXCEPTION_PRINT("__sub_init was already called.\n");
187 return ALARMMGR_RESULT_SUCCESS;
191 dbus_g_thread_init();
193 alarm_context.bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
194 if (alarm_context.bus == NULL) {
195 ALARM_MGR_EXCEPTION_PRINT("dbus bus get failed\n");
197 return ERR_ALARM_SYSTEM_FAIL;
200 alarm_context.proxy = dbus_g_proxy_new_for_name(alarm_context.bus,
201 "org.tizen.alarm.manager",
202 "/org/tizen/alarm/manager",
203 "org.tizen.alarm.manager");
204 if (alarm_context.proxy == NULL) {
205 ALARM_MGR_EXCEPTION_PRINT("dbus bus proxy get failed\n");
207 return ERR_ALARM_SYSTEM_FAIL;
210 alarm_context.pid = getpid(); /*this running appliction's process id*/
212 sub_initialized = true;
214 return ALARMMGR_RESULT_SUCCESS;
217 bool alarm_power_off(int *error_code)
219 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_power_off() is called\n");
222 return _send_alarm_power_off(alarm_context, error_code);
225 "[alarm-lib]:ALARM_BOOT feature is not supported. "
226 "so we return false.\n");
228 *error_code = -1; /*-1 means that system failed
234 int alarmmgr_check_next_duetime()
238 "[alarm-lib]:alarm_check_next_duetime() is called\n");
241 if (!_send_alarm_check_next_duetime(alarm_context, &error_code))
245 "[alarm-lib]:ALARM_BOOT feature is not supported. "
246 "so we return false.\n");
247 return ERR_ALARM_SYSTEM_FAIL;
250 return ALARMMGR_RESULT_SUCCESS;
253 EXPORT_API int alarmmgr_init(const char *appid)
256 int request_name_result = 0;
257 char service_name[MAX_SERVICE_NAME_LEN] = { 0 };
258 char service_name_mod[MAX_SERVICE_NAME_LEN]= { 0 };
265 return ERR_ALARM_INVALID_PARAM;
267 if (strlen(appid) >= MAX_PKG_NAME_LEN)
268 return ERR_ALARM_INVALID_PARAM;
271 ALARM_MGR_EXCEPTION_PRINT(
272 "alarm was already initialized. app_service_name=%s\n",
273 g_quark_to_string(alarm_context.quark_app_service_name));
274 return ALARMMGR_RESULT_SUCCESS;
281 memset(service_name_mod, 'a', MAX_SERVICE_NAME_LEN-1);
282 strncpy(service_name, appid, MAX_PKG_NAME_LEN);
286 for(i=0;i<=strlen(service_name);i++)
288 if (service_name[i] == '.' )
290 service_name_mod[j] = service_name[i];
294 service_name_mod[j] = service_name[i];
299 strncat(service_name, ".ALARM", strlen(".ALARM"));
301 strncat(service_name_mod, ".ALARM", strlen(".ALARM"));
304 dbus_error_init(&derror);
306 request_name_result = dbus_bus_request_name(
307 dbus_g_connection_get_connection(alarm_context.bus),
308 service_name_mod, 0, &derror);
309 if (dbus_error_is_set(&derror)) /*failure*/ {
310 ALARM_MGR_EXCEPTION_PRINT(
311 "Failed to dbus_bus_request_name(%s): %s\n", service_name,
313 dbus_error_free(&derror);
315 return ERR_ALARM_SYSTEM_FAIL;
317 alarm_context.quark_app_service_name =
318 g_quark_from_string(service_name);
319 alarm_context.quark_app_service_name_mod=
320 g_quark_from_string(service_name_mod);
323 if (!dbus_connection_add_filter(
324 dbus_g_connection_get_connection(alarm_context.bus),
325 __expire_alarm_filter, NULL, NULL)) {
326 ALARM_MGR_EXCEPTION_PRINT("add __expire_alarm_filter failed\n");
328 return ERR_ALARM_SYSTEM_FAIL;
331 b_initialized = true;
332 return ALARMMGR_RESULT_SUCCESS;
336 EXPORT_API void alarmmgr_fini()
338 dbus_connection_remove_filter(dbus_g_connection_get_connection
340 __expire_alarm_filter, NULL);
343 EXPORT_API int alarmmgr_set_cb(alarm_cb_t handler, void *user_param)
345 ALARM_MGR_LOG_PRINT("alarm_set_cb is called\n");
347 if (handler == NULL) {
348 return ERR_ALARM_INVALID_PARAM;
350 alarm_context.alarm_handler = handler;
351 alarm_context.user_param = user_param;
352 return ALARMMGR_RESULT_SUCCESS;
355 EXPORT_API alarm_entry_t *alarmmgr_create_alarm(void)
357 alarm_info_t *alarm = (alarm_info_t *) malloc(sizeof(alarm_info_t));
364 alarm->start.year = 0;
365 alarm->start.month = 0;
366 alarm->start.day = 0;
367 alarm->start.hour = 0;
368 alarm->start.min = 0;
369 alarm->start.sec = 0;
372 alarm->end.month = 0;
378 alarm->mode.repeat = ALARM_REPEAT_MODE_ONCE;
379 alarm->mode.u_interval.interval = 0;
381 alarm->alarm_type = ALARM_TYPE_DEFAULT;
383 alarm->reserved_info = 0;
385 return (alarm_entry_t *) alarm;
388 EXPORT_API int alarmmgr_free_alarm(alarm_entry_t *alarm)
391 return ERR_ALARM_INVALID_PARAM;
395 return ALARMMGR_RESULT_SUCCESS;
398 EXPORT_API int alarmmgr_set_time(alarm_entry_t *alarm, alarm_date_t time)
400 alarm_info_t *alarm_info; /*= (alarm_info_t*)alarm;*/
404 return ERR_ALARM_INVALID_PARAM;
407 alarm_info = (alarm_info_t *) alarm;
409 if (!__alarm_validate_date(&time, &error_code)) {
410 ALARM_MGR_EXCEPTION_PRINT("start date error\n");
414 if (!__alarm_validate_time(&time, &error_code)) {
415 ALARM_MGR_EXCEPTION_PRINT("start time error\n");
419 memcpy(&alarm_info->start, &time, sizeof(alarm_date_t));
421 return ALARMMGR_RESULT_SUCCESS;
424 EXPORT_API int alarmmgr_get_time(const alarm_entry_t *alarm,
427 alarm_info_t *alarm_info = (alarm_info_t *) alarm;
430 return ERR_ALARM_INVALID_PARAM;
434 memcpy(time, &alarm_info->start, sizeof(alarm_date_t));
436 return ALARMMGR_RESULT_SUCCESS;
439 EXPORT_API int alarmmgr_set_repeat_mode(alarm_entry_t *alarm,
440 alarm_repeat_mode_t repeat,
443 alarm_info_t *alarm_info = (alarm_info_t *) alarm;
445 if (repeat >= ALARM_REPEAT_MODE_MAX) {
446 return ERR_ALARM_INVALID_PARAM;
449 alarm_info->mode.repeat = repeat;
451 if (repeat == ALARM_REPEAT_MODE_REPEAT
452 || repeat == ALARM_REPEAT_MODE_WEEKLY) {
453 alarm_info->mode.u_interval.interval = interval;
456 return ALARMMGR_RESULT_SUCCESS;
459 EXPORT_API int alarmmgr_get_repeat_mode(const alarm_entry_t *alarm,
460 alarm_repeat_mode_t *repeat,
463 alarm_info_t *alarm_info = (alarm_info_t *) alarm;
466 return ERR_ALARM_INVALID_PARAM;
470 *repeat = alarm_info->mode.repeat;
471 if (interval != NULL)
472 *interval = alarm_info->mode.u_interval.interval;
474 return ALARMMGR_RESULT_SUCCESS;
477 EXPORT_API int alarmmgr_set_type(alarm_entry_t *alarm, int alarm_type)
479 alarm_info_t *alarm_info; /*= (alarm_info_t*)alarm;*/
482 return ERR_ALARM_INVALID_PARAM;
485 alarm_info = (alarm_info_t *) alarm;
487 alarm_info->alarm_type = alarm_type;
488 alarm_info->alarm_type &= (~ALARM_TYPE_RELATIVE);
490 return ALARMMGR_RESULT_SUCCESS;
493 EXPORT_API int alarmmgr_get_type(const alarm_entry_t *alarm, int *alarm_type)
495 alarm_info_t *alarm_info = (alarm_info_t *) alarm;
498 return ERR_ALARM_INVALID_PARAM;
501 if (alarm_type != NULL)
502 *alarm_type = alarm_info->alarm_type;
504 return ALARMMGR_RESULT_SUCCESS;
508 static int __alarmmgr_init_appsvc(void)
513 ALARM_MGR_EXCEPTION_PRINT("alarm was already initialized\n");
514 return ALARMMGR_RESULT_SUCCESS;
519 dbus_g_thread_init();
525 b_initialized = true;
527 return ALARMMGR_RESULT_SUCCESS;
531 EXPORT_API void *alarmmgr_get_alarm_appsvc_info(alarm_id_t alarm_id, int *return_code){
542 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarmmgr_get_alarm_appsvc_info() is called\n");
546 *return_code = ERR_ALARM_INVALID_ID;
550 return _send_alarm_get_appsvc_info(alarm_context, alarm_id, return_code);
554 EXPORT_API int alarmmgr_set_rtc_time(alarm_date_t *time){
560 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter time\n");
561 return ERR_ALARM_INVALID_PARAM;
569 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarmmgr_set_rtc_time() is called\n");
571 if (!__alarm_validate_date(time, &error_code)) {
572 ALARM_MGR_EXCEPTION_PRINT("RTC date error\n");
576 if (!__alarm_validate_time(time, &error_code)) {
577 ALARM_MGR_EXCEPTION_PRINT("RTC time error\n");
584 if (!_send_alarm_set_rtc_time
585 (alarm_context, time, &error_code)){
589 return ALARMMGR_RESULT_SUCCESS;
593 EXPORT_API int alarmmgr_add_alarm_appsvc_with_localtime(alarm_entry_t *alarm, void *bundle_data, alarm_id_t *alarm_id)
595 alarm_info_t *alarm_info = NULL; /* = (alarm_info_t*)alarm; */
596 const char *operation = NULL;
600 bundle *b=(bundle *)bundle_data;
603 return ERR_ALARM_INVALID_PARAM;
608 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter bundle\n");
609 return ERR_ALARM_INVALID_PARAM;
611 operation = appsvc_get_operation(b);
613 if (NULL == operation)
615 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter bundle [appsvc operation not present]\n");
616 return ERR_ALARM_INVALID_PARAM;
619 if (__alarmmgr_init_appsvc() < 0)
621 ALARM_MGR_EXCEPTION_PRINT("Unable to initialize dbus!!!\n");
622 return ERR_ALARM_SYSTEM_FAIL;
625 alarm_info = (alarm_info_t *) alarm;
627 appid = appsvc_get_appid(b);
629 if (NULL == appid && (alarm_info->alarm_type & ALARM_TYPE_NOLAUNCH) )
631 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter\n");
632 return ERR_ALARM_INVALID_PARAM;
635 if (alarm_info == NULL || alarm_id == NULL) {
636 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter\n");
637 return ERR_ALARM_INVALID_PARAM;
639 alarm_mode_t *mode = &alarm_info->mode;
641 ALARM_MGR_LOG_PRINT("alarm_info->start.year(%d), "
642 "alarm_info->start.month(%d), alarm_info->start.day(%d)",
643 alarm_info->start.year, alarm_info->start.month,
644 alarm_info->start.day);
646 /* TODO: This should be changed to > ALARM_REPEAT_MODE_MAX ? */
647 if (mode->repeat >= ALARM_REPEAT_MODE_MAX) {
648 return ERR_ALARM_INVALID_PARAM;
651 if (!__alarm_validate_date(&alarm_info->start, &error_code)) {
652 ALARM_MGR_EXCEPTION_PRINT("start date error\n");
656 if (!__alarm_validate_time(&alarm_info->start, &error_code)) {
657 ALARM_MGR_EXCEPTION_PRINT("start time error\n");
661 if (!__alarm_validate_date(&alarm_info->end, &error_code)) {
662 ALARM_MGR_EXCEPTION_PRINT("end date error\n");
667 if (!_send_alarm_create_appsvc
668 (alarm_context, alarm_info, alarm_id, b,
673 return ALARMMGR_RESULT_SUCCESS;
679 EXPORT_API int alarmmgr_add_alarm_with_localtime(alarm_entry_t *alarm,
680 const char *destination,
681 alarm_id_t *alarm_id)
683 char dst_service_name[MAX_SERVICE_NAME_LEN] = { 0 };
684 char dst_service_name_mod[MAX_SERVICE_NAME_LEN] = { 0 };
685 alarm_info_t *alarm_info; /* = (alarm_info_t*)alarm; */
691 return ERR_ALARM_INVALID_PARAM;
694 alarm_info = (alarm_info_t *) alarm;
695 if (alarm_info == NULL || alarm_id == NULL) {
696 return ERR_ALARM_INVALID_PARAM;
700 alarm_mode_t *mode = &alarm_info->mode;
706 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
708 ALARM_MGR_LOG_PRINT("alarm_info->start.year(%d), "
709 "alarm_info->start.month(%d), alarm_info->start.day(%d)",
710 alarm_info->start.year, alarm_info->start.month,
711 alarm_info->start.day);
713 /* TODO: This should be changed to > ALARM_REPEAT_MODE_MAX ? */
714 if (mode->repeat >= ALARM_REPEAT_MODE_MAX) {
715 return ERR_ALARM_INVALID_PARAM;
718 if (destination && strlen(destination) >= MAX_PKG_NAME_LEN){
719 ALARM_MGR_EXCEPTION_PRINT("[alarm-lib]: destination name is too long!\n");
720 return ERR_ALARM_INVALID_PARAM;
724 if (!__alarm_validate_date(&alarm_info->start, &error_code)) {
725 ALARM_MGR_EXCEPTION_PRINT("start date error\n");
729 if (!__alarm_validate_time(&alarm_info->start, &error_code)) {
730 ALARM_MGR_EXCEPTION_PRINT("start time error\n");
734 if (!__alarm_validate_date(&alarm_info->end, &error_code)) {
735 ALARM_MGR_EXCEPTION_PRINT("end date error\n");
739 if (destination != NULL) {
740 memset(dst_service_name, 0,
741 strlen(destination) + strlen(".ALARM") + 2);
742 snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "%s",
745 memset(dst_service_name_mod,'a',MAX_SERVICE_NAME_LEN-1);
749 for(i=0; i<=strlen(dst_service_name); i++)
751 if (dst_service_name[i] == '.' )
753 dst_service_name_mod[j] = dst_service_name[i];
758 dst_service_name_mod[j] = dst_service_name[i];
763 strncat(dst_service_name, ".ALARM", strlen(".ALARM"));
764 strncat(dst_service_name_mod, ".ALARM", strlen(".ALARM"));
766 if (!_send_alarm_create
767 (alarm_context, alarm_info, alarm_id, dst_service_name, dst_service_name_mod,
772 if (!_send_alarm_create
773 (alarm_context, alarm_info, alarm_id, "null", "null", &error_code)) {
777 return ALARMMGR_RESULT_SUCCESS;
782 EXPORT_API int alarmmgr_add_alarm_appsvc(int alarm_type, time_t trigger_at_time,
783 time_t interval, void *bundle_data,
784 alarm_id_t *alarm_id)
788 struct tm duetime_tm;
789 alarm_info_t alarm_info;
790 const char *operation = NULL;
793 bundle *b=(bundle *)bundle_data;
797 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter bundle\n");
798 return ERR_ALARM_INVALID_PARAM;
800 operation = appsvc_get_operation(b);
802 if (NULL == operation)
804 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter bundle [appsvc operation not present]\n");
805 return ERR_ALARM_INVALID_PARAM;
808 appid = appsvc_get_appid(b);
810 if (NULL == appid && (alarm_type & ALARM_TYPE_NOLAUNCH) )
812 ALARM_MGR_EXCEPTION_PRINT("Invalid parameter\n");
813 return ERR_ALARM_INVALID_PARAM;
816 if (__alarmmgr_init_appsvc() < 0)
818 ALARM_MGR_EXCEPTION_PRINT("Unable to initialize dbus!!!\n");
819 return ERR_ALARM_SYSTEM_FAIL;
822 ALARM_MGR_LOG_PRINT("interval(%d)", interval);
824 if (alarm_id == NULL) {
825 return ERR_ALARM_INVALID_PARAM;
828 if (trigger_at_time < 0) {
829 return ERR_ALARM_INVALID_PARAM;
832 alarm_info.alarm_type = alarm_type;
833 alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
837 current_time += trigger_at_time;
839 localtime_r(¤t_time, &duetime_tm);
841 alarm_info.start.year = duetime_tm.tm_year + 1900;
842 alarm_info.start.month = duetime_tm.tm_mon + 1;
843 alarm_info.start.day = duetime_tm.tm_mday;
845 alarm_info.end.year = 0;
846 alarm_info.end.month = 0;
847 alarm_info.end.day = 0;
849 alarm_info.start.hour = duetime_tm.tm_hour;
850 alarm_info.start.min = duetime_tm.tm_min;
851 alarm_info.start.sec = duetime_tm.tm_sec;
854 alarm_info.mode.repeat = ALARM_REPEAT_MODE_ONCE;
855 alarm_info.mode.u_interval.interval = 0;
857 alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT;
858 alarm_info.mode.u_interval.interval = interval;
861 if (!_send_alarm_create_appsvc
862 (alarm_context, &alarm_info, alarm_id, b,
867 return ALARMMGR_RESULT_SUCCESS;
871 EXPORT_API int alarmmgr_add_alarm(int alarm_type, time_t trigger_at_time,
872 time_t interval, const char *destination,
873 alarm_id_t *alarm_id)
875 char dst_service_name[MAX_SERVICE_NAME_LEN] = { 0 };
876 char dst_service_name_mod[MAX_SERVICE_NAME_LEN] = { 0 };
881 struct tm duetime_tm;
882 alarm_info_t alarm_info;
889 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
891 ALARM_MGR_LOG_PRINT("interval(%d)", interval);
893 if (alarm_id == NULL) {
894 return ERR_ALARM_INVALID_PARAM;
897 if (trigger_at_time < 0) {
898 return ERR_ALARM_INVALID_PARAM;
901 if (destination && strlen(destination) >= MAX_PKG_NAME_LEN){
902 ALARM_MGR_EXCEPTION_PRINT("[alarm-lib]: destination name is too long!\n");
903 return ERR_ALARM_INVALID_PARAM;
906 alarm_info.alarm_type = alarm_type;
907 alarm_info.alarm_type |= ALARM_TYPE_RELATIVE;
911 current_time += trigger_at_time;
913 localtime_r(¤t_time, &duetime_tm);
915 alarm_info.start.year = duetime_tm.tm_year + 1900;
916 alarm_info.start.month = duetime_tm.tm_mon + 1;
917 alarm_info.start.day = duetime_tm.tm_mday;
919 alarm_info.end.year = 0;
920 alarm_info.end.month = 0;
921 alarm_info.end.day = 0;
923 alarm_info.start.hour = duetime_tm.tm_hour;
924 alarm_info.start.min = duetime_tm.tm_min;
925 alarm_info.start.sec = duetime_tm.tm_sec;
928 alarm_info.mode.repeat = ALARM_REPEAT_MODE_ONCE;
929 alarm_info.mode.u_interval.interval = 0;
931 alarm_info.mode.repeat = ALARM_REPEAT_MODE_REPEAT;
932 alarm_info.mode.u_interval.interval = interval;
935 if (destination != NULL) {
936 memset(dst_service_name, 0,
937 strlen(destination) + strlen(".ALARM") + 2);
938 snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "%s",
940 memset(dst_service_name_mod,'a',MAX_SERVICE_NAME_LEN-1);
944 for(i=0;i<=strlen(dst_service_name);i++)
946 if (dst_service_name[i] == '.')
948 dst_service_name_mod[j]=dst_service_name[i];
953 dst_service_name_mod[j]=dst_service_name[i];
958 strncat(dst_service_name, ".ALARM", strlen(".ALARM"));
959 strncat(dst_service_name_mod, ".ALARM", strlen(".ALARM"));
961 if (!_send_alarm_create
962 (alarm_context, &alarm_info, alarm_id, dst_service_name,dst_service_name_mod,
967 if (!_send_alarm_create
968 (alarm_context, &alarm_info, alarm_id, "null","null", &error_code)) {
972 return ALARMMGR_RESULT_SUCCESS;
975 EXPORT_API int alarmmgr_remove_alarm(alarm_id_t alarm_id)
984 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_delete() is called\n");
987 return ERR_ALARM_INVALID_ID;
990 if (!_send_alarm_delete(alarm_context, alarm_id, &error_code))
993 return ALARMMGR_RESULT_SUCCESS;
996 EXPORT_API int alarmmgr_enum_alarm_ids(alarm_enum_fn_t fn, void *user_param)
998 GError *error = NULL;
999 GArray *alarm_array = NULL;
1000 int return_code = 0;
1008 return ERR_ALARM_INVALID_PARAM;
1014 if (!org_tizen_alarm_manager_alarm_get_number_of_ids(
1015 alarm_context.proxy, alarm_context.pid, &maxnum_of_ids,
1016 &return_code, &error)) {
1017 /* dbus-glib error */
1018 /* error_code should be set */
1019 ALARM_MGR_EXCEPTION_PRINT(
1020 "org_tizen_alarm_manager_alarm_get_number_of_ids() "
1021 "failed. return_code[%d], return_code[%s]\n",
1022 return_code, error->message);
1025 if (return_code != 0) {
1029 if (!org_tizen_alarm_manager_alarm_get_list_of_ids(
1030 alarm_context.proxy, alarm_context.pid, maxnum_of_ids,
1031 &alarm_array, &num_of_ids, &return_code, &error)) {
1032 /*dbus-glib error */
1033 /* error_code should be set */
1034 ALARM_MGR_EXCEPTION_PRINT(
1035 "org_tizen_alarm_manager_alarm_get_list_of_ids() "
1036 "failed. alarm_id[%d], return_code[%d]\n",
1037 alarm_id, return_code);
1040 if (return_code != 0) {
1043 if (error != NULL) {
1044 ALARM_MGR_LOG_PRINT(
1045 "Alarm server not ready dbus error message %s\n", error->message);
1046 return ERR_ALARM_SYSTEM_FAIL;
1048 if (NULL == alarm_array) {
1049 ALARM_MGR_LOG_PRINT(
1050 "alarm server not initilized\n");
1051 return ERR_ALARM_SYSTEM_FAIL;
1053 for (i = 0; i < alarm_array->len && i < maxnum_of_ids; i++) {
1054 alarm_id = g_array_index(alarm_array, alarm_id_t, i);
1055 (*fn) (alarm_id, user_param);
1056 ALARM_MGR_LOG_PRINT(" alarm_id(%d)\n", alarm_id);
1059 g_array_free(alarm_array, true);
1062 return ALARMMGR_RESULT_SUCCESS;
1065 EXPORT_API int alarmmgr_get_info(alarm_id_t alarm_id, alarm_entry_t *alarm)
1068 alarm_info_t *alarm_info = (alarm_info_t *) alarm;
1076 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_get_info() is called\n");
1078 if (alarm_id < 0 || alarm_info == NULL) {
1079 return ERR_ALARM_INVALID_PARAM;
1082 if (!_send_alarm_get_info(alarm_context, alarm_id, alarm_info,
1086 return ALARMMGR_RESULT_SUCCESS;
1089 EXPORT_API int alarmmgr_power_on(bool on_off)
1092 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_power_on() is called\n");
1095 if (!_send_alarm_power_on(alarm_context, on_off, &error_code))
1098 ALARM_MGR_LOG_PRINT("[alarm-lib]:ALARM_BOOT feature is not supported. "
1099 "so we return false.\n");
1100 return ERR_ALARM_SYSTEM_FAIL;
1103 return ALARMMGR_RESULT_SUCCESS;
1106 int alarmmgr_create(alarm_info_t *alarm_info, char *destination,
1107 alarm_id_t *alarm_id)
1109 char dst_service_name[MAX_SERVICE_NAME_LEN] = { 0 };
1110 alarm_mode_t *mode = &alarm_info->mode;
1113 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_create() is called\n");
1115 if (alarm_info == NULL || alarm_id == NULL) {
1116 return ERR_ALARM_INVALID_PARAM;
1119 ALARM_MGR_LOG_PRINT("alarm_info->start.year(%d), "
1120 "alarm_info->start.month(%d), alarm_info->start.day(%d)",
1121 alarm_info->start.year, alarm_info->start.month,
1122 alarm_info->start.day);
1124 /* TODO: This should be changed to > ALARM_REPEAT_MODE_MAX ? */
1125 if (mode->repeat >= ALARM_REPEAT_MODE_MAX) {
1126 return ERR_ALARM_INVALID_PARAM;
1129 if (!__alarm_validate_date(&alarm_info->start, &error_code)) {
1130 ALARM_MGR_EXCEPTION_PRINT("start date error\n");
1134 if (!__alarm_validate_time(&alarm_info->start, &error_code)) {
1135 ALARM_MGR_EXCEPTION_PRINT("start time error\n");
1139 if (!__alarm_validate_date(&alarm_info->end, &error_code)) {
1140 ALARM_MGR_EXCEPTION_PRINT("end date error\n");
1144 if (destination != NULL) {
1145 memset(dst_service_name, 0,
1146 strlen(destination) + strlen(".ALARM") + 2);
1147 snprintf(dst_service_name, MAX_SERVICE_NAME_LEN, "%s.ALARM",
1149 if (!_send_alarm_create
1150 (alarm_context, alarm_info, alarm_id, dst_service_name,"null",
1155 /*TODO: Currently this API is not exported. Hence not modifying*/
1156 if (!_send_alarm_create
1157 (alarm_context, alarm_info, alarm_id, "null", "null", &error_code)) {
1161 return ALARMMGR_RESULT_SUCCESS;
1165 int alarmmgr_get_number_of_ids(int *num_of_ids)
1168 ALARM_MGR_LOG_PRINT("[alarm-lib]:"
1169 "alarm_get_number_of_ids() is called\n");
1171 if (num_of_ids == NULL) {
1172 return ERR_ALARM_INVALID_PARAM;
1174 ALARM_MGR_LOG_PRINT("call alarm_get_number_of_ids\n");
1175 if (!_send_alarm_get_number_of_ids(alarm_context, num_of_ids,
1179 return ALARMMGR_RESULT_SUCCESS;
1182 int alarmmgr_get_list_of_ids(int maxnum_of_ids, alarm_id_t *alarm_id,
1186 ALARM_MGR_LOG_PRINT("[alarm-lib]:alarm_get_list_of_ids() is called\n");
1188 if (maxnum_of_ids < 0 || alarm_id == NULL || num_of_ids == NULL) {
1189 return ERR_ALARM_INVALID_PARAM;
1192 if (maxnum_of_ids == 0) {
1194 return ALARMMGR_RESULT_SUCCESS;
1197 if (!_send_alarm_get_list_of_ids
1198 (alarm_context, maxnum_of_ids, alarm_id, num_of_ids, &error_code))
1201 return ALARMMGR_RESULT_SUCCESS;