Listen on D-Bus system bus as well as session bus
authorSteven Luo <steven+maemo@steven676.net>
Thu, 26 Aug 2010 02:28:11 +0000 (19:28 -0700)
committerSteven Luo <steven+maemo@steven676.net>
Thu, 26 Aug 2010 12:03:06 +0000 (05:03 -0700)
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
dbus-server-bindings.c
main.c

index 726a553..3f1cfdd 100644 (file)
@@ -29,6 +29,8 @@ struct swb_context {
        char *other_browser_cmd;
        DBusGConnection *session_bus;
        DBusGProxy *dbus_proxy;
        char *other_browser_cmd;
        DBusGConnection *session_bus;
        DBusGProxy *dbus_proxy;
+       DBusGConnection *system_bus;
+       DBusGProxy *dbus_system_proxy;
 };
 
 #endif /* _BROWSER_SWITCHBOARD_H */
 };
 
 #endif /* _BROWSER_SWITCHBOARD_H */
index f20a690..000bed9 100644 (file)
@@ -147,7 +147,7 @@ void dbus_request_osso_browser_name(struct swb_context *ctx) {
        GError *error = NULL;
        guint result;
 
        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,
                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);
        }
                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 */
 }
 
 /* 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;
 
        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,
                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);
                          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 (file)
--- 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;
 
 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;
        GMainLoop *mainloop;
        GError *error = NULL;
        int reqname_result;
@@ -146,16 +147,38 @@ int main() {
                return 1;
        }
 
                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);
        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.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");
 
        mainloop = g_main_loop_new(NULL, FALSE);
        log_msg("Starting main loop\n");