From dbcb6cd8e6d1a12daa21a6aa17738adf026cf069 Mon Sep 17 00:00:00 2001 From: Steven Luo Date: Wed, 25 Aug 2010 19:28:11 -0700 Subject: [PATCH] Listen on D-Bus system bus as well as session bus Discussion on https://bugs.maemo.org/show_bug.cgi?id=8369 (Hermes doesn't work when Browser Switchboard is installed) revealed that MicroB listens on the D-Bus system bus as well as the session bus. While it's not appropriate for applications to request opening a browser via the system bus (which is supposed to be for requesting system services, not applications), the fact that MicroB listens there means that we need to too. This fixes Browser Switchboard bug 5910. Thanks to Andrew Flegg and Marcin Juszkiewicz for providing the information needed to track down this bug. --- browser-switchboard.h | 2 ++ dbus-server-bindings.c | 23 +++++++++++++++++++++-- main.c | 23 +++++++++++++++++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/browser-switchboard.h b/browser-switchboard.h index 726a553..3f1cfdd 100644 --- a/browser-switchboard.h +++ b/browser-switchboard.h @@ -29,6 +29,8 @@ struct swb_context { char *other_browser_cmd; DBusGConnection *session_bus; DBusGProxy *dbus_proxy; + DBusGConnection *system_bus; + DBusGProxy *dbus_system_proxy; }; #endif /* _BROWSER_SWITCHBOARD_H */ diff --git a/dbus-server-bindings.c b/dbus-server-bindings.c index f20a690..000bed9 100644 --- a/dbus-server-bindings.c +++ b/dbus-server-bindings.c @@ -147,7 +147,7 @@ void dbus_request_osso_browser_name(struct swb_context *ctx) { GError *error = NULL; guint result; - if (!ctx || !ctx->dbus_proxy) + if (!ctx || !ctx->dbus_proxy || !ctx->dbus_system_proxy) return; if (!dbus_g_proxy_call(ctx->dbus_proxy, "RequestName", &error, @@ -163,6 +163,20 @@ void dbus_request_osso_browser_name(struct swb_context *ctx) { log_msg("Couldn't acquire name com.nokia.osso_browser\n"); exit(1); } + + if (!dbus_g_proxy_call(ctx->dbus_system_proxy, "RequestName", &error, + G_TYPE_STRING, "com.nokia.osso_browser", + G_TYPE_UINT, DBUS_NAME_FLAG_REPLACE_EXISTING|DBUS_NAME_FLAG_DO_NOT_QUEUE, + G_TYPE_INVALID, + G_TYPE_UINT, &result, + G_TYPE_INVALID)) { + log_msg("Couldn't acquire name com.nokia.osso_browser on system bus\n"); + exit(1); + } + if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { + log_msg("Couldn't acquire name com.nokia.osso_browser on system bus\n"); + exit(1); + } } /* Release the name com.nokia.osso_browser on the D-Bus session bus */ @@ -170,7 +184,7 @@ void dbus_release_osso_browser_name(struct swb_context *ctx) { GError *error = NULL; guint result; - if (!ctx || !ctx->dbus_proxy) + if (!ctx || !ctx->dbus_proxy || !ctx->dbus_system_proxy) return; dbus_g_proxy_call(ctx->dbus_proxy, "ReleaseName", &error, @@ -178,4 +192,9 @@ void dbus_release_osso_browser_name(struct swb_context *ctx) { G_TYPE_INVALID, G_TYPE_UINT, &result, G_TYPE_INVALID); + dbus_g_proxy_call(ctx->dbus_system_proxy, "ReleaseName", &error, + G_TYPE_STRING, "com.nokia.osso_browser", + G_TYPE_INVALID, + G_TYPE_UINT, &result, + G_TYPE_INVALID); } diff --git a/main.c b/main.c index 568732d..a6d2c89 100644 --- a/main.c +++ b/main.c @@ -79,6 +79,7 @@ static void read_config(int signalnum) { int main() { OssoBrowser *obj_osso_browser, *obj_osso_browser_req; + OssoBrowser *obj_osso_browser_sys, *obj_osso_browser_sys_req; GMainLoop *mainloop; GError *error = NULL; int reqname_result; @@ -146,16 +147,38 @@ int main() { return 1; } + /* Get a connection to the D-Bus system bus */ + ctx.system_bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error); + if (!ctx.system_bus) { + log_msg("Couldn't get a D-Bus system bus connection\n"); + return 1; + } + ctx.dbus_system_proxy = dbus_g_proxy_new_for_name(ctx.system_bus, + "org.freedesktop.DBus", "/org/freedesktop/DBus", + "org.freedesktop.DBus"); + if (!ctx.dbus_system_proxy) { + log_msg("Couldn't get an org.freedesktop.DBus proxy\n"); + return 1; + } + dbus_request_osso_browser_name(&ctx); /* Register ourselves to handle the osso_browser D-Bus methods */ obj_osso_browser = g_object_new(OSSO_BROWSER_TYPE, NULL); obj_osso_browser_req = g_object_new(OSSO_BROWSER_TYPE, NULL); + obj_osso_browser_sys = g_object_new(OSSO_BROWSER_TYPE, NULL); + obj_osso_browser_sys_req = g_object_new(OSSO_BROWSER_TYPE, NULL); dbus_g_connection_register_g_object(ctx.session_bus, "/com/nokia/osso_browser", G_OBJECT(obj_osso_browser)); dbus_g_connection_register_g_object(ctx.session_bus, "/com/nokia/osso_browser/request", G_OBJECT(obj_osso_browser_req)); + dbus_g_connection_register_g_object(ctx.system_bus, + "/com/nokia/osso_browser", + G_OBJECT(obj_osso_browser_sys)); + dbus_g_connection_register_g_object(ctx.system_bus, + "/com/nokia/osso_browser/request", + G_OBJECT(obj_osso_browser_sys_req)); mainloop = g_main_loop_new(NULL, FALSE); log_msg("Starting main loop\n"); -- 1.7.9.5