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:
/* 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
/*