commit db3a4f43ed310b5e1e1fe778dfe8d6cf3c405ead Author: Tomas Touceda chiiph@gentoo.org Date: Thu Jun 2 14:02:26 2011 -0300
Provide more useful output --- src/vidalia/plugin/DebugDialog.cpp | 41 +++++++++++++--- src/vidalia/plugin/DebugDialog.h | 11 ++++- src/vidalia/plugin/DebugDialog.ui | 38 +++++++++++++++- src/vidalia/plugin/PluginEngine.cpp | 24 ++++++---- src/vidalia/plugin/PluginWrapper.cpp | 83 ++++++++++++++++++++++++++------- src/vidalia/plugin/PluginWrapper.h | 1 + 6 files changed, 159 insertions(+), 39 deletions(-)
diff --git a/src/vidalia/plugin/DebugDialog.cpp b/src/vidalia/plugin/DebugDialog.cpp index b05fbe0..df2aa1e 100644 --- a/src/vidalia/plugin/DebugDialog.cpp +++ b/src/vidalia/plugin/DebugDialog.cpp @@ -1,28 +1,53 @@ #include "DebugDialog.h"
-QStringList DebugDialog::buffer; +QStringList DebugDialog::outputBuffer; +QStringList DebugDialog::syntaxBuffer; +QStringList DebugDialog::exceptBuffer;
DebugDialog::DebugDialog(QWidget *parent) : QDialog(parent) { ui.setupUi(this);
- foreach(QString line, buffer) - ui.textEdit->setPlainText(QString("%1\n%2") - .arg(ui.textEdit->toPlainText()) - .arg(line)); + fillText(ui.tedOutput, outputBuffer); + fillText(ui.tedSyntax, syntaxBuffer); + fillText(ui.tedExceptions, exceptBuffer); }
DebugDialog::~DebugDialog() {}
void -DebugDialog::pDebug(const QString &msg) +DebugDialog::fillText(QTextEdit *tedit, QStringList buffer) +{ + foreach(QString line, buffer) { + tedit->setPlainText(QString("%1\n%2") + .arg(tedit->toPlainText()) + .arg(line)); + } +} + +void +DebugDialog::outputDebug(const QString &msg) +{ + outputBuffer << msg; +} + +void +DebugDialog::syntaxDebug(const QString &msg) +{ + syntaxBuffer << msg; +} + +void +DebugDialog::exceptDebug(const QString &msg) { - buffer << msg; + exceptBuffer << msg; }
void DebugDialog::clear() { - buffer.clear(); + outputBuffer.clear(); + syntaxBuffer.clear(); + exceptBuffer.clear(); } diff --git a/src/vidalia/plugin/DebugDialog.h b/src/vidalia/plugin/DebugDialog.h index ec69c3e..76b3bb6 100644 --- a/src/vidalia/plugin/DebugDialog.h +++ b/src/vidalia/plugin/DebugDialog.h @@ -13,11 +13,18 @@ class DebugDialog : public QDialog DebugDialog(QWidget *parent = 0); ~DebugDialog();
- static void pDebug(const QString &msg); + void fillText(QTextEdit *tedit, QStringList buffer); + + static void outputDebug(const QString &msg); + static void syntaxDebug(const QString &msg); + static void exceptDebug(const QString &msg); + static void clear();
private: - static QStringList buffer; + static QStringList outputBuffer; + static QStringList syntaxBuffer; + static QStringList exceptBuffer;
Ui::DebugDialog ui; }; diff --git a/src/vidalia/plugin/DebugDialog.ui b/src/vidalia/plugin/DebugDialog.ui index 1ad0d2f..1107c3a 100644 --- a/src/vidalia/plugin/DebugDialog.ui +++ b/src/vidalia/plugin/DebugDialog.ui @@ -18,8 +18,42 @@ <normaloff>:/images/16x16/applications-system.png</normaloff>:/images/16x16/applications-system.png</iconset> </property> <layout class="QGridLayout" name="gridLayout"> - <item row="0" column="1" rowspan="2"> - <widget class="QTextEdit" name="textEdit"/> + <item row="0" column="0"> + <widget class="QTabWidget" name="tabWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="outputTab"> + <attribute name="title"> + <string>Plugin Output</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QTextEdit" name="tedOutput"/> + </item> + </layout> + </widget> + <widget class="QWidget" name="syntaxTab"> + <attribute name="title"> + <string>Syntax Errors</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QTextEdit" name="tedSyntax"/> + </item> + </layout> + </widget> + <widget class="QWidget" name="errorTab"> + <attribute name="title"> + <string>Exceptions</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QTextEdit" name="tedExceptions"/> + </item> + </layout> + </widget> + </widget> </item> </layout> </widget> diff --git a/src/vidalia/plugin/PluginEngine.cpp b/src/vidalia/plugin/PluginEngine.cpp index bad9c65..883dc24 100644 --- a/src/vidalia/plugin/PluginEngine.cpp +++ b/src/vidalia/plugin/PluginEngine.cpp @@ -21,16 +21,18 @@ PluginEngine::~PluginEngine() void PluginEngine::loadAllPlugins() { - DebugDialog::pDebug("loadAllPlugins()"); + DebugDialog::outputDebug("Loading all plugins...");
VidaliaSettings settings; QDir path = QDir(settings.pluginPath());
- qWarning() << "PluginPath" << path.absolutePath(); + DebugDialog::outputDebug(QString("PluginPath=%1").arg(path.absolutePath()));
foreach(QString pdir, path.entryList(QDir::NoDotAndDotDot|QDir::AllDirs)) { - qWarning() << "pdir" << pdir; - QFileInfo finfo(QString("%1%2%3").arg(path.absolutePath()).arg(QDir::separator()).arg(pdir)); + QFileInfo finfo(QString("%1%2%3") + .arg(path.absolutePath()) + .arg(QDir::separator()) + .arg(pdir));
if(finfo.isDir()) { tryLoadPlugin(finfo.filePath()); @@ -41,18 +43,22 @@ PluginEngine::loadAllPlugins() void PluginEngine::tryLoadPlugin(QDir path) { - qWarning() << "tryLoadPlugin()" << path.absolutePath(); - QStringList files = path.entryList();
- if(!files.contains("info.xml")) + if(!files.contains("info.xml")) { + DebugDialog::outputDebug(tr("WARNING: %1 doesn't have an info file.") + .arg(path.absolutePath())); return; + }
- PluginWrapper *wrapper = new PluginWrapper(QString("%1%2info.xml").arg(path.absolutePath()).arg(QDir::separator()), this); + PluginWrapper *wrapper = new PluginWrapper(QString("%1%2info.xml") + .arg(path.absolutePath()) + .arg(QDir::separator()), this);
// if it's persistent, start it right away - if(wrapper->isPersistent()) + if(wrapper->isPersistent()) { wrapper->start(); + }
wrappers << wrapper;
diff --git a/src/vidalia/plugin/PluginWrapper.cpp b/src/vidalia/plugin/PluginWrapper.cpp index 8e839fa..2736dbc 100644 --- a/src/vidalia/plugin/PluginWrapper.cpp +++ b/src/vidalia/plugin/PluginWrapper.cpp @@ -1,5 +1,6 @@ #include "PluginWrapper.h" #include "PluginEngine.h" +#include "DebugDialog.h"
#include <QtXml>
@@ -12,13 +13,25 @@ PluginWrapper::PluginWrapper(const QString &info_path, PluginEngine *engine, QOb processInfo(info_path);
foreach(QString path, _files) { - qWarning() << path; + DebugDialog::outputDebug(tr("%1: Processing...").arg(name())); + QFile file(path); if(file.open(QIODevice::ReadOnly)) { - _engine->evaluate(file.readAll()); - qWarning() << "evaluated"; + QString contents = file.readAll(); + QScriptSyntaxCheckResult res = QScriptEngine::checkSyntax(contents); + if(res.state() == QScriptSyntaxCheckResult::Valid) { + DebugDialog::outputDebug("Everything's ok, evaluating..."); + _engine->evaluate(contents); + } else { + DebugDialog::syntaxDebug(tr("%4: ERROR: Line: %1 - Column: %2\n%3") + .arg(res.errorLineNumber()) + .arg(res.errorColumnNumber()) + .arg(res.errorMessage()) + .arg(name())); + } } else - qWarning() << "Error opening file"; + DebugDialog::outputDebug(tr("%1: Error opening file %2") + .arg(name()).arg(path)); } }
@@ -27,17 +40,23 @@ PluginWrapper::~PluginWrapper() {} void PluginWrapper::processInfo(const QString &path) { - qWarning() << "processInfo()"; - QDomDocument info("Plugin Info"); QFile file(path); if(!file.open(QIODevice::ReadOnly)) { - qWarning() << "Problem opening xml file"; + DebugDialog::outputDebug(tr("%2: ERROR: Cannot open %1") + .arg(path).arg(name())); return; }
- if(!info.setContent(&file)) { - qWarning() << "Problem setting contents"; + QString errMsg; + int errLine, errCol; + + if(!info.setContent(&file, false, &errMsg, &errLine, &errCol)) { + DebugDialog::syntaxDebug(tr("%2: ERROR: Parsing %1") + .arg(file.fileName()).arg(name())); + DebugDialog::syntaxDebug(tr("Line: %1 - Column: %2\nMessage: %3") + .arg(errLine).arg(errCol).arg(errMsg)); + file.close(); return; } @@ -82,29 +101,55 @@ PluginWrapper::processInfo(const QString &path) void PluginWrapper::start() { + DebugDialog::outputDebug(tr("%1: Starting...").arg(name())); _engine->evaluate(QString("%1.start()").arg(nspace())); + checkExceptions(); }
void PluginWrapper::stop() { + DebugDialog::outputDebug(tr("%1: Stoping...").arg(name())); _engine->evaluate(QString("%1.stop()").arg(nspace())); + checkExceptions(); }
VidaliaTab * PluginWrapper::buildGUI() { - if(!hasGUI()) + if(!hasGUI()) { + DebugDialog::outputDebug(tr("%1: WARNING: doesn't have a GUI, and buildGUI() was called") + .arg(name())); + if(checkExceptions()) + return NULL; + } + + VidaliaTab *tab = qscriptvalue_cast<VidaliaTab *>( + _engine->evaluate(QString("%1.buildGUI()").arg(nspace()))); + + if(checkExceptions()) return NULL; - VidaliaTab *tab = qscriptvalue_cast<VidaliaTab *>(_engine->evaluate(QString("%1.buildGUI()").arg(nspace()))); + + return tab; +} + +bool +PluginWrapper::checkExceptions() +{ if(_engine->hasUncaughtException()) { - qWarning() << "Exception:"; - qWarning() << _engine->uncaughtExceptionLineNumber(); + DebugDialog::exceptDebug(tr("%2:\n*** Exception in line %1") + .arg(_engine->uncaughtExceptionLineNumber()) + .arg(name())); + DebugDialog::exceptDebug(tr("*** Backtrace:")); + foreach(QString line, _engine->uncaughtExceptionBacktrace()) + DebugDialog::exceptDebug(line);
- return NULL; + _engine->clearExceptions(); + + return true; } - qWarning() << "Casted tab:" << tab << nspace(); - return tab; + + return false; }
bool @@ -122,6 +167,8 @@ PluginWrapper::isPersistent() QString PluginWrapper::name() const { + if(_name.isEmpty()) + return tr("(untitled)"); return _name; }
@@ -173,6 +220,6 @@ PluginWrapper::emitPluginTab() if(tab) emit pluginTab(tab); else - // TODO: make this more than a console print - qWarning() << "Error: buildGUI() failed for plugin" << name(); + DebugDialog::exceptDebug(tr("Error: buildGUI() failed for plugin %1") + .arg(name())); } diff --git a/src/vidalia/plugin/PluginWrapper.h b/src/vidalia/plugin/PluginWrapper.h index d99538c..15f7853 100644 --- a/src/vidalia/plugin/PluginWrapper.h +++ b/src/vidalia/plugin/PluginWrapper.h @@ -38,6 +38,7 @@ class PluginWrapper : public QObject {
protected: void processInfo(const QString &path); + bool checkExceptions();
PluginEngine *_engine; QString _name, _date, _author;