2 * Copyright (c) 2019 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <sys/types.h>
21 #include <notification.h>
22 #include <notification_ipc.h>
25 #include "alarm-internal.h"
27 static int __dbus_call_sync(GDBusProxy *proxy, const gchar *method_name,
28 GVariant *param, GVariant **reply)
30 int error_code = ALARMMGR_RESULT_SUCCESS;
33 *reply = g_dbus_proxy_call_sync(proxy, method_name, param,
34 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
36 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
37 error_code = ERR_ALARM_NO_PERMISSION;
39 error_code = ERR_ALARM_SYSTEM_FAIL;
41 LOGE("%s : g_dbus_proxy_call_sync() failed.\
42 error_code[%d]. error->message is %s(%d)",
43 method_name, error_code, error->message, error->code);
51 bool _send_alarm_create_noti(alarm_context_t context, alarm_info_t *alarm_info,
52 alarm_id_t *alarm_id, notification_h noti, int *error_code)
55 GVariant *noti_gv = NULL;
59 GVariant *param = NULL;
60 GVariant *reply = NULL;
62 noti_gv = notification_ipc_make_gvariant_from_noti(noti, true);
65 *error_code = ERR_ALARM_SYSTEM_FAIL;
69 datalen = g_variant_get_size(noti_gv);
73 data = malloc(datalen);
77 g_variant_store(noti_gv, data);
78 noti_data = g_base64_encode((guchar *)data, datalen);
80 param = g_variant_new("(iiiiiiiiiixiixs)",
81 alarm_info->start.year,
82 alarm_info->start.month,
83 alarm_info->start.day,
84 alarm_info->start.hour,
85 alarm_info->start.min,
86 alarm_info->start.sec,
88 alarm_info->end.month,
90 alarm_info->mode.u_interval.day_of_week,
91 (gint64)alarm_info->mode.u_interval.interval,
92 alarm_info->mode.repeat,
93 alarm_info->alarm_type,
94 (gint64)alarm_info->reserved_info,
101 g_variant_unref(noti_gv);
103 return_code = __dbus_call_sync(context.proxy, "alarm_create_noti",
105 if (return_code != ALARMMGR_RESULT_SUCCESS)
108 g_variant_get(reply, "(ii)", alarm_id, &return_code);
110 LOGD("alarm_create_noti() success. alarm_id[%d], return_code[%d].",
111 *alarm_id, return_code);
113 if (return_code != 0) {
115 *error_code = return_code;
117 g_variant_unref(reply);
121 g_variant_unref(reply);
125 bool _send_alarm_create_appsvc(alarm_context_t context, alarm_info_t *alarm_info,
126 alarm_id_t *alarm_id, bundle *b, int *error_code)
128 int return_code = -1;
129 bundle_raw *b_data = NULL;
131 GVariant *param = NULL;
132 GVariant *reply = NULL;
134 if (bundle_encode(b, &b_data, &datalen)) {
135 LOGE("Unable to encode the bundle data\n");
137 *error_code = ERR_ALARM_SYSTEM_FAIL;
141 param = g_variant_new("(iiiiiiiiiixiixs)",
142 alarm_info->start.year,
143 alarm_info->start.month,
144 alarm_info->start.day,
145 alarm_info->start.hour,
146 alarm_info->start.min,
147 alarm_info->start.sec,
148 alarm_info->end.year,
149 alarm_info->end.month,
151 alarm_info->mode.u_interval.day_of_week,
152 (gint64)alarm_info->mode.u_interval.interval,
153 alarm_info->mode.repeat,
154 alarm_info->alarm_type,
155 (gint64)alarm_info->reserved_info,
161 return_code = __dbus_call_sync(context.proxy, "alarm_create_appsvc",
163 if (return_code != ALARMMGR_RESULT_SUCCESS)
166 g_variant_get(reply, "(ii)", alarm_id, &return_code);
168 LOGD("alarm_create_appsvc() success. alarm_id[%d], return_code[%d].",
169 *alarm_id, return_code);
171 if (return_code != 0) {
173 *error_code = return_code;
175 g_variant_unref(reply);
179 g_variant_unref(reply);
183 bool _send_alarm_create(alarm_context_t context, alarm_info_t *alarm_info,
184 alarm_id_t *alarm_id, const char *dst_service_name, const char *dst_service_name_mod,
187 int return_code = -1;
188 GVariant *param = NULL;
189 GVariant *reply = NULL;
191 /*TODO: Dbus bus name validation is must & will be added to avoid alarm-server crash*/
192 if (context.app_service_name == NULL
193 && strlen(dst_service_name) == 4
194 && strncmp(dst_service_name, "null", 4) == 0) {
195 LOGE("Invalid arg. Provide valid destination or call alarmmgr_init()\n");
197 *error_code = ERR_ALARM_INVALID_PARAM;
201 param = g_variant_new("(ssiiiiiiiiiiiiixss)",
202 context.app_service_name,
203 context.app_service_name_mod,
204 alarm_info->start.year,
205 alarm_info->start.month,
206 alarm_info->start.day,
207 alarm_info->start.hour,
208 alarm_info->start.min,
209 alarm_info->start.sec,
211 alarm_info->end.year,
212 alarm_info->end.month,
214 alarm_info->mode.u_interval.day_of_week,
215 alarm_info->mode.repeat,
216 alarm_info->alarm_type,
217 (gint64)alarm_info->reserved_info,
218 dst_service_name, dst_service_name_mod);
220 return_code = __dbus_call_sync(context.proxy, "alarm_create",
222 if (return_code != ALARMMGR_RESULT_SUCCESS)
225 g_variant_get(reply, "(ii)", alarm_id, &return_code);
227 LOGD("alarm_create() dbus sync success. alarm_id[%d], return_code[%d].",
228 *alarm_id, return_code);
230 if (return_code != 0) {
232 *error_code = return_code;
234 g_variant_unref(reply);
238 g_variant_unref(reply);
242 bool _send_alarm_create_periodic(alarm_context_t context, int interval, int is_ref,
243 int method, alarm_id_t *alarm_id, int *error_code)
245 int return_code = -1;
246 GVariant *param = NULL;
247 GVariant *reply = NULL;
249 if (context.app_service_name == NULL) {
250 LOGE("Invalid arg. Provide valid destination or call alarmmgr_init()\n");
252 *error_code = ERR_ALARM_INVALID_PARAM;
256 param = g_variant_new("(ssiii)",
257 context.app_service_name,
258 context.app_service_name_mod,
259 interval, is_ref, method);
261 return_code = __dbus_call_sync(context.proxy, "alarm_create_periodic",
263 if (return_code != ALARMMGR_RESULT_SUCCESS)
266 g_variant_get(reply, "(ii)", alarm_id, &return_code);
268 LOGD("alarm_create_periodic() dbus sync success. alarm_id[%d], return_code[%d].",
269 *alarm_id, return_code);
271 if (return_code != 0) {
273 *error_code = return_code;
275 g_variant_unref(reply);
279 g_variant_unref(reply);
283 bundle *_send_alarm_get_appsvc_info(alarm_context_t context, alarm_id_t alarm_id, int *error_code)
285 int return_code = -1;
287 gchar *b_data = NULL;
288 GVariant *param = NULL;
289 GVariant *reply = NULL;
291 param = g_variant_new("(i)", alarm_id);
293 return_code = __dbus_call_sync(context.proxy, "alarm_get_appsvc_info",
295 if (return_code != ALARMMGR_RESULT_SUCCESS)
298 g_variant_get(reply, "(si)", &b_data, &return_code);
300 LOGD("alarm_get_appsvc_info() dbus sync success. return_code[%d].",
303 if (return_code != 0) {
305 *error_code = return_code;
307 b = bundle_decode((bundle_raw *)b_data, strlen(b_data));
313 g_variant_unref(reply);
317 notification_h _send_alarm_get_noti_info(alarm_context_t context, alarm_id_t alarm_id, int *error_code)
319 int return_code = -1;
321 GVariant *noti_gv = NULL;
322 GVariant *body = NULL;
323 notification_h noti = NULL;
324 gchar *noti_data = NULL;
326 GVariant *param = NULL;
327 GVariant *reply = NULL;
329 param = g_variant_new("(i)", alarm_id);
331 return_code = __dbus_call_sync(context.proxy, "alarm_get_noti_info",
333 if (return_code != ALARMMGR_RESULT_SUCCESS)
336 g_variant_get(reply, "(si)", ¬i_data, &return_code);
338 LOGD("alarm_get_noti_info() dbus sync success. return_code[%d].",
341 if (return_code != 0) {
343 *error_code = return_code;
345 data = g_base64_decode(noti_data, (gsize *)&datalen);
347 noti_gv = g_variant_new_from_data(G_VARIANT_TYPE("(v)"),
351 g_variant_get(noti_gv, "(v)", &body);
353 noti = notification_create(NOTIFICATION_TYPE_NOTI);
354 notification_ipc_make_noti_from_gvariant(noti, body);
357 g_variant_unref(noti_gv);
363 g_variant_unref(reply);
367 bool _send_alarm_set_rtc_time(alarm_context_t context, alarm_date_t *time, int *error_code)
369 int return_code = -1;
370 GVariant *param = NULL;
371 GVariant *reply = NULL;
373 param = g_variant_new("(iiiiii)", time->year, time->month, time->day,
374 time->hour, time->min, time->sec);
376 return_code = __dbus_call_sync(context.proxy, "alarm_set_rtc_time",
378 if (return_code != ALARMMGR_RESULT_SUCCESS)
381 g_variant_get(reply, "(i)", &return_code);
383 LOGD("alarm_set_rtc_time() dbus sync success. return_code[%d].",
386 if (return_code != 0) {
388 *error_code = return_code;
390 g_variant_unref(reply);
394 g_variant_unref(reply);
398 bool _send_alarm_delete(alarm_context_t context, alarm_id_t alarm_id, int *error_code)
400 int return_code = -1;
401 GVariant *param = NULL;
402 GVariant *reply = NULL;
404 param = g_variant_new("(i)", alarm_id);
406 return_code = __dbus_call_sync(context.proxy, "alarm_delete",
408 if (return_code != ALARMMGR_RESULT_SUCCESS)
411 g_variant_get(reply, "(i)", &return_code);
413 LOGD("alarm_delete() dbus sync success. return_code[%d].",
416 if (return_code != 0) {
418 *error_code = return_code;
420 g_variant_unref(reply);
424 g_variant_unref(reply);
428 bool _send_alarm_delete_all(alarm_context_t context, int *error_code)
430 int return_code = -1;
431 GVariant *reply = NULL;
433 return_code = __dbus_call_sync(context.proxy, "alarm_delete_all",
435 if (return_code != ALARMMGR_RESULT_SUCCESS)
438 g_variant_get(reply, "(i)", &return_code);
440 LOGD("alarm_delete_all() dbus sync success. return_code[%d].",
443 if (return_code != 0) {
445 *error_code = return_code;
447 g_variant_unref(reply);
451 g_variant_unref(reply);
455 bool _send_alarm_get_list_of_ids(alarm_context_t context, int maxnum_of_ids,
456 GVariantIter **iter, int *num_of_ids,
459 int return_code = -1;
460 GVariantIter *iter_temp = NULL;
461 GVariant *arr = NULL;
462 GVariant *param = NULL;
463 GVariant *reply = NULL;
465 param = g_variant_new("(i)", maxnum_of_ids);
467 return_code = __dbus_call_sync(context.proxy, "alarm_get_list_of_ids",
469 if (return_code != ALARMMGR_RESULT_SUCCESS)
472 g_variant_get(reply, "(@aiii)", &arr, num_of_ids, &return_code);
473 g_variant_get(arr, "ai", &iter_temp);
475 LOGD("alarm_get_list_of_ids() dbus sync success. return_code[%d].",
478 if (return_code != 0) {
480 *error_code = return_code;
482 g_variant_unref(reply);
488 g_variant_unref(reply);
493 bool _send_alarm_get_number_of_ids(alarm_context_t context, int *num_of_ids,
496 int return_code = -1;
497 GVariant *reply = NULL;
499 return_code = __dbus_call_sync(context.proxy, "alarm_get_number_of_ids",
501 if (return_code != ALARMMGR_RESULT_SUCCESS)
504 g_variant_get(reply, "(ii)", num_of_ids, &return_code);
506 LOGD("alarm_get_number_of_ids() dbus sync success.\
507 num_of_ids[%d] return_code[%d].",
508 *num_of_ids, return_code);
510 if (return_code != 0) {
512 *error_code = return_code;
514 g_variant_unref(reply);
518 g_variant_unref(reply);
522 bool _send_alarm_get_info(alarm_context_t context, alarm_id_t alarm_id,
523 alarm_info_t *alarm_info, int *error_code)
525 int return_code = -1;
526 GVariant *param = NULL;
527 GVariant *reply = NULL;
528 gint64 tmp_reserved_info;
529 param = g_variant_new("(i)", alarm_id);
531 return_code = __dbus_call_sync(context.proxy, "alarm_get_info",
533 if (return_code != ALARMMGR_RESULT_SUCCESS)
536 g_variant_get(reply, "(iiiiiiiiiiiixi)",
537 &alarm_info->start.year,
538 &alarm_info->start.month,
539 &alarm_info->start.day,
540 &alarm_info->start.hour,
541 &alarm_info->start.min,
542 &alarm_info->start.sec,
543 &alarm_info->end.year,
544 &alarm_info->end.month,
545 &alarm_info->end.day,
546 &alarm_info->mode.u_interval.day_of_week,
547 &alarm_info->mode.repeat,
548 &alarm_info->alarm_type,
551 alarm_info->reserved_info = (time_t)tmp_reserved_info;
553 LOGD("alarm_get_info() dbus sync success. return_code[%d].",
556 if (return_code != 0) {
558 *error_code = return_code;
560 g_variant_unref(reply);
564 g_variant_unref(reply);
568 bool _send_alarm_get_next_duetime(alarm_context_t context, alarm_id_t alarm_id,
569 time_t *duetime, int *error_code)
571 int return_code = -1;
572 GVariant *param = NULL;
573 GVariant *reply = NULL;
576 param = g_variant_new("(i)", alarm_id);
578 return_code = __dbus_call_sync(context.proxy, "alarm_get_next_duetime",
580 if (return_code != ALARMMGR_RESULT_SUCCESS)
583 g_variant_get(reply, "(xi)", &_duetime, &return_code);
585 LOGD("alarm_get_next_duetime() dbus sync success. return_code[%d].",
588 if (return_code != 0) {
590 *error_code = return_code;
592 g_variant_unref(reply);
596 *duetime = (time_t)_duetime;
597 g_variant_unref(reply);
601 bool _send_alarm_get_all_info(alarm_context_t context, char **db_path, int *error_code)
603 int return_code = -1;
604 GVariant *reply = NULL;
605 char *_db_path = NULL;
607 return_code = __dbus_call_sync(context.proxy, "alarm_get_all_info",
609 if (return_code != ALARMMGR_RESULT_SUCCESS)
612 g_variant_get(reply, "(si)", &_db_path, &return_code);
614 LOGD("alarm_get_all_info() dbus sync success. db_path[%s] return_code[%d].",
615 *db_path, return_code);
617 if (return_code != ALARMMGR_RESULT_SUCCESS) {
619 *error_code = return_code;
621 g_variant_unref(reply);
626 g_variant_unref(reply);
630 bool _send_alarm_set_time(alarm_context_t context, time_t new_time, int *error_code)
632 int return_code = -1;
633 GVariant *param = NULL;
634 GVariant *reply = NULL;
636 param = g_variant_new("(x)", (gint64)new_time);
638 return_code = __dbus_call_sync(context.proxy, "alarm_set_time",
640 if (return_code != ALARMMGR_RESULT_SUCCESS)
643 g_variant_get(reply, "(i)", &return_code);
645 LOGD("alarm_set_time() dbus sync success. return_code[%d].",
648 if (return_code != ALARMMGR_RESULT_SUCCESS) {
650 *error_code = return_code;
652 g_variant_unref(reply);
656 g_variant_unref(reply);
660 static void _alarm_set_time_cb(GObject *source_object, GAsyncResult *res,
663 int return_code = -1;
664 GError *error = NULL;
665 GVariant *reply = NULL;
666 alarm_set_time_data_t *func_data = (alarm_set_time_data_t *)user_data;
668 reply = g_dbus_proxy_call_finish(func_data->proxy, res, &error);
670 LOGE("dbus error message: %s", error->message);
672 return_code = ERR_ALARM_SYSTEM_FAIL;
674 g_variant_get(reply, "(i)", &return_code);
675 LOGD("alarm_set_time_async() dbus success. return_code[%d].",
679 if (func_data->callback != NULL)
680 func_data->callback(return_code, func_data->user_data);
682 g_variant_unref(reply);
686 bool _send_alarm_set_time_async(alarm_context_t context, time_t new_time, alarm_set_time_cb_t result_cb, void *user_data)
688 alarm_set_time_data_t *func_data;
691 func_data = g_try_new0(alarm_set_time_data_t, 1);
693 if (func_data == NULL)
696 func_data->callback = result_cb;
697 func_data->user_data = user_data;
698 func_data->proxy = context.proxy;
700 param = g_variant_new("(x)", (gint64)new_time);
702 g_dbus_proxy_call(context.proxy, "alarm_set_time", param,
703 G_DBUS_CALL_FLAGS_NONE, -1, NULL, _alarm_set_time_cb, func_data);
708 bool _send_alarm_set_time_with_propagation_delay(alarm_context_t context, struct timespec new_time, struct timespec req_time, int *error_code)
710 int return_code = -1;
711 GVariant *param = NULL;
712 GVariant *reply = NULL;
714 param = g_variant_new("(xxxx)", (gint64)new_time.tv_sec, (gint64)new_time.tv_nsec,
715 (gint64)req_time.tv_sec, (gint64)req_time.tv_nsec);
717 return_code = __dbus_call_sync(context.proxy, "alarm_set_time_with_propagation_delay",
719 if (return_code != ALARMMGR_RESULT_SUCCESS)
722 g_variant_get(reply, "(i)", &return_code);
724 LOGD("alarm_set_time_with_propagation_delay dbus sync() success.\
725 return_code[%d]", return_code);
727 if (return_code != ALARMMGR_RESULT_SUCCESS) {
729 *error_code = return_code;
731 g_variant_unref(reply);
735 g_variant_unref(reply);
739 static void _alarm_set_time_with_delay_cb(GObject *source_object, GAsyncResult *res,
742 int return_code = -1;
743 GError *error = NULL;
744 GVariant *reply = NULL;
745 alarm_set_time_data_t *func_data = (alarm_set_time_data_t *)user_data;
747 reply = g_dbus_proxy_call_finish(func_data->proxy, res, &error);
749 LOGE("dbus error message: %s", error->message);
751 return_code = ERR_ALARM_SYSTEM_FAIL;
753 g_variant_get(reply, "(i)", &return_code);
755 LOGD("alarm_set_time_with_propagation_delay_async() dbus success.\
756 return_code[%d].", return_code);
759 if (func_data->callback != NULL)
760 func_data->callback(return_code, func_data->user_data);
762 g_variant_unref(reply);
766 bool _send_alarm_set_time_with_propagation_delay_async(alarm_context_t context, struct timespec new_time, struct timespec req_time, alarm_set_time_cb_t result_cb, void *user_data)
768 alarm_set_time_data_t *func_data;
769 GVariant *param = NULL;
771 func_data = g_try_new0(alarm_set_time_data_t, 1);
773 if (func_data == NULL)
776 func_data->callback = result_cb;
777 func_data->user_data = user_data;
778 func_data->proxy = context.proxy;
780 param = g_variant_new("(xxxx)", (gint64)new_time.tv_sec, (gint64)new_time.tv_nsec,
781 (gint64)req_time.tv_sec, (gint64)req_time.tv_nsec);
783 g_dbus_proxy_call(context.proxy, "alarm_set_time_with_propagation_delay", param,
784 G_DBUS_CALL_FLAGS_NONE, -1, NULL, _alarm_set_time_with_delay_cb, func_data);
789 bool _send_alarm_set_timezone(alarm_context_t context, char *tzpath_str, int *error_code)
791 int return_code = -1;
792 GVariant *param = NULL;
793 GVariant *reply = NULL;
795 param = g_variant_new("(s)", tzpath_str);
797 return_code = __dbus_call_sync(context.proxy, "alarm_set_timezone",
799 if (return_code != ALARMMGR_RESULT_SUCCESS)
802 g_variant_get(reply, "(i)", &return_code);
804 LOGD("alarm_set_timezone dbus sync() success. tz_path[%s] return_code[%d]",
805 tzpath_str, return_code);
807 if (return_code != ALARMMGR_RESULT_SUCCESS) {
809 *error_code = return_code;
811 g_variant_unref(reply);
815 g_variant_unref(reply);
819 bool _send_alarm_set_global(alarm_context_t context, const alarm_id_t alarm_id, bool global, int *error_code)
821 int return_code = -1;
822 GVariant *param = NULL;
823 GVariant *reply = NULL;
825 param = g_variant_new("(ib)", alarm_id, (gboolean)global);
827 return_code = __dbus_call_sync(context.proxy, "alarm_set_global",
829 if (return_code != ALARMMGR_RESULT_SUCCESS)
832 g_variant_get(reply, "(i)", &return_code);
834 LOGD("alarm_set_global dbus sync() success. alarm_id[%d], global[%d]\
835 return_code[%d]", alarm_id, global, return_code);
837 if (return_code != ALARMMGR_RESULT_SUCCESS) {
839 *error_code = return_code;
841 g_variant_unref(reply);
845 g_variant_unref(reply);
849 bool _send_alarm_get_global(alarm_context_t context, const alarm_id_t alarm_id, bool *global, int *error_code)
851 int return_code = -1;
852 GVariant *param = NULL;
853 GVariant *reply = NULL;
855 param = g_variant_new("(i)", alarm_id);
857 return_code = __dbus_call_sync(context.proxy, "alarm_get_global",
859 if (return_code != ALARMMGR_RESULT_SUCCESS)
862 g_variant_get(reply, "(bi)", global, &return_code);
864 LOGD("alarm_get_global dbus sync() success. alarm_id[%d], global[%d]\
865 return_code[%d]", alarm_id, *global, return_code);
867 if (return_code != 0) {
869 *error_code = return_code;
871 g_variant_unref(reply);
875 g_variant_unref(reply);
879 bool _send_alarm_update(alarm_context_t context, alarm_id_t alarm_id,
880 alarm_info_t *alarm_info, int update_flag, int *error_code)
882 int return_code = -1;
883 GVariant *param = NULL;
884 GVariant *reply = NULL;
886 param = g_variant_new("(iiiiiiiiiixiixi)",
888 alarm_info->start.year,
889 alarm_info->start.month,
890 alarm_info->start.day,
891 alarm_info->start.hour,
892 alarm_info->start.min,
893 alarm_info->start.sec,
894 alarm_info->end.year,
895 alarm_info->end.month,
897 (gint64)alarm_info->mode.u_interval.interval,
898 alarm_info->mode.repeat,
899 alarm_info->alarm_type,
900 (gint64)alarm_info->reserved_info,
903 return_code = __dbus_call_sync(context.proxy, "alarm_update",
905 if (return_code != ALARMMGR_RESULT_SUCCESS)
908 g_variant_get(reply, "(i)", &return_code);
910 LOGD("alarm_update dbus sync() success. alarm_id[%d], return_code[%d]",
911 alarm_id, return_code);
913 if (return_code != 0) {
915 *error_code = return_code;
917 g_variant_unref(reply);
921 g_variant_unref(reply);