[vlc-commits] dbus: simplify single instance initialization

Rémi Denis-Courmont git at videolan.org
Thu Sep 6 12:11:01 CEST 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Sep  6 13:10:12 2012 +0300| [40edf1ba79819c6fa216435b01b06bf25331b1c9] | committer: Rémi Denis-Courmont

dbus: simplify single instance initialization

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=40edf1ba79819c6fa216435b01b06bf25331b1c9
---

 src/libvlc.c |  200 +++++++++++++++++++++++-----------------------------------
 1 file changed, 80 insertions(+), 120 deletions(-)

diff --git a/src/libvlc.c b/src/libvlc.c
index 293c963..a335fd7 100644
--- a/src/libvlc.c
+++ b/src/libvlc.c
@@ -280,150 +280,110 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
 #define MPRIS_OBJECT_PATH "/org/mpris/MediaPlayer2"
 #define MPRIS_TRACKLIST_INTERFACE "org.mpris.MediaPlayer2.TrackList"
 
-    dbus_threads_init_default();
-
     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 */
-        DBusConnection  *p_conn = NULL;
-        DBusError       dbus_error;
+        dbus_threads_init_default();
 
-        dbus_error_init( &dbus_error );
+        DBusError err;
+        dbus_error_init( &err );
 
         /* connect to the session bus */
-        p_conn = dbus_bus_get( DBUS_BUS_SESSION, &dbus_error );
-        if( !p_conn )
+        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",
-                    dbus_error.message );
-            dbus_error_free( &dbus_error );
+                    err.message );
+            dbus_error_free( &err );
+            goto dbus_out;
         }
-        else
+
+        /* 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 ) )
         {
-            /* 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 */
-            if( !dbus_bus_name_has_owner( p_conn, MPRIS_BUS_NAME, &dbus_error ) )
+            dbus_connection_unref( conn );
+            if( dbus_error_is_set( &err ) )
             {
-                if( dbus_error_is_set( &dbus_error ) )
-                {
-                    msg_Err( p_libvlc, "D-Bus error: %s", dbus_error.message );
-                    dbus_error_free( &dbus_error );
-                }
-                else
-                    msg_Dbg( p_libvlc, "No Media Player is running. "
-                            "Continuing normally." );
+                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 )
             {
-                int i_input;
-                DBusMessage* p_dbus_msg = NULL;
-                DBusMessageIter dbus_args;
-                DBusPendingCall* p_dbus_pending = NULL;
-                dbus_bool_t b_play;
-
-                msg_Warn( p_libvlc, "Another Media Player is running. Exiting");
-
-                for( i_input = vlc_optind; i_input < i_argc;i_input++ )
-                {
-                    /* Skip input options, we can't pass them through D-Bus */
-                    if( ppsz_argv[i_input][0] == ':' )
-                    {
-                        msg_Warn( p_libvlc, "Ignoring option %s",
-                                  ppsz_argv[i_input] );
-                        continue;
-                    }
-
-                    /* We need to resolve relative paths in this instance */
-                    char *psz_mrl;
-                    if( strstr( psz_mrl, "://" ) )
-                        psz_mrl = strdup( ppsz_argv[i_input] );
-                    else
-                        psz_mrl = vlc_path2uri( ppsz_argv[i_input], NULL );
-                    const char *psz_after_track = MPRIS_APPEND;
-
-                    if( psz_mrl == NULL )
-                        continue;
-                    msg_Dbg( p_libvlc, "Adds %s to the running Media Player",
-                             psz_mrl );
-
-                    p_dbus_msg = dbus_message_new_method_call(
-                        MPRIS_BUS_NAME, MPRIS_OBJECT_PATH,
-                        MPRIS_TRACKLIST_INTERFACE, "AddTrack" );
-
-                    if ( NULL == p_dbus_msg )
-                    {
-                        msg_Err( p_libvlc, "D-Bus problem" );
-                        free( psz_mrl );
-                        exit( 1 );
-                    }
-
-                    /* append MRLs */
-                    dbus_message_iter_init_append( p_dbus_msg, &dbus_args );
-                    if ( !dbus_message_iter_append_basic( &dbus_args,
-                                DBUS_TYPE_STRING, &psz_mrl ) )
-                    {
-                        dbus_message_unref( p_dbus_msg );
-                        free( psz_mrl );
-                        exit( 1 );
-                    }
-                    free( psz_mrl );
-
-                    if( !dbus_message_iter_append_basic( &dbus_args,
-                                DBUS_TYPE_OBJECT_PATH, &psz_after_track ) )
-                    {
-                        dbus_message_unref( p_dbus_msg );
-                        exit( 1 );
-                    }
-
-                    b_play = TRUE;
-                    if( var_InheritBool( p_libvlc, "playlist-enqueue" ) )
-                        b_play = FALSE;
-
-                    if ( !dbus_message_iter_append_basic( &dbus_args,
-                                DBUS_TYPE_BOOLEAN, &b_play ) )
-                    {
-                        dbus_message_unref( p_dbus_msg );
-                        exit( 1 );
-                    }
-
-                    /* send message and get a handle for a reply */
-                    if ( !dbus_connection_send_with_reply ( p_conn,
-                                p_dbus_msg, &p_dbus_pending, -1 ) )
-                    {
-                        msg_Err( p_libvlc, "D-Bus problem" );
-                        dbus_message_unref( p_dbus_msg );
-                        exit( 1 );
-                    }
-
-                    if ( NULL == p_dbus_pending )
-                    {
-                        msg_Err( p_libvlc, "D-Bus problem" );
-                        dbus_message_unref( p_dbus_msg );
-                        exit( 1 );
-                    }
-                    dbus_connection_flush( p_conn );
-                    dbus_message_unref( p_dbus_msg );
-                    /* block until we receive a reply */
-                    dbus_pending_call_block( p_dbus_pending );
-                    dbus_pending_call_unref( p_dbus_pending );
-                } /* processes all command line MRLs */
-
-                /* bye bye */
-                exit( 0 );
+                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_STRING, &after_track,
+                                                DBUS_TYPE_BOOLEAN, &play,
+                                                DBUS_TYPE_INVALID ) )
+            {
+                 dbus_message_unref( msg );
+                 msg = NULL;
+            }
+            free( mrl );
+            if( unlikely(msg == NULL) )
+                continue;
+
+            msg_Dbg( p_libvlc, "Adds %s to the running media player", 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 */
-        if( p_conn ) dbus_connection_unref( p_conn );
+        dbus_connection_unref( conn );
+        exit( 1 );
     }
-
 #undef MPRIS_APPEND
 #undef MPRIS_BUS_NAME
 #undef MPRIS_OBJECT_PATH
 #undef MPRIS_TRACKLIST_INTERFACE
-
+dbus_out:
 #endif // HAVE_DBUS
 
     /*



More information about the vlc-commits mailing list