From 80895f44cd939544948c207604fea3c886bbf18a Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Fri, 10 Jun 2016 17:10:21 +0900 Subject: [PATCH 01/16] Exclude shortcut package from wearable Signed-off-by: seungha.son Change-Id: I058747689c64c48c981ff9106c80e6f49bd9e070 --- CMakeLists.txt | 107 ++++++++++++++++++++++++------------ include/service_common.h | 4 +- packaging/data-provider-master.spec | 4 +- src/main.c | 12 ++-- src/service_common.c | 2 + 5 files changed, 87 insertions(+), 42 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 39b3d46..72edd7a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,31 +6,56 @@ SET(EXEC_PREFIX "\${prefix}") SET(LIBDIR ${LIB_INSTALL_DIR}) SET(INCLUDEDIR "\${prefix}/include") - -INCLUDE(FindPkgConfig) -pkg_check_modules(pkg REQUIRED - dlog - aul - vconf - sqlite3 - db-util - glib-2.0 - gio-2.0 - bundle - ecore - eina - pkgmgr - notification - badge - libsmack - shortcut - pkgmgr-info - libsystemd-daemon - capi-appfw-app-manager - cynara-client - cynara-session - cynara-creds-socket -) +IF (MOBILE) + INCLUDE(FindPkgConfig) + pkg_check_modules(pkg REQUIRED + dlog + aul + vconf + sqlite3 + db-util + glib-2.0 + gio-2.0 + bundle + ecore + eina + pkgmgr + notification + badge + shortcut + libsmack + pkgmgr-info + libsystemd-daemon + capi-appfw-app-manager + cynara-client + cynara-session + cynara-creds-socket + ) +ELSEIF (WEARABLE) + INCLUDE(FindPkgConfig) + pkg_check_modules(pkg REQUIRED + dlog + aul + vconf + sqlite3 + db-util + glib-2.0 + gio-2.0 + bundle + ecore + eina + pkgmgr + notification + badge + libsmack + pkgmgr-info + libsystemd-daemon + capi-appfw-app-manager + cynara-client + cynara-session + cynara-creds-socket + ) +ENDIF (MOBILE) SET(PACKAGE "${PROJECT_NAME}") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Winline -Werror -fno-builtin-malloc -fno-omit-frame-pointer -g -fPIE") @@ -61,16 +86,28 @@ ELSEIF (WEARABLE) ADD_DEFINITIONS("-DWEARABLE") ENDIF (MOBILE) -SET(BUILD_SOURCE - src/main.c - src/util.c - src/pkgmgr.c - src/shortcut_service.c - src/badge_service.c - src/notification_service.c - src/service_common.c - src/critical_log.c -) +IF (MOBILE) + SET(BUILD_SOURCE + src/main.c + src/util.c + src/pkgmgr.c + src/badge_service.c + src/notification_service.c + src/service_common.c + src/critical_log.c + src/shortcut_service.c + ) +ELSEIF (WEARABLE) + SET(BUILD_SOURCE + src/main.c + src/util.c + src/pkgmgr.c + src/badge_service.c + src/notification_service.c + src/service_common.c + src/critical_log.c + ) +ENDIF (MOBILE) STRING(REPLACE "-L-l" "-l" pkg_fixed_LDFLAGS ${pkg_LDFLAGS}) STRING(REPLACE "-l" " -l" pkg_LDFLAGS ${pkg_fixed_LDFLAGS}) diff --git a/include/service_common.h b/include/service_common.h index 709aa45..5cafa69 100755 --- a/include/service_common.h +++ b/include/service_common.h @@ -17,8 +17,10 @@ #include #include #include -#include #include +#ifndef WEARABLE +#include +#endif #define NORMAL_UID_BASE 5000 diff --git a/packaging/data-provider-master.spec b/packaging/data-provider-master.spec index 23c4309..5fcf011 100755 --- a/packaging/data-provider-master.spec +++ b/packaging/data-provider-master.spec @@ -27,7 +27,9 @@ BuildRequires: pkgconfig(pkgmgr) BuildRequires: pkgconfig(pkgmgr-info) BuildRequires: pkgconfig(notification) BuildRequires: pkgconfig(badge) +%if "%{profile}" == "mobile" BuildRequires: pkgconfig(shortcut) +%endif BuildRequires: pkgconfig(libsystemd-daemon) BuildRequires: pkgconfig(cynara-client) BuildRequires: pkgconfig(cynara-session) @@ -56,7 +58,7 @@ export FFLAGS="${FFLAGS} -DTIZEN_ENGINEER_MODE" export ENGINEER=true %endif -%if "%{_repository}" == "wearable" +%if "%{profile}" == "wearable" export MOBILE=Off export WEARABLE=On %else diff --git a/src/main.c b/src/main.c index 05c4a7b..8e44bcf 100755 --- a/src/main.c +++ b/src/main.c @@ -37,9 +37,11 @@ #include "util.h" #include "critical_log.h" #include "service_common.h" -#include "shortcut_service.h" #include "notification_service.h" #include "badge_service.h" +#ifndef WEARABLE +#include "shortcut_service.h" +#endif static void lang_key_changed_cb(keynode_t *node EINA_UNUSED, void *first) { @@ -70,11 +72,11 @@ static inline int app_create(void) DbgPrint("VCONFKEY_LANGSET notify key chenaged: %d\n", ret); lang_key_changed_cb(NULL, NULL); - +#ifndef WEARABLE ret = shortcut_service_init(); if (ret < 0) DbgPrint("shortcut: %d\n", ret); - +#endif ret = notification_service_init(); if (ret < 0) DbgPrint("noti: %d\n", ret); @@ -97,11 +99,11 @@ static inline int app_terminate(void) ret = notification_service_fini(); if (ret < 0) DbgPrint("noti: %d\n", ret); - +#ifndef WEARABLE ret = shortcut_service_fini(); if (ret < 0) DbgPrint("shortcut: %d\n", ret); - +#endif DbgPrint("Terminated\n"); return 0; } diff --git a/src/service_common.c b/src/service_common.c index d5a7279..31e1863 100755 --- a/src/service_common.c +++ b/src/service_common.c @@ -28,7 +28,9 @@ #include "notification_service.h" #include "badge_service.h" +#ifndef WEARABLE #include "shortcut_service.h" +#endif #define PROVIDER_BUS_NAME "org.tizen.data_provider_service" #define PROVIDER_OBJECT_PATH "/org/tizen/data_provider_service" -- 2.7.4 From 2044f61581bd0282b79e41b5735de0d3e4c4bfbd Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Tue, 14 Jun 2016 10:04:06 +0900 Subject: [PATCH 02/16] Exclude shortcut package from only wearable profile Signed-off-by: seungha.son Change-Id: I5402ebbb5c61be30283927592dfcaa72d4bccb4e --- CMakeLists.txt | 16 ++++++++-------- packaging/data-provider-master.spec | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 72edd7a..6026500 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ SET(EXEC_PREFIX "\${prefix}") SET(LIBDIR ${LIB_INSTALL_DIR}) SET(INCLUDEDIR "\${prefix}/include") -IF (MOBILE) +IF (WEARABLE) INCLUDE(FindPkgConfig) pkg_check_modules(pkg REQUIRED dlog @@ -22,7 +22,6 @@ IF (MOBILE) pkgmgr notification badge - shortcut libsmack pkgmgr-info libsystemd-daemon @@ -31,7 +30,7 @@ IF (MOBILE) cynara-session cynara-creds-socket ) -ELSEIF (WEARABLE) +ELSE (WEARABLE) INCLUDE(FindPkgConfig) pkg_check_modules(pkg REQUIRED dlog @@ -47,6 +46,7 @@ ELSEIF (WEARABLE) pkgmgr notification badge + shortcut libsmack pkgmgr-info libsystemd-daemon @@ -55,7 +55,7 @@ ELSEIF (WEARABLE) cynara-session cynara-creds-socket ) -ENDIF (MOBILE) +ENDIF (WEARABLE) SET(PACKAGE "${PROJECT_NAME}") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Winline -Werror -fno-builtin-malloc -fno-omit-frame-pointer -g -fPIE") @@ -86,7 +86,7 @@ ELSEIF (WEARABLE) ADD_DEFINITIONS("-DWEARABLE") ENDIF (MOBILE) -IF (MOBILE) +IF (WEARABLE) SET(BUILD_SOURCE src/main.c src/util.c @@ -95,9 +95,8 @@ IF (MOBILE) src/notification_service.c src/service_common.c src/critical_log.c - src/shortcut_service.c ) -ELSEIF (WEARABLE) +ELSE (WEARABLE) SET(BUILD_SOURCE src/main.c src/util.c @@ -105,9 +104,10 @@ ELSEIF (WEARABLE) src/badge_service.c src/notification_service.c src/service_common.c + src/shortcut_service.c src/critical_log.c ) -ENDIF (MOBILE) +ENDIF (WEARABLE) STRING(REPLACE "-L-l" "-l" pkg_fixed_LDFLAGS ${pkg_LDFLAGS}) STRING(REPLACE "-l" " -l" pkg_LDFLAGS ${pkg_fixed_LDFLAGS}) diff --git a/packaging/data-provider-master.spec b/packaging/data-provider-master.spec index 5fcf011..23aad81 100755 --- a/packaging/data-provider-master.spec +++ b/packaging/data-provider-master.spec @@ -27,7 +27,7 @@ BuildRequires: pkgconfig(pkgmgr) BuildRequires: pkgconfig(pkgmgr-info) BuildRequires: pkgconfig(notification) BuildRequires: pkgconfig(badge) -%if "%{profile}" == "mobile" +%if "%{profile}" != "wearable" BuildRequires: pkgconfig(shortcut) %endif BuildRequires: pkgconfig(libsystemd-daemon) -- 2.7.4 From 93dc2ddf1348c0908ec39c24fe08a603a6d43575 Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Mon, 27 Jun 2016 12:46:24 +0900 Subject: [PATCH 03/16] Add variable for uid Signed-off-by: seungha.son Change-Id: I85728dce02d99396529ec55025486d3145f6586d --- src/notification_service.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/notification_service.c b/src/notification_service.c index ff5302b..5be8190 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -794,7 +794,7 @@ int notification_del_noti_single(GVariant *parameters, GVariant **reply_body, ui } if (num_changes > 0) { - body = g_variant_new("(ii)", 1, priv_id); + body = g_variant_new("(iii)", 1, priv_id, param_uid); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return NOTIFICATION_ERROR_OUT_OF_MEMORY; @@ -853,7 +853,7 @@ int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body, for (i = 0; i < num_deleted; i++) { g_variant_builder_add(builder, "(i)", *(list_deleted + i)); } - deleted_noti_list = g_variant_new("(a(i))", builder); + deleted_noti_list = g_variant_new("(a(i)i)", builder, param_uid); monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(deleted_noti_list, "delete_multiple_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); -- 2.7.4 From fbd319c3175dc9bffc621b35a88d3e3183dc9bd4 Mon Sep 17 00:00:00 2001 From: Myungki Lee Date: Tue, 5 Jul 2016 14:33:17 +0900 Subject: [PATCH 04/16] Add do_not_disturb schedule in system_setting Change-Id: I69291b8ee4f05fe3b50d7cba536543dbbb2805e0 Signed-off-by: Myungki Lee --- CMakeLists.txt | 2 + packaging/data-provider-master.spec | 1 + src/notification_service.c | 172 +++++++++++++++++++++++++++++++++--- 3 files changed, 161 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6026500..a992be1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ IF (WEARABLE) cynara-client cynara-session cynara-creds-socket + alarm-service ) ELSE (WEARABLE) INCLUDE(FindPkgConfig) @@ -54,6 +55,7 @@ ELSE (WEARABLE) cynara-client cynara-session cynara-creds-socket + alarm-service ) ENDIF (WEARABLE) diff --git a/packaging/data-provider-master.spec b/packaging/data-provider-master.spec index 23aad81..abe0bbc 100755 --- a/packaging/data-provider-master.spec +++ b/packaging/data-provider-master.spec @@ -34,6 +34,7 @@ BuildRequires: pkgconfig(libsystemd-daemon) BuildRequires: pkgconfig(cynara-client) BuildRequires: pkgconfig(cynara-session) BuildRequires: pkgconfig(cynara-creds-socket) +BuildRequires: pkgconfig(alarm-service) Requires(post): dbus diff --git a/src/notification_service.c b/src/notification_service.c index 5be8190..7812207 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -24,6 +24,7 @@ #include #include +#include #include "pkgmgr.h" #include "service_common.h" @@ -41,6 +42,9 @@ static GHashTable *_monitoring_hash = NULL; static int _update_noti(GVariant **reply_body, notification_h noti, GList *monitoring_list); +static alarm_id_t dnd_schedule_start_alarm_id; +static alarm_id_t dnd_schedule_end_alarm_id; + /*! * SERVICE HANDLER */ @@ -224,6 +228,12 @@ int notification_register_dbus_interface() " " " " " " + " " + " " + " " + " " + " " + " " " " " " @@ -948,25 +958,91 @@ int notification_update_noti_setting(GVariant *parameters, GVariant **reply_body return ret; } +static int _dnd_schedule_alarm_cb(alarm_id_t alarm_id, void *data) +{ + /* need to get current uid, use default user here. temporarily */ + if (alarm_id == dnd_schedule_start_alarm_id) { + notification_setting_db_update_do_not_disturb(1, tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + } else if (alarm_id == dnd_schedule_end_alarm_id) { + notification_setting_db_update_do_not_disturb(0, tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + } else { + ErrPrint("notification wrong alarm [%d]", alarm_id); + return -1; + } + + return 0; +} + +static int _add_alarm(int dnd_schedule_day, int dnd_start_hour, int dnd_start_min, int dnd_end_hour, int dnd_end_min) +{ + int ret = NOTIFICATION_ERROR_NONE; + + if (dnd_schedule_start_alarm_id) + alarmmgr_remove_alarm(dnd_schedule_start_alarm_id); + + ret = noti_system_setting_set_alarm(dnd_schedule_day, + dnd_start_hour, dnd_start_min, + _dnd_schedule_alarm_cb, &dnd_schedule_start_alarm_id); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("_add_alarm fail %d", ret); + return ret; + } + + if (dnd_schedule_end_alarm_id) + alarmmgr_remove_alarm(dnd_schedule_end_alarm_id); + + ret = noti_system_setting_set_alarm(dnd_schedule_day, + dnd_end_hour, dnd_end_min, + _dnd_schedule_alarm_cb, &dnd_schedule_end_alarm_id); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("_add_alarm fail %d", ret); + return ret; + } + + return ret; +} + /* update_noti_sys_setting */ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret; int do_not_disturb = 0; int visivility_class = 0; + int dnd_schedule_enabled = 0; + int dnd_schedule_day = 0; + int dnd_start_hour = 0; + int dnd_start_min = 0; + int dnd_end_hour = 0; + int dnd_end_min = 0; uid_t param_uid; - g_variant_get(parameters, "(iii)", - &do_not_disturb, - &visivility_class, - ¶m_uid); + g_variant_get(parameters, "(iiiiiiiii)", + &do_not_disturb, + &visivility_class, + &dnd_schedule_enabled, + &dnd_schedule_day, + &dnd_start_hour, + &dnd_start_min, + &dnd_end_hour, + &dnd_end_min, + ¶m_uid); ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); if (ret != NOTIFICATION_ERROR_NONE) return ret; - DbgPrint("do_not_disturb [%d] visivility_class [%d]\n", do_not_disturb, visivility_class); - ret = notification_setting_db_update_system_setting(do_not_disturb, visivility_class, param_uid); + DbgPrint("do_not_disturb [%d] visivility_class [%d] set_schedule [%d]\n", + do_not_disturb, visivility_class, dnd_schedule_enabled); + + ret = notification_setting_db_update_system_setting(do_not_disturb, + visivility_class, + dnd_schedule_enabled, + dnd_schedule_day, + dnd_start_hour, + dnd_start_min, + dnd_end_hour, + dnd_end_min, + param_uid); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("failed to setting db update system setting : %d\n", ret); return ret; @@ -977,7 +1053,16 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_ ErrPrint("cannot make reply_body"); return NOTIFICATION_ERROR_OUT_OF_MEMORY; } + + if (dnd_schedule_enabled) { + ret = _add_alarm(dnd_schedule_day, dnd_start_hour, dnd_start_min, + dnd_end_hour, dnd_end_min); + if (ret != NOTIFICATION_ERROR_NONE) + ErrPrint("failed to add alarm for dnd_schedule"); + } + DbgPrint("_update_noti_sys_setting_service done !! %d", ret); + return ret; } @@ -1026,29 +1111,88 @@ static int _package_uninstall_cb(uid_t uid, const char *pkgname, enum pkgmgr_sta return 0; } +static int _check_dnd_schedule(void) +{ + int ret; + notification_system_setting_h setting = NULL; + bool dnd_schedule_enabled = false; + int dnd_schedule_day = 0; + int dnd_start_hour = 0; + int dnd_start_min = 0; + int dnd_end_hour = 0; + int dnd_end_min = 0; + + ret = noti_system_setting_load_system_setting(&setting, + tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("noti_system_setting_load_system_setting fail %d", ret); + return ret; + } + + ret = notification_system_setting_dnd_schedule_get_enabled(setting, + &dnd_schedule_enabled); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("system_setting_dnd_schedule_get_enabled fail %d", ret); + goto out; + } + + if (dnd_schedule_enabled) { + ret = notification_system_setting_dnd_schedule_get_day(setting, + &dnd_schedule_day); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("system_setting_dnd_schedule_get_day fail %d", ret); + goto out; + } + + ret = notification_system_setting_dnd_schedule_get_start_time(setting, + &dnd_start_hour, &dnd_start_min); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("system_setting_dnd_schedule_get_start_time fail %d", ret); + goto out; + } + + ret = notification_system_setting_dnd_schedule_get_end_time(setting, + &dnd_end_hour, &dnd_end_min); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("system_setting_dnd_schedule_get_end_time fail %d", ret); + goto out; + } + + _add_alarm(dnd_schedule_day, dnd_start_hour, dnd_start_min, dnd_end_hour, dnd_end_min); + } + +out: + notification_system_setting_free_system_setting(setting); + + return ret; +} + /*! * MAIN THREAD * Do not try to do any other operation in these functions */ HAPI int notification_service_init(void) { - int result; + int ret; _monitoring_hash = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, free_monitoring_list); - result = notification_db_init(); - if (result != NOTIFICATION_ERROR_NONE) { - ErrPrint("notification db init fail %d", result); - return result; + ret = notification_db_init(); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("notification db init fail %d", ret); + return ret; } - result = notification_register_dbus_interface(); - if (result != SERVICE_COMMON_ERROR_NONE) { - ErrPrint("notification register dbus fail %d", result); + ret = notification_register_dbus_interface(); + if (ret != SERVICE_COMMON_ERROR_NONE) { + ErrPrint("notification register dbus fail %d", ret); return NOTIFICATION_ERROR_IO_ERROR; } + _notification_data_init(); notification_setting_refresh_setting_table(tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + _check_dnd_schedule(); + pkgmgr_init(); pkgmgr_add_event_callback(PKGMGR_EVENT_INSTALL, _package_install_cb, NULL); pkgmgr_add_event_callback(PKGMGR_EVENT_UPDATE, _package_install_cb, NULL); -- 2.7.4 From 3de2aa353e49730154fb25a35d78e542cd09eb50 Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Wed, 29 Jun 2016 20:40:38 +0900 Subject: [PATCH 05/16] Add multiuser feature for badge Signed-off-by: seungha.son Change-Id: Ie48fa8c5aad60ce1b54d1f8fbdeee7cf3765fcf6 --- include/badge_service.h | 11 ++-- src/badge_service.c | 169 ++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 140 insertions(+), 40 deletions(-) diff --git a/include/badge_service.h b/include/badge_service.h index 478c984..7c9d0e5 100755 --- a/include/badge_service.h +++ b/include/badge_service.h @@ -15,19 +15,20 @@ */ #include +#include extern int badge_service_init(void); extern int badge_service_fini(void); int badge_get_badge_existing(GVariant *parameters, GVariant **reply_body, uid_t uid); int badge_get_badge_list(GVariant *parameters, GVariant **reply_body, uid_t uid); -int badge_insert(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); -int badge_delete(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); -int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int badge_insert(GVariant *parameters, GVariant **reply_body, uid_t uid); +int badge_delete(GVariant *parameters, GVariant **reply_body, uid_t uid); +int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid); int badge_get_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid); -int badge_set_display_option(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int badge_set_display_option(GVariant *parameters, GVariant **reply_body, uid_t uid); int badge_get_display_option(GVariant *parameters, GVariant **reply_body, uid_t uid); -int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid); +int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, uid_t uid); int badge_get_setting_property(GVariant *parameters, GVariant **reply_body, uid_t uid); int badge_register_dbus_interface(); diff --git a/src/badge_service.c b/src/badge_service.c index 92d2b99..56dce5f 100755 --- a/src/badge_service.c +++ b/src/badge_service.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "service_common.h" #include "badge_service.h" @@ -60,9 +61,7 @@ static void _badge_dbus_method_call_handler(GDBusConnection *conn, GVariant *reply_body = NULL; int ret = BADGE_ERROR_INVALID_PARAMETER; uid_t uid = get_sender_uid(sender); - GList *monitoring_list = NULL; - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, &uid); if (g_strcmp0(method_name, "badge_service_register") == 0) ret = service_register(parameters, &reply_body, sender, _on_name_appeared, _on_name_vanished, &_monitoring_hash, uid); @@ -71,19 +70,19 @@ static void _badge_dbus_method_call_handler(GDBusConnection *conn, else if (g_strcmp0(method_name, "get_list") == 0) ret = badge_get_badge_list(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "insert_badge") == 0) - ret = badge_insert(parameters, &reply_body, monitoring_list, uid); + ret = badge_insert(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "delete_badge") == 0) - ret = badge_delete(parameters, &reply_body, monitoring_list, uid); + ret = badge_delete(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "set_badge_count") == 0) - ret = badge_set_badge_count(parameters, &reply_body, monitoring_list, uid); + ret = badge_set_badge_count(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "get_badge_count") == 0) ret = badge_get_badge_count(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "set_disp_option") == 0) - ret = badge_set_display_option(parameters, &reply_body, monitoring_list, uid); + ret = badge_set_display_option(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "get_disp_option") == 0) ret = badge_get_display_option(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "set_noti_property") == 0) - ret = badge_set_setting_property(parameters, &reply_body, monitoring_list, uid); + ret = badge_set_setting_property(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "get_noti_property") == 0) ret = badge_get_setting_property(parameters, &reply_body, uid); @@ -117,30 +116,36 @@ int badge_register_dbus_interface() " " " " " " + " " " " " " " " + " " " " " " " " " " " " " " + " " " " " " " " " " + " " " " " " " " " " " " + " " " " " " " " + " " " " " " @@ -148,10 +153,12 @@ int badge_register_dbus_interface() " " " " " " + " " " " " " " " + " " " " " " @@ -159,11 +166,13 @@ int badge_register_dbus_interface() " " " " " " + " " " " " " " " " " + " " " " " " " " @@ -172,6 +181,23 @@ int badge_register_dbus_interface() return service_common_register_dbus_interface(introspection_xml, _badge_interface_vtable); } +static int _validate_and_set_param_uid_with_uid(uid_t uid, uid_t *param_uid) +{ + int ret = BADGE_ERROR_NONE; + + if (uid > NORMAL_UID_BASE && uid != *param_uid) { + ErrPrint("invalid sender uid : %d, param_uid : %d", uid, *param_uid); + return BADGE_ERROR_INVALID_PARAMETER; + } else if (uid <= NORMAL_UID_BASE) { + if (*param_uid <= NORMAL_UID_BASE) { + if (*param_uid != uid) + return BADGE_ERROR_INVALID_PARAMETER; + *param_uid = tzplatform_getuid(TZ_SYS_DEFAULT_USER); + } + } + return ret; +} + static void _release_badge_info(gpointer data) { badge_info_s *badge = (badge_info_s *)data; @@ -188,11 +214,17 @@ int badge_get_badge_existing(GVariant *parameters, GVariant **reply_body, uid_t int ret = BADGE_ERROR_NONE; char *pkgname = NULL; bool existing = 0; + uid_t param_uid; - g_variant_get(parameters, "(&s)", &pkgname); + g_variant_get(parameters, "(&si)", &pkgname, ¶m_uid); DbgPrint("badge_get_badge_existing %s", pkgname); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; + if (pkgname != NULL) - ret = badge_db_is_existing(pkgname, &existing); + ret = badge_db_is_existing(pkgname, &existing, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -219,8 +251,15 @@ int badge_get_badge_list(GVariant *parameters, GVariant **reply_body, uid_t uid) badge_info_s *badge; GVariantBuilder *builder; int ret; + uid_t param_uid; + + g_variant_get(parameters, "(i)", ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - ret = badge_db_get_list(&badge_list); + ret = badge_db_get_list(&badge_list, param_uid); if (ret != BADGE_ERROR_NONE) { ErrPrint("badge get list fail : %d", ret); return ret; @@ -248,17 +287,24 @@ int badge_get_badge_list(GVariant *parameters, GVariant **reply_body, uid_t uid) } /* insert_badge */ -int badge_insert(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) +int badge_insert(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; char *writable_pkg = NULL; char *caller = NULL; GVariant *body = NULL; + GList *monitoring_list = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&s&si)", &pkgname, &writable_pkg, &caller, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&s&s)", &pkgname, &writable_pkg, &caller); if (pkgname != NULL && writable_pkg != NULL && caller != NULL) - ret = badge_db_insert(pkgname, writable_pkg, caller); + ret = badge_db_insert(pkgname, writable_pkg, caller, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -267,12 +313,13 @@ int badge_insert(GVariant *parameters, GVariant **reply_body, GList *monitoring_ return ret; } - body = g_variant_new("(s)", pkgname); + body = g_variant_new("(si)", pkgname, param_uid); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(body, "insert_badge_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -291,16 +338,23 @@ int badge_insert(GVariant *parameters, GVariant **reply_body, GList *monitoring_ } /* delete_badge */ -int badge_delete(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) +int badge_delete(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; char *caller = NULL; GVariant *body = NULL; + GList *monitoring_list = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&si)", &pkgname, &caller, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&s)", &pkgname, &caller); if (pkgname != NULL && caller != NULL) { - ret = badge_db_delete(pkgname, caller); + ret = badge_db_delete(pkgname, caller, param_uid); } else { return BADGE_ERROR_INVALID_PARAMETER; } @@ -310,11 +364,13 @@ int badge_delete(GVariant *parameters, GVariant **reply_body, GList *monitoring_ return ret; } - body = g_variant_new("(s)", pkgname); + body = g_variant_new("(si)", pkgname, param_uid); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } + + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(body, "delete_badge_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -332,17 +388,24 @@ int badge_delete(GVariant *parameters, GVariant **reply_body, GList *monitoring_ } /* set_badge_count */ -int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) +int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; char *caller = NULL; unsigned int count = 0; GVariant *body = NULL; + GList *monitoring_list = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&sii)", &pkgname, &caller, &count, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&si)", &pkgname, &caller, &count); if (pkgname != NULL && caller != NULL) - ret = badge_db_set_count(pkgname, caller, count); + ret = badge_db_set_count(pkgname, caller, count, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -351,12 +414,13 @@ int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, GList *mo return ret; } - body = g_variant_new("(si)", pkgname, count); + body = g_variant_new("(sii)", pkgname, count, param_uid); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(body, "set_badge_count_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -380,10 +444,16 @@ int badge_get_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid int ret = BADGE_ERROR_NONE; char *pkgname = NULL; unsigned int count = 0; + uid_t param_uid; + + g_variant_get(parameters, "(&si)", &pkgname, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s)", &pkgname); if (pkgname != NULL) - ret = badge_db_get_count(pkgname, &count); + ret = badge_db_get_count(pkgname, &count, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -402,19 +472,26 @@ int badge_get_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid } /* set_disp_option */ -int badge_set_display_option(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) +int badge_set_display_option(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = BADGE_ERROR_NONE; char *pkgname = NULL; char *caller = NULL; unsigned int is_display = 0; GVariant *body = NULL; + GList *monitoring_list = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&sii)", &pkgname, &caller, &is_display, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&si)", &pkgname, &caller, &is_display); DbgPrint("set disp option : %s, %s, %d", pkgname, caller, is_display); if (pkgname != NULL && caller != NULL) - ret = badge_db_set_display_option(pkgname, caller, is_display); + ret = badge_db_set_display_option(pkgname, is_display, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -423,12 +500,13 @@ int badge_set_display_option(GVariant *parameters, GVariant **reply_body, GList return ret; } - body = g_variant_new("(si)", pkgname, is_display); + body = g_variant_new("(sii)", pkgname, is_display, param_uid); if (body == NULL) { ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(body, "set_disp_option_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -452,12 +530,18 @@ int badge_get_display_option(GVariant *parameters, GVariant **reply_body, uid_t int ret = BADGE_ERROR_NONE; char *pkgname = NULL; unsigned int is_display = 0; + uid_t param_uid; + + g_variant_get(parameters, "(&si)", &pkgname, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s)", &pkgname); DbgPrint("get disp option : %s", pkgname); if (pkgname != NULL) - ret = badge_db_get_display_option(pkgname, &is_display); + ret = badge_db_get_display_option(pkgname, &is_display, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -475,7 +559,7 @@ int badge_get_display_option(GVariant *parameters, GVariant **reply_body, uid_t } /* set_noti_property */ -int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, GList *monitoring_list, uid_t uid) +int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, uid_t uid) { int ret = 0; int is_display = 0; @@ -483,10 +567,17 @@ int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, GLis char *property = NULL; char *value = NULL; GVariant *body = NULL; + GList *monitoring_list = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&s&si)", &pkgname, &property, &value, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&s&s)", &pkgname, &property, &value); if (pkgname != NULL && property != NULL && value != NULL) - ret = badge_setting_db_set(pkgname, property, value); + ret = badge_setting_db_set(pkgname, property, value, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; @@ -507,6 +598,8 @@ int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, GLis ErrPrint("cannot make gvariant to noti"); return BADGE_ERROR_OUT_OF_MEMORY; } + + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); ret = send_notify(body, "set_disp_option_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); if (ret != BADGE_ERROR_NONE) { @@ -533,10 +626,16 @@ int badge_get_setting_property(GVariant *parameters, GVariant **reply_body, uid_ char *pkgname = NULL; char *property = NULL; char *value = NULL; + uid_t param_uid; + + g_variant_get(parameters, "(&s&si)", &pkgname, &property, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != BADGE_ERROR_NONE) + return ret; - g_variant_get(parameters, "(&s&s)", &pkgname, &property); if (pkgname != NULL && property != NULL) - ret = badge_setting_db_get(pkgname, property, &value); + ret = badge_setting_db_get(pkgname, property, &value, param_uid); else return BADGE_ERROR_INVALID_PARAMETER; -- 2.7.4 From 466c04bed02192f437168dd8ea856481233ba4b8 Mon Sep 17 00:00:00 2001 From: Myungki Lee Date: Tue, 5 Jul 2016 22:35:56 +0900 Subject: [PATCH 06/16] Add lock_screen_level in system_setting Change-Id: I371f302b9522a72dc3cd36f20143e12074615197 Signed-off-by: Myungki Lee --- src/notification_service.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/notification_service.c b/src/notification_service.c index 7812207..3d06064 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -234,6 +234,7 @@ int notification_register_dbus_interface() " " " " " " + " " " " " " @@ -1014,9 +1015,10 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_ int dnd_start_min = 0; int dnd_end_hour = 0; int dnd_end_min = 0; + int lock_screen_level = 0; uid_t param_uid; - g_variant_get(parameters, "(iiiiiiiii)", + g_variant_get(parameters, "(iiiiiiiiii)", &do_not_disturb, &visivility_class, &dnd_schedule_enabled, @@ -1025,14 +1027,15 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_ &dnd_start_min, &dnd_end_hour, &dnd_end_min, + &lock_screen_level, ¶m_uid); ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); if (ret != NOTIFICATION_ERROR_NONE) return ret; - DbgPrint("do_not_disturb [%d] visivility_class [%d] set_schedule [%d]\n", - do_not_disturb, visivility_class, dnd_schedule_enabled); + DbgPrint("do_not_disturb [%d] visivility_class [%d] set_schedule [%d] lock_screen_level [%d]\n", + do_not_disturb, visivility_class, dnd_schedule_enabled, lock_screen_level); ret = notification_setting_db_update_system_setting(do_not_disturb, visivility_class, @@ -1042,6 +1045,7 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_ dnd_start_min, dnd_end_hour, dnd_end_min, + lock_screen_level, param_uid); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("failed to setting db update system setting : %d\n", ret); -- 2.7.4 From c5acaf1a45676826e7675ad5a2c26a3fcaf01e07 Mon Sep 17 00:00:00 2001 From: jooseong lee Date: Wed, 20 Jul 2016 20:21:24 +0900 Subject: [PATCH 07/16] Set the SMACK security label to run given executable file in systemd services Change-Id: I62ff40352f3d872a73c58cfb8c8911884cfce14e Signed-off-by: jooseong lee --- packaging/data-provider-master.service | 1 + 1 file changed, 1 insertion(+) diff --git a/packaging/data-provider-master.service b/packaging/data-provider-master.service index 89e9122..95e3d3f 100644 --- a/packaging/data-provider-master.service +++ b/packaging/data-provider-master.service @@ -6,6 +6,7 @@ User=app_fw Group=app_fw BusName=org.tizen.data_provider_service Type=dbus +SmackProcessLabel=System ExecStart=/usr/bin/data-provider-master TimeoutStopSec=3s Restart=always -- 2.7.4 From 7f9c6626d1409a27468ac63101d20cccf22a3364 Mon Sep 17 00:00:00 2001 From: Myungki Lee Date: Mon, 25 Jul 2016 15:14:08 +0900 Subject: [PATCH 08/16] Remove unused code Change-Id: I3f54e75dc81fefcfc9423be70acc8029e27296e2 Signed-off-by: Myungki Lee --- CMakeLists.txt | 6 ------ packaging/data-provider-master.spec | 3 --- src/service_common.c | 3 --- 3 files changed, 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a992be1..600f0ca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,9 +26,6 @@ IF (WEARABLE) pkgmgr-info libsystemd-daemon capi-appfw-app-manager - cynara-client - cynara-session - cynara-creds-socket alarm-service ) ELSE (WEARABLE) @@ -52,9 +49,6 @@ ELSE (WEARABLE) pkgmgr-info libsystemd-daemon capi-appfw-app-manager - cynara-client - cynara-session - cynara-creds-socket alarm-service ) ENDIF (WEARABLE) diff --git a/packaging/data-provider-master.spec b/packaging/data-provider-master.spec index abe0bbc..93f568f 100755 --- a/packaging/data-provider-master.spec +++ b/packaging/data-provider-master.spec @@ -31,9 +31,6 @@ BuildRequires: pkgconfig(badge) BuildRequires: pkgconfig(shortcut) %endif BuildRequires: pkgconfig(libsystemd-daemon) -BuildRequires: pkgconfig(cynara-client) -BuildRequires: pkgconfig(cynara-session) -BuildRequires: pkgconfig(cynara-creds-socket) BuildRequires: pkgconfig(alarm-service) Requires(post): dbus diff --git a/src/service_common.c b/src/service_common.c index 31e1863..1a29da8 100755 --- a/src/service_common.c +++ b/src/service_common.c @@ -18,9 +18,6 @@ #include #include #include -#include -#include -#include #include #include "service_common.h" -- 2.7.4 From 14d579f338ade43b43e634f7074ffbdd349d7aef Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Thu, 28 Jul 2016 08:07:45 +0900 Subject: [PATCH 09/16] Add function for set alaram Signed-off-by: seungha.son Change-Id: I5842fe38df08a5f5eb927ea4378cc61519af71b5 --- src/notification_service.c | 95 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 2 deletions(-) diff --git a/src/notification_service.c b/src/notification_service.c index 3d06064..8a0d58f 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -974,6 +974,97 @@ static int _dnd_schedule_alarm_cb(alarm_id_t alarm_id, void *data) return 0; } +static int _get_current_time(struct tm *date) +{ + time_t now; + + if (date == NULL) { + ErrPrint("NOTIFICATION_ERROR_INVALID_PARAMETER"); + return NOTIFICATION_ERROR_INVALID_PARAMETER; + } + + time(&now); + localtime_r(&now, date); + + return NOTIFICATION_ERROR_NONE; +} + +static int _noti_system_setting_set_alarm(int week_flag, int hour, int min, alarm_cb_t handler, alarm_id_t *dnd_schedule_alarm_id) +{ + int err = NOTIFICATION_ERROR_NONE; + struct tm struct_time; + alarm_entry_t *alarm_info = NULL; + alarm_date_t alarm_time; + alarm_id_t alarm_id = -1; + + err = alarmmgr_init("notification"); + if (err < 0) { + ErrPrint("alarmmgr_init failed [%d]", err); + goto out; + } + + err = alarmmgr_set_cb(handler, NULL); + if (err < 0) { + ErrPrint("alarmmgr_set_cb failed [%d]", err); + goto out; + } + + err = _get_current_time(&struct_time); + if (err != NOTIFICATION_ERROR_NONE) { + ErrPrint("get_current_time failed"); + goto out; + } + + alarm_info = alarmmgr_create_alarm(); + if (alarm_info == NULL) { + ErrPrint("alarmmgr_create_alarm failed"); + goto out; + } + + alarm_time.year = struct_time.tm_year + 1900; + alarm_time.month = struct_time.tm_mon + 1; + alarm_time.day = struct_time.tm_mday; + alarm_time.hour = hour; + alarm_time.min = min; + alarm_time.sec = 0; + + err = alarmmgr_set_time(alarm_info, alarm_time); + if (err != ALARMMGR_RESULT_SUCCESS) { + ErrPrint("alarmmgr_set_time failed (%d)", err); + goto out; + } + + if (week_flag) { + err = alarmmgr_set_repeat_mode(alarm_info, ALARM_REPEAT_MODE_WEEKLY, week_flag); + if (err != ALARMMGR_RESULT_SUCCESS) { + ErrPrint("alarmmgr_set_repeat_mode failed [%d]", err); + goto out; + } + } + + err = alarmmgr_set_type(alarm_info, ALARM_TYPE_VOLATILE); + if (err != ALARMMGR_RESULT_SUCCESS) { + ErrPrint("alarmmgr_set_type failed [%d]", err); + goto out; + } + + err = alarmmgr_add_alarm_with_localtime(alarm_info, NULL, &alarm_id); + if (err != ALARMMGR_RESULT_SUCCESS) { + ErrPrint("alarmmgr_add_alarm_with_localtime failed [%d]", err); + goto out; + } + + *dnd_schedule_alarm_id = alarm_id; + + DbgPrint("alarm_id [%d]", *dnd_schedule_alarm_id); + +out: + if (alarm_info) + alarmmgr_free_alarm(alarm_info); + + return err; +} + static int _add_alarm(int dnd_schedule_day, int dnd_start_hour, int dnd_start_min, int dnd_end_hour, int dnd_end_min) { int ret = NOTIFICATION_ERROR_NONE; @@ -981,7 +1072,7 @@ static int _add_alarm(int dnd_schedule_day, int dnd_start_hour, int dnd_start_mi if (dnd_schedule_start_alarm_id) alarmmgr_remove_alarm(dnd_schedule_start_alarm_id); - ret = noti_system_setting_set_alarm(dnd_schedule_day, + ret = _noti_system_setting_set_alarm(dnd_schedule_day, dnd_start_hour, dnd_start_min, _dnd_schedule_alarm_cb, &dnd_schedule_start_alarm_id); if (ret != NOTIFICATION_ERROR_NONE) { @@ -992,7 +1083,7 @@ static int _add_alarm(int dnd_schedule_day, int dnd_start_hour, int dnd_start_mi if (dnd_schedule_end_alarm_id) alarmmgr_remove_alarm(dnd_schedule_end_alarm_id); - ret = noti_system_setting_set_alarm(dnd_schedule_day, + ret = _noti_system_setting_set_alarm(dnd_schedule_day, dnd_end_hour, dnd_end_min, _dnd_schedule_alarm_cb, &dnd_schedule_end_alarm_id); if (ret != NOTIFICATION_ERROR_NONE) { -- 2.7.4 From dee089079f098c42d7524a6bc3c8390208682c80 Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Fri, 29 Jul 2016 14:07:28 +0900 Subject: [PATCH 10/16] Delete duplicated code Signed-off-by: seungha.son Change-Id: I8e0ad4fae550bffcd0de0623f299e3c5fc66c75c --- data-provider-master.conf.in | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/data-provider-master.conf.in b/data-provider-master.conf.in index 6bb3c42..8651511 100644 --- a/data-provider-master.conf.in +++ b/data-provider-master.conf.in @@ -1,22 +1,20 @@ +"http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> - + - - - - - - - - - - - - + + + + + + + + + + -- 2.7.4 From edd89dac98e4be87d681fce16ab548ebf2fe166c Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Fri, 29 Jul 2016 15:29:33 +0900 Subject: [PATCH 11/16] Change key type of g_hash_table Signed-off-by: seungha.son Change-Id: I6ccfae25aa3773806fb644aca3a82c86baf97745 --- src/badge_service.c | 12 ++++++------ src/notification_service.c | 12 ++++++------ src/service_common.c | 9 +++------ src/shortcut_service.c | 4 ++-- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/badge_service.c b/src/badge_service.c index 56dce5f..ffd48b3 100755 --- a/src/badge_service.c +++ b/src/badge_service.c @@ -319,7 +319,7 @@ int badge_insert(GVariant *parameters, GVariant **reply_body, uid_t uid) return BADGE_ERROR_OUT_OF_MEMORY; } - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(param_uid)); ret = send_notify(body, "insert_badge_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -370,7 +370,7 @@ int badge_delete(GVariant *parameters, GVariant **reply_body, uid_t uid) return BADGE_ERROR_OUT_OF_MEMORY; } - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(param_uid)); ret = send_notify(body, "delete_badge_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -420,7 +420,7 @@ int badge_set_badge_count(GVariant *parameters, GVariant **reply_body, uid_t uid return BADGE_ERROR_OUT_OF_MEMORY; } - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(param_uid)); ret = send_notify(body, "set_badge_count_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -506,7 +506,7 @@ int badge_set_display_option(GVariant *parameters, GVariant **reply_body, uid_t return BADGE_ERROR_OUT_OF_MEMORY; } - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(param_uid)); ret = send_notify(body, "set_disp_option_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); @@ -599,7 +599,7 @@ int badge_set_setting_property(GVariant *parameters, GVariant **reply_body, uid_ return BADGE_ERROR_OUT_OF_MEMORY; } - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(param_uid)); ret = send_notify(body, "set_disp_option_notify", monitoring_list, PROVIDER_BADGE_INTERFACE_NAME); g_variant_unref(body); if (ret != BADGE_ERROR_NONE) { @@ -660,7 +660,7 @@ HAPI int badge_service_init(void) { int result; - _monitoring_hash = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, free_monitoring_list); + _monitoring_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_monitoring_list); result = badge_db_init(); if (result != BADGE_ERROR_NONE) { ErrPrint("badge db init fail %d", result); diff --git a/src/notification_service.c b/src/notification_service.c index 8a0d58f..f793475 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -376,7 +376,7 @@ int notification_add_noti(GVariant *parameters, GVariant **reply_body, uid_t uid if (ret != NOTIFICATION_ERROR_NONE) return ret; - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¬i_uid); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(noti_uid)); if (ret == NOTIFICATION_ERROR_NONE) { ret = notification_noti_check_tag(noti); if (ret == NOTIFICATION_ERROR_NOT_EXIST_ID) @@ -450,7 +450,7 @@ int notification_update_noti(GVariant *parameters, GVariant **reply_body, uid_t if (ret != NOTIFICATION_ERROR_NONE) return ret; - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¬i_uid); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(noti_uid)); if (ret == NOTIFICATION_ERROR_NONE) ret = _update_noti(reply_body, noti, monitoring_list); @@ -765,7 +765,7 @@ int notification_refresh_noti(GVariant *parameters, GVariant **reply_body, uid_t if (ret != NOTIFICATION_ERROR_NONE) return ret; - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(param_uid)); ret = send_notify(parameters, "refresh_noti_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("failed to send notify:%d\n", ret); @@ -810,7 +810,7 @@ int notification_del_noti_single(GVariant *parameters, GVariant **reply_body, ui ErrPrint("cannot make gvariant to noti"); return NOTIFICATION_ERROR_OUT_OF_MEMORY; } - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(param_uid)); ret = send_notify(body, "delete_single_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); g_variant_unref(body); if (ret != NOTIFICATION_ERROR_NONE) { @@ -865,7 +865,7 @@ int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body, g_variant_builder_add(builder, "(i)", *(list_deleted + i)); } deleted_noti_list = g_variant_new("(a(i)i)", builder, param_uid); - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, ¶m_uid); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(param_uid)); ret = send_notify(deleted_noti_list, "delete_multiple_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); g_variant_builder_unref(builder); @@ -1270,7 +1270,7 @@ HAPI int notification_service_init(void) { int ret; - _monitoring_hash = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, free_monitoring_list); + _monitoring_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_monitoring_list); ret = notification_db_init(); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("notification db init fail %d", ret); diff --git a/src/service_common.c b/src/service_common.c index 1a29da8..8bb23ab 100755 --- a/src/service_common.c +++ b/src/service_common.c @@ -167,7 +167,6 @@ int service_register(GVariant *parameters, GVariant **reply_body, const gchar *s monitoring_info_s *m_info = NULL; uid_t request_uid = 0; GList *monitoring_list = NULL; - int *hash_key; if (sender == NULL) return SERVICE_COMMON_ERROR_IO_ERROR; @@ -177,7 +176,7 @@ int service_register(GVariant *parameters, GVariant **reply_body, const gchar *s return SERVICE_COMMON_ERROR_IO_ERROR; DbgPrint("service_register : uid %d , request_uid %d", uid, request_uid); - monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, &request_uid); + monitoring_list = (GList *)g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(request_uid)); added_list = g_list_find_custom(monitoring_list, bus_name, (GCompareFunc)_monitoring_app_list_compare_cb); @@ -210,10 +209,8 @@ int service_register(GVariant *parameters, GVariant **reply_body, const gchar *s monitoring_list = g_list_append(monitoring_list, strdup(bus_name)); DbgPrint("service_register : register success sender is %s , length : %d", sender, g_list_length(monitoring_list)); - if (g_hash_table_lookup(*monitoring_hash, &request_uid) == NULL) { - hash_key = (int *)calloc(1, sizeof(int)); - *hash_key = request_uid; - g_hash_table_insert(*monitoring_hash, hash_key, monitoring_list); + if (g_hash_table_lookup(*monitoring_hash, GUINT_TO_POINTER(request_uid)) == NULL) { + g_hash_table_insert(*monitoring_hash, GUINT_TO_POINTER(request_uid), monitoring_list); } } else { diff --git a/src/shortcut_service.c b/src/shortcut_service.c index 1184bf6..1142251 100755 --- a/src/shortcut_service.c +++ b/src/shortcut_service.c @@ -57,7 +57,7 @@ static void _shortcut_dbus_method_call_handler(GDBusConnection *conn, uid_t uid = get_sender_uid(sender); GList *monitoring_list = NULL; - monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, &uid); + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(uid)); if (g_strcmp0(method_name, "shortcut_service_register") == 0) ret = service_register(parameters, &reply_body, sender, _on_name_appeared, _on_name_vanished, &_monitoring_hash, uid); @@ -251,7 +251,7 @@ HAPI int shortcut_service_init(void) { DbgPrint("Successfully initiated\n"); int result; - _monitoring_hash = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, free_monitoring_list); + _monitoring_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_monitoring_list); result = shortcut_register_dbus_interface(); if (result != SERVICE_COMMON_ERROR_NONE) { ErrPrint("shortcut register dbus fail %d", result); -- 2.7.4 From 595a14166eea05cb1e1cdb216a86879b6483111f Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Mon, 18 Jul 2016 19:08:03 +0900 Subject: [PATCH 12/16] Add methods for notification system setting dnd schedule changed callback Signed-off-by: seungha.son Change-Id: Ic9ec6265bc65b24d066d627db046177032c105f6 --- src/notification_service.c | 154 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 123 insertions(+), 31 deletions(-) diff --git a/src/notification_service.c b/src/notification_service.c index f793475..9e03e5e 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -19,7 +19,6 @@ #include #include - #include #include @@ -39,11 +38,18 @@ #define PROVIDER_NOTI_INTERFACE_NAME "org.tizen.data_provider_noti_service" -static GHashTable *_monitoring_hash = NULL; +typedef struct _dnd_alarm_id dnd_alarm_id_s; + +static GHashTable *_monitoring_hash; static int _update_noti(GVariant **reply_body, notification_h noti, GList *monitoring_list); -static alarm_id_t dnd_schedule_start_alarm_id; -static alarm_id_t dnd_schedule_end_alarm_id; +static GList *_dnd_alarm_id_list; + +typedef struct _dnd_alarm_id { + uid_t uid; + alarm_id_t dnd_start_id; + alarm_id_t dnd_end_id; +} dnd_alarm_id_s; /*! * SERVICE HANDLER @@ -861,9 +867,9 @@ int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body, if (num_deleted > 0) { builder = g_variant_builder_new(G_VARIANT_TYPE("a(i)")); - for (i = 0; i < num_deleted; i++) { + for (i = 0; i < num_deleted; i++) g_variant_builder_add(builder, "(i)", *(list_deleted + i)); - } + deleted_noti_list = g_variant_new("(a(i)i)", builder, param_uid); monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(param_uid)); ret = send_notify(deleted_noti_list, "delete_multiple_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); @@ -961,17 +967,53 @@ int notification_update_noti_setting(GVariant *parameters, GVariant **reply_body static int _dnd_schedule_alarm_cb(alarm_id_t alarm_id, void *data) { - /* need to get current uid, use default user here. temporarily */ - if (alarm_id == dnd_schedule_start_alarm_id) { - notification_setting_db_update_do_not_disturb(1, tzplatform_getuid(TZ_SYS_DEFAULT_USER)); - } else if (alarm_id == dnd_schedule_end_alarm_id) { - notification_setting_db_update_do_not_disturb(0, tzplatform_getuid(TZ_SYS_DEFAULT_USER)); - } else { - ErrPrint("notification wrong alarm [%d]", alarm_id); + int ret; + int do_not_disturb; + bool dnd_id_found = false; + GVariant *body = NULL; + GList *dnd_found_list = NULL; + GList *monitoring_list = NULL; + dnd_alarm_id_s *dnd_id_data = NULL; + uid_t uid; + + dnd_found_list = g_list_first(_dnd_alarm_id_list); + + for (; dnd_found_list != NULL; dnd_found_list = dnd_found_list->next) { + dnd_id_data = dnd_found_list->data; + if (alarm_id == dnd_id_data->dnd_start_id) { + do_not_disturb = 1; + dnd_id_found = true; + uid = dnd_id_data->uid; + break; + } else if (alarm_id == dnd_id_data->dnd_end_id) { + do_not_disturb = 0; + dnd_id_found = true; + uid = dnd_id_data->uid; + break; + } + } + + if (dnd_id_found == false) { + ErrPrint("notification wrong alarm [%d] [%d] [%d]", + alarm_id, dnd_id_data->dnd_start_id, dnd_id_data->dnd_end_id); return -1; } - return 0; + notification_setting_db_update_do_not_disturb(do_not_disturb, uid); + + body = g_variant_new("(ii)", do_not_disturb, uid); + + monitoring_list = (GList *)g_hash_table_lookup(_monitoring_hash, GUINT_TO_POINTER(uid)); + ret = send_notify(body, "change_dnd_notify", monitoring_list, PROVIDER_NOTI_INTERFACE_NAME); + g_variant_unref(body); + + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("failed to send notify:%d\n", ret); + return ret; + } + + DbgPrint("_dnd_schedule_alarm_cb done"); + return ret; } static int _get_current_time(struct tm *date) @@ -1065,32 +1107,76 @@ out: return err; } -static int _add_alarm(int dnd_schedule_day, int dnd_start_hour, int dnd_start_min, int dnd_end_hour, int dnd_end_min) +static gint _dnd_data_compare(gconstpointer a, gconstpointer b) { - int ret = NOTIFICATION_ERROR_NONE; + const dnd_alarm_id_s *data = NULL; + + if (!a) + return -1; + data = a; + + if (data->uid == (uid_t)b) + return 0; + + return 1; +} - if (dnd_schedule_start_alarm_id) - alarmmgr_remove_alarm(dnd_schedule_start_alarm_id); +static int _add_alarm(int dnd_schedule_day, int dnd_start_hour, int dnd_start_min, int dnd_end_hour, int dnd_end_min, uid_t uid) +{ + int ret = NOTIFICATION_ERROR_NONE; + GList *found_list = NULL; + dnd_alarm_id_s *dnd_id_data = NULL; + alarm_id_t dnd_schedule_start_alarm_id; + alarm_id_t dnd_schedule_end_alarm_id; ret = _noti_system_setting_set_alarm(dnd_schedule_day, dnd_start_hour, dnd_start_min, - _dnd_schedule_alarm_cb, &dnd_schedule_start_alarm_id); + _dnd_schedule_alarm_cb, + &dnd_schedule_start_alarm_id); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("_add_alarm fail %d", ret); return ret; } - if (dnd_schedule_end_alarm_id) - alarmmgr_remove_alarm(dnd_schedule_end_alarm_id); - ret = _noti_system_setting_set_alarm(dnd_schedule_day, dnd_end_hour, dnd_end_min, - _dnd_schedule_alarm_cb, &dnd_schedule_end_alarm_id); + _dnd_schedule_alarm_cb, + &dnd_schedule_end_alarm_id); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("_add_alarm fail %d", ret); return ret; } + dnd_id_data = (dnd_alarm_id_s *)malloc(sizeof(dnd_alarm_id_s)); + if (dnd_id_data == NULL) { + ErrPrint("memory allocation fail"); + return NOTIFICATION_ERROR_OUT_OF_MEMORY; + } + + dnd_id_data->uid = uid; + dnd_id_data->dnd_start_id = dnd_schedule_start_alarm_id; + dnd_id_data->dnd_end_id = dnd_schedule_end_alarm_id; + + if (_dnd_alarm_id_list == NULL) { + _dnd_alarm_id_list = g_list_append(_dnd_alarm_id_list, dnd_id_data); + } else { + found_list = g_list_find_custom(_dnd_alarm_id_list, (gconstpointer)uid, + _dnd_data_compare); + if (found_list) { + dnd_id_data = g_list_nth_data(found_list, 0); + if (dnd_id_data->dnd_start_id) { + alarmmgr_remove_alarm(dnd_id_data->dnd_start_id); + dnd_id_data->dnd_start_id = dnd_schedule_start_alarm_id; + } + if (dnd_id_data->dnd_end_id) { + alarmmgr_remove_alarm(dnd_id_data->dnd_end_id); + dnd_id_data->dnd_end_id = dnd_schedule_end_alarm_id; + } + } else { + _dnd_alarm_id_list = g_list_append(_dnd_alarm_id_list, dnd_id_data); + } + } + return ret; } @@ -1124,7 +1210,6 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_ ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); if (ret != NOTIFICATION_ERROR_NONE) return ret; - DbgPrint("do_not_disturb [%d] visivility_class [%d] set_schedule [%d] lock_screen_level [%d]\n", do_not_disturb, visivility_class, dnd_schedule_enabled, lock_screen_level); @@ -1151,7 +1236,7 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_ if (dnd_schedule_enabled) { ret = _add_alarm(dnd_schedule_day, dnd_start_hour, dnd_start_min, - dnd_end_hour, dnd_end_min); + dnd_end_hour, dnd_end_min, param_uid); if (ret != NOTIFICATION_ERROR_NONE) ErrPrint("failed to add alarm for dnd_schedule"); } @@ -1206,7 +1291,7 @@ static int _package_uninstall_cb(uid_t uid, const char *pkgname, enum pkgmgr_sta return 0; } -static int _check_dnd_schedule(void) +static int _check_dnd_schedule(uid_t uid) { int ret; notification_system_setting_h setting = NULL; @@ -1217,8 +1302,7 @@ static int _check_dnd_schedule(void) int dnd_end_hour = 0; int dnd_end_min = 0; - ret = noti_system_setting_load_system_setting(&setting, - tzplatform_getuid(TZ_SYS_DEFAULT_USER)); + ret = noti_system_setting_load_system_setting(&setting, uid); if (ret != NOTIFICATION_ERROR_NONE) { ErrPrint("noti_system_setting_load_system_setting fail %d", ret); return ret; @@ -1253,7 +1337,7 @@ static int _check_dnd_schedule(void) goto out; } - _add_alarm(dnd_schedule_day, dnd_start_hour, dnd_start_min, dnd_end_hour, dnd_end_min); + _add_alarm(dnd_schedule_day, dnd_start_hour, dnd_start_min, dnd_end_hour, dnd_end_min, uid); } out: @@ -1268,7 +1352,9 @@ out: */ HAPI int notification_service_init(void) { - int ret; + int ret, i; + int count = 0; + uid_t *uids = NULL; _monitoring_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_monitoring_list); ret = notification_db_init(); @@ -1286,7 +1372,13 @@ HAPI int notification_service_init(void) _notification_data_init(); notification_setting_refresh_setting_table(tzplatform_getuid(TZ_SYS_DEFAULT_USER)); - _check_dnd_schedule(); + ret = notification_system_setting_get_dnd_schedule_enabled_uid(&uids, &count); + if (ret == NOTIFICATION_ERROR_NONE && count > 0) { + for (i = 0; i < count; i++) + _check_dnd_schedule(uids[i]); + } + if (uids) + free(uids); pkgmgr_init(); pkgmgr_add_event_callback(PKGMGR_EVENT_INSTALL, _package_install_cb, NULL); -- 2.7.4 From 2ed2c1ddf53cfccbd971c12d809977c1ffba872b Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Tue, 9 Aug 2016 14:04:42 +0900 Subject: [PATCH 13/16] Fix wrong type casting Signed-off-by: seungha.son Change-Id: I612dc5b66270d7eab3a2f7c3d8486c63f57810a0 --- src/notification_service.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/notification_service.c b/src/notification_service.c index 9e03e5e..1259cc3 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -1114,8 +1114,7 @@ static gint _dnd_data_compare(gconstpointer a, gconstpointer b) if (!a) return -1; data = a; - - if (data->uid == (uid_t)b) + if (data->uid == GPOINTER_TO_UINT(b)) return 0; return 1; @@ -1160,7 +1159,7 @@ static int _add_alarm(int dnd_schedule_day, int dnd_start_hour, int dnd_start_mi if (_dnd_alarm_id_list == NULL) { _dnd_alarm_id_list = g_list_append(_dnd_alarm_id_list, dnd_id_data); } else { - found_list = g_list_find_custom(_dnd_alarm_id_list, (gconstpointer)uid, + found_list = g_list_find_custom(_dnd_alarm_id_list, GUINT_TO_POINTER(uid), _dnd_data_compare); if (found_list) { dnd_id_data = g_list_nth_data(found_list, 0); -- 2.7.4 From 9bbfac99a002166003ceb80cdca3b010e1254d21 Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Thu, 11 Aug 2016 10:44:00 +0900 Subject: [PATCH 14/16] Delete '&' characters in g_variant_new() - For g_variant_new() this has absolutely no effect. Signed-off-by: seungha.son Change-Id: Icf9a14a7c8f163e871cf14eb31dd010bd4ce8aea --- src/badge_service.c | 2 +- src/shortcut_service.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/badge_service.c b/src/badge_service.c index ffd48b3..7bf96a7 100755 --- a/src/badge_service.c +++ b/src/badge_service.c @@ -269,7 +269,7 @@ int badge_get_badge_list(GVariant *parameters, GVariant **reply_body, uid_t uid) iter_list = g_list_first(badge_list); for (; iter_list != NULL; iter_list = iter_list->next) { badge = iter_list->data; - body = g_variant_new("(&si)", badge->pkg, badge->badge_count); + body = g_variant_new("(si)", badge->pkg, badge->badge_count); g_variant_builder_add(builder, "(v)", body); } g_list_free_full(badge_list, (GDestroyNotify)_release_badge_info); diff --git a/src/shortcut_service.c b/src/shortcut_service.c index 1142251..59394e9 100755 --- a/src/shortcut_service.c +++ b/src/shortcut_service.c @@ -178,7 +178,7 @@ int shortcut_get_shortcut_service_list(GVariant *parameters, GVariant **reply_bo iter_list = g_list_first(shortcut_list); for (; iter_list != NULL; iter_list = iter_list->next) { shortcut = iter_list->data; - body = g_variant_new("(&s&s&s&s&s)", + body = g_variant_new("(sssss)", shortcut->package_name, shortcut->icon, shortcut->name, shortcut->extra_key, shortcut->extra_data); g_variant_builder_add(builder, "(v)", body); } -- 2.7.4 From d8f131cab3e19a63085f8f5df4658b430ca03ff6 Mon Sep 17 00:00:00 2001 From: Myungki Lee Date: Wed, 3 Aug 2016 16:12:11 +0900 Subject: [PATCH 15/16] Add methods to handle noti_template Change-Id: Ie2237343537633dcb6b023f7c9e2f9d5319772dc Signed-off-by: Myungki Lee --- data-provider-master.conf.in | 2 + include/notification_service.h | 3 + include/service_common.h | 1 + src/notification_service.c | 138 ++++++++++++++++++++++++++++++++++++++++- src/service_common.c | 39 ++++++++++++ 5 files changed, 182 insertions(+), 1 deletion(-) diff --git a/data-provider-master.conf.in b/data-provider-master.conf.in index 8651511..742f584 100644 --- a/data-provider-master.conf.in +++ b/data-provider-master.conf.in @@ -14,6 +14,8 @@ + + diff --git a/include/notification_service.h b/include/notification_service.h index 1ba4d00..bb15042 100755 --- a/include/notification_service.h +++ b/include/notification_service.h @@ -36,6 +36,9 @@ int notification_load_detail_list(GVariant *parameters, GVariant **reply_body, u int notification_get_setting_array(GVariant *parameters, GVariant **reply_body, uid_t uid); int notification_get_setting_by_package_name(GVariant *parameters, GVariant **reply_body, uid_t uid); int notification_load_system_setting(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_add_noti_template(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_get_noti_template(GVariant *parameters, GVariant **reply_body, pid_t pid, uid_t uid); +int notification_get_noti_package_template(GVariant *parameters, GVariant **reply_body, uid_t uid); int notification_register_dbus_interface(); /* End of a file */ diff --git a/include/service_common.h b/include/service_common.h index 5cafa69..0b3af0d 100755 --- a/include/service_common.h +++ b/include/service_common.h @@ -58,6 +58,7 @@ int service_register(GVariant *parameters, GVariant **reply_body, const gchar *s GDBusConnection *service_common_get_connection(); int service_common_register_dbus_interface(char *introspection_xml, GDBusInterfaceVTable interface_vtable); uid_t get_sender_uid(const char *sender_name); +pid_t get_sender_pid(const char *sender_name); void free_monitoring_list(gpointer data); /* End of a file */ diff --git a/src/notification_service.c b/src/notification_service.c index 1259cc3..ca60f1a 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "pkgmgr.h" #include "service_common.h" @@ -37,6 +38,8 @@ #include #define PROVIDER_NOTI_INTERFACE_NAME "org.tizen.data_provider_noti_service" +#define NOTI_TEMPLATE_LIMIT 10 +#define BUF_LEN 256 typedef struct _dnd_alarm_id dnd_alarm_id_s; @@ -90,7 +93,8 @@ static void _noti_dbus_method_call_handler(GDBusConnection *conn, GVariant *reply_body = NULL; int ret = NOTIFICATION_ERROR_INVALID_OPERATION; - int uid = get_sender_uid(sender); + uid_t uid = get_sender_uid(sender); + pid_t pid = get_sender_pid(sender); if (g_strcmp0(method_name, "noti_service_register") == 0) ret = service_register(parameters, &reply_body, sender, @@ -125,6 +129,12 @@ static void _noti_dbus_method_call_handler(GDBusConnection *conn, ret = notification_get_setting_by_package_name(parameters, &reply_body, uid); else if (g_strcmp0(method_name, "load_system_setting") == 0) ret = notification_load_system_setting(parameters, &reply_body, uid); + else if (g_strcmp0(method_name, "save_as_template") == 0) + ret = notification_add_noti_template(parameters, &reply_body, uid); + else if (g_strcmp0(method_name, "create_from_template") == 0) + ret = notification_get_noti_template(parameters, &reply_body, pid, uid); + else if (g_strcmp0(method_name, "create_from_package_template") == 0) + ret = notification_get_noti_package_template(parameters, &reply_body, uid); if (ret == NOTIFICATION_ERROR_NONE) { DbgPrint("notification service success : %d", ret); @@ -261,6 +271,22 @@ int notification_register_dbus_interface() " " " " + " " + " " + " " + " " + + " " + " " + " " + " " + + " " + " " + " " + " " + " " + " " " " " " @@ -889,6 +915,7 @@ int notification_del_noti_multiple(GVariant *parameters, GVariant **reply_body, ErrPrint("cannot make reply_body"); return NOTIFICATION_ERROR_OUT_OF_MEMORY; } + DbgPrint("_del_noti_multiple done !!"); return ret; } @@ -1245,6 +1272,114 @@ int notification_update_noti_sys_setting(GVariant *parameters, GVariant **reply_ return ret; } +int notification_add_noti_template(GVariant *parameters, GVariant **reply_body, uid_t uid) +{ + notification_h noti; + int ret; + GVariant *body = NULL; + GVariant *coupled_body = NULL; + char *template_name = NULL; + int count = 0; + + noti = notification_create(NOTIFICATION_TYPE_NOTI); + if (noti != NULL) { + g_variant_get(parameters, "(v&s)", &coupled_body, &template_name); + g_variant_get(coupled_body, "(v)", &body); + + ret = notification_ipc_make_noti_from_gvariant(noti, body); + g_variant_unref(coupled_body); + g_variant_unref(body); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("failed to make a notification:%d\n", ret); + return ret; + } + + ret = notification_noti_check_count_for_template(noti, &count); + if (count > NOTI_TEMPLATE_LIMIT) + return NOTIFICATION_ERROR_MAX_EXCEEDED; + + ret = notification_noti_add_template(noti, template_name); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("failed to add a notification:%d\n", ret); + return ret; + } + } else { + ret = NOTIFICATION_ERROR_OUT_OF_MEMORY; + } + + return ret; +} + +int notification_get_noti_template(GVariant *parameters, GVariant **reply_body, pid_t pid, uid_t uid) +{ + int ret; + char appid[BUF_LEN] = {0, }; + char *template_name = NULL; + notification_h noti; + + noti = notification_create(NOTIFICATION_TYPE_NOTI); + if (noti != NULL) { + g_variant_get(parameters, "(&s)", &template_name); + + ret = aul_app_get_appid_bypid_for_uid(pid, appid, sizeof(appid), uid); + if (ret != AUL_R_OK) { + ErrPrint("failed to get appid:%d", ret); + return ret; + } + + ret = notification_noti_get_package_template(noti, appid, template_name); + if (ret != NOTIFICATION_ERROR_NONE) { + DbgPrint("failed to get template:%d", ret); + return ret; + } + + *reply_body = notification_ipc_make_gvariant_from_noti(noti, false); + notification_free(noti); + + if (*reply_body == NULL) { + ErrPrint("cannot make reply_body"); + return NOTIFICATION_ERROR_OUT_OF_MEMORY; + } + } else { + ret = NOTIFICATION_ERROR_OUT_OF_MEMORY; + } + + DbgPrint("_get_noti_template done !!"); + return ret; +} + +int notification_get_noti_package_template(GVariant *parameters, GVariant **reply_body, uid_t uid) +{ + int ret; + char *pkgname = NULL; + char *template_name = NULL; + notification_h noti; + + noti = notification_create(NOTIFICATION_TYPE_NOTI); + if (noti != NULL) { + g_variant_get(parameters, "(&s&s)", &pkgname, &template_name); + + ret = notification_noti_get_package_template(noti, pkgname, template_name); + if (ret != NOTIFICATION_ERROR_NONE) { + DbgPrint("failed to get template:%d", ret); + return ret; + } + + *reply_body = notification_ipc_make_gvariant_from_noti(noti, false); + notification_free(noti); + + if (*reply_body == NULL) { + ErrPrint("cannot make reply_body"); + return NOTIFICATION_ERROR_OUT_OF_MEMORY; + } + } else { + ret = NOTIFICATION_ERROR_OUT_OF_MEMORY; + } + + DbgPrint("_get_noti_package_template done !!"); + return ret; +} + static void _notification_data_init(void) { int property = 0; @@ -1287,6 +1422,7 @@ static int _package_install_cb(uid_t uid, const char *pkgname, enum pkgmgr_statu static int _package_uninstall_cb(uid_t uid, const char *pkgname, enum pkgmgr_status status, double value, void *data) { notification_setting_delete_package_for_uid(pkgname, uid); + notification_noti_delete_template(pkgname); return 0; } diff --git a/src/service_common.c b/src/service_common.c index 8bb23ab..e1e044c 100755 --- a/src/service_common.c +++ b/src/service_common.c @@ -111,6 +111,45 @@ out: return uid; } +pid_t get_sender_pid(const char *sender_name) +{ + GDBusMessage *msg = NULL; + GDBusMessage *reply = NULL; + GError *err = NULL; + GVariant *body; + pid_t pid = 0; + + msg = g_dbus_message_new_method_call("org.freedesktop.DBus", "/org/freedesktop/DBus", + "org.freedesktop.DBus", "GetConnectionUnixProcessID"); + if (!msg) { + LOGE("Can't allocate new method call"); + goto out; + } + + g_dbus_message_set_body(msg, g_variant_new("(s)", sender_name)); + reply = g_dbus_connection_send_message_with_reply_sync(_gdbus_conn, msg, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, NULL, NULL, &err); + + if (!reply) { + if (err != NULL) { + LOGE("Failed to get uid [%s]", err->message); + g_error_free(err); + } + goto out; + } + + body = g_dbus_message_get_body(reply); + g_variant_get(body, "(u)", &pid); + +out: + if (msg) + g_object_unref(msg); + if (reply) + g_object_unref(reply); + + return pid; +} + int send_notify(GVariant *body, char *cmd, GList *monitoring_app_list, char *interface_name) { GError *err = NULL; -- 2.7.4 From fe89c6b23b899b33b64636759d248d40d91b5b51 Mon Sep 17 00:00:00 2001 From: "seungha.son" Date: Tue, 16 Aug 2016 17:13:21 +0900 Subject: [PATCH 16/16] Add methods to get notification block state - https://review.tizen.org/gerrit/#/c/84006/ Signed-off-by: seungha.son Change-Id: I1b47441cc3d701ca7ff40274f47a78071605ad32 --- data-provider-master.conf.in | 1 + include/notification_service.h | 1 + src/notification_service.c | 45 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/data-provider-master.conf.in b/data-provider-master.conf.in index 742f584..38cd0e9 100644 --- a/data-provider-master.conf.in +++ b/data-provider-master.conf.in @@ -16,6 +16,7 @@ + diff --git a/include/notification_service.h b/include/notification_service.h index bb15042..9dca6c5 100755 --- a/include/notification_service.h +++ b/include/notification_service.h @@ -39,6 +39,7 @@ int notification_load_system_setting(GVariant *parameters, GVariant **reply_body int notification_add_noti_template(GVariant *parameters, GVariant **reply_body, uid_t uid); int notification_get_noti_template(GVariant *parameters, GVariant **reply_body, pid_t pid, uid_t uid); int notification_get_noti_package_template(GVariant *parameters, GVariant **reply_body, uid_t uid); +int notification_get_block_state(GVariant *parameters, GVariant **reply_body, uid_t uid); int notification_register_dbus_interface(); /* End of a file */ diff --git a/src/notification_service.c b/src/notification_service.c index ca60f1a..e2d41d3 100755 --- a/src/notification_service.c +++ b/src/notification_service.c @@ -135,6 +135,8 @@ static void _noti_dbus_method_call_handler(GDBusConnection *conn, ret = notification_get_noti_template(parameters, &reply_body, pid, uid); else if (g_strcmp0(method_name, "create_from_package_template") == 0) ret = notification_get_noti_package_template(parameters, &reply_body, uid); + else if (g_strcmp0(method_name, "get_noti_block_state") == 0) + ret = notification_get_block_state(parameters, &reply_body, uid); if (ret == NOTIFICATION_ERROR_NONE) { DbgPrint("notification service success : %d", ret); @@ -287,6 +289,12 @@ int notification_register_dbus_interface() " " " " + " " + " " + " " + " " + " " + " " " " " " @@ -1377,6 +1385,43 @@ int notification_get_noti_package_template(GVariant *parameters, GVariant **repl } DbgPrint("_get_noti_package_template done !!"); + + return ret; +} + +int notification_get_block_state(GVariant *parameters, GVariant **reply_body, uid_t uid) +{ + int ret; + int dnd; + int dnd_except; + int allow_to_notify; + char *pkgname; + uid_t param_uid; + GVariant *body = NULL; + + g_variant_get(parameters, "(&si)", &pkgname, ¶m_uid); + + ret = _validate_and_set_param_uid_with_uid(uid, ¶m_uid); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("_validate_uid fail ret : %d", ret); + return NOTIFICATION_ERROR_IO_ERROR; + } + + ret = notification_get_dnd_and_allow_to_notify(pkgname, &dnd, &dnd_except, &allow_to_notify, param_uid); + if (ret != NOTIFICATION_ERROR_NONE) { + ErrPrint("failed to get_dnd_and_allow_to_notify : %d\n", ret); + return ret; + } + + body = g_variant_new("(iii)", dnd, dnd_except, allow_to_notify); + *reply_body = g_variant_new("(v)", body); + + if (*reply_body == NULL) { + ErrPrint("cannot make reply_body"); + return NOTIFICATION_ERROR_OUT_OF_MEMORY; + } + + DbgPrint("get notification block state done"); return ret; } -- 2.7.4