- Search plugin parses opensearch.xml files and adds them to combobox
[qtrapids] / src / gui / MainWindow.cpp
index 884ced0..9a6770c 100644 (file)
@@ -43,6 +43,8 @@ const QString ABOUT_TEXT
                           "\nDenis Zalevskiy, denis.zalewsky@ixonos.com"
                           "\n\nIxonos Plc, Finland\n"));
 
+const QString PLUGINS_DIR = "plugins";
+
 // Consturctor
 MainWindow::MainWindow():
                QMainWindow(), // Superclass
@@ -51,6 +53,7 @@ MainWindow::MainWindow():
                seedView_(NULL),
                preferencesDialog_(NULL),
                settings_(),
+               pluginDirs_(),
 //     torrentHandles_(),
                btSession_()
 {
@@ -191,38 +194,60 @@ bool MainWindow::eventRequest(QVariant param, PluginRequest req)
 
 void MainWindow::LoadPlugins()
 {
-       /// @todo get plugin directory from settings or go through multiple directories
-       /// Now we only check the application directory
-       pluginsDir_ = QDir(qApp->applicationDirPath());
-       pluginsDir_.cd("plugins");
-       QStringList nameFilters;
-       nameFilters << "*.so";
-
-       foreach (QString fileName, pluginsDir_.entryList(nameFilters, QDir::Files)) {
-               QPluginLoader pluginLoader(pluginsDir_.absoluteFilePath(fileName));
-
-               if (!QLibrary::isLibrary(fileName)) {
-                       qDebug() << fileName << " not a library";
-               }
-
-               if (pluginLoader.load()) {
-                       qDebug() << "Plugin loaded: "  << fileName;
-               } else {
-                       qDebug() << "Plugin load failed: " << pluginLoader.errorString();
-               }
-
-               QObject *baseInstance = pluginLoader.instance();
-               if (!baseInstance) {
-                       qDebug() << "Base instance = NULL.";
-               }
-
-               qtrapids::PluginInterface *plugin = qobject_cast<qtrapids::PluginInterface*>(baseInstance);
-
-               if (!plugin) {
-                       qDebug() << "Cast failed.";
+       // Get plugin directories from 
+       QStringList pluginDirsTmp = settings_.value("plugins/path").toStringList();
+       QStringList nameFilters("*.so");
+       
+       /// @todo enable "application directory" for plugin search in development/debug mode only. In release version
+       /// search plugins directory under $HOME/.qtrapids or system library paths
+       pluginDirsTmp << qApp->applicationDirPath();
+       pluginDirsTmp.removeDuplicates();
+       
+       foreach (QString dir, pluginDirsTmp) {
+               pluginDirs_.append(QDir(dir));
+       }
+       
+       foreach (QDir dir, pluginDirs_) {
+               
+               if (dir.cd(PLUGINS_DIR)) {
+                       
+                       foreach (QString fileName, dir.entryList(nameFilters, QDir::Files)) {
+                               QPluginLoader pluginLoader(dir.absoluteFilePath(fileName));
+
+                               // If plugin not loaded from another directory, then load
+                               if (!pluginFileNames_.contains(fileName) && QLibrary::isLibrary(fileName)) {
+
+                                       if (pluginLoader.load()) {
+                                               qDebug() << "Plugin loaded: "  << fileName;
+                                       } else {
+                                               qWarning() << "Plugin load failed: " << pluginLoader.errorString();
+                                       }
+
+                                       QObject *baseInstance = pluginLoader.instance();
+                                       if (!baseInstance) {
+                                               qDebug() << "Base instance = NULL.";
+                                       }
+
+                                       qtrapids::PluginInterface *plugin = qobject_cast<qtrapids::PluginInterface*>(baseInstance);
+
+                                       if (!plugin) {
+                                               qDebug() << "Cast failed.";
+                                       } else {
+                                               qtrapids::PluginInterface::Info info;
+                                               info.directory = dir.path();
+                                               qDebug() << dir.path();
+                                               plugin->initialize(this, info);
+                                               pluginFileNames_ += fileName;
+                                       }
+                               } else {
+                                       qWarning() << "Plugin " 
+                                               << fileName 
+                                               << " already loaded from another directory, or not a valid library file";
+                               }
+                       }
+                       
                } else {
-                       plugin->initialize(this);
-                       pluginFileNames_ += fileName;
+                       qWarning() << PLUGINS_DIR <<  "directory not accessible or does not exist in "  << dir.path();
                }
        }
 }