Commit 6c464c3c authored by Rafaël Carré's avatar Rafaël Carré

Simplification of one-instance mode

It now checks if a capable "Media Player" is running, not only VLC.
parent 9dc29b4f
...@@ -20,6 +20,13 @@ ...@@ -20,6 +20,13 @@
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. # 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
import dbus.glib import dbus.glib
import gtk import gtk
......
...@@ -573,9 +573,6 @@ static int Open( vlc_object_t *p_this ) ...@@ -573,9 +573,6 @@ static int Open( vlc_object_t *p_this )
return VLC_EGENERIC; return VLC_EGENERIC;
} }
/* we unregister the object /, registered by libvlc */
dbus_connection_unregister_object_path( p_conn, "/" );
/* we register the objects */ /* we register the objects */
dbus_connection_register_object_path( p_conn, VLC_DBUS_ROOT_PATH, dbus_connection_register_object_path( p_conn, VLC_DBUS_ROOT_PATH,
&vlc_dbus_root_vtable, p_this ); &vlc_dbus_root_vtable, p_this );
......
...@@ -218,40 +218,6 @@ libvlc_int_t * libvlc_InternalCreate( void ) ...@@ -218,40 +218,6 @@ libvlc_int_t * libvlc_InternalCreate( void )
return p_libvlc; 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 * Initialize a libvlc instance
* This function initializes a previously allocated libvlc instance: * This function initializes a previously allocated libvlc instance:
...@@ -608,6 +574,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] ) ...@@ -608,6 +574,8 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
/* FIXME: could be replaced by using Unix sockets */ /* FIXME: could be replaced by using Unix sockets */
#ifdef HAVE_DBUS_3 #ifdef HAVE_DBUS_3
if( config_GetInt( p_libvlc, "one-instance" ) )
{
/* Initialise D-Bus interface, check for other instances */ /* Initialise D-Bus interface, check for other instances */
DBusConnection *p_conn; DBusConnection *p_conn;
DBusError dbus_error; DBusError dbus_error;
...@@ -620,26 +588,11 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] ) ...@@ -620,26 +588,11 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
p_conn = dbus_bus_get( DBUS_BUS_SESSION, &dbus_error ); p_conn = dbus_bus_get( DBUS_BUS_SESSION, &dbus_error );
if( !p_conn ) if( !p_conn )
{ {
msg_Err( p_libvlc, "Failed to connect to the D-Bus session daemon: %s", msg_Err( p_libvlc, "Failed to connect to D-Bus session daemon: %s",
dbus_error.message ); dbus_error.message );
dbus_error_free( &dbus_error ); dbus_error_free( &dbus_error );
} }
else 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 );
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 /* check if a Media Player is available
* if not: D-Bus control is not enabled on the other * if not: D-Bus control is not enabled on the other
...@@ -655,16 +608,13 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] ) ...@@ -655,16 +608,13 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
if( p_test_reply == NULL ) if( p_test_reply == NULL )
{ {
dbus_error_free( &dbus_error ); dbus_error_free( &dbus_error );
msg_Err( p_libvlc, "one instance mode has been " msg_Dbg( p_libvlc, "No Media Player is running. "
"set but D-Bus control interface is not " "Continuing normally." );
"enabled. Enable it and restart vlc, or "
"disable one instance mode." );
} }
else else
{ {
dbus_message_unref( p_test_reply ); dbus_message_unref( p_test_reply );
msg_Warn( p_libvlc, msg_Warn( p_libvlc, "Another Media Player is running. Exiting");
"Another vlc instance exists: will now exit");
int i_input; int i_input;
DBusMessage* p_dbus_msg; DBusMessage* p_dbus_msg;
...@@ -674,7 +624,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] ) ...@@ -674,7 +624,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
for( i_input = optind;i_input < i_argc;i_input++ ) for( i_input = optind;i_input < i_argc;i_input++ )
{ {
msg_Dbg( p_libvlc, "Give %s to other vlc\n", msg_Dbg( p_libvlc, "Adds %s to the running Media Player",
ppsz_argv[i_input] ); ppsz_argv[i_input] );
p_dbus_msg = dbus_message_new_method_call( p_dbus_msg = dbus_message_new_method_call(
...@@ -685,20 +635,18 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] ) ...@@ -685,20 +635,18 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
{ {
msg_Err( p_libvlc, "D-Bus problem" ); msg_Err( p_libvlc, "D-Bus problem" );
system_End( p_libvlc ); system_End( p_libvlc );
exit( 0 ); exit( VLC_ETIMEOUT );
} }
/* append MRLs */ /* append MRLs */
dbus_message_iter_init_append( p_dbus_msg, dbus_message_iter_init_append( p_dbus_msg, &dbus_args );
&dbus_args );
if ( !dbus_message_iter_append_basic( &dbus_args, if ( !dbus_message_iter_append_basic( &dbus_args,
DBUS_TYPE_STRING, DBUS_TYPE_STRING, &ppsz_argv[i_input] ) )
&ppsz_argv[i_input] ) )
{ {
msg_Err( p_libvlc, "Out of memory" ); msg_Err( p_libvlc, "Out of memory" );
dbus_message_unref( p_dbus_msg ); dbus_message_unref( p_dbus_msg );
system_End( p_libvlc ); system_End( p_libvlc );
exit( 0 ); exit( VLC_ENOMEM );
} }
b_play = TRUE; b_play = TRUE;
if( config_GetInt( p_libvlc, "playlist-enqueue" ) ) if( config_GetInt( p_libvlc, "playlist-enqueue" ) )
...@@ -709,7 +657,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] ) ...@@ -709,7 +657,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
msg_Err( p_libvlc, "Out of memory" ); msg_Err( p_libvlc, "Out of memory" );
dbus_message_unref( p_dbus_msg ); dbus_message_unref( p_dbus_msg );
system_End( p_libvlc ); system_End( p_libvlc );
exit( 0 ); exit( VLC_ENOMEM );
} }
/* send message and get a handle for a reply */ /* send message and get a handle for a reply */
...@@ -719,7 +667,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] ) ...@@ -719,7 +667,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
msg_Err( p_libvlc, "D-Bus problem" ); msg_Err( p_libvlc, "D-Bus problem" );
dbus_message_unref( p_dbus_msg ); dbus_message_unref( p_dbus_msg );
system_End( p_libvlc ); system_End( p_libvlc );
exit( 0 ); exit( VLC_ETIMEOUT );
} }
if ( NULL == p_dbus_pending ) if ( NULL == p_dbus_pending )
...@@ -727,7 +675,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] ) ...@@ -727,7 +675,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
msg_Err( p_libvlc, "D-Bus problem" ); msg_Err( p_libvlc, "D-Bus problem" );
dbus_message_unref( p_dbus_msg ); dbus_message_unref( p_dbus_msg );
system_End( p_libvlc ); system_End( p_libvlc );
exit( 0 ); exit( VLC_ETIMEOUT );
} }
dbus_connection_flush( p_conn ); dbus_connection_flush( p_conn );
dbus_message_unref( p_dbus_msg ); dbus_message_unref( p_dbus_msg );
...@@ -738,31 +686,12 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] ) ...@@ -738,31 +686,12 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, char *ppsz_argv[] )
/* bye bye */ /* bye bye */
system_End( p_libvlc ); system_End( p_libvlc );
exit( 0 ); exit( VLC_SUCCESS );
} }
} /* 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" );
}
} /* no error when requesting the name on the bus */
/* we unreference the connection when we've finished with it */ /* we unreference the connection when we've finished with it */
dbus_connection_unref( p_conn ); dbus_connection_unref( p_conn );
} /* ( p_conn != NULL ) */ }
#endif #endif
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment