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 \
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) \
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
--- /dev/null
+<!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>
["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])
# 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])
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
+
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 \
* 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;
}
+
--- /dev/null
+[D-BUS Service]
+Name=org.tizen.messageport
+Exec=@bindir@/messageportd
* 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
{
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) {
g_error_free (error);
}
}
+
+ g_free (bus_address);
}
MsgPortManager * msgport_manager_new ()
%define build_examples 1
-
+%define use_session_bus 1
Name: message-port
Summary: Message port daemon
Version: 0.0.1
%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}
%files -n %{name}
%defattr(-,root,root,-)
%{_bindir}/messageportd
+%if %{use_session_bus} == 1
+%{_datadir}/dbus-1/services/org.tizen.messageport.service
+%endif
# libmessage-port