*****************************************************************************/
#include "extensions_manager.hpp"
+#include "input_manager.hpp"
#include "dialogs/extensions.hpp"
+#include <vlc_modules.h>
#include "assert.h"
#include <QMenu>
menuMapper = new QSignalMapper( this );
CONNECT( menuMapper, mapped( int ), this, triggerMenu( int ) );
+ CONNECT( THEMIM->getIM(), statusChanged( int ), this, playingChanged( int ) );
+ DCONNECT( THEMIM, inputChanged( input_thread_t* ),
+ this, inputChanged( input_thread_t* ) );
b_unloading = false;
+ b_failed = false;
}
ExtensionsManager::~ExtensionsManager()
{
+ msg_Dbg( p_intf, "Killing extension dialog provider" );
+ ExtensionsDialogProvider::killInstance();
if( p_extensions_manager )
{
module_unneed( p_extensions_manager, p_extensions_manager->p_module );
}
}
-void ExtensionsManager::loadExtensions()
+bool ExtensionsManager::loadExtensions()
{
if( !p_extensions_manager )
{
p_extensions_manager = ( extensions_manager_t* )
vlc_object_create( p_intf, sizeof( extensions_manager_t ) );
if( !p_extensions_manager )
- return;
+ {
+ b_failed = true;
+ emit extensionsUpdated();
+ return false;
+ }
vlc_object_attach( p_extensions_manager, p_intf );
p_extensions_manager->p_module =
if( !p_extensions_manager->p_module )
{
msg_Err( p_intf, "Unable to load extensions module" );
- return;
+ vlc_object_release( p_extensions_manager );
+ p_extensions_manager = NULL;
+ b_failed = true;
+ emit extensionsUpdated();
+ return false;
}
/* Initialize dialog provider */
if( !p_edp )
{
msg_Err( p_intf, "Unable to create dialogs provider for extensions" );
- return;
+ module_unneed( p_extensions_manager,
+ p_extensions_manager->p_module );
+ vlc_object_release( p_extensions_manager );
+ p_extensions_manager = NULL;
+ b_failed = true;
+ emit extensionsUpdated();
+ return false;
}
b_unloading = false;
}
+ b_failed = false;
+ emit extensionsUpdated();
+ return true;
}
void ExtensionsManager::unloadExtensions()
if( !p_extensions_manager )
return;
b_unloading = true;
+ ExtensionsDialogProvider::killInstance();
module_unneed( p_extensions_manager, p_extensions_manager->p_module );
vlc_object_release( p_extensions_manager );
p_extensions_manager = NULL;
- ExtensionsDialogProvider::killInstance();
+}
+
+void ExtensionsManager::reloadExtensions()
+{
+ unloadExtensions();
+ loadExtensions();
+ emit extensionsUpdated();
}
void ExtensionsManager::menu( QMenu *current )
{
- QAction *action;
assert( current != NULL );
if( !isLoaded() )
{
- // This case should not happen
- action = current->addAction( qtr( "Extensions not loaded" ) );
- action->setEnabled( false );
+ // This case can happen: do nothing
return;
}
- /* Some useless message */
- action = current->addAction( p_extensions_manager->extensions.i_size
- ? qtr( "Extensions found:" )
- : qtr( "No extensions found" ) );
- action->setEnabled( false );
- current->addSeparator();
+ vlc_mutex_lock( &p_extensions_manager->lock );
+ QAction *action;
extension_t *p_ext = NULL;
int i_ext = 0;
FOREACH_ARRAY( p_ext, p_extensions_manager->extensions )
if( b_Active && extension_HasMenu( p_extensions_manager, p_ext ) )
{
- QMenu *submenu = new QMenu( qfu( p_ext->psz_title ) );
+ QMenu *submenu = new QMenu( qfu( p_ext->psz_title ), current );
char **ppsz_titles = NULL;
uint16_t *pi_ids = NULL;
size_t i_num = 0;
menuMapper->setMapping( action,
MENU_MAP( pi_ids[i], i_ext ) );
CONNECT( action, triggered(), menuMapper, map() );
+ free( ppsz_titles[i] );
}
if( !i_num )
{
action = submenu->addAction( qtr( "Empty" ) );
action->setEnabled( false );
}
+ free( ppsz_titles );
+ free( pi_ids );
}
else
{
}
FOREACH_END()
- /* Possibility to unload the module */
- current->addSeparator();
- current->addAction( QIcon( ":/menu/quit" ), qtr( "Unload extensions" ),
- this, SLOT( unloadExtensions() ) );
+ vlc_mutex_unlock( &p_extensions_manager->lock );
}
void ExtensionsManager::triggerMenu( int id )
uint16_t i_ext = MENU_GET_EXTENSION( id );
uint16_t i_action = MENU_GET_ACTION( id );
+ vlc_mutex_lock( &p_extensions_manager->lock );
+
if( (int) i_ext > p_extensions_manager->extensions.i_size )
{
msg_Dbg( p_intf, "can't trigger extension with wrong id %d",
extension_t *p_ext = ARRAY_VAL( p_extensions_manager->extensions, i_ext );
assert( p_ext != NULL);
+ vlc_mutex_unlock( &p_extensions_manager->lock );
+
if( i_action == 0 )
{
msg_Dbg( p_intf, "activating or triggering extension '%s'",
extension_TriggerMenu( p_extensions_manager, p_ext, i_action );
}
}
+
+void ExtensionsManager::inputChanged( input_thread_t* p_input )
+{
+ //This is unlikely, but can happen if no extension modules can be loaded.
+ if ( p_extensions_manager == NULL )
+ return ;
+ vlc_mutex_lock( &p_extensions_manager->lock );
+
+ extension_t *p_ext;
+ FOREACH_ARRAY( p_ext, p_extensions_manager->extensions )
+ {
+ if( extension_IsActivated( p_extensions_manager, p_ext ) )
+ {
+ extension_SetInput( p_extensions_manager, p_ext, p_input );
+ }
+ }
+ FOREACH_END()
+
+ vlc_mutex_unlock( &p_extensions_manager->lock );
+}
+
+void ExtensionsManager::playingChanged( int state )
+{
+ //This is unlikely, but can happen if no extension modules can be loaded.
+ if ( p_extensions_manager == NULL )
+ return ;
+ vlc_mutex_lock( &p_extensions_manager->lock );
+
+ extension_t *p_ext;
+ FOREACH_ARRAY( p_ext, p_extensions_manager->extensions )
+ {
+ if( extension_IsActivated( p_extensions_manager, p_ext ) )
+ {
+ extension_PlayingChanged( p_extensions_manager, p_ext, state );
+ }
+ }
+ FOREACH_END()
+
+ vlc_mutex_unlock( &p_extensions_manager->lock );
+}