Use dbus signal for sending expired noti to client 84/45284/1 accepted/tizen/mobile/20150812.110325 accepted/tizen/tv/20150812.110339 accepted/tizen/wearable/20150812.110352 submit/tizen/20150812.024336
authorSangyoon Jang <s89.jang@samsung.com>
Tue, 4 Aug 2015 10:23:43 +0000 (19:23 +0900)
committerSangyoon Jang <s89.jang@samsung.com>
Tue, 4 Aug 2015 10:44:56 +0000 (19:44 +0900)
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>
alarm-manager.c
alarm_mgr.xml
include/alarm-internal.h
src/alarm-lib.c

index 5842bbb..41a7f6c 100644 (file)
@@ -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);
                        }
 
                        /*
index 4facb9d..faf03a0 100644 (file)
       <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>
index 87b8d8b..eaa99d9 100644 (file)
@@ -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 {
index a697b80..c285bc8 100644 (file)
 #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);