From: Sangyoon Jang Date: Tue, 4 Aug 2015 10:23:43 +0000 (+0900) Subject: Use dbus signal for sending expired noti to client X-Git-Tag: accepted/tizen/mobile/20150812.110325^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=51b432e318eba952ad7f0fd19ea2bb078eeee189;p=platform%2Fcore%2Fappfw%2Falarm-manager.git Use dbus signal for sending expired noti to client In current implementation, each client register own dbus object to receive alarm expired signal from alarm-server. When an alarm expired, alarm-server finds service name(app or daemon) and calls directly using dbus method call. But using dbus signal is more reasonable, alarm-server can just emit dbus signal to notify alarm expired. Furthermore, in Tizen 3.0, if a service who doesn't have busconfig cannot own name and send method call on system bus. Change-Id: Ic6a3ea44046cc963ca3fc1b94c2433ff64e3e33a Signed-off-by: Sangyoon Jang --- diff --git a/alarm-manager.c b/alarm-manager.c index 5842bbb..41a7f6c 100644 --- a/alarm-manager.c +++ b/alarm-manager.c @@ -1086,6 +1086,8 @@ static bool __can_skip_expired_cb(alarm_id_t alarm_id) static void __alarm_send_noti_to_application(const char *app_service_name, alarm_id_t alarm_id) { char service_name[MAX_SERVICE_NAME_LEN] = {0,}; + gboolean ret; + GError *err = NULL; if (app_service_name == NULL || strlen(app_service_name) == 0) { ALARM_MGR_EXCEPTION_PRINT("This alarm destination is invalid."); @@ -1098,18 +1100,17 @@ static void __alarm_send_noti_to_application(const char *app_service_name, alarm memcpy(service_name, app_service_name, strlen(app_service_name)); SECURE_LOGI("[alarm server][send expired_alarm(alarm_id=%d) to app_service_name(%s)]", alarm_id, service_name); - g_dbus_connection_call(alarm_context.connection, - service_name, - "/org/tizen/alarm/client", - "org.tizen.alarm.client", - "alarm_expired", - g_variant_new("(is)", alarm_id, service_name), - NULL, - G_DBUS_CALL_FLAGS_NONE, - -1, - NULL, - NULL, - NULL); + ret = g_dbus_connection_emit_signal(alarm_context.connection, + NULL, + "/org/tizen/alarm/manager", + "org.tizen.alarm.manager", + "alarm_expired", + g_variant_new("(is)", alarm_id, service_name), + &err); + if (ret != TRUE) { + ALARM_MGR_EXCEPTION_PRINT("failed to send expired signal for %d, %s: %s", alarm_id, service_name, err->message); + g_error_free(err); + } } static uid_t __get_caller_uid(const char *name) @@ -1316,11 +1317,11 @@ static void __alarm_expired() if (strncmp(g_quark_to_string(__alarm_info->quark_dst_service_name), "null", 4) == 0) { SECURE_LOGD("[alarm-server]:destination is null, so we send expired alarm to %s(%u).", g_quark_to_string(__alarm_info->quark_app_service_name), __alarm_info->quark_app_service_name); - destination_app_service_name = g_quark_to_string(__alarm_info->quark_app_service_name_mod); + destination_app_service_name = g_quark_to_string(__alarm_info->quark_app_service_name); } else { SECURE_LOGD("[alarm-server]:destination :%s(%u)", g_quark_to_string(__alarm_info->quark_dst_service_name), __alarm_info->quark_dst_service_name); - destination_app_service_name = g_quark_to_string(__alarm_info->quark_dst_service_name_mod); + destination_app_service_name = g_quark_to_string(__alarm_info->quark_dst_service_name); } /* diff --git a/alarm_mgr.xml b/alarm_mgr.xml index 4facb9d..faf03a0 100644 --- a/alarm_mgr.xml +++ b/alarm_mgr.xml @@ -139,5 +139,9 @@ + + + + diff --git a/include/alarm-internal.h b/include/alarm-internal.h index 87b8d8b..eaa99d9 100644 --- a/include/alarm-internal.h +++ b/include/alarm-internal.h @@ -70,11 +70,11 @@ application server.*/ typedef struct { GDBusConnection *connection; GDBusProxy *proxy; + guint sid; /* signal subscription id */ alarm_cb_t alarm_handler; void *user_param; - GQuark quark_app_service_name; /*dbus_service_name is converted - to quark value*/ - GQuark quark_app_service_name_mod; + GQuark quark_app_service_name; /*dbus_service_name is converted to quark value*/ + GQuark quark_app_service_name_mod; } alarm_context_t; typedef union { diff --git a/src/alarm-lib.c b/src/alarm-lib.c index a697b80..c285bc8 100644 --- a/src/alarm-lib.c +++ b/src/alarm-lib.c @@ -42,16 +42,16 @@ #define EXPORT_API __attribute__ ((visibility("default"))) #endif -static alarm_context_t alarm_context = { NULL, NULL, NULL, NULL, -1 }; +static alarm_context_t alarm_context = { NULL, NULL, 0, NULL, NULL, -1 }; static bool b_initialized = false; static bool sub_initialized = false; pthread_mutex_t init_lock = PTHREAD_MUTEX_INITIALIZER; -static void __handle_expiry_method_call(GDBusConnection *conn, - const gchar *name, const gchar *path, const gchar *interface, - const gchar *method, GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data); +static void __handle_expired_signal(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *signal_name, GVariant *param, gpointer user_data); static int __alarm_validate_date(alarm_date_t *date, int *error_code); static bool __alarm_validate_time(alarm_date_t *date, int *error_code); @@ -67,27 +67,6 @@ typedef struct _alarm_cb_info_t { static alarm_cb_info_t *alarmcb_head = NULL; -guint registration_id = 0; - -static GDBusNodeInfo *introspection_data = NULL; - -static const gchar introspection_xml[] = - "" - " " - " " - " " - " " - " " - " " - ""; - -static const GDBusInterfaceVTable interface_vtable = -{ - __handle_expiry_method_call, - NULL, - NULL -}; - static void __add_resultcb(alarm_id_t alarm_id, alarm_cb_t cb_func, void *data) { alarm_cb_info_t *info; @@ -142,27 +121,29 @@ static void __remove_resultcb(alarm_cb_info_t *info) } } -static void __handle_expiry_method_call(GDBusConnection *conn, - const gchar *name, const gchar *path, const gchar *interface, - const gchar *method, GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data) +static void __handle_expired_signal(GDBusConnection *conn, + const gchar *name, const gchar *path, const gchar *interface, + const gchar *signal_name, GVariant *param, gpointer user_data) { - if (method && strcmp(method, "alarm_expired") == 0) { - gchar *package_name = NULL; - alarm_id_t alarm_id = 0; - alarm_cb_info_t *info = NULL; - g_variant_get(param, "(is)", &alarm_id, &package_name); - ALARM_MGR_EXCEPTION_PRINT("[alarm-lib] : Alarm expired for [%s] : Alarm id [%d]", package_name, alarm_id); - - if (alarm_context.alarm_handler != NULL) { - alarm_context.alarm_handler(alarm_id, alarm_context.user_param); - } + gchar *package_name = NULL; + alarm_id_t alarm_id = 0; + alarm_cb_info_t *info; - info = __find_resultcb(alarm_id); - if (info && info->cb_func) { - info->cb_func(alarm_id, info->priv_data); - } - g_free(package_name); + if (signal_name == NULL || strcmp(signal_name, "alarm_expired") != 0) + ALARM_MGR_EXCEPTION_PRINT("[alarm-lib] : unexpected signal"); + + g_variant_get(param, "(is)", &alarm_id, &package_name); + ALARM_MGR_EXCEPTION_PRINT("[alarm-lib] : Alarm expired for [%s] : Alarm id [%d]", package_name, alarm_id); + + if (alarm_context.alarm_handler != NULL) { + alarm_context.alarm_handler(alarm_id, alarm_context.user_param); } + + info = __find_resultcb(alarm_id); + if (info && info->cb_func) { + info->cb_func(alarm_id, info->priv_data); + } + g_free(package_name); } static int __alarm_validate_date(alarm_date_t *date, int *error_code) @@ -288,11 +269,7 @@ EXPORT_API int alarmmgr_init(const char *appid) { SECURE_LOGD("Enter"); char service_name[MAX_SERVICE_NAME_LEN] = { 0 }; - char service_name_mod[MAX_SERVICE_NAME_LEN]= { 0 }; - int ret = ALARMMGR_RESULT_SUCCESS; - guint owner_id = 0; - int i = 0; - int j = 0; + int ret; int len = 0; if (appid == NULL) @@ -311,81 +288,37 @@ EXPORT_API int alarmmgr_init(const char *appid) if (ret < 0) return ret; - memset(service_name_mod, 'a', MAX_SERVICE_NAME_LEN - 1); + alarm_context.sid = g_dbus_connection_signal_subscribe( + alarm_context.connection, + NULL, + "org.tizen.alarm.manager", + "alarm_expired", + "/org/tizen/alarm/manager", + NULL, + G_DBUS_SIGNAL_FLAGS_NONE, + __handle_expired_signal, + NULL, + NULL); len = strlen("ALARM."); strncpy(service_name, "ALARM.", len); strncpy(service_name + len, appid, strlen(appid)); - for(i = 0; i <= strlen(service_name); i++) { - if (service_name[i] == '.') { - service_name_mod[j] = service_name[i]; - j++; - } - else { - service_name_mod[j] = service_name[i]; - } - j++; - } - - SECURE_LOGD("[alarm-lib]: dbus own name: %s", service_name_mod); - owner_id = g_bus_own_name_on_connection(alarm_context.connection, service_name_mod, - G_BUS_NAME_OWNER_FLAGS_NONE, NULL, NULL, NULL, NULL); - if (owner_id == 0) { - ALARM_MGR_EXCEPTION_PRINT("Acquiring the own name is failed. %s", service_name_mod); - goto error; - } - - introspection_data = g_dbus_node_info_new_for_xml(introspection_xml, NULL); - if (introspection_data == NULL) { - ALARM_MGR_EXCEPTION_PRINT("g_dbus_node_info_new_for_xml() is failed."); - goto error; - } - - registration_id = g_dbus_connection_register_object(alarm_context.connection, - "/org/tizen/alarm/client", - introspection_data->interfaces[0], - &interface_vtable, NULL, NULL, NULL); - if (registration_id == 0) { - ALARM_MGR_EXCEPTION_PRINT("Registering the callback is failed."); - goto error; - } - alarm_context.quark_app_service_name = g_quark_from_string(service_name); - alarm_context.quark_app_service_name_mod= g_quark_from_string(service_name_mod); b_initialized = true; SECURE_LOGD("Leave"); return ALARMMGR_RESULT_SUCCESS; - -error: - if (introspection_data) { - g_dbus_node_info_unref(introspection_data); - } - if (registration_id != 0) { - g_dbus_connection_unregister_object(alarm_context.connection, registration_id); - } - g_object_unref(alarm_context.proxy); - alarm_context.proxy = NULL; - - g_object_unref(alarm_context.connection); - alarm_context.connection = NULL; - - sub_initialized = false; - return ERR_ALARM_INVALID_PARAM; } EXPORT_API void alarmmgr_fini() { SECURE_LOGD("Enter"); - if (introspection_data) { - g_dbus_node_info_unref(introspection_data); - } - if (alarm_context.connection != NULL && registration_id != 0) { - g_dbus_connection_unregister_object(alarm_context.connection, registration_id); - } + g_dbus_connection_signal_unsubscribe(alarm_context.connection, + alarm_context.sid); + alarm_context.sid = 0; if (alarm_context.proxy) { g_object_unref(alarm_context.proxy);