1 /* vi: set et sw=4 ts=4 cino=t0,(0: */
2 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
4 * This file is part of message-port.
6 * Copyright (C) 2013 Intel Corporation.
8 * Contact: Amarnath Valluri <amarnath.valluri@linux.intel.com>
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * This library is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
29 #include "common/log.h"
30 #ifdef USE_SESSION_BUS
31 #include "common/dbus-error.h"
32 #include "common/dbus-server-glue.h"
35 #include "dbus-server.h"
39 MsgPortDbusServer *server;
40 #ifdef USE_SESSION_BUS
41 MsgPortDbusGlueServer *dbus_skeleten;
48 return g_slice_new0 (DaemonData);
52 daemon_data_free (DaemonData *data)
55 if (data->server) g_clear_object (&data->server);
56 #ifdef USE_SESSION_BUS
57 if (data->dbus_skeleten) {
58 g_dbus_interface_skeleton_unexport (
59 G_DBUS_INTERFACE_SKELETON (data->dbus_skeleten));
60 g_clear_object (&data->dbus_skeleten);
63 if (data->m_loop) g_main_loop_unref (data->m_loop);
65 g_slice_free (DaemonData, data);
68 #ifdef USE_SESSION_BUS
70 _handle_get_bus_address (DaemonData *data,
71 GDBusMethodInvocation *invocation,
75 msgport_return_val_if_fail (data, FALSE);
76 msgport_return_val_if_fail (data->server && MSGPORT_IS_DBUS_SERVER (data->server), FALSE);
78 const gchar *server_address = msgport_dbus_server_get_address (data->server);
81 msgport_dbus_glue_server_complete_get_bus_address (data->dbus_skeleten,
82 invocation, server_address);
85 g_dbus_method_invocation_take_error (invocation, msgport_error_unknown_new());
92 _on_bus_acquired (GDBusConnection *connection,
96 DaemonData *data = (DaemonData *) userdata;
98 msgport_return_if_fail (data);
101 data->server = msgport_dbus_server_new ();
103 data->dbus_skeleten = msgport_dbus_glue_server_skeleton_new ();
105 g_signal_connect_swapped (data->dbus_skeleten, "handle-get-bus-address",
106 G_CALLBACK (_handle_get_bus_address), data);
108 if (!g_dbus_interface_skeleton_export (
109 G_DBUS_INTERFACE_SKELETON (data->dbus_skeleten), connection, "/", &error)) {
110 WARN ("Failed to export interface: %s", error->message);
111 g_error_free (error);
112 g_main_loop_quit (data->m_loop);
117 _on_name_acquired (GDBusConnection *connection,
121 DBG ("D-Bus name acquired: %s", name);
125 _on_name_lost (GDBusConnection *connection,
129 DaemonData *data = (DaemonData *) userdata;
130 DBG ("D-Bus name lost: %s", name);
131 msgport_return_if_fail (data && data->m_loop);
133 g_main_loop_quit (data->m_loop);
135 #endif /* USE_SESSION_BUS */
138 _on_unix_signal (gpointer data)
140 g_main_loop_quit (((DaemonData *)data)->m_loop);
145 int main (int argc, char *argv[])
147 DaemonData *data = daemon_data_new ();
149 #if !GLIB_CHECK_VERSION (2, 36, 0)
150 g_type_init (&argc, &argv);
154 guint bus_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
155 "org.tizen.messageport",
156 G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | G_BUS_NAME_OWNER_FLAGS_REPLACE,
163 data->server = msgport_dbus_server_new();
165 ERR ("Failed to start server");
166 daemon_data_free (data);
169 #endif /* USE_SESSION_BUS */
171 data->m_loop = g_main_loop_new (NULL, FALSE);
172 g_unix_signal_add (SIGTERM, _on_unix_signal, data);
173 g_unix_signal_add (SIGINT, _on_unix_signal, data);
175 g_main_loop_run (data->m_loop);
177 daemon_data_free (data);
178 #ifdef USE_SESSION_BUS
179 g_bus_unown_name (bus_owner_id);
182 DBG("Clean shutdown");