#include <glib.h>
#include <gio/gio.h>
#include <app_manager.h>
+#include <map>
#include "Server.h"
#include "access_control/PeerCreds.h"
#define DEFAULT_APP_ID "Default"
+static std::map<char*, guint> dbus_disconnect_listeners;
+
static bool connAcquired = false;
static bool nameAcquired = false;
static conv::DbusServer *__instance = NULL;
g_variant_unref(binaryArray);
}
+static void __dbusDisconnectListener(GDBusConnection* conn, const gchar* sender, const gchar* path, const gchar* iface, const gchar* name, GVariant* param, gpointer userData)
+{
+ gchar *dbus_client = reinterpret_cast<gchar *>(userData);
+ _I("Dbus client disconnected(%s)", dbus_client);
+
+ for (std::map<char*, guint>::iterator it = dbus_disconnect_listeners.begin(); it != dbus_disconnect_listeners.end(); it++) {
+ if (!strcmp(dbus_client, it->first)) {
+ _I("Erase the dbus_disconnect_listener. dbus_client(%s), listener_id(%d)", it->first, it->second);
+ g_dbus_connection_signal_unsubscribe(conn, it->second);
+ dbus_disconnect_listeners.erase(it);
+ break;
+ }
+ }
+
+ free(dbus_client);
+
+ if (dbus_disconnect_listeners.empty() == true) {
+ conv::server_kill_timer_start();
+ }
+}
+
+static void __registDbusDisconnectListener(GDBusConnection *conn, const gchar *dbus_client)
+{
+ conv::server_kill_timer_stop();
+
+ int idx = 0;
+ for(std::map<char*, guint>::iterator it = dbus_disconnect_listeners.begin(); it != dbus_disconnect_listeners.end(); it++) {
+ _I("[map %d] sender:%s, listener_id:%d", ++idx, it->first, it->second);
+ if (!strcmp(dbus_client, it->first)) {
+ _I("This dbus client (%s) is already registed", dbus_client);
+ return;
+ }
+ }
+
+ char *__dbus_client = strdup(dbus_client);
+ guint listener_id = g_dbus_connection_signal_subscribe(conn, "org.freedesktop.DBus", "org.freedesktop.DBus", "NameOwnerChanged", "/org/freedesktop/DBus",
+ dbus_client, G_DBUS_SIGNAL_FLAGS_NONE, __dbusDisconnectListener, __dbus_client, NULL);
+
+ dbus_disconnect_listeners[__dbus_client] = listener_id;
+ _I("Regist dbus_disconnect_listener. dbus client(%s), listener id(%d)", __dbus_client, listener_id);
+}
+
static void __handle_method_call(GDBusConnection *conn, const gchar *sender,
const gchar *obj_path, const gchar *iface, const gchar *method_name,
GVariant *param, GDBusMethodInvocation *invocation, gpointer user_data)
IF_FAIL_VOID_TAG(STR_EQ(obj_path, DBUS_PATH), _W, "Invalid path: %s", obj_path);
IF_FAIL_VOID_TAG(STR_EQ(iface, DBUS_IFACE), _W, "Invalid interface: %s", obj_path);
+ __registDbusDisconnectListener(conn, sender);
+
if (STR_EQ(method_name, METHOD_REQUEST))
__handle_request(conn, sender, param, invocation);
else if (STR_EQ(method_name, METHOD_CHK_PRIV_NETWORK_GET))
void conv::DbusServer::release()
{
+ dbus_disconnect_listeners.clear();
+
if (dbusConnection){
g_dbus_connection_flush_sync(dbusConnection, NULL, NULL);
dbusConnection = NULL;
#include "ClientManager.h"
#include "ServiceManager.h"
#include "RequestHandler.h"
+#include "Util.h"
+
+#define PROCESS_KILL_TIMER 10
using namespace std;
static conv::ServiceManager *serviceMgr = NULL;
static conv::RequestHandler *requestMgr = NULL;
+static int timer_id = -1;
+
+
+void conv::server_kill_timer_stop()
+{
+ _I("process_kill_timer_stop");
+ if (timer_id == -1) return;
+ conv::util::miscStopTimer(timer_id);
+ timer_id = -1;
+}
+
+static void process_kill(void *data)
+{
+ _I("process_kill");
+ conv::server_kill_timer_stop();
+
+ if (g_main_loop_is_running(mainLoop)) {
+ g_main_loop_quit(mainLoop);
+ }
+}
+
+void conv::server_kill_timer_start()
+{
+ _I("process_kill_timer_star");
+ timer_id = conv::util::miscStartTimer(process_kill, PROCESS_KILL_TIMER, NULL);
+}
+
void conv::initialize()
{
int result;
result = dbusHandle->init();
IF_FAIL_CATCH_TAG(result == true, _E, "Initialization Failed");
+ conv::server_kill_timer_start();
+
_I("Start main loop");
mainLoop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(mainLoop);
void initialize();
void release();
void sendRequest(Request* requestObj);
+ void server_kill_timer_start();
+ void server_kill_timer_stop();
}
#endif
+++ /dev/null
-<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<busconfig>
- <policy user="root">
- <allow own="org.tizen.d2dconv"/>
- <allow send_destination="org.tizen.d2dconv" send_interface="org.tizen.d2dconv" send_member="Request"/>
- <allow send_destination="org.tizen.d2dconv" send_interface="org.tizen.d2dconv" send_member="Respond"/>
- </policy>
- <policy user="owner">
- <allow own="org.tizen.d2dconv"/>
- <allow send_destination="org.tizen.d2dconv" send_interface="org.tizen.d2dconv" send_member="Request"/>
- <allow send_destination="org.tizen.d2dconv" send_interface="org.tizen.d2dconv" send_member="Respond"/>
- </policy>
- <policy context="default">
- <check send_destination="org.tizen.d2dconv" send_interface="org.tizen.d2dconv"
- send_member="ChkPrivNetworkGet" privilege="http://tizen.org/privilege/network.get"/>
- </policy>
-</busconfig>
[Unit]
Description=D2D Convergence Manager Daemon
-After=dbus.service
[Service]
+Type=dbus
+BusName=org.tizen.d2dconv
ExecStart=/usr/bin/d2d-conv-managerd
-Restart=always
-RestartSec=1
[Install]
WantedBy=default.target
License: Apache-2.0
Source0: %{name}-%{version}.tar.gz
Source1: %{name}.service
-Source2: %{name}.conf
+Source2: org.tizen.d2dconv.conf
+Source3: org.tizen.d2dconv.service
Source1001: %{name}.manifest
Source1002: lib%{name}.manifest
mkdir -p %{buildroot}%{_sysconfdir}/dbus-1/session.d
install -m 0644 %{SOURCE2} %{buildroot}%{_sysconfdir}/dbus-1/session.d/
+mkdir -p %{buildroot}/usr/share/dbus-1/services
+install -m 0644 %{SOURCE3} %{buildroot}/usr/share/dbus-1/services/
+
#mkdir -p %{buildroot}%{_userdatadir}
#cp daemon/d2d-conv-manager-iotcon-server.dat %{buildroot}%{_userdatadir}
%files
%manifest %{name}.manifest
-%config %{_sysconfdir}/dbus-1/session.d/d2d-conv-manager.conf
+%config %{_sysconfdir}/dbus-1/session.d/org.tizen.d2dconv.conf
%{_unitdir_user}/%{name}.service
%{_bindir}/%{name}d
#%{_bindir}/msf-api-test*
%attr(755,root,root) %{_sysconfdir}/gumd/useradd.d/99_d2d-conv-manager.post
/usr/share/d2d-conv-manager/*.dat
/usr/share/d2d-conv-manager/ca_crt.pem
+/usr/share/dbus-1/services/*
%files lib
%manifest lib%{name}.manifest
--- /dev/null
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+ <policy user="root">
+ <allow own="org.tizen.d2dconv"/>
+ <allow send_destination="org.tizen.d2dconv" send_interface="org.tizen.d2dconv" send_member="Request"/>
+ <allow send_destination="org.tizen.d2dconv" send_interface="org.tizen.d2dconv" send_member="Respond"/>
+ </policy>
+ <policy user="owner">
+ <allow own="org.tizen.d2dconv"/>
+ <allow send_destination="org.tizen.d2dconv" send_interface="org.tizen.d2dconv" send_member="Request"/>
+ <allow send_destination="org.tizen.d2dconv" send_interface="org.tizen.d2dconv" send_member="Respond"/>
+ </policy>
+ <policy context="default">
+ <check send_destination="org.tizen.d2dconv" send_interface="org.tizen.d2dconv"
+ send_member="ChkPrivNetworkGet" privilege="http://tizen.org/privilege/network.get"/>
+ </policy>
+</busconfig>
\ No newline at end of file
--- /dev/null
+[D-BUS Service]
+Name=org.tizen.d2dconv
+Exec=/usr/bin/false
+SystemdService=d2d-conv-manager.service
\ No newline at end of file