[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>