summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSangyoon Jang <s89.jang@samsung.com>2015-08-04 19:23:43 +0900
committerSangyoon Jang <s89.jang@samsung.com>2015-08-04 19:44:56 +0900
commit51b432e318eba952ad7f0fd19ea2bb078eeee189 (patch)
tree77f83ec0336980234c6d415f2f2fef5eccec0832
parent60782eee2d2745e4f623feaf0c2f5652837c058e (diff)
downloadalarm-manager-51b432e318eba952ad7f0fd19ea2bb078eeee189.tar.gz
alarm-manager-51b432e318eba952ad7f0fd19ea2bb078eeee189.tar.bz2
alarm-manager-51b432e318eba952ad7f0fd19ea2bb078eeee189.zip
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 <s89.jang@samsung.com>
-rw-r--r--alarm-manager.c29
-rw-r--r--alarm_mgr.xml4
-rw-r--r--include/alarm-internal.h6
-rw-r--r--src/alarm-lib.c145
4 files changed, 61 insertions, 123 deletions
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 @@
<arg type="s" name="tzpath_str" direction="in" />
<arg type="i" name="return_code" direction="out" />
</method>
+ <signal name="alarm_expired">
+ <arg type="i" name="alarm_id" />
+ <arg type="s" name="app_service_name" />
+ </signal>
</interface>
</node>
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[] =
- "<node name='/org/tizen/alarm/client'>"
- " <interface name='org.tizen.alarm.client'>"
- " <method name='alarm_expired'>"
- " <arg type='i' name='alarm_id' direction='in'/>"
- " <arg type='s' name='service_name' direction='in'/>"
- " </method>"
- " </interface>"
- "</node>";
-
-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);