[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[vidalia-svn] r4040: Add plugin dialog working. Users selects plugin to load, app (in vidalia/branches/extension-api/src: plugins plugins/HerdictWebReporterPlugin vidalia vidalia/res vidalia/res/32x32)



Author: tyree731
Date: 2009-08-14 18:35:50 -0400 (Fri, 14 Aug 2009)
New Revision: 4040

Added:
   vidalia/branches/extension-api/src/vidalia/res/32x32/tab-new.png
Modified:
   vidalia/branches/extension-api/src/plugins/HerdictWebReporterPlugin/HerdictWebReporterPanel.ui
   vidalia/branches/extension-api/src/plugins/PluginManager.cpp
   vidalia/branches/extension-api/src/plugins/PluginManager.h
   vidalia/branches/extension-api/src/plugins/VidaliaPluginInterface.cpp
   vidalia/branches/extension-api/src/plugins/VidaliaPluginInterface.h
   vidalia/branches/extension-api/src/vidalia/MainWindow.cpp
   vidalia/branches/extension-api/src/vidalia/MainWindow.h
   vidalia/branches/extension-api/src/vidalia/MainWindow.ui
   vidalia/branches/extension-api/src/vidalia/res/vidalia.qrc
Log:
Add plugin dialog working. Users selects plugin to load, application finds plugin, checks if it loads, and copies to plugin directory. Previously loaded plugins reloaded upon next startup.

Modified: vidalia/branches/extension-api/src/plugins/HerdictWebReporterPlugin/HerdictWebReporterPanel.ui
===================================================================
--- vidalia/branches/extension-api/src/plugins/HerdictWebReporterPlugin/HerdictWebReporterPanel.ui	2009-08-14 01:15:56 UTC (rev 4039)
+++ vidalia/branches/extension-api/src/plugins/HerdictWebReporterPlugin/HerdictWebReporterPanel.ui	2009-08-14 22:35:50 UTC (rev 4040)
@@ -32,7 +32,7 @@
    <string>MainWindow</string>
   </property>
   <property name="documentMode">
-   <bool>true</bool>
+   <bool>false</bool>
   </property>
   <widget class="QWidget" name="centralwidget">
    <property name="sizePolicy">

Modified: vidalia/branches/extension-api/src/plugins/PluginManager.cpp
===================================================================
--- vidalia/branches/extension-api/src/plugins/PluginManager.cpp	2009-08-14 01:15:56 UTC (rev 4039)
+++ vidalia/branches/extension-api/src/plugins/PluginManager.cpp	2009-08-14 22:35:50 UTC (rev 4040)
@@ -17,6 +17,7 @@
 #include "PluginManager.h"
 
 #include <QDir>
+#include <QMessageBox>
 #include <QPluginLoader>
 #include <QStringList>
 
@@ -34,45 +35,73 @@
 
 PluginManager::~PluginManager() 
 {
+  /* Save all of the loaded plugins to the settings object */
+  QSettings pluginSettings(_dataDirectory + "/plugin.conf",
+                           QSettings::IniFormat);
+
+  QStringList loadedPlugins;
+  foreach (VidaliaPluginInterface* plugin, _pluginList) {
+    QString fileName = plugin->fileName().split("/").last();
+    loadedPlugins << fileName;
+  }
+  pluginSettings.setValue("LoadedPlugins", loadedPlugins);
+
   foreach(VidaliaPluginInterface* plugin, _pluginList) {
     delete plugin;
   }
 }
 
+VidaliaPluginInterface*
+PluginManager::loadPlugin(const QString& fileName)
+{
+  QPluginLoader loader(fileName);
+  VidaliaPluginInterface* pluginInstance =
+    qobject_cast<VidaliaPluginInterface*>(loader.instance());
+     
+  if (pluginInstance) {
+    pluginInstance->setPluginManager(this);
+    pluginInstance->setFileName(fileName);
+    _pluginList.push_back(pluginInstance);
+    return pluginInstance;
+  }
+
+  qDebug() << "Plugin loading error: " << loader.errorString() << "\n";
+  return 0;  
+}
+
 void 
 PluginManager::loadPlugins(const QString& pluginsDirectory)
 {
-  /* Load all static plugins */
-  foreach (QObject *plugin, QPluginLoader::staticInstances()) {
-    VidaliaPluginInterface* pluginInstance = 
-      qobject_cast<VidaliaPluginInterface*>(plugin);
-    if (pluginInstance) {
-      pluginInstance->setPluginManager(this);
-      _pluginList.push_back(pluginInstance);
-    } else {
-      qDebug() << "Plugin Loading error: Static plugin not of type VidaliaPluginInterface\n";
+  /* Load the settings object to see which plugins to load */
+  QSettings pluginSettings(_dataDirectory + "/plugin.conf", 
+                           QSettings::IniFormat);
+
+  QStringList loadedPlugins = pluginSettings.value("LoadedPlugins",
+                                               defaultPlugins()).toStringList();
+
+  /* Note any default plugins that failed to load */
+  QStringList failedPluginLoads;
+
+  QDir applicationPluginsDir(pluginsDirectory);
+  foreach (QString fileName, loadedPlugins) {
+    if (!loadPlugin(applicationPluginsDir.absoluteFilePath(fileName))) {
+      /* Default plugin load failed */
+      failedPluginLoads << fileName;
     }
   }
 
-  /* Load all dynamic plugins */
-  QDir applicationPluginsDir = QDir(pluginsDirectory);
+  /* If any plugins failed to load, notify the user */
+  if (failedPluginLoads.size()) {
+    QMessageBox msgBox;
 
-  foreach (QString fileName, applicationPluginsDir.entryList(QDir::Files)) {
-    QPluginLoader loader(applicationPluginsDir.absoluteFilePath(fileName));
-    VidaliaPluginInterface* pluginInstance = 
-      qobject_cast<VidaliaPluginInterface*>(loader.instance());
+    QString messageBoxText = "The following plugins failed to load:";;
+    foreach (QString fileName, failedPluginLoads) {
+      messageBoxText += QString("\n") + fileName;
+    }
+    msgBox.setText(messageBoxText);
 
-	qDebug() << "Found a plugin: " << fileName << "\r\n";
-
-    if (pluginInstance) {
-	  qDebug() << "It's actually a plugin!\n";
-      pluginInstance->setPluginManager(this);
-      _pluginList.push_back(pluginInstance);
-    } else {
-      qDebug() << "Plugin loading error: " << loader.errorString() << "\n";
-    }
+    msgBox.exec();
   }
-
 }
 
 TorControl*
@@ -81,6 +110,22 @@
   return _torControl;
 }
 
+QStringList
+PluginManager::defaultPlugins() const
+{
+  QStringList result;
+#ifdef Q_OS_WIN
+  result << QString("libhomeplugin.dll");
+  result << QString("libnetworkmapplugin.dll");
+  result << QString("libmessagelogplugin.dll");
+#else
+  result << QString("libhomeplugin.so");
+  result << QString("libnetworkmapplugin.so");
+  result << QString("libmessagelogplugin.so");
+#endif
+  return result;
+}
+
 QList<VidaliaPluginInterface*> 
 PluginManager::plugins() const
 {

Modified: vidalia/branches/extension-api/src/plugins/PluginManager.h
===================================================================
--- vidalia/branches/extension-api/src/plugins/PluginManager.h	2009-08-14 01:15:56 UTC (rev 4039)
+++ vidalia/branches/extension-api/src/plugins/PluginManager.h	2009-08-14 22:35:50 UTC (rev 4040)
@@ -52,6 +52,8 @@
   PluginManager(TorControl* torControl, const QString& dataDirectory);
   /** PluginManager destructor. */
   ~PluginManager();
+  /** Loads the plugin at the specified location */
+  VidaliaPluginInterface* loadPlugin(const QString& fileName);
   /** Loads all included static and dynamic plugins. */
   void loadPlugins(const QString& applicationDirectory);
   /** Returns the specified plugin for 0 if not found. */
@@ -97,6 +99,8 @@
   void proxyStopped();
 
 private:
+  /** Returns a StringList of the default plugins */
+  QStringList defaultPlugins() const;
   /** Returns a QList of all loaded plugin instances. */
   QList<VidaliaPluginInterface*> plugins() const;
   /** Emit proxy status signal based on provided status value */

Modified: vidalia/branches/extension-api/src/plugins/VidaliaPluginInterface.cpp
===================================================================
--- vidalia/branches/extension-api/src/plugins/VidaliaPluginInterface.cpp	2009-08-14 01:15:56 UTC (rev 4039)
+++ vidalia/branches/extension-api/src/plugins/VidaliaPluginInterface.cpp	2009-08-14 22:35:50 UTC (rev 4040)
@@ -17,6 +17,7 @@
 #include "VidaliaPluginInterface.h"
 
 VidaliaPluginInterface::VidaliaPluginInterface()
+: _fileName()
 {
 }
 
@@ -38,7 +39,19 @@
   return setting;
 }
 
+QString
+VidaliaPluginInterface::fileName() const
+{
+  return _fileName;
+}
+
 void
+VidaliaPluginInterface::setFileName(const QString& fileName)
+{
+  _fileName = fileName;
+}
+
+void
 VidaliaPluginInterface::setPluginManager(PluginManager* pluginManager)
 {
   _pluginManager = pluginManager;

Modified: vidalia/branches/extension-api/src/plugins/VidaliaPluginInterface.h
===================================================================
--- vidalia/branches/extension-api/src/plugins/VidaliaPluginInterface.h	2009-08-14 01:15:56 UTC (rev 4039)
+++ vidalia/branches/extension-api/src/plugins/VidaliaPluginInterface.h	2009-08-14 22:35:50 UTC (rev 4040)
@@ -83,8 +83,15 @@
   PluginManager* _pluginManager;
 
 private:
+  /** Returns the plugins filename */
+  QString fileName() const;
+  /** Allows the Plugin Manager to store the filename of the plugin */
+  void setFileName(const QString& fileName);
   /** Allows the Plugin Manager to pass an instance of itself to the plugin. */
   void setPluginManager(PluginManager* pluginManager);
+
+  /** The plugin file's name */
+  QString _fileName;
 };
 
 Q_DECLARE_INTERFACE(VidaliaPluginInterface, 

Modified: vidalia/branches/extension-api/src/vidalia/MainWindow.cpp
===================================================================
--- vidalia/branches/extension-api/src/vidalia/MainWindow.cpp	2009-08-14 01:15:56 UTC (rev 4039)
+++ vidalia/branches/extension-api/src/vidalia/MainWindow.cpp	2009-08-14 22:35:50 UTC (rev 4040)
@@ -157,6 +157,10 @@
   connect(_configDialog, SIGNAL(settingsChanged()),
           this, SLOT(onSettingsChange()));
 
+  /* When the user attempts to add a plugin, notify MainWindow. */
+  connect (ui.pluginAddAct32, SIGNAL(triggered()),
+           this, SLOT(loadPluginDialog()));
+
   /* Create the actions that will go in the tray and file menu */
   createActions();
   /* Create the menu bar */
@@ -539,25 +543,25 @@
 void
 MainWindow::createTrayIcon()
 {
-  QMenu *menu = new QMenu(this);
-  menu->addAction(_startStopAct);
-  menu->addSeparator();
-  menu->addAction(_bandwidthAct);
-  menu->addAction(_newIdentityAct);
-  populatePluginsTrayMenu(_pluginManager->plugins(), menu);
+  _trayMenu = new QMenu(this);
+  _trayMenu->addAction(_startStopAct);
+  _trayMenu->addSeparator();
+  _trayMenu->addAction(_bandwidthAct);
+  _trayMenu->addAction(_newIdentityAct);
+  populatePluginsTrayMenu(_pluginManager->plugins());
 
 #if !defined(Q_WS_MAC)
   /* These aren't added to the dock menu on Mac, since they are in the
    * standard Mac locations in the menu bar. */
-  menu->addAction(_configAct);
-  menu->addAction(_helpAct);
-  menu->addAction(_aboutAct);
-  menu->addSeparator();
-  menu->addAction(_exitAct);
+  _trayMenu->addAction(_configAct);
+  _trayMenu->addAction(_helpAct);
+  _trayMenu->addAction(_aboutAct);
+  _trayMenu->addSeparator();
+  _trayMenu->addAction(_exitAct);
 #endif
 
   /* Create a tray menu and add it to the tray icon */
-  _trayIcon.setContextMenu(menu);
+  _trayIcon.setContextMenu(_trayMenu);
   connect(&_trayIcon, SIGNAL(doubleClicked()), this, SLOT(show()));
 }
 
@@ -738,30 +742,29 @@
 void
 MainWindow::createPluginsFileMenu(QList<VidaliaPluginInterface*> plugins)
 {
-  QMenu* pluginsMenu = 0;
+  _pluginsMenu = 0;
   foreach(VidaliaPluginInterface* plugin, plugins) {
     if (plugin->fileMenuEntry()) {
-      if (!pluginsMenu)
-        pluginsMenu = _menuBar->addMenu(tr("Plugins"));
-      pluginsMenu->addAction(plugin->fileMenuEntry());
+      if (!_pluginsMenu)
+        _pluginsMenu = _menuBar->addMenu(tr("Plugins"));
+      _pluginsMenu->addAction(plugin->fileMenuEntry());
       plugin->fileMenuEntry()->setText(plugin->name());
     }
   }
 }
 
 void
-MainWindow::populatePluginsTrayMenu(QList<VidaliaPluginInterface*> plugins,
-                                   QMenu* trayMenu)
+MainWindow::populatePluginsTrayMenu(QList<VidaliaPluginInterface*> plugins)
 {
   bool separatorAdded = false;
   foreach(VidaliaPluginInterface* plugin, plugins) {
     if (plugin->trayMenuEntry()) {
       /* So two seperators don't appear in a row if no plugins have a menu */
       if (!separatorAdded) {
-        trayMenu->addSeparator();
+        _trayMenu->addSeparator();
         separatorAdded = true;
       }
-      trayMenu->addAction(plugin->trayMenuEntry());
+      _trayMenu->addAction(plugin->trayMenuEntry());
       plugin->trayMenuEntry()->setText(plugin->name());
     }
   }
@@ -1817,6 +1820,50 @@
   }
 }
 
+void
+MainWindow::loadPluginDialog()
+{
+  VidaliaSettings settings;
+
+  /* Obtain the name of the plugin file using a QFileDialog */
+  QString fileName = QFileDialog::getOpenFileName(this, tr("Load Plugin"),
+                                                 settings.getPluginDirectory());
+  fileName = QDir::fromNativeSeparators(fileName);
+
+  /* Attempt to load the plugin */
+  VidaliaPluginInterface* plugin = _pluginManager->loadPlugin(fileName);
+
+  QMessageBox msgBox;
+  if (!plugin) {
+    msgBox.setText(QString("Plugin file ") + fileName + " failed to load.");
+    msgBox.exec();
+    return;
+  }
+  else {
+    msgBox.setText(QString("Plugin file ") + fileName + " loaded successfuly.");
+    msgBox.exec();
+  }
+
+  /* Copy the plugin to the plugins directory */
+  QFile::copy(fileName, settings.getPluginDirectory() + "/" +  
+                        fileName.split("/").last());
+
+  /* Add the plugin to the tab main window */
+  if (plugin->panel()) {
+    ui.tabMainPanel->addTab(plugin->panel(), plugin->panel()->tabIcon(),
+                            plugin->panel()->tabLabel());
+  }
+  /* Add the plugin to the file and tray menus */
+  if (plugin->trayMenuEntry()) {
+    _trayMenu->addAction(plugin->trayMenuEntry());
+    plugin->trayMenuEntry()->setText(plugin->name());
+  }
+  if (plugin->fileMenuEntry()) {
+    _pluginsMenu->addAction(plugin->fileMenuEntry());
+    plugin->fileMenuEntry()->setText(plugin->name());
+  }
+}
+
 /** Creates and displays Vidalia's About dialog. */
 void
 MainWindow::showAboutDialog()

Modified: vidalia/branches/extension-api/src/vidalia/MainWindow.h
===================================================================
--- vidalia/branches/extension-api/src/vidalia/MainWindow.h	2009-08-14 01:15:56 UTC (rev 4039)
+++ vidalia/branches/extension-api/src/vidalia/MainWindow.h	2009-08-14 22:35:50 UTC (rev 4040)
@@ -42,6 +42,7 @@
 #include "UPNPControl.h"
 #endif
 
+#include <QFileDialog>
 #include <QLabel>
 #include <QList>
 #include <QMainWindow>
@@ -116,6 +117,8 @@
   /** Terminate the Tor process if it is being run under Vidalia, disconnect
    * all TorControl signals, and exit Vidalia. */
   void aboutToQuit();
+  /** Creates the file dialog which allows the user to load a plugin */
+  void loadPluginDialog();
   /** Creates and displays Vidalia's About dialog. */
   void showAboutDialog();
   /** Creates and displays the Configuration dialog with the current page set
@@ -209,8 +212,7 @@
   void createPluginsFileMenu(QList<VidaliaPluginInterface*> plugins);
   /** Takes a list of plugin instances and the tray menu and populates the tray
    * menu with any plugin menus. */
-  void populatePluginsTrayMenu(QList<VidaliaPluginInterface*> plugins,
-                               QMenu* pluginMenu);
+  void populatePluginsTrayMenu(QList<VidaliaPluginInterface*> plugins);
   /** Starts the web browser, if appropriately configured */
   void startSubprocesses();
   /** Starts the proxy server, if appropriately configured */
@@ -293,6 +295,10 @@
 #endif
   /** The menubar */
   QMenuBar *_menuBar;
+  /** The plugin's menu */
+  QMenu* _pluginsMenu;
+  /** The Tray menu */
+  QMenu* _trayMenu;
   /** The statusbar variables */
   QProgressBar *_progressBar;
   QLabel *_lblStartupProgress;
@@ -310,6 +316,8 @@
   QAction* _helpAct;
   QAction* _newIdentityAct;
 
+  /* File dialog used to load plugins */
+  QFileDialog* _filePluginDialog;
   Ui::MainWindow ui; /**< Qt Designer generated object. */
 };
 

Modified: vidalia/branches/extension-api/src/vidalia/MainWindow.ui
===================================================================
--- vidalia/branches/extension-api/src/vidalia/MainWindow.ui	2009-08-14 01:15:56 UTC (rev 4039)
+++ vidalia/branches/extension-api/src/vidalia/MainWindow.ui	2009-08-14 22:35:50 UTC (rev 4040)
@@ -27,7 +27,7 @@
    <enum>Qt::ToolButtonTextUnderIcon</enum>
   </property>
   <property name="documentMode">
-   <bool>true</bool>
+   <bool>false</bool>
   </property>
   <property name="unifiedTitleAndToolBarOnMac">
    <bool>true</bool>
@@ -83,6 +83,7 @@
    <addaction name="newIdentityAct32"/>
    <addaction name="bandwidthAct32"/>
    <addaction name="configAct32"/>
+   <addaction name="pluginAddAct32"/>
    <addaction name="separator"/>
    <addaction name="helpAct32"/>
   </widget>
@@ -135,6 +136,18 @@
     <string>Bandwidth Graph</string>
    </property>
   </action>
+  <action name="pluginAddAct32">
+   <property name="icon">
+    <iconset resource="res/vidalia.qrc">
+     <normaloff>:/images/32x32/tab-new.png</normaloff>:/images/32x32/tab-new.png</iconset>
+   </property>
+   <property name="text">
+    <string>Load Plugin</string>
+   </property>
+   <property name="statusTip">
+    <string>Load Plugin</string>
+   </property>
+  </action>
   <action name="helpAct32">
    <property name="icon">
     <iconset resource="res/vidalia.qrc">

Added: vidalia/branches/extension-api/src/vidalia/res/32x32/tab-new.png
===================================================================
(Binary files differ)


Property changes on: vidalia/branches/extension-api/src/vidalia/res/32x32/tab-new.png
___________________________________________________________________
Added: svn:mime-type
   + application/octet-stream

Modified: vidalia/branches/extension-api/src/vidalia/res/vidalia.qrc
===================================================================
--- vidalia/branches/extension-api/src/vidalia/res/vidalia.qrc	2009-08-14 01:15:56 UTC (rev 4039)
+++ vidalia/branches/extension-api/src/vidalia/res/vidalia.qrc	2009-08-14 22:35:50 UTC (rev 4040)
@@ -75,6 +75,7 @@
         <file>32x32/services.png</file>
         <file>32x32/system-help.png</file>
         <file>32x32/system-software-update.png</file>
+        <file>32x32/tab-new.png</file>
         <file>32x32/tor-logo.png</file>
         <file>32x32/tor-off.png</file>
         <file>32x32/tor-on.png</file>