vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Sun Jun 18 17:10:30 2017 +0300| [ba8117c4fbb330fe9d09fdcc35595146af170299] | committer: Rémi Denis-Courmont
posix: move D-Bus one-instance to system_Configure() This takes the platform-specific wart out of common initialization code, and into the same callback as the equivalent Windows code. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ba8117c4fbb330fe9d09fdcc35595146af170299 --- src/libvlc.c | 120 ----------------------------------------------- src/posix/specific.c | 130 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 127 insertions(+), 123 deletions(-) diff --git a/src/libvlc.c b/src/libvlc.c index 4b220d2e31..844e04c09f 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -51,12 +51,6 @@ #include "config/vlc_getopt.h" -#ifdef HAVE_DBUS -/* used for one-instance mode */ -# include <dbus/dbus.h> -#endif - - #include <vlc_playlist.h> #include <vlc_interface.h> @@ -236,120 +230,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if( libvlc_InternalKeystoreInit( p_libvlc ) != VLC_SUCCESS ) msg_Warn( p_libvlc, "memory keystore init failed" ); -/* FIXME: could be replaced by using Unix sockets */ -#ifdef HAVE_DBUS - -#define MPRIS_APPEND "/org/mpris/MediaPlayer2/TrackList/Append" -#define MPRIS_BUS_NAME "org.mpris.MediaPlayer2.vlc" -#define MPRIS_OBJECT_PATH "/org/mpris/MediaPlayer2" -#define MPRIS_TRACKLIST_INTERFACE "org.mpris.MediaPlayer2.TrackList" - - if( var_InheritBool( p_libvlc, "one-instance" ) - || ( var_InheritBool( p_libvlc, "one-instance-when-started-from-file" ) - && var_InheritBool( p_libvlc, "started-from-file" ) ) ) - { - for( int i = vlc_optind; i < i_argc; i++ ) - if( ppsz_argv[i][0] == ':' ) - { - msg_Err( p_libvlc, "item option %s incompatible with single instance", - ppsz_argv[i] ); - goto dbus_out; - } - - /* Initialise D-Bus interface, check for other instances */ - dbus_threads_init_default(); - - DBusError err; - dbus_error_init( &err ); - - /* connect to the session bus */ - DBusConnection *conn = dbus_bus_get( DBUS_BUS_SESSION, &err ); - if( conn == NULL ) - { - msg_Err( p_libvlc, "Failed to connect to D-Bus session daemon: %s", - err.message ); - dbus_error_free( &err ); - goto dbus_out; - } - - /* check if VLC is available on the bus - * if not: D-Bus control is not enabled on the other - * instance and we can't pass MRLs to it */ - /* FIXME: This check is totally brain-dead and buggy. */ - if( !dbus_bus_name_has_owner( conn, MPRIS_BUS_NAME, &err ) ) - { - dbus_connection_unref( conn ); - if( dbus_error_is_set( &err ) ) - { - msg_Err( p_libvlc, "D-Bus error: %s", err.message ); - } - else - msg_Dbg( p_libvlc, "No media player running. Continuing normally." ); - dbus_error_free( &err ); - goto dbus_out; - } - - const dbus_bool_t play = !var_InheritBool( p_libvlc, "playlist-enqueue" ); - - msg_Warn( p_libvlc, "media player running. Exiting..."); - for( int i = vlc_optind; i < i_argc; i++ ) - { - DBusMessage *msg = dbus_message_new_method_call( - MPRIS_BUS_NAME, MPRIS_OBJECT_PATH, MPRIS_TRACKLIST_INTERFACE, "AddTrack" ); - if( unlikely(msg == NULL) ) - continue; - - /* We need to resolve relative paths in this instance */ - char *mrl; - if( strstr( ppsz_argv[i], "://" ) ) - mrl = strdup( ppsz_argv[i] ); - else - mrl = vlc_path2uri( ppsz_argv[i], NULL ); - if( mrl == NULL ) - { - dbus_message_unref( msg ); - continue; - } - - const char *after_track = MPRIS_APPEND; - - /* append MRLs */ - if( !dbus_message_append_args( msg, DBUS_TYPE_STRING, &mrl, - DBUS_TYPE_OBJECT_PATH, &after_track, - DBUS_TYPE_BOOLEAN, &play, - DBUS_TYPE_INVALID ) ) - { - dbus_message_unref( msg ); - msg = NULL; - free( mrl ); - continue; - } - - msg_Dbg( p_libvlc, "Adds %s to the running media player", mrl ); - free( mrl ); - - /* send message and get a handle for a reply */ - DBusMessage *reply = dbus_connection_send_with_reply_and_block( conn, msg, -1, - &err ); - dbus_message_unref( msg ); - if( reply == NULL ) - { - msg_Err( p_libvlc, "D-Bus error: %s", err.message ); - continue; - } - dbus_message_unref( reply ); - } - /* we unreference the connection when we've finished with it */ - dbus_connection_unref( conn ); - exit( 0 ); - } -#undef MPRIS_APPEND -#undef MPRIS_BUS_NAME -#undef MPRIS_OBJECT_PATH -#undef MPRIS_TRACKLIST_INTERFACE -dbus_out: -#endif // HAVE_DBUS - vlc_CPU_dump( VLC_OBJECT(p_libvlc) ); priv->b_stats = var_InheritBool( p_libvlc, "stats" ); diff --git a/src/posix/specific.c b/src/posix/specific.c index 971ec6a8fe..9622816d5f 100644 --- a/src/posix/specific.c +++ b/src/posix/specific.c @@ -25,12 +25,136 @@ #include <vlc_common.h> #include "../libvlc.h" +#ifdef HAVE_DBUS +/* used for one-instance mode */ +# include <dbus/dbus.h> +# include <vlc_url.h> +#endif + void system_Init (void) { } -void system_Configure (libvlc_int_t *libvlc, - int argc, const char *const argv[]) +static void system_ConfigureDbus(libvlc_int_t *vlc, int argc, + const char *const argv[]) +{ +/* FIXME: could be replaced by using Unix sockets */ +#ifdef HAVE_DBUS + if (!var_InheritBool(vlc, "one-instance") + && !(var_InheritBool(vlc, "one-instance-when-started-from-file") + && var_InheritBool(vlc, "started-from-file"))) + return; + +#define MPRIS_APPEND "/org/mpris/MediaPlayer2/TrackList/Append" +#define MPRIS_BUS_NAME "org.mpris.MediaPlayer2.vlc" +#define MPRIS_OBJECT_PATH "/org/mpris/MediaPlayer2" +#define MPRIS_TRACKLIST_INTERFACE "org.mpris.MediaPlayer2.TrackList" + for (int i = 0; i < argc; i++) + if (argv[i][0] == ':') + { + msg_Err(vlc, "item option %s incompatible with single instance", + argv[i]); + return; + } + + /* Initialise D-Bus interface, check for other instances */ + dbus_threads_init_default(); + + DBusError err; + dbus_error_init(&err); + + /* connect to the session bus */ + DBusConnection *conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + if (conn == NULL) + { + msg_Err(vlc, "D-Bus session bus connection failure: %s", + err.message); + dbus_error_free(&err); + return; + } + + /* check if VLC is available on the bus + * if not: D-Bus control is not enabled on the other + * instance and we can't pass MRLs to it */ + /* FIXME: This check is totally brain-dead and buggy. */ + if (!dbus_bus_name_has_owner(conn, MPRIS_BUS_NAME, &err)) + { + dbus_connection_unref(conn); + if (dbus_error_is_set(&err)) + { + msg_Err(vlc, "D-Bus error: %s", err.message); + dbus_error_free(&err); + } + else + msg_Dbg(vlc, "no running VLC instance - continuing normally..."); + return; + } + msg_Warn(vlc, "running VLC instance - exiting..."); + + const dbus_bool_t play = !var_InheritBool(vlc, "playlist-enqueue"); + + for (int i = 0; i < argc; i++) + { + DBusMessage *req = dbus_message_new_method_call(MPRIS_BUS_NAME, + MPRIS_OBJECT_PATH, MPRIS_TRACKLIST_INTERFACE, "AddTrack"); + if (unlikely(req == NULL)) + continue; + + /* We need to resolve relative paths in this instance */ + char *mrlbuf = NULL; + const char *mrl; + + if (strstr(argv[i], "://")) + mrl = argv[i]; + else + { + mrlbuf = vlc_path2uri(argv[i], NULL); + if (unlikely(mrlbuf == NULL)) + { + dbus_message_unref(req); + continue; + } + mrl = mrlbuf; + } + + /* append MRLs */ + msg_Dbg(vlc, "adding track %s to running instance", mrl); + + const char *after_track = MPRIS_APPEND; + dbus_bool_t ok = dbus_message_append_args(req, DBUS_TYPE_STRING, &mrl, + DBUS_TYPE_OBJECT_PATH, &after_track, + DBUS_TYPE_BOOLEAN, &play, + DBUS_TYPE_INVALID); + free(mrlbuf); + if (unlikely(!ok)) + { + dbus_message_unref(req); + continue; + } + + /* send message and get a handle for a reply */ + DBusMessage *reply = dbus_connection_send_with_reply_and_block(conn, + req, -1, &err); + dbus_message_unref(req); + if (reply == NULL) + { + msg_Err(vlc, "D-Bus error: %s", err.message); + dbus_error_free(&err); + continue; + } + dbus_message_unref(reply); + } + + /* we unreference the connection when we've finished with it */ + dbus_connection_unref(conn); + exit(0); +#else + (void) libvlc; (void) argc; (void) argv; +#endif // HAVE_DBUS +} + +void system_Configure(libvlc_int_t *libvlc, + int argc, const char *const argv[]) { - (void)libvlc; (void)argc; (void)argv; + system_ConfigureDbus(libvlc, argc, argv); } _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
