Session bus support enabled for message port daemon
authorAmarnath Valluri <amarnath.valluri@linux.intel.com>
Wed, 30 Oct 2013 11:39:43 +0000 (13:39 +0200)
committerAmarnath Valluri <amarnath.valluri@linux.intel.com>
Thu, 7 Nov 2013 15:03:55 +0000 (17:03 +0200)
common/Makefile.am
common/dbus-error.h
common/org.tizen.messageport.Server.xml [new file with mode: 0644]
configure.ac
daemon/Makefile.am
daemon/main.c
daemon/org.tizen.messageport.service.in [new file with mode: 0644]
lib/msgport-manager.c
packaging/message-port.spec

index 494500e..46bc97c 100644 (file)
@@ -1,6 +1,15 @@
 noinst_LTLIBRARIES = libmessageport-dbus-glue.la  libmessageport-common.la
 NULL = 
 
+if USE_SESSION_BUS
+dbus-server-glue.c dbus-server-glue.h : org.tizen.messageport.Server.xml
+       $(AM_V_GEM)gdbus-codegen                                \
+        --interface-prefix org.tizen.messageport \
+        --c-namespace      MsgPort_Dbus_Glue     \
+        --generate-c-code  dbus-server-glue     \
+        $<
+endif
+
 dbus-manager-glue.c dbus-maanager-glue.h : org.tizen.messageport.Manager.xml
        $(AM_V_GEM)gdbus-codegen                                \
         --interface-prefix org.tizen.messageport \
@@ -24,6 +33,13 @@ libmessageport_dbus_glue_la_SOURCES = \
     dubs-service-glue.h \
     dbus-service-glue.c \
     $(NULL)
+
+if USE_SESSION_BUS
+libmessageport_dbus_glue_la_SOURCES += \
+    dbus-server-glue.h \
+    dbus-server-glue.c \
+    $(NULL)
+endif
     
 libmessageport_dbus_glue_la_CPPFLAGS = \
     -I$(top_builddir) \
index 4e1abea..84195e3 100644 (file)
@@ -59,13 +59,13 @@ msgport_error_quark ();
     msgport_error_new (MSGPORT_ERROR_NOT_FOUND, "port not found with name '%s' on application '%s'", port_name, app_id)
 
 #define msgport_error_port_id_not_found_new(service_id) \
-    msgport_error_new (MSGPORT_ERROR_NOT_FOUND, "no port found with id '%d'", service_id);
+    msgport_error_new (MSGPORT_ERROR_NOT_FOUND, "no port found with id '%d'", service_id)
 
 #define msgport_error_certificate_mismatch_new() \
-    msgport_error_new (MSGPORT_ERROR_CERTIFICATE_MISMATCH, "cerficates not matched");
+    msgport_error_new (MSGPORT_ERROR_CERTIFICATE_MISMATCH, "cerficates not matched")
 
 #define msgport_error_unknown_new() \
-    msgport_error_new (MSGPORT_ERROR_UNKNOWN, "unknown");
+    msgport_error_new (MSGPORT_ERROR_UNKNOWN, "unknown")
 
 G_END_DECLS
 
diff --git a/common/org.tizen.messageport.Server.xml b/common/org.tizen.messageport.Server.xml
new file mode 100644 (file)
index 0000000..7193e38
--- /dev/null
@@ -0,0 +1,8 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+  <interface name="org.tizen.messageport.Server">
+    <method name="getBusAddress">
+      <arg name="address" type="s" direction="out"/>
+    </method>
+  </interface>
+</node>
index dc5f263..8398194 100644 (file)
@@ -47,9 +47,18 @@ AC_DEFINE(MESSAGEPORT_BUS_ADDRESS,
          ["unix:path=%s/.message-port", g_get_user_runtime_dir()],
          [messageport daemon server socket address])
 
+# Use Session bus for daemon activation
+AC_ARG_ENABLE(sessionbus,
+             [  --enable-sessionbus     Use Session bus for activation],
+             [enable_sessionbus=$enableval], [enable_sessionbus=no])
+AM_CONDITIONAL(USE_SESSION_BUS, [test "x$enable_sessionbus" = "xyes"])
+if test "x$enable_sessionbus" = "xyes" ; then
+    AC_DEFINE(USE_SESSION_BUS, [1], [Use session bus])
+fi
+
 # Enable Debug
 AC_ARG_ENABLE(debug, 
-              [--enable-debug Eenable debug features],
+              [  --enable-debug         Eenable debug features],
               [enable_debug=$enableval], [enable_debug=no])
 if test "x$enable_debug" = "xyes" ; then
     AC_DEFINE(ENABLE_DEBUG, [1], [Enable debug features])
@@ -57,12 +66,10 @@ fi
 
 # build example
 AC_ARG_ENABLE(examples,
-              [--enable-examples example applications],
+              [  --enable-examples      Build example applications],
               [enable_examples=$enable_examples], [enable_examples=no])
 AM_CONDITIONAL(BUILD_EXAMPLES, [test "x$enable_examples" = "xyes"])
-if test "x$enable_examples" = "xyes"; then
-    AC_PROG_CXX
-fi
+AC_PROG_CXX
 
 # Checks for header files.
 AC_CHECK_HEADERS([string.h])
@@ -79,8 +86,15 @@ lib/Makefile
 lib/message-port.pc
 ])
 
+if test "x$enable_sessionbus" = "xyes"; then
+    AC_OUTPUT([
+    daemon/org.tizen.messageport.service
+    ])
+fi
+
 if test "x$enable_examples" = "xyes"; then
     AC_OUTPUT([
     examples/Makefile
     ])
 fi
+
index d93846b..ac345ee 100644 (file)
@@ -1,6 +1,11 @@
 bin_PROGRAMS = messageportd
 NULL = 
 
+if USE_SESSION_BUS
+servicedir = $(datadir)/dbus-1/services
+service_DATA = org.tizen.messageport.service
+endif
+
 messageportd_SOURCES = \
     dbus-service.h \
     dbus-service.c \
index 80b3ff5..7ce82ce 100644 (file)
  * 02110-1301 USA
  */
 
+#include "config.h"
+
 #include <glib.h>
 #include "common/log.h"
+#ifdef USE_SESSION_BUS
+#include "common/dbus-error.h"
+#include "common/dbus-server-glue.h"
+#include "utils.h"
+#endif
 #include "dbus-server.h"
 
+typedef struct {
+    GMainLoop             *m_loop;
+    MsgPortDbusServer     *server;
+#ifdef USE_SESSION_BUS
+    MsgPortDbusGlueServer *dbus_skeleten;
+#endif
+} DaemonData;
+
+static DaemonData *
+daemon_data_new ()
+{
+    return g_slice_new0 (DaemonData);
+}
+
+static void
+daemon_data_free (DaemonData *data)
+{
+    if (!data) return;
+    if (data->server) g_clear_object (&data->server);
+#ifdef USE_SESSION_BUS
+    if (data->dbus_skeleten) {
+        g_dbus_interface_skeleton_unexport (
+              G_DBUS_INTERFACE_SKELETON (data->dbus_skeleten));
+        g_clear_object (&data->dbus_skeleten);
+    }
+#endif
+    if (data->m_loop) g_main_loop_unref (data->m_loop);
+
+    g_slice_free (DaemonData, data);
+}
+
+#ifdef USE_SESSION_BUS
+static gboolean
+_handle_get_bus_address (DaemonData *data,
+                         GDBusMethodInvocation *invocation,
+                         gpointer               userdata)
+{
+
+    msgport_return_val_if_fail (data, FALSE);
+    msgport_return_val_if_fail (data->server && MSGPORT_IS_DBUS_SERVER (data->server), FALSE);
+
+    const gchar *server_address = msgport_dbus_server_get_address (data->server);
+
+    if (server_address) {
+        msgport_dbus_glue_server_complete_get_bus_address (data->dbus_skeleten,
+                invocation, server_address);
+    }
+    else {
+        g_dbus_method_invocation_take_error (invocation, msgport_error_unknown_new());
+    }
+
+    return TRUE;
+}
+
+static void
+_on_bus_acquired (GDBusConnection *connection,
+                 const gchar     *name,
+                 gpointer         userdata)
+{
+    DaemonData *data = (DaemonData *) userdata;
+
+    msgport_return_if_fail (data);
+    GError *error = NULL;
+
+    data->server = msgport_dbus_server_new ();
+    data->dbus_skeleten = msgport_dbus_glue_server_skeleton_new ();
+
+    g_signal_connect_swapped (data->dbus_skeleten, "handle-get-bus-address",
+               G_CALLBACK (_handle_get_bus_address), data);
+
+    if (!g_dbus_interface_skeleton_export (
+            G_DBUS_INTERFACE_SKELETON (data->dbus_skeleten), connection, "/", &error)) {
+        WARN ("Failed to export interface: %s", error->message);
+        g_error_free (error);
+        g_main_loop_quit (data->m_loop);
+    }
+}
+
+static void
+_on_name_acquired (GDBusConnection *connection,
+                  const gchar     *name,
+                  gpointer         userdata)
+{
+    DBG ("D-Bus name acquired: %s", name);
+}
+
+static void
+_on_name_lost (GDBusConnection *connection,
+              const gchar     *name,
+              gpointer         userdata)
+{
+    DaemonData *data = (DaemonData *) userdata;
+    DBG ("D-Bus name lost: %s", name);
+    msgport_return_if_fail (data && data->m_loop);
+
+    g_main_loop_quit (data->m_loop);
+}
+#endif /* USE_SESSION_BUS */
+
 static gboolean
 _on_unix_signal (gpointer data)
 {
-    g_main_loop_quit ((GMainLoop*)data);
+    g_main_loop_quit (((DaemonData *)data)->m_loop);
 
     return FALSE;
 }
 
 int main (int argc, char *argv[])
 {
-    GMainLoop *main_loop = NULL;
-    MsgPortDbusServer *server = NULL;
+    DaemonData *data = daemon_data_new ();
 
 #if !GLIB_CHECK_VERSION (2, 36, 0)
     g_type_init (&argc, &argv);
 #endif
 
-    main_loop = g_main_loop_new (NULL, FALSE);
-
-    server = msgport_dbus_server_new();
+#if USE_SESSION_BUS
+    guint bus_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
+            "org.tizen.messageport",
+            G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | G_BUS_NAME_OWNER_FLAGS_REPLACE,
+            _on_bus_acquired,
+            _on_name_acquired,
+            _on_name_lost,
+            data,
+            NULL);
+#else
+    data->server = msgport_dbus_server_new();
+    if (!data->server) {
+        ERR ("Failed to start server");
+        daemon_data_free (data);
+        return (-1);
+    }
+#endif /* USE_SESSION_BUS */
 
-    DBG ("server started at : %s", msgport_dbus_server_get_address (server));
+    data->m_loop = g_main_loop_new (NULL, FALSE);
+    g_unix_signal_add (SIGTERM, _on_unix_signal, data);
+    g_unix_signal_add (SIGINT, _on_unix_signal, data);
 
-    g_unix_signal_add (SIGTERM, _on_unix_signal, main_loop);
-    g_unix_signal_add (SIGINT, _on_unix_signal, main_loop);
+    g_main_loop_run (data->m_loop);
 
-    g_main_loop_run (main_loop);
+    daemon_data_free (data);
+#ifdef USE_SESSION_BUS
+    g_bus_unown_name (bus_owner_id);
+#endif
 
-    g_object_unref (server);
-    g_main_loop_unref (main_loop);
+    DBG("Clean shutdown");
 
-    DBG("Clean close");
+    return 0;
 }
+
diff --git a/daemon/org.tizen.messageport.service.in b/daemon/org.tizen.messageport.service.in
new file mode 100644 (file)
index 0000000..bb7f576
--- /dev/null
@@ -0,0 +1,3 @@
+[D-BUS Service]
+Name=org.tizen.messageport
+Exec=@bindir@/messageportd
index ade375a..ff2b905 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA
  */
+#include "config.h" /* MESSAGEPORT_BUS_ADDRESS */
 
 #include "msgport-manager.h"
 #include "msgport-service.h"
 #include "msgport-utils.h" /* msgport_daemon_error_to_error */
 #include "message-port.h" /* messageport_error_e */
 #include "common/dbus-manager-glue.h"
+#ifdef  USE_SESSION_BUS
+#include "common/dbus-server-glue.h"
+#endif
 #include "common/log.h"
-#include "config.h" /* MESSAGEPORT_BUS_ADDRESS */
 #include <gio/gio.h>
 
 struct _MsgPortManager
@@ -99,12 +102,45 @@ msgport_manager_init (MsgPortManager *manager)
 {
     GError          *error = NULL;
     GDBusConnection *connection = NULL;
-    gchar           *bus_address = g_strdup_printf (MESSAGEPORT_BUS_ADDRESS);
+    gchar           *bus_address = NULL;
 
     manager->services = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
     manager->local_services = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, NULL);
     manager->remote_services = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, NULL);
 
+#ifdef USE_SESSION_BUS
+    MsgPortDbusGlueServer *server = NULL;
+    server = msgport_dbus_glue_server_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
+            G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
+            "org.tizen.messageport", "/", NULL, &error);
+
+    if (error) {
+        WARN ("fail to get server proxy : %s",  error->message);
+        g_error_free (error);
+    }
+    else {
+        msgport_dbus_glue_server_call_get_bus_address_sync (server, &bus_address, NULL, &error);
+        if (error) {
+            WARN ("Fail to get server bus address : %s", error->message);
+            g_error_free (error);
+        }
+    }
+
+    g_object_unref (server);
+#endif
+    if (!bus_address) {
+        if (g_getenv("MESSAGEPORT_BUS_ADDRESS")) {
+            bus_address = g_strdup (g_getenv ("MESSAGEPORT_BUS_ADDRESS"));
+        }
+        else {
+#       ifdef MESSAGEPORT_BUS_ADDRESS
+            bus_address = g_strdup_printf (MESSAGEPORT_BUS_ADDRESS);
+#       endif
+        }
+    }
+    if (!bus_address)
+        bus_address = g_strdup_printf ("unix:path=%s/.message-port", g_get_user_runtime_dir());
+
     connection = g_dbus_connection_new_for_address_sync (bus_address,
             G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT, NULL, NULL, &error);
     if (error) {
@@ -119,6 +155,8 @@ msgport_manager_init (MsgPortManager *manager)
             g_error_free (error);
         }
     }
+
+    g_free (bus_address);
 }
 
 MsgPortManager * msgport_manager_new ()
index 1a96bea..3bde5d7 100644 (file)
@@ -1,6 +1,6 @@
 
 %define build_examples 1
-
+%define use_session_bus 1
 Name: message-port
 Summary: Message port daemon
 Version: 0.0.1
@@ -62,11 +62,14 @@ autoreconf -f -i
 
 
 %build
+%configure --enable-debug \
 %if %{build_examples} == 1
-%configure --enable-debug --enable-examples
-%else
-%configure --enable-debug
+     --enable-examples \
+%endif
+%if %{use_session_bus} == 1
+    --enable-sessionbus \
 %endif
+
 make %{?_smp_mflags}
 
 
@@ -85,6 +88,9 @@ make %{?_smp_mflags}
 %files -n %{name}
 %defattr(-,root,root,-)
 %{_bindir}/messageportd
+%if %{use_session_bus} == 1
+%{_datadir}/dbus-1/services/org.tizen.messageport.service
+%endif
 
 
 # libmessage-port