X-Git-Url: http://git.maemo.org/git/?p=browser-switch;a=blobdiff_plain;f=launcher.c;h=9d2953be0dccd0f15514076138077bbabba92f39;hp=0e48d4220edd1c57788b164902385c42046f2aa3;hb=13c579741f0f3186a7b4fe5609607d7ac1aa984f;hpb=870b63f0602922c0f135d3982f1febfe2706c243;ds=sidebyside diff --git a/launcher.c b/launcher.c index 0e48d42..9d2953b 100644 --- a/launcher.c +++ b/launcher.c @@ -239,6 +239,41 @@ void launch_microb(struct swb_context *ctx, char *uri) { } free(microb_profile_dir); + /* Set up the D-Bus eavesdropping we'll use to watch for MicroB + acquiring the com.nokia.osso_browser D-Bus name. Again, this needs + to happen before the browser is launched, so that there's no race + between establishing the watch and browser startup. + + Ideas for how to do this monitoring derived from the dbus-monitor + code (tools/dbus-monitor.c in the D-Bus codebase). */ + dbus_error_init(&dbus_error); + + raw_connection = dbus_bus_get_private(DBUS_BUS_SESSION, &dbus_error); + if (!raw_connection) { + fprintf(stderr, + "Failed to open connection to session bus: %s\n", + dbus_error.message); + dbus_error_free(&dbus_error); + exit(1); + } + + dbus_bus_add_match(raw_connection, + "type='signal',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0='com.nokia.osso_browser'", + &dbus_error); + if (dbus_error_is_set(&dbus_error)) { + fprintf(stderr, + "Failed to set up watch for browser UI start: %s\n", + dbus_error.message); + dbus_error_free(&dbus_error); + exit(1); + } + filter_func = check_microb_started; + if (!dbus_connection_add_filter(raw_connection, + filter_func, NULL, NULL)) { + fprintf(stderr, "Failed to set up watch filter!\n"); + exit(1); + } + if ((pid = fork()) == -1) { perror("fork"); exit(1); @@ -249,40 +284,8 @@ void launch_microb(struct swb_context *ctx, char *uri) { /* Wait for our child to start the browser UI process and for it to acquire the com.nokia.osso_browser D-Bus name, then make the appropriate method call to open the browser - window. - - Ideas for how to do this monitoring derived from the - dbus-monitor code (tools/dbus-monitor.c in the D-Bus - codebase). */ + window. */ microb_started = 0; - dbus_error_init(&dbus_error); - - raw_connection = dbus_bus_get_private(DBUS_BUS_SESSION, - &dbus_error); - if (!raw_connection) { - fprintf(stderr, - "Failed to open connection to session bus: %s\n", - dbus_error.message); - dbus_error_free(&dbus_error); - exit(1); - } - - dbus_bus_add_match(raw_connection, - "type='signal',interface='org.freedesktop.DBus',member='NameOwnerChanged',arg0='com.nokia.osso_browser'", - &dbus_error); - if (dbus_error_is_set(&dbus_error)) { - fprintf(stderr, - "Failed to set up watch for browser UI start: %s\n", - dbus_error.message); - dbus_error_free(&dbus_error); - exit(1); - } - filter_func = check_microb_started; - if (!dbus_connection_add_filter(raw_connection, - filter_func, NULL, NULL)) { - fprintf(stderr, "Failed to set up watch filter!\n"); - exit(1); - } printf("Waiting for MicroB to start\n"); while (!microb_started && dbus_connection_read_write_dispatch(raw_connection, @@ -378,7 +381,7 @@ void launch_microb(struct swb_context *ctx, char *uri) { pos += len; else /* All events processed */ - pos = buf + bytes_read; + break; } if (!pos) /* Event found, stop looking */ @@ -466,6 +469,8 @@ void launch_microb(struct swb_context *ctx, char *uri) { } } else { /* Child process */ + dbus_connection_close(raw_connection); + dbus_connection_unref(raw_connection); close(fd); close_stdio();