]> git.sesse.net Git - vlc/commitdiff
Simplification of one-instance mode
authorRafaël Carré <funman@videolan.org>
Wed, 6 Dec 2006 15:02:37 +0000 (15:02 +0000)
committerRafaël Carré <funman@videolan.org>
Wed, 6 Dec 2006 15:02:37 +0000 (15:02 +0000)
It now checks if a capable "Media Player" is running, not only VLC.

extras/dbus-vlc.py
modules/control/dbus.c
src/libvlc-common.c

index 9b8c15549f8ac8b6d5415c4d8615427789ea8b9e..673bbf43e15edf776f61f08f809c37d0d80c36fa 100755 (executable)
 #  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
 #
 
+#
+# NOTE: this controller is a SAMPLE, and thus doesn't implement all the D-Bus Media Player specification. http://wiki.videolan.org/index.php/DBus-spec
+# This is an unfinished document (on the 12/06/2006) and has been designed to be as general as possible.
+# So don't expect that much from this, but basic capabilities should work out of the box (Play/Pause/Next/Add)
+#
+# Also notice it has been designed first for a previous specificaiton, and thus some code may not work/be disabled
+#
 import dbus
 import dbus.glib
 import gtk
index 50f0d187878632db8023abfed883a7f8560e7a19..cb9bbce2d83319d9548108a06acb8efa19dde6d1 100644 (file)
@@ -573,9 +573,6 @@ static int Open( vlc_object_t *p_this )
         return VLC_EGENERIC;
     }
 
-    /* we unregister the object /, registered by libvlc */
-    dbus_connection_unregister_object_path( p_conn, "/" );
-
     /* we register the objects */
     dbus_connection_register_object_path( p_conn, VLC_DBUS_ROOT_PATH,
             &vlc_dbus_root_vtable, p_this );
index a9ee400e9bc17587d2080d6f17a7de70fa238263..b69d7fc1ed54be5ff20c3d43829d9e1b80aeddc9 100644 (file)
@@ -218,40 +218,6 @@ libvlc_int_t * libvlc_InternalCreate( void )
     return p_libvlc;
 }
 
-/*
- * D-Bus callback needed in libvlc_InternalInit()
- */
-#ifdef HAVE_DBUS_3
-/* Handling of messages received on / object */
-static DBusHandlerResult handle_root
-    ( DBusConnection *p_conn, DBusMessage *p_from, void *p_data ) 
-{
-    DBusMessage* p_msg = dbus_message_new_method_return( p_from );
-    if( !p_msg ) return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
-    DBusMessageIter args;
-    dbus_message_iter_init_append( p_msg, &args );
-
-    char *p_root = malloc( strlen( "<node name='/'></node>" ) );
-    if (!p_root ) return DBUS_HANDLER_RESULT_NEED_MEMORY;
-    sprintf( p_root, "<node name='/'></node>" );
-
-    if( !dbus_message_iter_append_basic( &args, DBUS_TYPE_STRING, &p_root ) )
-            return DBUS_HANDLER_RESULT_NEED_MEMORY;
-
-    if( !dbus_connection_send( p_conn, p_msg, NULL ) )
-        return DBUS_HANDLER_RESULT_NEED_MEMORY;
-    dbus_connection_flush( p_conn );
-    dbus_message_unref( p_msg );
-    return DBUS_HANDLER_RESULT_HANDLED;
-}
-/* vtable passed to dbus_connection_register_object_path() */
-static DBusObjectPathVTable vlc_dbus_root_vtable = {
-    NULL, handle_root, NULL, NULL, NULL, NULL
-};
-
-#endif
-
 /**
  * Initialize a libvlc instance
  * This function initializes a previously allocated libvlc instance:
@@ -608,161 +574,124 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
 
 /* FIXME: could be replaced by using Unix sockets */
 #ifdef HAVE_DBUS_3
-    /* Initialise D-Bus interface, check for other instances */
-    DBusConnection  *p_conn;
-    DBusError       dbus_error;
-    int             i_dbus_service;
+    if( config_GetInt( p_libvlc, "one-instance" ) )
+    {
+        /* Initialise D-Bus interface, check for other instances */
+        DBusConnection  *p_conn;
+        DBusError       dbus_error;
+        int             i_dbus_service;
 
-    dbus_threads_init_default();
-    dbus_error_init( &dbus_error );
+        dbus_threads_init_default();
+        dbus_error_init( &dbus_error );
 
-    /* connect to the session bus */
-    p_conn = dbus_bus_get( DBUS_BUS_SESSION, &dbus_error );
-    if( !p_conn )
-    {
-        msg_Err( p_libvlc, "Failed to connect to the D-Bus session daemon: %s",
-                dbus_error.message );
-        dbus_error_free( &dbus_error );
-    }
-    else
-    {
-        /* we request the service org.videolan.vlc */
-        i_dbus_service = dbus_bus_request_name( p_conn, "org.videolan.vlc", 0, 
-                &dbus_error );
-        if( dbus_error_is_set( &dbus_error ) )
-        { 
-            msg_Err( p_libvlc, "Error requesting org.videolan.vlc service: "
-                    "%s\n", dbus_error.message );
+        /* connect to the session bus */
+        p_conn = dbus_bus_get( DBUS_BUS_SESSION, &dbus_error );
+        if( !p_conn )
+        {
+            msg_Err( p_libvlc, "Failed to connect to D-Bus session daemon: %s",
+                    dbus_error.message );
             dbus_error_free( &dbus_error );
         }
         else
         {
-            if( i_dbus_service != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER )
-            { /* the name is already registered by another instance of vlc */
-                if( config_GetInt( p_libvlc, "one-instance" ) )
+            /* check if a Media Player is available
+             * if not: D-Bus control is not enabled on the other
+             * instance and we can't pass MRLs to it */
+            DBusMessage *p_test_msg, *p_test_reply;
+            p_test_msg =  dbus_message_new_method_call(
+                    "org.freedesktop.MediaPlayer", "/",
+                    "org.freedesktop.MediaPlayer", "Identity" );
+            /* block until a reply arrives */
+            p_test_reply = dbus_connection_send_with_reply_and_block(
+                    p_conn, p_test_msg, -1, &dbus_error );
+            dbus_message_unref( p_test_msg );
+            if( p_test_reply == NULL )
+            {
+                dbus_error_free( &dbus_error );
+                msg_Dbg( p_libvlc, "No Media Player is running. "
+                        "Continuing normally." );
+            }
+            else
+            {
+                dbus_message_unref( p_test_reply );
+                msg_Warn( p_libvlc, "Another Media Player is running. Exiting");
+
+                int i_input;
+                DBusMessage* p_dbus_msg;
+                DBusMessageIter dbus_args;
+                DBusPendingCall* p_dbus_pending;
+                dbus_bool_t b_play;
+
+                for( i_input = optind;i_input < i_argc;i_input++ )
                 {
-                    /* check if a Media Player is available
-                     * if not: D-Bus control is not enabled on the other
-                     * instance and we can't pass MRLs to it */
-                    DBusMessage *p_test_msg, *p_test_reply;
-                    p_test_msg =  dbus_message_new_method_call(
-                            "org.freedesktop.MediaPlayer", "/",
-                            "org.freedesktop.MediaPlayer", "Identity" );
-                    /* block until a reply arrives */
-                    p_test_reply = dbus_connection_send_with_reply_and_block(
-                            p_conn, p_test_msg, -1, &dbus_error );
-                    dbus_message_unref( p_test_msg );
-                    if( p_test_reply == NULL )
+                    msg_Dbg( p_libvlc, "Adds %s to the running Media Player",
+                            ppsz_argv[i_input] );
+
+                    p_dbus_msg = dbus_message_new_method_call(
+                            "org.freedesktop.MediaPlayer", "/TrackList",
+                            "org.freedesktop.MediaPlayer", "AddTrack" );
+
+                    if ( NULL == p_dbus_msg )
                     {
-                        dbus_error_free( &dbus_error );
-                        msg_Err( p_libvlc, "one instance mode has been "
-                                "set but D-Bus control interface is not "
-                                "enabled. Enable it and restart vlc, or "
-                                "disable one instance mode." );
+                        msg_Err( p_libvlc, "D-Bus problem" );
+                        system_End( p_libvlc );
+                        exit( VLC_ETIMEOUT );
                     }
-                    else
+
+                    /* append MRLs */
+                    dbus_message_iter_init_append( p_dbus_msg, &dbus_args );
+                    if ( !dbus_message_iter_append_basic( &dbus_args, 
+                                DBUS_TYPE_STRING, &ppsz_argv[i_input] ) )
                     {
-                        dbus_message_unref( p_test_reply );
-                        msg_Warn( p_libvlc,
-                                "Another vlc instance exists: will now exit");
-
-                        int i_input;
-                        DBusMessage* p_dbus_msg;
-                        DBusMessageIter dbus_args;
-                        DBusPendingCall* p_dbus_pending;
-                        dbus_bool_t b_play;
-
-                        for( i_input = optind;i_input < i_argc;i_input++ )
-                        {
-                            msg_Dbg( p_libvlc, "Give %s to other vlc\n",
-                                    ppsz_argv[i_input] );
-
-                            p_dbus_msg = dbus_message_new_method_call(
-                                    "org.freedesktop.MediaPlayer", "/TrackList",
-                                    "org.freedesktop.MediaPlayer", "AddTrack" );
-
-                            if ( NULL == p_dbus_msg )
-                            {
-                                msg_Err( p_libvlc, "D-Bus problem" );
-                                system_End( p_libvlc );
-                                exit( 0 );
-                            }
-
-                            /* append MRLs */
-                            dbus_message_iter_init_append( p_dbus_msg,
-                                    &dbus_args );
-                            if ( !dbus_message_iter_append_basic( &dbus_args, 
-                                        DBUS_TYPE_STRING,
-                                        &ppsz_argv[i_input] ) )
-                            {
-                                msg_Err( p_libvlc, "Out of memory" );
-                                dbus_message_unref( p_dbus_msg );
-                                system_End( p_libvlc );
-                                exit( 0 );
-                            }
-                            b_play = TRUE;
-                            if( config_GetInt( p_libvlc, "playlist-enqueue" ) )
-                                b_play = FALSE;
-                            if ( !dbus_message_iter_append_basic( &dbus_args,
-                                        DBUS_TYPE_BOOLEAN, &b_play ) )
-                            {
-                                msg_Err( p_libvlc, "Out of memory" );
-                                dbus_message_unref( p_dbus_msg );
-                                system_End( p_libvlc );
-                                exit( 0 );
-                            }
-
-                            /* 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 );
-                                system_End( p_libvlc );
-                                exit( 0 );
-                            }
-
-                            if ( NULL == p_dbus_pending )
-                            {
-                                msg_Err( p_libvlc, "D-Bus problem" );
-                                dbus_message_unref( p_dbus_msg );
-                                system_End( p_libvlc );
-                                exit( 0 );
-                            }
-                            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 */
+                        msg_Err( p_libvlc, "Out of memory" );
+                        dbus_message_unref( p_dbus_msg );
                         system_End( p_libvlc );
-                        exit( 0 );
+                        exit( VLC_ENOMEM );
                     }
-                } /* we're not in one-instance mode */
-                else
-                {
-                    msg_Dbg( p_libvlc, "org.videolan.vlc is already registered "
-                            "on the session bus\n" );
-                }
-            } /* the named is owned by something else */
-            else
-            {
-                /* register "/" object */
-                if( !dbus_connection_register_object_path( p_conn, "/", 
-                        &vlc_dbus_root_vtable, NULL ) )
-                {
-                    msg_Err( p_libvlc, "Out of memory" );
-                }
-                msg_Dbg( p_libvlc, 
-                        "We are the primary owner of org.videolan.vlc on the "
-                        " session bus" );
+                    b_play = TRUE;
+                    if( config_GetInt( p_libvlc, "playlist-enqueue" ) )
+                        b_play = FALSE;
+                    if ( !dbus_message_iter_append_basic( &dbus_args,
+                                DBUS_TYPE_BOOLEAN, &b_play ) )
+                    {
+                        msg_Err( p_libvlc, "Out of memory" );
+                        dbus_message_unref( p_dbus_msg );
+                        system_End( p_libvlc );
+                        exit( VLC_ENOMEM );
+                    }
+
+                    /* 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 );
+                        system_End( p_libvlc );
+                        exit( VLC_ETIMEOUT );
+                    }
+
+                    if ( NULL == p_dbus_pending )
+                    {
+                        msg_Err( p_libvlc, "D-Bus problem" );
+                        dbus_message_unref( p_dbus_msg );
+                        system_End( p_libvlc );
+                        exit( VLC_ETIMEOUT );
+                    }
+                    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 */
+                system_End( p_libvlc );
+                exit( VLC_SUCCESS );
             }
-        } /* no error when requesting the name on the bus */
+        }
         /* we unreference the connection when we've finished with it */
         dbus_connection_unref( p_conn );
-    } /* ( p_conn != NULL ) */
+    }
 #endif
 
     /*