]> git.sesse.net Git - vlc/commitdiff
Extensions/Qt: add cannotLoad() flag
authorJean-Philippe André <jpeg@videolan.org>
Thu, 28 Jan 2010 14:24:58 +0000 (15:24 +0100)
committerJean-Philippe André <jpeg@videolan.org>
Thu, 28 Jan 2010 15:17:35 +0000 (16:17 +0100)
This flag will indicate that we can't load the extensions module,
thus preventing many unnecessary (failing) loads on ViewMenu::exec()

modules/gui/qt4/extensions_manager.cpp
modules/gui/qt4/extensions_manager.hpp

index ac99a2d0b9307ee1d0e7b1e35a9caf79c189b8ed..a460f5523a0ea67297363724687c30212d9a1384 100644 (file)
@@ -47,6 +47,7 @@ ExtensionsManager::ExtensionsManager( intf_thread_t *_p_intf, QObject *parent )
     menuMapper = new QSignalMapper( this );
     CONNECT( menuMapper, mapped( int ), this, triggerMenu( int ) );
     b_unloading = false;
+    b_failed = false;
 }
 
 ExtensionsManager::~ExtensionsManager()
@@ -58,14 +59,17 @@ ExtensionsManager::~ExtensionsManager()
     }
 }
 
-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;
+            return false;
+        }
         vlc_object_attach( p_extensions_manager, p_intf );
 
         p_extensions_manager->p_module =
@@ -74,7 +78,10 @@ void ExtensionsManager::loadExtensions()
         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;
+            return false;
         }
 
         /* Initialize dialog provider */
@@ -83,10 +90,17 @@ void ExtensionsManager::loadExtensions()
         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;
+            return false;
         }
         b_unloading = false;
     }
+    b_failed = false;
+    return true;
 }
 
 void ExtensionsManager::unloadExtensions()
@@ -100,27 +114,24 @@ void ExtensionsManager::unloadExtensions()
     ExtensionsDialogProvider::killInstance();
 }
 
+void ExtensionsManager::reloadExtensions()
+{
+    unloadExtensions();
+    loadExtensions();
+}
+
 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 )
@@ -186,11 +197,6 @@ void ExtensionsManager::menu( QMenu *current )
     FOREACH_END()
 
     vlc_mutex_unlock( &p_extensions_manager->lock );
-
-    /* Possibility to unload the module */
-    current->addSeparator();
-    current->addAction( QIcon( ":/menu/quit" ), qtr( "Unload extensions" ),
-                        this, SLOT( unloadExtensions() ) );
 }
 
 void ExtensionsManager::triggerMenu( int id )
index dc427f3a94248dcced829568e4f4af4075cedcfa..c008ff9cd19aba13cc5ed3f0320e68c070aecd50 100644 (file)
@@ -41,16 +41,6 @@ class ExtensionsDialogProvider;
 class ExtensionsManager : public QObject
 {
     Q_OBJECT
-
-private:
-    static ExtensionsManager* instance;
-    intf_thread_t *p_intf;
-    extensions_manager_t *p_extensions_manager;
-    ExtensionsDialogProvider *p_edp;
-
-    QSignalMapper *menuMapper;
-    bool b_unloading;  ///< Work around threads + emit issues, see isUnloading
-
 public:
     static ExtensionsManager *getInstance( intf_thread_t *_p_intf,
                                            QObject *_parent = 0 )
@@ -69,15 +59,27 @@ public:
     virtual ~ExtensionsManager();
 
     inline bool isLoaded() { return p_extensions_manager != NULL; }
+    inline bool cannotLoad() { return b_unloading || b_failed; }
     inline bool isUnloading() { return b_unloading; }
     void menu( QMenu *current );
 
 public slots:
-    void loadExtensions();
+    bool loadExtensions();
     void unloadExtensions();
+    void reloadExtensions();
 
 private slots:
     void triggerMenu( int id );
+
+private:
+    static ExtensionsManager* instance;
+    intf_thread_t *p_intf;
+    extensions_manager_t *p_extensions_manager;
+    ExtensionsDialogProvider *p_edp;
+
+    QSignalMapper *menuMapper;
+    bool b_unloading;  ///< Work around threads + emit issues, see isUnloading
+    bool b_failed; ///< Flag set to true if we could not load the module
 };
 
 #endif // EXTENSIONS_MANAGER_HPP