[tor-commits] [vidalia/alpha] Add all the generated classes as automatically generated qtscript extensions

chiiph at torproject.org chiiph at torproject.org
Sat Jul 21 19:17:47 UTC 2012


commit f85ab165ce2f9868c43940822d74dbc5972a45ea
Author: Tomás Touceda <chiiph at torproject.org>
Date:   Tue Jul 17 19:27:23 2012 -0300

    Add all the generated classes as automatically generated qtscript extensions
    
    RouterStatus is a QObject now.
---
 src/torcontrol/RouterStatus.cpp                    |   38 ++
 src/torcontrol/RouterStatus.h                      |    9 +-
 src/vidalia/CMakeLists.txt                         |   22 +
 .../plugin/extensions/VidaliaExtensionsInit.cpp    |   51 ++-
 .../plugin/extensions/qtscript_BootstrapStatus.cpp |  393 ++++++++++++++
 src/vidalia/plugin/extensions/qtscript_Circuit.cpp |  542 +++++++++++++++++++
 .../plugin/extensions/qtscript_ControlCommand.cpp  |  206 +++++++
 .../extensions/qtscript_ControlConnection.cpp      |  344 ++++++++++++
 .../plugin/extensions/qtscript_ControlMethod.cpp   |  199 +++++++
 .../plugin/extensions/qtscript_ControlReply.cpp    |  199 +++++++
 .../plugin/extensions/qtscript_ControlSocket.cpp   |  278 ++++++++++
 .../plugin/extensions/qtscript_ReplyLine.cpp       |  215 ++++++++
 .../extensions/qtscript_RouterDescriptor.cpp       |  561 ++++++++++++++++++++
 .../plugin/extensions/qtscript_RouterStatus.cpp    |  344 ++++++++++++
 .../extensions/qtscript_SendCommandEvent.cpp       |  134 +++++
 src/vidalia/plugin/extensions/qtscript_Stream.cpp  |  413 ++++++++++++++
 .../plugin/extensions/qtscript_TorControl.cpp      |  119 ++++-
 .../plugin/extensions/qtscript_TorEvents.cpp       |  297 +++++++++++
 .../plugin/extensions/qtscript_TorProcess.cpp      |  232 ++++++++
 .../plugin/extensions/qtscript_TorSignal.cpp       |  196 +++++++
 .../extensions/qtscriptshell_ControlConnection.cpp |   95 ++++
 .../extensions/qtscriptshell_ControlConnection.h   |   23 +
 .../extensions/qtscriptshell_ControlMethod.cpp     |   13 +
 .../extensions/qtscriptshell_ControlMethod.h       |   18 +
 .../extensions/qtscriptshell_ControlSocket.cpp     |   94 ++++
 .../extensions/qtscriptshell_ControlSocket.h       |   23 +
 .../plugin/extensions/qtscriptshell_TorControl.cpp |   99 ++++
 .../plugin/extensions/qtscriptshell_TorControl.h   |   23 +
 .../plugin/extensions/qtscriptshell_TorEvents.cpp  |  100 ++++
 .../plugin/extensions/qtscriptshell_TorEvents.h    |   23 +
 .../plugin/extensions/qtscriptshell_TorProcess.cpp |  306 +++++++++++
 .../plugin/extensions/qtscriptshell_TorProcess.h   |   40 ++
 .../plugin/extensions/qtscriptshell_TorSignal.cpp  |   13 +
 .../plugin/extensions/qtscriptshell_TorSignal.h    |   18 +
 34 files changed, 5658 insertions(+), 22 deletions(-)

diff --git a/src/torcontrol/RouterStatus.cpp b/src/torcontrol/RouterStatus.cpp
index 49e6cb1..d750a3f 100644
--- a/src/torcontrol/RouterStatus.cpp
+++ b/src/torcontrol/RouterStatus.cpp
@@ -22,6 +22,43 @@
 #define TIME_FORMAT  "yyyy-MM-dd HH:mm:ss"
 
 
+RouterStatus::RouterStatus()
+  : QObject()
+{}
+
+RouterStatus::RouterStatus(const RouterStatus &rs)
+{
+  _valid = rs._valid;
+  _name = rs._name;
+  _id = rs._id;
+  _digest = rs._digest;
+  _published = rs._published;
+  _ipAddress = rs._ipAddress;
+  _orPort = rs._orPort;
+  _dirPort = rs._dirPort;
+  _flags = rs._flags;
+  _bandwidth = rs._bandwidth;
+}
+
+RouterStatus::~RouterStatus() {}
+
+RouterStatus &
+RouterStatus::operator=(const RouterStatus &rs)
+{
+  _valid = rs._valid;
+  _name = rs._name;
+  _id = rs._id;
+  _digest = rs._digest;
+  _published = rs._published;
+  _ipAddress = rs._ipAddress;
+  _orPort = rs._orPort;
+  _dirPort = rs._dirPort;
+  _flags = rs._flags;
+  _bandwidth = rs._bandwidth;
+
+  return *this;
+}
+
 /** Constructor. Parses <b>status</b> for router status information. The given
  * string should match the router status entry format from Tor's dir-spec.txt.
  * The currently recognized lines are:
@@ -34,6 +71,7 @@
  *
  * */
 RouterStatus::RouterStatus(const QStringList &status)
+  : QObject()
 {
   bool ok;
 
diff --git a/src/torcontrol/RouterStatus.h b/src/torcontrol/RouterStatus.h
index ee136b1..d0da655 100644
--- a/src/torcontrol/RouterStatus.h
+++ b/src/torcontrol/RouterStatus.h
@@ -22,7 +22,7 @@
 #include <QDateTime>
 
 
-class RouterStatus
+class RouterStatus : public QObject
 {
 public:
   /** Possible router status flags. */
@@ -45,7 +45,14 @@ public:
   Q_DECLARE_FLAGS(Flags, Flag)
 
   /** Constructor. */
+  RouterStatus();
+  RouterStatus(const RouterStatus &rs);
+  /** Constructor. */
   RouterStatus(const QStringList &status);
+  /** Destructor */
+  ~RouterStatus();
+
+  RouterStatus &operator=(const RouterStatus &other);
 
   /** Returns the router's hexadecimal-encoded router identity key digest. */
   QString id() const { return _id; }
diff --git a/src/vidalia/CMakeLists.txt b/src/vidalia/CMakeLists.txt
index 312191d..58d846d 100644
--- a/src/vidalia/CMakeLists.txt
+++ b/src/vidalia/CMakeLists.txt
@@ -94,7 +94,29 @@ set(vidalia_SRCS ${vidalia_SRCS}
   plugin/prototypes/TorrcPrototype.cpp
   plugin/extensions/VidaliaExtensions.cpp
   plugin/extensions/VidaliaExtensionsInit.cpp
+  plugin/extensions/qtscript_BootstrapStatus.cpp
+  plugin/extensions/qtscript_Circuit.cpp
+  plugin/extensions/qtscript_ControlCommand.cpp
+  plugin/extensions/qtscript_ControlConnection.cpp
+  plugin/extensions/qtscript_ControlMethod.cpp
+  plugin/extensions/qtscript_ControlReply.cpp
+  plugin/extensions/qtscript_ControlSocket.cpp
+  plugin/extensions/qtscript_ReplyLine.cpp
+  plugin/extensions/qtscript_RouterDescriptor.cpp
+  plugin/extensions/qtscript_RouterStatus.cpp
+  plugin/extensions/qtscript_SendCommandEvent.cpp
+  plugin/extensions/qtscript_Stream.cpp
   plugin/extensions/qtscript_TorControl.cpp
+  plugin/extensions/qtscript_TorEvents.cpp
+  plugin/extensions/qtscript_TorProcess.cpp
+  plugin/extensions/qtscript_TorSignal.cpp
+  plugin/extensions/qtscriptshell_ControlConnection.cpp
+  plugin/extensions/qtscriptshell_ControlMethod.cpp
+  plugin/extensions/qtscriptshell_ControlSocket.cpp
+  plugin/extensions/qtscriptshell_TorControl.cpp
+  plugin/extensions/qtscriptshell_TorEvents.cpp
+  plugin/extensions/qtscriptshell_TorProcess.cpp
+  plugin/extensions/qtscriptshell_TorSignal.cpp
 )
 qt4_wrap_cpp(vidalia_SRCS
   plugin/PluginEngine.h
diff --git a/src/vidalia/plugin/extensions/VidaliaExtensionsInit.cpp b/src/vidalia/plugin/extensions/VidaliaExtensionsInit.cpp
index 0dd4887..75b75d6 100644
--- a/src/vidalia/plugin/extensions/VidaliaExtensionsInit.cpp
+++ b/src/vidalia/plugin/extensions/VidaliaExtensionsInit.cpp
@@ -1,17 +1,62 @@
 #include <QtScript/QScriptValue>
 #include <QtScript/QScriptEngine>
 
-const int classCount = 1;
+const int classCount = 16;
 
 QScriptValue qtscript_create_TorControl_class(QScriptEngine *engine);
+QScriptValue qtscript_create_Circuit_class(QScriptEngine *engine);
+QScriptValue qtscript_create_RouterDescriptor_class(QScriptEngine *engine);
+QScriptValue qtscript_create_BootstrapStatus_class(QScriptEngine *engine);
+QScriptValue qtscript_create_TorSignal_class(QScriptEngine *engine);
+QScriptValue qtscript_create_ControlCommand_class(QScriptEngine *engine);
+QScriptValue qtscript_create_ControlMethod_class(QScriptEngine *engine);
+QScriptValue qtscript_create_ReplyLine_class(QScriptEngine *engine);
+QScriptValue qtscript_create_Stream_class(QScriptEngine *engine);
+QScriptValue qtscript_create_ControlReply_class(QScriptEngine *engine);
+QScriptValue qtscript_create_RouterStatus_class(QScriptEngine *engine);
+QScriptValue qtscript_create_ControlConnection_class(QScriptEngine *engine);
+QScriptValue qtscript_create_TorEvents_class(QScriptEngine *engine);
+QScriptValue qtscript_create_ControlSocket_class(QScriptEngine *engine);
+QScriptValue qtscript_create_SendCommandEvent_class(QScriptEngine *engine);
+QScriptValue qtscript_create_TorProcess_class(QScriptEngine *engine);
 
 static const char * const vidalia_class_names[] = {
-  "TorControl"
+    "Circuit"
+    , "RouterDescriptor"
+    , "BootstrapStatus"
+    , "TorSignal"
+    , "ControlCommand"
+    , "ControlMethod"
+    , "ReplyLine"
+    , "Stream"
+    , "ControlReply"
+    , "RouterStatus"
+    , "ControlConnection"
+    , "TorControl"
+    , "TorEvents"
+    , "ControlSocket"
+    , "SendCommandEvent"
+    , "TorProcess"
 };
 
 typedef QScriptValue (*QtBindingCreator)(QScriptEngine *engine);
 static const QtBindingCreator vidalia_class_functions[] = {
-  qtscript_create_TorControl_class
+    qtscript_create_Circuit_class
+    , qtscript_create_RouterDescriptor_class
+    , qtscript_create_BootstrapStatus_class
+    , qtscript_create_TorSignal_class
+    , qtscript_create_ControlCommand_class
+    , qtscript_create_ControlMethod_class
+    , qtscript_create_ReplyLine_class
+    , qtscript_create_Stream_class
+    , qtscript_create_ControlReply_class
+    , qtscript_create_RouterStatus_class
+    , qtscript_create_ControlConnection_class
+    , qtscript_create_TorControl_class
+    , qtscript_create_TorEvents_class
+    , qtscript_create_ControlSocket_class
+    , qtscript_create_SendCommandEvent_class
+    , qtscript_create_TorProcess_class
 };
 
 void vidalia_initialize_bindings(QScriptValue &extensionObject)
diff --git a/src/vidalia/plugin/extensions/qtscript_BootstrapStatus.cpp b/src/vidalia/plugin/extensions/qtscript_BootstrapStatus.cpp
new file mode 100644
index 0000000..f9e0ad4
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_BootstrapStatus.cpp
@@ -0,0 +1,393 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <BootstrapStatus.h>
+#include <QVariant>
+
+static const char * const qtscript_BootstrapStatus_function_names[] = {
+    "BootstrapStatus"
+    // static
+    , "actionFromString"
+    , "statusFromString"
+    // prototype
+    , "description"
+    , "isValid"
+    , "percentComplete"
+    , "recommendedAction"
+    , "status"
+    , "warning"
+    , "toString"
+};
+
+static const char * const qtscript_BootstrapStatus_function_signatures[] = {
+    ""
+    // static
+    , "String str"
+    , "String tag"
+    // prototype
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+""
+};
+
+static const int qtscript_BootstrapStatus_function_lengths[] = {
+    0
+    // static
+    , 1
+    , 1
+    // prototype
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+};
+
+static QScriptValue qtscript_BootstrapStatus_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("BootstrapStatus::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(BootstrapStatus*)
+Q_DECLARE_METATYPE(BootstrapStatus::Recommendation)
+Q_DECLARE_METATYPE(BootstrapStatus::Status)
+
+static QScriptValue qtscript_create_enum_class_helper(
+    QScriptEngine *engine,
+    QScriptEngine::FunctionSignature construct,
+    QScriptEngine::FunctionSignature valueOf,
+    QScriptEngine::FunctionSignature toString)
+{
+    QScriptValue proto = engine->newObject();
+    proto.setProperty(QString::fromLatin1("valueOf"),
+        engine->newFunction(valueOf), QScriptValue::SkipInEnumeration);
+    proto.setProperty(QString::fromLatin1("toString"),
+        engine->newFunction(toString), QScriptValue::SkipInEnumeration);
+    return engine->newFunction(construct, proto, 1);
+}
+
+//
+// BootstrapStatus::Recommendation
+//
+
+static const BootstrapStatus::Recommendation qtscript_BootstrapStatus_Recommendation_values[] = {
+    BootstrapStatus::UnrecognizedRecommendation
+    , BootstrapStatus::RecommendIgnore
+    , BootstrapStatus::RecommendWarn
+};
+
+static const char * const qtscript_BootstrapStatus_Recommendation_keys[] = {
+    "UnrecognizedRecommendation"
+    , "RecommendIgnore"
+    , "RecommendWarn"
+};
+
+static QString qtscript_BootstrapStatus_Recommendation_toStringHelper(BootstrapStatus::Recommendation value)
+{
+    if ((value >= BootstrapStatus::UnrecognizedRecommendation) && (value <= BootstrapStatus::RecommendWarn))
+        return qtscript_BootstrapStatus_Recommendation_keys[static_cast<int>(value)-static_cast<int>(BootstrapStatus::UnrecognizedRecommendation)];
+    return QString();
+}
+
+static QScriptValue qtscript_BootstrapStatus_Recommendation_toScriptValue(QScriptEngine *engine, const BootstrapStatus::Recommendation &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("BootstrapStatus"));
+    return clazz.property(qtscript_BootstrapStatus_Recommendation_toStringHelper(value));
+}
+
+static void qtscript_BootstrapStatus_Recommendation_fromScriptValue(const QScriptValue &value, BootstrapStatus::Recommendation &out)
+{
+    out = qvariant_cast<BootstrapStatus::Recommendation>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_BootstrapStatus_Recommendation(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    if ((arg >= BootstrapStatus::UnrecognizedRecommendation) && (arg <= BootstrapStatus::RecommendWarn))
+        return qScriptValueFromValue(engine,  static_cast<BootstrapStatus::Recommendation>(arg));
+    return context->throwError(QString::fromLatin1("Recommendation(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_BootstrapStatus_Recommendation_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    BootstrapStatus::Recommendation value = qscriptvalue_cast<BootstrapStatus::Recommendation>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_BootstrapStatus_Recommendation_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    BootstrapStatus::Recommendation value = qscriptvalue_cast<BootstrapStatus::Recommendation>(context->thisObject());
+    return QScriptValue(engine, qtscript_BootstrapStatus_Recommendation_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_BootstrapStatus_Recommendation_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_BootstrapStatus_Recommendation,
+        qtscript_BootstrapStatus_Recommendation_valueOf, qtscript_BootstrapStatus_Recommendation_toString);
+    qScriptRegisterMetaType<BootstrapStatus::Recommendation>(engine, qtscript_BootstrapStatus_Recommendation_toScriptValue,
+        qtscript_BootstrapStatus_Recommendation_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 3; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_BootstrapStatus_Recommendation_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_BootstrapStatus_Recommendation_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// BootstrapStatus::Status
+//
+
+static const BootstrapStatus::Status qtscript_BootstrapStatus_Status_values[] = {
+    BootstrapStatus::UnrecognizedStatus
+    , BootstrapStatus::ConnectingToDirMirror
+    , BootstrapStatus::HandshakingWithDirMirror
+    , BootstrapStatus::CreatingOneHopCircuit
+    , BootstrapStatus::RequestingNetworkStatus
+    , BootstrapStatus::LoadingNetworkStatus
+    , BootstrapStatus::LoadingAuthorityCertificates
+    , BootstrapStatus::RequestingDescriptors
+    , BootstrapStatus::LoadingDescriptors
+    , BootstrapStatus::ConnectingToEntryGuard
+    , BootstrapStatus::HandshakingWithEntryGuard
+    , BootstrapStatus::EstablishingCircuit
+    , BootstrapStatus::BootstrappingDone
+};
+
+static const char * const qtscript_BootstrapStatus_Status_keys[] = {
+    "UnrecognizedStatus"
+    , "ConnectingToDirMirror"
+    , "HandshakingWithDirMirror"
+    , "CreatingOneHopCircuit"
+    , "RequestingNetworkStatus"
+    , "LoadingNetworkStatus"
+    , "LoadingAuthorityCertificates"
+    , "RequestingDescriptors"
+    , "LoadingDescriptors"
+    , "ConnectingToEntryGuard"
+    , "HandshakingWithEntryGuard"
+    , "EstablishingCircuit"
+    , "BootstrappingDone"
+};
+
+static QString qtscript_BootstrapStatus_Status_toStringHelper(BootstrapStatus::Status value)
+{
+    if ((value >= BootstrapStatus::UnrecognizedStatus) && (value <= BootstrapStatus::BootstrappingDone))
+        return qtscript_BootstrapStatus_Status_keys[static_cast<int>(value)-static_cast<int>(BootstrapStatus::UnrecognizedStatus)];
+    return QString();
+}
+
+static QScriptValue qtscript_BootstrapStatus_Status_toScriptValue(QScriptEngine *engine, const BootstrapStatus::Status &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("BootstrapStatus"));
+    return clazz.property(qtscript_BootstrapStatus_Status_toStringHelper(value));
+}
+
+static void qtscript_BootstrapStatus_Status_fromScriptValue(const QScriptValue &value, BootstrapStatus::Status &out)
+{
+    out = qvariant_cast<BootstrapStatus::Status>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_BootstrapStatus_Status(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    if ((arg >= BootstrapStatus::UnrecognizedStatus) && (arg <= BootstrapStatus::BootstrappingDone))
+        return qScriptValueFromValue(engine,  static_cast<BootstrapStatus::Status>(arg));
+    return context->throwError(QString::fromLatin1("Status(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_BootstrapStatus_Status_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    BootstrapStatus::Status value = qscriptvalue_cast<BootstrapStatus::Status>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_BootstrapStatus_Status_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    BootstrapStatus::Status value = qscriptvalue_cast<BootstrapStatus::Status>(context->thisObject());
+    return QScriptValue(engine, qtscript_BootstrapStatus_Status_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_BootstrapStatus_Status_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_BootstrapStatus_Status,
+        qtscript_BootstrapStatus_Status_valueOf, qtscript_BootstrapStatus_Status_toString);
+    qScriptRegisterMetaType<BootstrapStatus::Status>(engine, qtscript_BootstrapStatus_Status_toScriptValue,
+        qtscript_BootstrapStatus_Status_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 13; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_BootstrapStatus_Status_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_BootstrapStatus_Status_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// BootstrapStatus
+//
+
+static QScriptValue qtscript_BootstrapStatus_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 6;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    BootstrapStatus* _q_self = qscriptvalue_cast<BootstrapStatus*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("BootstrapStatus.%0(): this object is not a BootstrapStatus")
+            .arg(qtscript_BootstrapStatus_function_names[_id+3]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->description();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->isValid();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 0) {
+        int _q_result = _q_self->percentComplete();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 0) {
+        BootstrapStatus::Recommendation _q_result = _q_self->recommendedAction();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 0) {
+        BootstrapStatus::Status _q_result = _q_self->status();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 5:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->warning();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 6: {
+    QString result = QString::fromLatin1("BootstrapStatus");
+    return QScriptValue(context->engine(), result);
+    }
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_BootstrapStatus_throw_ambiguity_error_helper(context,
+        qtscript_BootstrapStatus_function_names[_id+3],
+        qtscript_BootstrapStatus_function_signatures[_id+3]);
+}
+
+static QScriptValue qtscript_BootstrapStatus_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("BootstrapStatus(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        BootstrapStatus* _q_cpp_result = new BootstrapStatus();
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        BootstrapStatus::Recommendation _q_result = BootstrapStatus::actionFromString(_q_arg0);
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        BootstrapStatus::Status _q_result = BootstrapStatus::statusFromString(_q_arg0);
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_BootstrapStatus_throw_ambiguity_error_helper(context,
+        qtscript_BootstrapStatus_function_names[_id],
+        qtscript_BootstrapStatus_function_signatures[_id]);
+}
+
+QScriptValue qtscript_create_BootstrapStatus_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<BootstrapStatus*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((BootstrapStatus*)0));
+    for (int i = 0; i < 7; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_BootstrapStatus_prototype_call, qtscript_BootstrapStatus_function_lengths[i+3]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_BootstrapStatus_function_names[i+3]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    engine->setDefaultPrototype(qMetaTypeId<BootstrapStatus*>(), proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_BootstrapStatus_static_call, proto, qtscript_BootstrapStatus_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+    for (int i = 0; i < 2; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_BootstrapStatus_static_call,
+            qtscript_BootstrapStatus_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i+1)));
+        ctor.setProperty(QString::fromLatin1(qtscript_BootstrapStatus_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    ctor.setProperty(QString::fromLatin1("Recommendation"),
+        qtscript_create_BootstrapStatus_Recommendation_class(engine, ctor));
+    ctor.setProperty(QString::fromLatin1("Status"),
+        qtscript_create_BootstrapStatus_Status_class(engine, ctor));
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_Circuit.cpp b/src/vidalia/plugin/extensions/qtscript_Circuit.cpp
new file mode 100644
index 0000000..f7a15ee
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_Circuit.cpp
@@ -0,0 +1,542 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <Circuit.h>
+#include <QVariant>
+#include <qstringlist.h>
+
+static const char * const qtscript_Circuit_function_names[] = {
+    "Circuit"
+    // static
+    , "isValidCircuitId"
+    , "toStatus"
+    , "tr"
+    , "trUtf8"
+    // prototype
+    , "id"
+    , "isValid"
+    , "length"
+    , "purpose"
+    , "routerIDs"
+    , "routerNames"
+    , "status"
+    , "statusString"
+    , "toString"
+};
+
+static const char * const qtscript_Circuit_function_signatures[] = {
+    "\nString circuit"
+    // static
+    , "String circId"
+    , "String strStatus"
+    , "char sourceText, char disambiguation\nchar sourceText, char disambiguation, int n"
+    , "char sourceText, char disambiguation\nchar sourceText, char disambiguation, int n"
+    // prototype
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+""
+};
+
+static const int qtscript_Circuit_function_lengths[] = {
+    1
+    // static
+    , 1
+    , 1
+    , 3
+    , 3
+    // prototype
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+};
+
+static QScriptValue qtscript_Circuit_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("Circuit::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(Circuit*)
+Q_DECLARE_METATYPE(Circuit::Purpose)
+Q_DECLARE_METATYPE(Circuit::BuildFlag)
+Q_DECLARE_METATYPE(Circuit::Status)
+Q_DECLARE_METATYPE(char*)
+
+static QScriptValue qtscript_create_enum_class_helper(
+    QScriptEngine *engine,
+    QScriptEngine::FunctionSignature construct,
+    QScriptEngine::FunctionSignature valueOf,
+    QScriptEngine::FunctionSignature toString)
+{
+    QScriptValue proto = engine->newObject();
+    proto.setProperty(QString::fromLatin1("valueOf"),
+        engine->newFunction(valueOf), QScriptValue::SkipInEnumeration);
+    proto.setProperty(QString::fromLatin1("toString"),
+        engine->newFunction(toString), QScriptValue::SkipInEnumeration);
+    return engine->newFunction(construct, proto, 1);
+}
+
+//
+// Circuit::Purpose
+//
+
+static const Circuit::Purpose qtscript_Circuit_Purpose_values[] = {
+    Circuit::General
+    , Circuit::HsClientIntro
+    , Circuit::HsClientRend
+    , Circuit::HsServiceIntro
+    , Circuit::HsServiceRend
+    , Circuit::Testing
+    , Circuit::Controller
+};
+
+static const char * const qtscript_Circuit_Purpose_keys[] = {
+    "General"
+    , "HsClientIntro"
+    , "HsClientRend"
+    , "HsServiceIntro"
+    , "HsServiceRend"
+    , "Testing"
+    , "Controller"
+};
+
+static QString qtscript_Circuit_Purpose_toStringHelper(Circuit::Purpose value)
+{
+    if ((value >= Circuit::General) && (value <= Circuit::Controller))
+        return qtscript_Circuit_Purpose_keys[static_cast<int>(value)-static_cast<int>(Circuit::General)];
+    return QString();
+}
+
+static QScriptValue qtscript_Circuit_Purpose_toScriptValue(QScriptEngine *engine, const Circuit::Purpose &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("Circuit"));
+    return clazz.property(qtscript_Circuit_Purpose_toStringHelper(value));
+}
+
+static void qtscript_Circuit_Purpose_fromScriptValue(const QScriptValue &value, Circuit::Purpose &out)
+{
+    out = qvariant_cast<Circuit::Purpose>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_Circuit_Purpose(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    if ((arg >= Circuit::General) && (arg <= Circuit::Controller))
+        return qScriptValueFromValue(engine,  static_cast<Circuit::Purpose>(arg));
+    return context->throwError(QString::fromLatin1("Purpose(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_Circuit_Purpose_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    Circuit::Purpose value = qscriptvalue_cast<Circuit::Purpose>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_Circuit_Purpose_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    Circuit::Purpose value = qscriptvalue_cast<Circuit::Purpose>(context->thisObject());
+    return QScriptValue(engine, qtscript_Circuit_Purpose_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_Circuit_Purpose_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_Circuit_Purpose,
+        qtscript_Circuit_Purpose_valueOf, qtscript_Circuit_Purpose_toString);
+    qScriptRegisterMetaType<Circuit::Purpose>(engine, qtscript_Circuit_Purpose_toScriptValue,
+        qtscript_Circuit_Purpose_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 7; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_Circuit_Purpose_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_Circuit_Purpose_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// Circuit::BuildFlag
+//
+
+static const Circuit::BuildFlag qtscript_Circuit_BuildFlag_values[] = {
+    Circuit::None
+    , Circuit::OneHopTunnel
+    , Circuit::IsInternal
+    , Circuit::NeedCapacity
+    , Circuit::NeedUptime
+};
+
+static const char * const qtscript_Circuit_BuildFlag_keys[] = {
+    "None"
+    , "OneHopTunnel"
+    , "IsInternal"
+    , "NeedCapacity"
+    , "NeedUptime"
+};
+
+static QString qtscript_Circuit_BuildFlag_toStringHelper(Circuit::BuildFlag value)
+{
+    for (int i = 0; i < 5; ++i) {
+        if (qtscript_Circuit_BuildFlag_values[i] == value)
+            return QString::fromLatin1(qtscript_Circuit_BuildFlag_keys[i]);
+    }
+    return QString();
+}
+
+static QScriptValue qtscript_Circuit_BuildFlag_toScriptValue(QScriptEngine *engine, const Circuit::BuildFlag &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("Circuit"));
+    return clazz.property(qtscript_Circuit_BuildFlag_toStringHelper(value));
+}
+
+static void qtscript_Circuit_BuildFlag_fromScriptValue(const QScriptValue &value, Circuit::BuildFlag &out)
+{
+    out = qvariant_cast<Circuit::BuildFlag>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_Circuit_BuildFlag(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    for (int i = 0; i < 5; ++i) {
+        if (qtscript_Circuit_BuildFlag_values[i] == arg)
+            return qScriptValueFromValue(engine,  static_cast<Circuit::BuildFlag>(arg));
+    }
+    return context->throwError(QString::fromLatin1("BuildFlag(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_Circuit_BuildFlag_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    Circuit::BuildFlag value = qscriptvalue_cast<Circuit::BuildFlag>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_Circuit_BuildFlag_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    Circuit::BuildFlag value = qscriptvalue_cast<Circuit::BuildFlag>(context->thisObject());
+    return QScriptValue(engine, qtscript_Circuit_BuildFlag_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_Circuit_BuildFlag_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_Circuit_BuildFlag,
+        qtscript_Circuit_BuildFlag_valueOf, qtscript_Circuit_BuildFlag_toString);
+    qScriptRegisterMetaType<Circuit::BuildFlag>(engine, qtscript_Circuit_BuildFlag_toScriptValue,
+        qtscript_Circuit_BuildFlag_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 5; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_Circuit_BuildFlag_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_Circuit_BuildFlag_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// Circuit::Status
+//
+
+static const Circuit::Status qtscript_Circuit_Status_values[] = {
+    Circuit::Unknown
+    , Circuit::Launched
+    , Circuit::Built
+    , Circuit::Extended
+    , Circuit::Failed
+    , Circuit::Closed
+};
+
+static const char * const qtscript_Circuit_Status_keys[] = {
+    "Unknown"
+    , "Launched"
+    , "Built"
+    , "Extended"
+    , "Failed"
+    , "Closed"
+};
+
+static QString qtscript_Circuit_Status_toStringHelper(Circuit::Status value)
+{
+    if ((value >= Circuit::Unknown) && (value <= Circuit::Closed))
+        return qtscript_Circuit_Status_keys[static_cast<int>(value)-static_cast<int>(Circuit::Unknown)];
+    return QString();
+}
+
+static QScriptValue qtscript_Circuit_Status_toScriptValue(QScriptEngine *engine, const Circuit::Status &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("Circuit"));
+    return clazz.property(qtscript_Circuit_Status_toStringHelper(value));
+}
+
+static void qtscript_Circuit_Status_fromScriptValue(const QScriptValue &value, Circuit::Status &out)
+{
+    out = qvariant_cast<Circuit::Status>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_Circuit_Status(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    if ((arg >= Circuit::Unknown) && (arg <= Circuit::Closed))
+        return qScriptValueFromValue(engine,  static_cast<Circuit::Status>(arg));
+    return context->throwError(QString::fromLatin1("Status(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_Circuit_Status_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    Circuit::Status value = qscriptvalue_cast<Circuit::Status>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_Circuit_Status_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    Circuit::Status value = qscriptvalue_cast<Circuit::Status>(context->thisObject());
+    return QScriptValue(engine, qtscript_Circuit_Status_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_Circuit_Status_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_Circuit_Status,
+        qtscript_Circuit_Status_valueOf, qtscript_Circuit_Status_toString);
+    qScriptRegisterMetaType<Circuit::Status>(engine, qtscript_Circuit_Status_toScriptValue,
+        qtscript_Circuit_Status_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 6; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_Circuit_Status_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_Circuit_Status_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// Circuit
+//
+
+static QScriptValue qtscript_Circuit_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 8;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    Circuit* _q_self = qscriptvalue_cast<Circuit*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("Circuit.%0(): this object is not a Circuit")
+            .arg(qtscript_Circuit_function_names[_id+5]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->id();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->isValid();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 0) {
+        uint _q_result = _q_self->length();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 0) {
+        Circuit::Purpose _q_result = _q_self->purpose();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 0) {
+        QStringList _q_result = _q_self->routerIDs();
+        return qScriptValueFromSequence(context->engine(), _q_result);
+    }
+    break;
+
+    case 5:
+    if (context->argumentCount() == 0) {
+        QStringList _q_result = _q_self->routerNames();
+        return qScriptValueFromSequence(context->engine(), _q_result);
+    }
+    break;
+
+    case 6:
+    if (context->argumentCount() == 0) {
+        Circuit::Status _q_result = _q_self->status();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 7:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->statusString();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 8: {
+    QString result = QString::fromLatin1("Circuit");
+    return QScriptValue(context->engine(), result);
+    }
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_Circuit_throw_ambiguity_error_helper(context,
+        qtscript_Circuit_function_names[_id+5],
+        qtscript_Circuit_function_signatures[_id+5]);
+}
+
+static QScriptValue qtscript_Circuit_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("Circuit(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        Circuit* _q_cpp_result = new Circuit();
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    } else if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        Circuit* _q_cpp_result = new Circuit(_q_arg0);
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        bool _q_result = Circuit::isValidCircuitId(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        Circuit::Status _q_result = Circuit::toStatus(_q_arg0);
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 1) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        QString _q_result = Circuit::tr(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 2) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        QString _q_result = Circuit::tr(_q_arg0, _q_arg1);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 3) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        int _q_arg2 = context->argument(2).toInt32();
+        QString _q_result = Circuit::tr(_q_arg0, _q_arg1, _q_arg2);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 1) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        QString _q_result = Circuit::trUtf8(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 2) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        QString _q_result = Circuit::trUtf8(_q_arg0, _q_arg1);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 3) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        int _q_arg2 = context->argument(2).toInt32();
+        QString _q_result = Circuit::trUtf8(_q_arg0, _q_arg1, _q_arg2);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_Circuit_throw_ambiguity_error_helper(context,
+        qtscript_Circuit_function_names[_id],
+        qtscript_Circuit_function_signatures[_id]);
+}
+
+QScriptValue qtscript_create_Circuit_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<Circuit*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((Circuit*)0));
+    for (int i = 0; i < 9; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_Circuit_prototype_call, qtscript_Circuit_function_lengths[i+5]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_Circuit_function_names[i+5]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    engine->setDefaultPrototype(qMetaTypeId<Circuit*>(), proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_Circuit_static_call, proto, qtscript_Circuit_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+    for (int i = 0; i < 4; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_Circuit_static_call,
+            qtscript_Circuit_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i+1)));
+        ctor.setProperty(QString::fromLatin1(qtscript_Circuit_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    ctor.setProperty(QString::fromLatin1("Purpose"),
+        qtscript_create_Circuit_Purpose_class(engine, ctor));
+    ctor.setProperty(QString::fromLatin1("BuildFlag"),
+        qtscript_create_Circuit_BuildFlag_class(engine, ctor));
+    ctor.setProperty(QString::fromLatin1("Status"),
+        qtscript_create_Circuit_Status_class(engine, ctor));
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_ControlCommand.cpp b/src/vidalia/plugin/extensions/qtscript_ControlCommand.cpp
new file mode 100644
index 0000000..c0e11e4
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_ControlCommand.cpp
@@ -0,0 +1,206 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <ControlCommand.h>
+#include <QVariant>
+#include <qstringlist.h>
+
+static const char * const qtscript_ControlCommand_function_names[] = {
+    "ControlCommand"
+    // static
+    // prototype
+    , "addArgument"
+    , "addArguments"
+    , "appendData"
+    , "keyword"
+    , "setKeyword"
+    , "toString"
+};
+
+static const char * const qtscript_ControlCommand_function_signatures[] = {
+    "\nString keyword\nString keyword, String arg\nString keyword, List args"
+    // static
+    // prototype
+    , "String arg"
+    , "List args"
+    , "String data"
+    , ""
+    , "String keyword"
+    , ""
+};
+
+static const int qtscript_ControlCommand_function_lengths[] = {
+    2
+    // static
+    // prototype
+    , 1
+    , 1
+    , 1
+    , 0
+    , 1
+    , 0
+};
+
+static QScriptValue qtscript_ControlCommand_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("ControlCommand::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(ControlCommand*)
+
+//
+// ControlCommand
+//
+
+static QScriptValue qtscript_ControlCommand_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 6;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    ControlCommand* _q_self = qscriptvalue_cast<ControlCommand*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("ControlCommand.%0(): this object is not a ControlCommand")
+            .arg(qtscript_ControlCommand_function_names[_id+1]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        _q_self->addArgument(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 1) {
+        QStringList _q_arg0;
+        qScriptValueToSequence(context->argument(0), _q_arg0);
+        _q_self->addArguments(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        _q_self->appendData(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->keyword();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        _q_self->setKeyword(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 5:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->toString();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_ControlCommand_throw_ambiguity_error_helper(context,
+        qtscript_ControlCommand_function_names[_id+1],
+        qtscript_ControlCommand_function_signatures[_id+1]);
+}
+
+static QScriptValue qtscript_ControlCommand_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("ControlCommand(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        ControlCommand* _q_cpp_result = new ControlCommand();
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    } else if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        ControlCommand* _q_cpp_result = new ControlCommand(_q_arg0);
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    } else if (context->argumentCount() == 2) {
+        if (context->argument(0).isString()
+            && context->argument(1).isString()) {
+            QString _q_arg0 = context->argument(0).toString();
+            QString _q_arg1 = context->argument(1).toString();
+            ControlCommand* _q_cpp_result = new ControlCommand(_q_arg0, _q_arg1);
+            QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+            return _q_result;
+        } else if (context->argument(0).isString()
+            && context->argument(1).isArray()) {
+            QString _q_arg0 = context->argument(0).toString();
+            QStringList _q_arg1;
+            qScriptValueToSequence(context->argument(1), _q_arg1);
+            ControlCommand* _q_cpp_result = new ControlCommand(_q_arg0, _q_arg1);
+            QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+            return _q_result;
+        }
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_ControlCommand_throw_ambiguity_error_helper(context,
+        qtscript_ControlCommand_function_names[_id],
+        qtscript_ControlCommand_function_signatures[_id]);
+}
+
+QScriptValue qtscript_create_ControlCommand_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<ControlCommand*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((ControlCommand*)0));
+    for (int i = 0; i < 6; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_ControlCommand_prototype_call, qtscript_ControlCommand_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_ControlCommand_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    engine->setDefaultPrototype(qMetaTypeId<ControlCommand*>(), proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_ControlCommand_static_call, proto, qtscript_ControlCommand_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_ControlConnection.cpp b/src/vidalia/plugin/extensions/qtscript_ControlConnection.cpp
new file mode 100644
index 0000000..6ed844c
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_ControlConnection.cpp
@@ -0,0 +1,344 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <ControlConnection.h>
+#include <ControlCommand.h>
+#include <ControlReply.h>
+#include <QVariant>
+#include <TorEvents.h>
+#include <qbytearray.h>
+#include <qcoreevent.h>
+#include <qhostaddress.h>
+#include <qlist.h>
+#include <qobject.h>
+
+#include "qtscriptshell_ControlConnection.h"
+
+static const char * const qtscript_ControlConnection_function_names[] = {
+    "ControlConnection"
+    // static
+    // prototype
+    , "cancelConnect"
+    , "connect"
+    , "disconnect"
+    , "isConnected"
+    , "send"
+    , "status"
+    , "toString"
+};
+
+static const char * const qtscript_ControlConnection_function_signatures[] = {
+    "Method method, TorEvents events"
+    // static
+    // prototype
+    , ""
+    , "QHostAddress addr, unsigned short port\nString addr"
+    , ""
+    , ""
+    , "ControlCommand cmd, ControlReply reply, String errmsg\nControlCommand cmd, String errmsg"
+    , ""
+""
+};
+
+static const int qtscript_ControlConnection_function_lengths[] = {
+    2
+    // static
+    // prototype
+    , 0
+    , 2
+    , 0
+    , 0
+    , 3
+    , 0
+    , 0
+};
+
+static QScriptValue qtscript_ControlConnection_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("ControlConnection::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(ControlConnection*)
+Q_DECLARE_METATYPE(QtScriptShell_ControlConnection*)
+Q_DECLARE_METATYPE(ControlConnection::Status)
+Q_DECLARE_METATYPE(QHostAddress)
+Q_DECLARE_METATYPE(ControlCommand)
+Q_DECLARE_METATYPE(ControlReply)
+Q_DECLARE_METATYPE(QString*)
+Q_DECLARE_METATYPE(ControlMethod::Method)
+Q_DECLARE_METATYPE(TorEvents*)
+
+static QScriptValue qtscript_create_enum_class_helper(
+    QScriptEngine *engine,
+    QScriptEngine::FunctionSignature construct,
+    QScriptEngine::FunctionSignature valueOf,
+    QScriptEngine::FunctionSignature toString)
+{
+    QScriptValue proto = engine->newObject();
+    proto.setProperty(QString::fromLatin1("valueOf"),
+        engine->newFunction(valueOf), QScriptValue::SkipInEnumeration);
+    proto.setProperty(QString::fromLatin1("toString"),
+        engine->newFunction(toString), QScriptValue::SkipInEnumeration);
+    return engine->newFunction(construct, proto, 1);
+}
+
+//
+// ControlConnection::Status
+//
+
+static const ControlConnection::Status qtscript_ControlConnection_Status_values[] = {
+    ControlConnection::Unset
+    , ControlConnection::Disconnected
+    , ControlConnection::Disconnecting
+    , ControlConnection::Connecting
+    , ControlConnection::Connected
+};
+
+static const char * const qtscript_ControlConnection_Status_keys[] = {
+    "Unset"
+    , "Disconnected"
+    , "Disconnecting"
+    , "Connecting"
+    , "Connected"
+};
+
+static QString qtscript_ControlConnection_Status_toStringHelper(ControlConnection::Status value)
+{
+    if ((value >= ControlConnection::Unset) && (value <= ControlConnection::Connected))
+        return qtscript_ControlConnection_Status_keys[static_cast<int>(value)-static_cast<int>(ControlConnection::Unset)];
+    return QString();
+}
+
+static QScriptValue qtscript_ControlConnection_Status_toScriptValue(QScriptEngine *engine, const ControlConnection::Status &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("ControlConnection"));
+    return clazz.property(qtscript_ControlConnection_Status_toStringHelper(value));
+}
+
+static void qtscript_ControlConnection_Status_fromScriptValue(const QScriptValue &value, ControlConnection::Status &out)
+{
+    out = qvariant_cast<ControlConnection::Status>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_ControlConnection_Status(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    if ((arg >= ControlConnection::Unset) && (arg <= ControlConnection::Connected))
+        return qScriptValueFromValue(engine,  static_cast<ControlConnection::Status>(arg));
+    return context->throwError(QString::fromLatin1("Status(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_ControlConnection_Status_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    ControlConnection::Status value = qscriptvalue_cast<ControlConnection::Status>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_ControlConnection_Status_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    ControlConnection::Status value = qscriptvalue_cast<ControlConnection::Status>(context->thisObject());
+    return QScriptValue(engine, qtscript_ControlConnection_Status_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_ControlConnection_Status_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_ControlConnection_Status,
+        qtscript_ControlConnection_Status_valueOf, qtscript_ControlConnection_Status_toString);
+    qScriptRegisterMetaType<ControlConnection::Status>(engine, qtscript_ControlConnection_Status_toScriptValue,
+        qtscript_ControlConnection_Status_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 5; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_ControlConnection_Status_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_ControlConnection_Status_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// ControlConnection
+//
+
+static QScriptValue qtscript_ControlConnection_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 6;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    ControlConnection* _q_self = qscriptvalue_cast<ControlConnection*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("ControlConnection.%0(): this object is not a ControlConnection")
+            .arg(qtscript_ControlConnection_function_names[_id+1]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 0) {
+        _q_self->cancelConnect();
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        _q_self->connect(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    if (context->argumentCount() == 2) {
+        QHostAddress _q_arg0 = qscriptvalue_cast<QHostAddress>(context->argument(0));
+        unsigned short _q_arg1 = qscriptvalue_cast<unsigned short>(context->argument(1));
+        _q_self->connect(_q_arg0, _q_arg1);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 0) {
+        _q_self->disconnect();
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->isConnected();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 1) {
+        ControlCommand _q_arg0 = qscriptvalue_cast<ControlCommand>(context->argument(0));
+        bool _q_result = _q_self->send(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 2) {
+        if ((qMetaTypeId<ControlCommand>() == context->argument(0).toVariant().userType())
+            && (qMetaTypeId<ControlReply>() == context->argument(1).toVariant().userType())) {
+            ControlCommand _q_arg0 = qscriptvalue_cast<ControlCommand>(context->argument(0));
+            ControlReply _q_arg1 = qscriptvalue_cast<ControlReply>(context->argument(1));
+            bool _q_result = _q_self->send(_q_arg0, _q_arg1);
+            return QScriptValue(context->engine(), _q_result);
+        } else if ((qMetaTypeId<ControlCommand>() == context->argument(0).toVariant().userType())
+            && qscriptvalue_cast<QString*>(context->argument(1))) {
+            ControlCommand _q_arg0 = qscriptvalue_cast<ControlCommand>(context->argument(0));
+            QString* _q_arg1 = qscriptvalue_cast<QString*>(context->argument(1));
+            bool _q_result = _q_self->send(_q_arg0, _q_arg1);
+            return QScriptValue(context->engine(), _q_result);
+        }
+    }
+    if (context->argumentCount() == 3) {
+        ControlCommand _q_arg0 = qscriptvalue_cast<ControlCommand>(context->argument(0));
+        ControlReply _q_arg1 = qscriptvalue_cast<ControlReply>(context->argument(1));
+        QString* _q_arg2 = qscriptvalue_cast<QString*>(context->argument(2));
+        bool _q_result = _q_self->send(_q_arg0, _q_arg1, _q_arg2);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 5:
+    if (context->argumentCount() == 0) {
+        ControlConnection::Status _q_result = _q_self->status();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 6: {
+    QString result = QString::fromLatin1("ControlConnection");
+    return QScriptValue(context->engine(), result);
+    }
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_ControlConnection_throw_ambiguity_error_helper(context,
+        qtscript_ControlConnection_function_names[_id+1],
+        qtscript_ControlConnection_function_signatures[_id+1]);
+}
+
+static QScriptValue qtscript_ControlConnection_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("ControlConnection(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 1) {
+        ControlMethod::Method _q_arg0 = qscriptvalue_cast<ControlMethod::Method>(context->argument(0));
+        QtScriptShell_ControlConnection* _q_cpp_result = new QtScriptShell_ControlConnection(_q_arg0);
+        QScriptValue _q_result = context->engine()->newQObject(context->thisObject(), (ControlConnection*)_q_cpp_result, QScriptEngine::AutoOwnership);
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    } else if (context->argumentCount() == 2) {
+        ControlMethod::Method _q_arg0 = qscriptvalue_cast<ControlMethod::Method>(context->argument(0));
+        TorEvents* _q_arg1 = qscriptvalue_cast<TorEvents*>(context->argument(1));
+        QtScriptShell_ControlConnection* _q_cpp_result = new QtScriptShell_ControlConnection(_q_arg0, _q_arg1);
+        QScriptValue _q_result = context->engine()->newQObject(context->thisObject(), (ControlConnection*)_q_cpp_result, QScriptEngine::AutoOwnership);
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_ControlConnection_throw_ambiguity_error_helper(context,
+        qtscript_ControlConnection_function_names[_id],
+        qtscript_ControlConnection_function_signatures[_id]);
+}
+
+static QScriptValue qtscript_ControlConnection_toScriptValue(QScriptEngine *engine, ControlConnection* const &in)
+{
+    return engine->newQObject(in, QScriptEngine::QtOwnership, QScriptEngine::PreferExistingWrapperObject);
+}
+
+static void qtscript_ControlConnection_fromScriptValue(const QScriptValue &value, ControlConnection* &out)
+{
+    out = qobject_cast<ControlConnection*>(value.toQObject());
+}
+
+QScriptValue qtscript_create_ControlConnection_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<ControlConnection*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((ControlConnection*)0));
+    proto.setPrototype(engine->defaultPrototype(qMetaTypeId<QObject*>()));
+    for (int i = 0; i < 7; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_ControlConnection_prototype_call, qtscript_ControlConnection_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_ControlConnection_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    qScriptRegisterMetaType<ControlConnection*>(engine, qtscript_ControlConnection_toScriptValue, 
+        qtscript_ControlConnection_fromScriptValue, proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_ControlConnection_static_call, proto, qtscript_ControlConnection_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+
+    ctor.setProperty(QString::fromLatin1("Status"),
+        qtscript_create_ControlConnection_Status_class(engine, ctor));
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_ControlMethod.cpp b/src/vidalia/plugin/extensions/qtscript_ControlMethod.cpp
new file mode 100644
index 0000000..883217f
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_ControlMethod.cpp
@@ -0,0 +1,199 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <ControlMethod.h>
+#include <QVariant>
+
+#include "qtscriptshell_ControlMethod.h"
+
+static const char * const qtscript_ControlMethod_function_names[] = {
+    "ControlMethod"
+    // static
+    , "fromString"
+    , "toString"
+    // prototype
+};
+
+static const char * const qtscript_ControlMethod_function_signatures[] = {
+    ""
+    // static
+    , "String method"
+    , "Method method"
+    // prototype
+};
+
+static const int qtscript_ControlMethod_function_lengths[] = {
+    0
+    // static
+    , 1
+    , 1
+    // prototype
+};
+
+static QScriptValue qtscript_ControlMethod_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("ControlMethod::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(ControlMethod*)
+Q_DECLARE_METATYPE(QtScriptShell_ControlMethod*)
+Q_DECLARE_METATYPE(ControlMethod::Method)
+
+static QScriptValue qtscript_create_enum_class_helper(
+    QScriptEngine *engine,
+    QScriptEngine::FunctionSignature construct,
+    QScriptEngine::FunctionSignature valueOf,
+    QScriptEngine::FunctionSignature toString)
+{
+    QScriptValue proto = engine->newObject();
+    proto.setProperty(QString::fromLatin1("valueOf"),
+        engine->newFunction(valueOf), QScriptValue::SkipInEnumeration);
+    proto.setProperty(QString::fromLatin1("toString"),
+        engine->newFunction(toString), QScriptValue::SkipInEnumeration);
+    return engine->newFunction(construct, proto, 1);
+}
+
+//
+// ControlMethod::Method
+//
+
+static const ControlMethod::Method qtscript_ControlMethod_Method_values[] = {
+    ControlMethod::Port
+    , ControlMethod::Socket
+};
+
+static const char * const qtscript_ControlMethod_Method_keys[] = {
+    "Port"
+    , "Socket"
+};
+
+static QString qtscript_ControlMethod_Method_toStringHelper(ControlMethod::Method value)
+{
+    if ((value >= ControlMethod::Port) && (value <= ControlMethod::Socket))
+        return qtscript_ControlMethod_Method_keys[static_cast<int>(value)-static_cast<int>(ControlMethod::Port)];
+    return QString();
+}
+
+static QScriptValue qtscript_ControlMethod_Method_toScriptValue(QScriptEngine *engine, const ControlMethod::Method &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("ControlMethod"));
+    return clazz.property(qtscript_ControlMethod_Method_toStringHelper(value));
+}
+
+static void qtscript_ControlMethod_Method_fromScriptValue(const QScriptValue &value, ControlMethod::Method &out)
+{
+    out = qvariant_cast<ControlMethod::Method>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_ControlMethod_Method(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    if ((arg >= ControlMethod::Port) && (arg <= ControlMethod::Socket))
+        return qScriptValueFromValue(engine,  static_cast<ControlMethod::Method>(arg));
+    return context->throwError(QString::fromLatin1("Method(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_ControlMethod_Method_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    ControlMethod::Method value = qscriptvalue_cast<ControlMethod::Method>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_ControlMethod_Method_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    ControlMethod::Method value = qscriptvalue_cast<ControlMethod::Method>(context->thisObject());
+    return QScriptValue(engine, qtscript_ControlMethod_Method_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_ControlMethod_Method_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_ControlMethod_Method,
+        qtscript_ControlMethod_Method_valueOf, qtscript_ControlMethod_Method_toString);
+    qScriptRegisterMetaType<ControlMethod::Method>(engine, qtscript_ControlMethod_Method_toScriptValue,
+        qtscript_ControlMethod_Method_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 2; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_ControlMethod_Method_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_ControlMethod_Method_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// ControlMethod
+//
+
+static QScriptValue qtscript_ControlMethod_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("ControlMethod(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        QtScriptShell_ControlMethod* _q_cpp_result = new QtScriptShell_ControlMethod();
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue((ControlMethod*)_q_cpp_result));
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        ControlMethod::Method _q_result = ControlMethod::fromString(_q_arg0);
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 1) {
+        ControlMethod::Method _q_arg0 = qscriptvalue_cast<ControlMethod::Method>(context->argument(0));
+        QString _q_result = ControlMethod::toString(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_ControlMethod_throw_ambiguity_error_helper(context,
+        qtscript_ControlMethod_function_names[_id],
+        qtscript_ControlMethod_function_signatures[_id]);
+}
+
+QScriptValue qtscript_create_ControlMethod_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<ControlMethod*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((ControlMethod*)0));
+
+    engine->setDefaultPrototype(qMetaTypeId<ControlMethod*>(), proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_ControlMethod_static_call, proto, qtscript_ControlMethod_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+    for (int i = 0; i < 2; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_ControlMethod_static_call,
+            qtscript_ControlMethod_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i+1)));
+        ctor.setProperty(QString::fromLatin1(qtscript_ControlMethod_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    ctor.setProperty(QString::fromLatin1("Method"),
+        qtscript_create_ControlMethod_Method_class(engine, ctor));
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_ControlReply.cpp b/src/vidalia/plugin/extensions/qtscript_ControlReply.cpp
new file mode 100644
index 0000000..4244f26
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_ControlReply.cpp
@@ -0,0 +1,199 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <ControlReply.h>
+#include <QVariant>
+#include <ReplyLine.h>
+#include <qlist.h>
+#include <qstringlist.h>
+
+static const char * const qtscript_ControlReply_function_names[] = {
+    "ControlReply"
+    // static
+    // prototype
+    , "appendLine"
+    , "getData"
+    , "getLine"
+    , "getLines"
+    , "getMessage"
+    , "getStatus"
+    , "toString"
+};
+
+static const char * const qtscript_ControlReply_function_signatures[] = {
+    ""
+    // static
+    // prototype
+    , "ReplyLine line"
+    , ""
+    , "int idx"
+    , ""
+    , ""
+    , ""
+    , ""
+};
+
+static const int qtscript_ControlReply_function_lengths[] = {
+    0
+    // static
+    // prototype
+    , 1
+    , 0
+    , 1
+    , 0
+    , 0
+    , 0
+    , 0
+};
+
+static QScriptValue qtscript_ControlReply_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("ControlReply::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(ControlReply*)
+Q_DECLARE_METATYPE(ReplyLine)
+Q_DECLARE_METATYPE(QList<ReplyLine>)
+
+//
+// ControlReply
+//
+
+static QScriptValue qtscript_ControlReply_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 7;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    ControlReply* _q_self = qscriptvalue_cast<ControlReply*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("ControlReply.%0(): this object is not a ControlReply")
+            .arg(qtscript_ControlReply_function_names[_id+1]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 1) {
+        ReplyLine _q_arg0 = qscriptvalue_cast<ReplyLine>(context->argument(0));
+        _q_self->appendLine(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 0) {
+        QStringList _q_result = _q_self->getData();
+        return qScriptValueFromSequence(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 0) {
+        ReplyLine _q_result = _q_self->getLine();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 1) {
+        int _q_arg0 = context->argument(0).toInt32();
+        ReplyLine _q_result = _q_self->getLine(_q_arg0);
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 0) {
+        QList<ReplyLine> _q_result = _q_self->getLines();
+        return qScriptValueFromSequence(context->engine(), _q_result);
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->getMessage();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 5:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->getStatus();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 6:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->toString();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_ControlReply_throw_ambiguity_error_helper(context,
+        qtscript_ControlReply_function_names[_id+1],
+        qtscript_ControlReply_function_signatures[_id+1]);
+}
+
+static QScriptValue qtscript_ControlReply_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("ControlReply(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        ControlReply* _q_cpp_result = new ControlReply();
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_ControlReply_throw_ambiguity_error_helper(context,
+        qtscript_ControlReply_function_names[_id],
+        qtscript_ControlReply_function_signatures[_id]);
+}
+
+QScriptValue qtscript_create_ControlReply_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<ControlReply*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((ControlReply*)0));
+    for (int i = 0; i < 7; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_ControlReply_prototype_call, qtscript_ControlReply_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_ControlReply_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    engine->setDefaultPrototype(qMetaTypeId<ControlReply*>(), proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_ControlReply_static_call, proto, qtscript_ControlReply_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_ControlSocket.cpp b/src/vidalia/plugin/extensions/qtscript_ControlSocket.cpp
new file mode 100644
index 0000000..3d5ff1e
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_ControlSocket.cpp
@@ -0,0 +1,278 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <ControlSocket.h>
+#include <ControlCommand.h>
+#include <ControlReply.h>
+#include <QVariant>
+#include <qbytearray.h>
+#include <qcoreevent.h>
+#include <qhostaddress.h>
+#include <qlist.h>
+#include <qobject.h>
+
+#include "qtscriptshell_ControlSocket.h"
+
+static const char * const qtscript_ControlSocket_function_names[] = {
+    "ControlSocket"
+    // static
+    , "toString"
+    // prototype
+    , "canReadLine"
+    , "connectToHost"
+    , "connectToServer"
+    , "disconnectFromHost"
+    , "disconnectFromServer"
+    , "getMethod"
+    , "isConnected"
+    , "readReply"
+    , "sendCommand"
+};
+
+static const char * const qtscript_ControlSocket_function_signatures[] = {
+    "Method method"
+    // static
+    , "SocketError error"
+    // prototype
+    , ""
+    , "QHostAddress address, unsigned short port"
+    , "String name"
+    , ""
+    , ""
+    , ""
+    , ""
+    , "ControlReply reply, String errmsg"
+    , "ControlCommand cmd, String errmsg"
+};
+
+static const int qtscript_ControlSocket_function_lengths[] = {
+    1
+    // static
+    , 1
+    // prototype
+    , 0
+    , 2
+    , 1
+    , 0
+    , 0
+    , 0
+    , 0
+    , 2
+    , 2
+};
+
+static QScriptValue qtscript_ControlSocket_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("ControlSocket::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(ControlSocket*)
+Q_DECLARE_METATYPE(QtScriptShell_ControlSocket*)
+Q_DECLARE_METATYPE(QHostAddress)
+Q_DECLARE_METATYPE(ControlMethod::Method)
+Q_DECLARE_METATYPE(ControlReply)
+Q_DECLARE_METATYPE(QString*)
+Q_DECLARE_METATYPE(ControlCommand)
+Q_DECLARE_METATYPE(QAbstractSocket::SocketError)
+
+//
+// ControlSocket
+//
+
+static QScriptValue qtscript_ControlSocket_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 9;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    ControlSocket* _q_self = qscriptvalue_cast<ControlSocket*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("ControlSocket.%0(): this object is not a ControlSocket")
+            .arg(qtscript_ControlSocket_function_names[_id+2]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->canReadLine();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 2) {
+        QHostAddress _q_arg0 = qscriptvalue_cast<QHostAddress>(context->argument(0));
+        unsigned short _q_arg1 = qscriptvalue_cast<unsigned short>(context->argument(1));
+        _q_self->connectToHost(_q_arg0, _q_arg1);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        _q_self->connectToServer(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 0) {
+        _q_self->disconnectFromHost();
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 0) {
+        _q_self->disconnectFromServer();
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 5:
+    if (context->argumentCount() == 0) {
+        ControlMethod::Method _q_result = _q_self->getMethod();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 6:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->isConnected();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 7:
+    if (context->argumentCount() == 1) {
+        ControlReply _q_arg0 = qscriptvalue_cast<ControlReply>(context->argument(0));
+        bool _q_result = _q_self->readReply(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 2) {
+        ControlReply _q_arg0 = qscriptvalue_cast<ControlReply>(context->argument(0));
+        QString* _q_arg1 = qscriptvalue_cast<QString*>(context->argument(1));
+        bool _q_result = _q_self->readReply(_q_arg0, _q_arg1);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 8:
+    if (context->argumentCount() == 1) {
+        ControlCommand _q_arg0 = qscriptvalue_cast<ControlCommand>(context->argument(0));
+        bool _q_result = _q_self->sendCommand(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 2) {
+        ControlCommand _q_arg0 = qscriptvalue_cast<ControlCommand>(context->argument(0));
+        QString* _q_arg1 = qscriptvalue_cast<QString*>(context->argument(1));
+        bool _q_result = _q_self->sendCommand(_q_arg0, _q_arg1);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_ControlSocket_throw_ambiguity_error_helper(context,
+        qtscript_ControlSocket_function_names[_id+2],
+        qtscript_ControlSocket_function_signatures[_id+2]);
+}
+
+static QScriptValue qtscript_ControlSocket_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("ControlSocket(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        QtScriptShell_ControlSocket* _q_cpp_result = new QtScriptShell_ControlSocket();
+        QScriptValue _q_result = context->engine()->newQObject(context->thisObject(), (ControlSocket*)_q_cpp_result, QScriptEngine::AutoOwnership);
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    } else if (context->argumentCount() == 1) {
+        ControlMethod::Method _q_arg0 = qscriptvalue_cast<ControlMethod::Method>(context->argument(0));
+        QtScriptShell_ControlSocket* _q_cpp_result = new QtScriptShell_ControlSocket(_q_arg0);
+        QScriptValue _q_result = context->engine()->newQObject(context->thisObject(), (ControlSocket*)_q_cpp_result, QScriptEngine::AutoOwnership);
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 1) {
+        QAbstractSocket::SocketError _q_arg0 = qscriptvalue_cast<QAbstractSocket::SocketError>(context->argument(0));
+        QString _q_result = ControlSocket::toString(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_ControlSocket_throw_ambiguity_error_helper(context,
+        qtscript_ControlSocket_function_names[_id],
+        qtscript_ControlSocket_function_signatures[_id]);
+}
+
+static QScriptValue qtscript_ControlSocket_toScriptValue(QScriptEngine *engine, ControlSocket* const &in)
+{
+    return engine->newQObject(in, QScriptEngine::QtOwnership, QScriptEngine::PreferExistingWrapperObject);
+}
+
+static void qtscript_ControlSocket_fromScriptValue(const QScriptValue &value, ControlSocket* &out)
+{
+    out = qobject_cast<ControlSocket*>(value.toQObject());
+}
+
+QScriptValue qtscript_create_ControlSocket_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<ControlSocket*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((ControlSocket*)0));
+    proto.setPrototype(engine->defaultPrototype(qMetaTypeId<QObject*>()));
+    for (int i = 0; i < 9; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_ControlSocket_prototype_call, qtscript_ControlSocket_function_lengths[i+2]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_ControlSocket_function_names[i+2]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    qScriptRegisterMetaType<ControlSocket*>(engine, qtscript_ControlSocket_toScriptValue, 
+        qtscript_ControlSocket_fromScriptValue, proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_ControlSocket_static_call, proto, qtscript_ControlSocket_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+    for (int i = 0; i < 1; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_ControlSocket_static_call,
+            qtscript_ControlSocket_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i+1)));
+        ctor.setProperty(QString::fromLatin1(qtscript_ControlSocket_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_ReplyLine.cpp b/src/vidalia/plugin/extensions/qtscript_ReplyLine.cpp
new file mode 100644
index 0000000..d27efc5
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_ReplyLine.cpp
@@ -0,0 +1,215 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <ReplyLine.h>
+#include <QVariant>
+#include <qstringlist.h>
+
+static const char * const qtscript_ReplyLine_function_names[] = {
+    "ReplyLine"
+    // static
+    // prototype
+    , "appendData"
+    , "getData"
+    , "getMessage"
+    , "getStatus"
+    , "hasData"
+    , "setMessage"
+    , "setStatus"
+    , "toString"
+};
+
+static const char * const qtscript_ReplyLine_function_signatures[] = {
+    "\nString status, String message\nString status, String message, String data"
+    // static
+    // prototype
+    , "String data"
+    , ""
+    , ""
+    , ""
+    , ""
+    , "String msg"
+    , "String status"
+    , ""
+};
+
+static const int qtscript_ReplyLine_function_lengths[] = {
+    3
+    // static
+    // prototype
+    , 1
+    , 0
+    , 0
+    , 0
+    , 0
+    , 1
+    , 1
+    , 0
+};
+
+static QScriptValue qtscript_ReplyLine_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("ReplyLine::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(ReplyLine*)
+
+//
+// ReplyLine
+//
+
+static QScriptValue qtscript_ReplyLine_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 8;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    ReplyLine* _q_self = qscriptvalue_cast<ReplyLine*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("ReplyLine.%0(): this object is not a ReplyLine")
+            .arg(qtscript_ReplyLine_function_names[_id+1]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        _q_self->appendData(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 0) {
+        QStringList _q_result = _q_self->getData();
+        return qScriptValueFromSequence(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->getMessage();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->getStatus();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->hasData();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 5:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        _q_self->setMessage(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 6:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        _q_self->setStatus(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 7:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->toString();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_ReplyLine_throw_ambiguity_error_helper(context,
+        qtscript_ReplyLine_function_names[_id+1],
+        qtscript_ReplyLine_function_signatures[_id+1]);
+}
+
+static QScriptValue qtscript_ReplyLine_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("ReplyLine(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        ReplyLine* _q_cpp_result = new ReplyLine();
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    } else if (context->argumentCount() == 2) {
+        QString _q_arg0 = context->argument(0).toString();
+        QString _q_arg1 = context->argument(1).toString();
+        ReplyLine* _q_cpp_result = new ReplyLine(_q_arg0, _q_arg1);
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    } else if (context->argumentCount() == 3) {
+        QString _q_arg0 = context->argument(0).toString();
+        QString _q_arg1 = context->argument(1).toString();
+        QString _q_arg2 = context->argument(2).toString();
+        ReplyLine* _q_cpp_result = new ReplyLine(_q_arg0, _q_arg1, _q_arg2);
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_ReplyLine_throw_ambiguity_error_helper(context,
+        qtscript_ReplyLine_function_names[_id],
+        qtscript_ReplyLine_function_signatures[_id]);
+}
+
+QScriptValue qtscript_create_ReplyLine_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<ReplyLine*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((ReplyLine*)0));
+    for (int i = 0; i < 8; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_ReplyLine_prototype_call, qtscript_ReplyLine_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_ReplyLine_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    engine->setDefaultPrototype(qMetaTypeId<ReplyLine*>(), proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_ReplyLine_static_call, proto, qtscript_ReplyLine_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_RouterDescriptor.cpp b/src/vidalia/plugin/extensions/qtscript_RouterDescriptor.cpp
new file mode 100644
index 0000000..4a480ab
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_RouterDescriptor.cpp
@@ -0,0 +1,561 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <RouterDescriptor.h>
+#include <QVariant>
+#include <RouterDescriptor.h>
+#include <RouterStatus.h>
+#include <TorControl.h>
+#include <qdatetime.h>
+#include <qhostaddress.h>
+#include <qstringlist.h>
+
+static const char * const qtscript_RouterDescriptor_function_names[] = {
+    "RouterDescriptor"
+    // static
+    , "fromTorControl"
+    , "tr"
+    , "trUtf8"
+    // prototype
+    , "appendRouterStatusInfo"
+    , "averageBandwidth"
+    , "burstBandwidth"
+    , "contact"
+    , "dirPort"
+    , "exitPolicy"
+    , "family"
+    , "fingerprint"
+    , "hibernating"
+    , "id"
+    , "ip"
+    , "isEmpty"
+    , "location"
+    , "name"
+    , "observedBandwidth"
+    , "offline"
+    , "onionKey"
+    , "online"
+    , "orPort"
+    , "platform"
+    , "published"
+    , "setLocation"
+    , "setOffline"
+    , "status"
+    , "uptime"
+    , "toString"
+};
+
+static const char * const qtscript_RouterDescriptor_function_signatures[] = {
+    "List descriptor, bool microdesc\nbool microdesc"
+    // static
+    , "TorControl tc"
+    , "char sourceText, char disambiguation\nchar sourceText, char disambiguation, int n"
+    , "char sourceText, char disambiguation\nchar sourceText, char disambiguation, int n"
+    // prototype
+    , "RouterStatus rs"
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , "String location"
+    , "bool offline"
+    , ""
+    , ""
+""
+};
+
+static const int qtscript_RouterDescriptor_function_lengths[] = {
+    2
+    // static
+    , 1
+    , 3
+    , 3
+    // prototype
+    , 1
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 1
+    , 1
+    , 0
+    , 0
+    , 0
+};
+
+static QScriptValue qtscript_RouterDescriptor_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("RouterDescriptor::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(RouterDescriptor*)
+Q_DECLARE_METATYPE(RouterDescriptor::RouterStatusEnum)
+Q_DECLARE_METATYPE(RouterStatus)
+Q_DECLARE_METATYPE(QHostAddress)
+Q_DECLARE_METATYPE(TorControl*)
+Q_DECLARE_METATYPE(char*)
+
+static QScriptValue qtscript_create_enum_class_helper(
+    QScriptEngine *engine,
+    QScriptEngine::FunctionSignature construct,
+    QScriptEngine::FunctionSignature valueOf,
+    QScriptEngine::FunctionSignature toString)
+{
+    QScriptValue proto = engine->newObject();
+    proto.setProperty(QString::fromLatin1("valueOf"),
+        engine->newFunction(valueOf), QScriptValue::SkipInEnumeration);
+    proto.setProperty(QString::fromLatin1("toString"),
+        engine->newFunction(toString), QScriptValue::SkipInEnumeration);
+    return engine->newFunction(construct, proto, 1);
+}
+
+//
+// RouterDescriptor::RouterStatusEnum
+//
+
+static const RouterDescriptor::RouterStatusEnum qtscript_RouterDescriptor_RouterStatusEnum_values[] = {
+    RouterDescriptor::Online
+    , RouterDescriptor::Hibernating
+    , RouterDescriptor::Offline
+};
+
+static const char * const qtscript_RouterDescriptor_RouterStatusEnum_keys[] = {
+    "Online"
+    , "Hibernating"
+    , "Offline"
+};
+
+static QString qtscript_RouterDescriptor_RouterStatusEnum_toStringHelper(RouterDescriptor::RouterStatusEnum value)
+{
+    if ((value >= RouterDescriptor::Online) && (value <= RouterDescriptor::Offline))
+        return qtscript_RouterDescriptor_RouterStatusEnum_keys[static_cast<int>(value)-static_cast<int>(RouterDescriptor::Online)];
+    return QString();
+}
+
+static QScriptValue qtscript_RouterDescriptor_RouterStatusEnum_toScriptValue(QScriptEngine *engine, const RouterDescriptor::RouterStatusEnum &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("RouterDescriptor"));
+    return clazz.property(qtscript_RouterDescriptor_RouterStatusEnum_toStringHelper(value));
+}
+
+static void qtscript_RouterDescriptor_RouterStatusEnum_fromScriptValue(const QScriptValue &value, RouterDescriptor::RouterStatusEnum &out)
+{
+    out = qvariant_cast<RouterDescriptor::RouterStatusEnum>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_RouterDescriptor_RouterStatusEnum(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    if ((arg >= RouterDescriptor::Online) && (arg <= RouterDescriptor::Offline))
+        return qScriptValueFromValue(engine,  static_cast<RouterDescriptor::RouterStatusEnum>(arg));
+    return context->throwError(QString::fromLatin1("RouterStatusEnum(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_RouterDescriptor_RouterStatusEnum_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    RouterDescriptor::RouterStatusEnum value = qscriptvalue_cast<RouterDescriptor::RouterStatusEnum>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_RouterDescriptor_RouterStatusEnum_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    RouterDescriptor::RouterStatusEnum value = qscriptvalue_cast<RouterDescriptor::RouterStatusEnum>(context->thisObject());
+    return QScriptValue(engine, qtscript_RouterDescriptor_RouterStatusEnum_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_RouterDescriptor_RouterStatusEnum_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_RouterDescriptor_RouterStatusEnum,
+        qtscript_RouterDescriptor_RouterStatusEnum_valueOf, qtscript_RouterDescriptor_RouterStatusEnum_toString);
+    qScriptRegisterMetaType<RouterDescriptor::RouterStatusEnum>(engine, qtscript_RouterDescriptor_RouterStatusEnum_toScriptValue,
+        qtscript_RouterDescriptor_RouterStatusEnum_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 3; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_RouterDescriptor_RouterStatusEnum_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_RouterDescriptor_RouterStatusEnum_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// RouterDescriptor
+//
+
+static QScriptValue qtscript_RouterDescriptor_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 25;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    RouterDescriptor* _q_self = qscriptvalue_cast<RouterDescriptor*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("RouterDescriptor.%0(): this object is not a RouterDescriptor")
+            .arg(qtscript_RouterDescriptor_function_names[_id+4]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 1) {
+        RouterStatus _q_arg0 = qscriptvalue_cast<RouterStatus>(context->argument(0));
+        _q_self->appendRouterStatusInfo(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 0) {
+        unsigned long long _q_result = _q_self->averageBandwidth();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 0) {
+        unsigned long long _q_result = _q_self->burstBandwidth();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->contact();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 0) {
+        unsigned short _q_result = _q_self->dirPort();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 5:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->exitPolicy();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 6:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->family();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 7:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->fingerprint();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 8:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->hibernating();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 9:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->id();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 10:
+    if (context->argumentCount() == 0) {
+        QHostAddress _q_result = _q_self->ip();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 11:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->isEmpty();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 12:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->location();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 13:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->name();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 14:
+    if (context->argumentCount() == 0) {
+        unsigned long long _q_result = _q_self->observedBandwidth();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 15:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->offline();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 16:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->onionKey();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 17:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->online();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 18:
+    if (context->argumentCount() == 0) {
+        unsigned short _q_result = _q_self->orPort();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 19:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->platform();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 20:
+    if (context->argumentCount() == 0) {
+        QDateTime _q_result = _q_self->published();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 21:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        _q_self->setLocation(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 22:
+    if (context->argumentCount() == 1) {
+        bool _q_arg0 = context->argument(0).toBoolean();
+        _q_self->setOffline(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 23:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->status();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 24:
+    if (context->argumentCount() == 0) {
+        unsigned long long _q_result = _q_self->uptime();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 25: {
+    QString result = QString::fromLatin1("RouterDescriptor");
+    return QScriptValue(context->engine(), result);
+    }
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_RouterDescriptor_throw_ambiguity_error_helper(context,
+        qtscript_RouterDescriptor_function_names[_id+4],
+        qtscript_RouterDescriptor_function_signatures[_id+4]);
+}
+
+static QScriptValue qtscript_RouterDescriptor_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("RouterDescriptor(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        RouterDescriptor* _q_cpp_result = new RouterDescriptor();
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    } else if (context->argumentCount() == 1) {
+        if (context->argument(0).isArray()) {
+            QStringList _q_arg0;
+            qScriptValueToSequence(context->argument(0), _q_arg0);
+            RouterDescriptor* _q_cpp_result = new RouterDescriptor(_q_arg0);
+            QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+            return _q_result;
+        } else if (context->argument(0).isBoolean()) {
+            bool _q_arg0 = context->argument(0).toBoolean();
+            RouterDescriptor* _q_cpp_result = new RouterDescriptor(_q_arg0);
+            QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+            return _q_result;
+        }
+    } else if (context->argumentCount() == 2) {
+        QStringList _q_arg0;
+        qScriptValueToSequence(context->argument(0), _q_arg0);
+        bool _q_arg1 = context->argument(1).toBoolean();
+        RouterDescriptor* _q_cpp_result = new RouterDescriptor(_q_arg0, _q_arg1);
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 1) {
+        TorControl* _q_arg0 = qscriptvalue_cast<TorControl*>(context->argument(0));
+        RouterDescriptor* _q_result = RouterDescriptor::fromTorControl(_q_arg0);
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 1) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        QString _q_result = RouterDescriptor::tr(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 2) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        QString _q_result = RouterDescriptor::tr(_q_arg0, _q_arg1);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 3) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        int _q_arg2 = context->argument(2).toInt32();
+        QString _q_result = RouterDescriptor::tr(_q_arg0, _q_arg1, _q_arg2);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 1) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        QString _q_result = RouterDescriptor::trUtf8(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 2) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        QString _q_result = RouterDescriptor::trUtf8(_q_arg0, _q_arg1);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 3) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        int _q_arg2 = context->argument(2).toInt32();
+        QString _q_result = RouterDescriptor::trUtf8(_q_arg0, _q_arg1, _q_arg2);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_RouterDescriptor_throw_ambiguity_error_helper(context,
+        qtscript_RouterDescriptor_function_names[_id],
+        qtscript_RouterDescriptor_function_signatures[_id]);
+}
+
+QScriptValue qtscript_create_RouterDescriptor_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<RouterDescriptor*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((RouterDescriptor*)0));
+    for (int i = 0; i < 26; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_RouterDescriptor_prototype_call, qtscript_RouterDescriptor_function_lengths[i+4]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_RouterDescriptor_function_names[i+4]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    engine->setDefaultPrototype(qMetaTypeId<RouterDescriptor*>(), proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_RouterDescriptor_static_call, proto, qtscript_RouterDescriptor_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+    for (int i = 0; i < 3; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_RouterDescriptor_static_call,
+            qtscript_RouterDescriptor_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i+1)));
+        ctor.setProperty(QString::fromLatin1(qtscript_RouterDescriptor_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    ctor.setProperty(QString::fromLatin1("RouterStatusEnum"),
+        qtscript_create_RouterDescriptor_RouterStatusEnum_class(engine, ctor));
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_RouterStatus.cpp b/src/vidalia/plugin/extensions/qtscript_RouterStatus.cpp
new file mode 100644
index 0000000..864b44b
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_RouterStatus.cpp
@@ -0,0 +1,344 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <RouterStatus.h>
+#include <QVariant>
+#include <qdatetime.h>
+#include <qhostaddress.h>
+#include <qstringlist.h>
+
+static const char * const qtscript_RouterStatus_function_names[] = {
+    "RouterStatus"
+    // static
+    // prototype
+    , "bandwidth"
+    , "descriptorDigest"
+    , "dirPort"
+    , "id"
+    , "ipAddress"
+    , "isRunning"
+    , "isValid"
+    , "name"
+    , "orPort"
+    , "published"
+    , "toString"
+};
+
+static const char * const qtscript_RouterStatus_function_signatures[] = {
+    "List status"
+    // static
+    // prototype
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+""
+};
+
+static const int qtscript_RouterStatus_function_lengths[] = {
+    1
+    // static
+    // prototype
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+};
+
+static QScriptValue qtscript_RouterStatus_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("RouterStatus::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(RouterStatus*)
+Q_DECLARE_METATYPE(RouterStatus::Flag)
+Q_DECLARE_METATYPE(QHostAddress)
+
+static QScriptValue qtscript_create_enum_class_helper(
+    QScriptEngine *engine,
+    QScriptEngine::FunctionSignature construct,
+    QScriptEngine::FunctionSignature valueOf,
+    QScriptEngine::FunctionSignature toString)
+{
+    QScriptValue proto = engine->newObject();
+    proto.setProperty(QString::fromLatin1("valueOf"),
+        engine->newFunction(valueOf), QScriptValue::SkipInEnumeration);
+    proto.setProperty(QString::fromLatin1("toString"),
+        engine->newFunction(toString), QScriptValue::SkipInEnumeration);
+    return engine->newFunction(construct, proto, 1);
+}
+
+//
+// RouterStatus::Flag
+//
+
+static const RouterStatus::Flag qtscript_RouterStatus_Flag_values[] = {
+    RouterStatus::Unknown
+    , RouterStatus::Authority
+    , RouterStatus::BadExit
+    , RouterStatus::BadDirectory
+    , RouterStatus::Exit
+    , RouterStatus::Fast
+    , RouterStatus::Guard
+    , RouterStatus::HSDir
+    , RouterStatus::Named
+    , RouterStatus::Stable
+    , RouterStatus::Running
+    , RouterStatus::Valid
+    , RouterStatus::V2Dir
+    , RouterStatus::V3Dir
+};
+
+static const char * const qtscript_RouterStatus_Flag_keys[] = {
+    "Unknown"
+    , "Authority"
+    , "BadExit"
+    , "BadDirectory"
+    , "Exit"
+    , "Fast"
+    , "Guard"
+    , "HSDir"
+    , "Named"
+    , "Stable"
+    , "Running"
+    , "Valid"
+    , "V2Dir"
+    , "V3Dir"
+};
+
+static QString qtscript_RouterStatus_Flag_toStringHelper(RouterStatus::Flag value)
+{
+    for (int i = 0; i < 14; ++i) {
+        if (qtscript_RouterStatus_Flag_values[i] == value)
+            return QString::fromLatin1(qtscript_RouterStatus_Flag_keys[i]);
+    }
+    return QString();
+}
+
+static QScriptValue qtscript_RouterStatus_Flag_toScriptValue(QScriptEngine *engine, const RouterStatus::Flag &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("RouterStatus"));
+    return clazz.property(qtscript_RouterStatus_Flag_toStringHelper(value));
+}
+
+static void qtscript_RouterStatus_Flag_fromScriptValue(const QScriptValue &value, RouterStatus::Flag &out)
+{
+    out = qvariant_cast<RouterStatus::Flag>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_RouterStatus_Flag(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    for (int i = 0; i < 14; ++i) {
+        if (qtscript_RouterStatus_Flag_values[i] == arg)
+            return qScriptValueFromValue(engine,  static_cast<RouterStatus::Flag>(arg));
+    }
+    return context->throwError(QString::fromLatin1("Flag(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_RouterStatus_Flag_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    RouterStatus::Flag value = qscriptvalue_cast<RouterStatus::Flag>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_RouterStatus_Flag_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    RouterStatus::Flag value = qscriptvalue_cast<RouterStatus::Flag>(context->thisObject());
+    return QScriptValue(engine, qtscript_RouterStatus_Flag_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_RouterStatus_Flag_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_RouterStatus_Flag,
+        qtscript_RouterStatus_Flag_valueOf, qtscript_RouterStatus_Flag_toString);
+    qScriptRegisterMetaType<RouterStatus::Flag>(engine, qtscript_RouterStatus_Flag_toScriptValue,
+        qtscript_RouterStatus_Flag_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 14; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_RouterStatus_Flag_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_RouterStatus_Flag_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// RouterStatus
+//
+
+static QScriptValue qtscript_RouterStatus_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 10;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    RouterStatus* _q_self = qscriptvalue_cast<RouterStatus*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("RouterStatus.%0(): this object is not a RouterStatus")
+            .arg(qtscript_RouterStatus_function_names[_id+1]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 0) {
+        unsigned long long _q_result = _q_self->bandwidth();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->descriptorDigest();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 0) {
+        unsigned short _q_result = _q_self->dirPort();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->id();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 0) {
+        QHostAddress _q_result = _q_self->ipAddress();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 5:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->isRunning();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 6:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->isValid();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 7:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->name();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 8:
+    if (context->argumentCount() == 0) {
+        unsigned short _q_result = _q_self->orPort();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 9:
+    if (context->argumentCount() == 0) {
+        QDateTime _q_result = _q_self->published();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 10: {
+    QString result = QString::fromLatin1("RouterStatus");
+    return QScriptValue(context->engine(), result);
+    }
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_RouterStatus_throw_ambiguity_error_helper(context,
+        qtscript_RouterStatus_function_names[_id+1],
+        qtscript_RouterStatus_function_signatures[_id+1]);
+}
+
+static QScriptValue qtscript_RouterStatus_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("RouterStatus(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 1) {
+        QStringList _q_arg0;
+        qScriptValueToSequence(context->argument(0), _q_arg0);
+        RouterStatus* _q_cpp_result = new RouterStatus(_q_arg0);
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_RouterStatus_throw_ambiguity_error_helper(context,
+        qtscript_RouterStatus_function_names[_id],
+        qtscript_RouterStatus_function_signatures[_id]);
+}
+
+QScriptValue qtscript_create_RouterStatus_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<RouterStatus*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((RouterStatus*)0));
+    for (int i = 0; i < 11; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_RouterStatus_prototype_call, qtscript_RouterStatus_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_RouterStatus_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    engine->setDefaultPrototype(qMetaTypeId<RouterStatus*>(), proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_RouterStatus_static_call, proto, qtscript_RouterStatus_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+
+    ctor.setProperty(QString::fromLatin1("Flag"),
+        qtscript_create_RouterStatus_Flag_class(engine, ctor));
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_SendCommandEvent.cpp b/src/vidalia/plugin/extensions/qtscript_SendCommandEvent.cpp
new file mode 100644
index 0000000..5969562
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_SendCommandEvent.cpp
@@ -0,0 +1,134 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <SendCommandEvent.h>
+#include <ControlCommand.h>
+#include <QVariant>
+
+static const char * const qtscript_SendCommandEvent_function_names[] = {
+    "SendCommandEvent"
+    // static
+    // prototype
+    , "command"
+    , "toString"
+};
+
+static const char * const qtscript_SendCommandEvent_function_signatures[] = {
+    ""
+    // static
+    // prototype
+    , ""
+""
+};
+
+static const int qtscript_SendCommandEvent_function_lengths[] = {
+    0
+    // static
+    // prototype
+    , 0
+    , 0
+};
+
+static QScriptValue qtscript_SendCommandEvent_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("SendCommandEvent::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(SendCommandEvent*)
+Q_DECLARE_METATYPE(ControlCommand)
+Q_DECLARE_METATYPE(QEvent*)
+
+//
+// SendCommandEvent
+//
+
+static QScriptValue qtscript_SendCommandEvent_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 1;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    SendCommandEvent* _q_self = qscriptvalue_cast<SendCommandEvent*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("SendCommandEvent.%0(): this object is not a SendCommandEvent")
+            .arg(qtscript_SendCommandEvent_function_names[_id+1]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 0) {
+        ControlCommand _q_result = _q_self->command();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 1: {
+    QString result = QString::fromLatin1("SendCommandEvent");
+    return QScriptValue(context->engine(), result);
+    }
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_SendCommandEvent_throw_ambiguity_error_helper(context,
+        qtscript_SendCommandEvent_function_names[_id+1],
+        qtscript_SendCommandEvent_function_signatures[_id+1]);
+}
+
+static QScriptValue qtscript_SendCommandEvent_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    return context->throwError(QScriptContext::TypeError,
+        QString::fromLatin1("SendCommandEvent cannot be constructed"));
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_SendCommandEvent_throw_ambiguity_error_helper(context,
+        qtscript_SendCommandEvent_function_names[_id],
+        qtscript_SendCommandEvent_function_signatures[_id]);
+}
+
+QScriptValue qtscript_create_SendCommandEvent_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<SendCommandEvent*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((SendCommandEvent*)0));
+    proto.setPrototype(engine->defaultPrototype(qMetaTypeId<QEvent*>()));
+    for (int i = 0; i < 2; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_SendCommandEvent_prototype_call, qtscript_SendCommandEvent_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_SendCommandEvent_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    engine->setDefaultPrototype(qMetaTypeId<SendCommandEvent*>(), proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_SendCommandEvent_static_call, proto, qtscript_SendCommandEvent_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_Stream.cpp b/src/vidalia/plugin/extensions/qtscript_Stream.cpp
new file mode 100644
index 0000000..20b63a1
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_Stream.cpp
@@ -0,0 +1,413 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <Stream.h>
+#include <QVariant>
+#include <Stream.h>
+
+static const char * const qtscript_Stream_function_names[] = {
+    "Stream"
+    // static
+    , "fromString"
+    , "isValidStreamId"
+    , "toStatus"
+    , "tr"
+    , "trUtf8"
+    // prototype
+    , "circuitId"
+    , "id"
+    , "isValid"
+    , "status"
+    , "statusString"
+    , "target"
+    , "targetAddress"
+    , "targetPort"
+    , "toString"
+};
+
+static const char * const qtscript_Stream_function_signatures[] = {
+    "\nString streamId, Status status, String circuitId, String address, unsigned short port\nString streamId, Status status, String circuitId, String target"
+    // static
+    , "String stream"
+    , "String streamId"
+    , "String strStatus"
+    , "char sourceText, char disambiguation\nchar sourceText, char disambiguation, int n"
+    , "char sourceText, char disambiguation\nchar sourceText, char disambiguation, int n"
+    // prototype
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+    , ""
+""
+};
+
+static const int qtscript_Stream_function_lengths[] = {
+    5
+    // static
+    , 1
+    , 1
+    , 1
+    , 3
+    , 3
+    // prototype
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+    , 0
+};
+
+static QScriptValue qtscript_Stream_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("Stream::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(Stream*)
+Q_DECLARE_METATYPE(Stream::Status)
+Q_DECLARE_METATYPE(char*)
+
+static QScriptValue qtscript_create_enum_class_helper(
+    QScriptEngine *engine,
+    QScriptEngine::FunctionSignature construct,
+    QScriptEngine::FunctionSignature valueOf,
+    QScriptEngine::FunctionSignature toString)
+{
+    QScriptValue proto = engine->newObject();
+    proto.setProperty(QString::fromLatin1("valueOf"),
+        engine->newFunction(valueOf), QScriptValue::SkipInEnumeration);
+    proto.setProperty(QString::fromLatin1("toString"),
+        engine->newFunction(toString), QScriptValue::SkipInEnumeration);
+    return engine->newFunction(construct, proto, 1);
+}
+
+//
+// Stream::Status
+//
+
+static const Stream::Status qtscript_Stream_Status_values[] = {
+    Stream::Unknown
+    , Stream::New
+    , Stream::NewResolve
+    , Stream::SentConnect
+    , Stream::SentResolve
+    , Stream::Succeeded
+    , Stream::Failed
+    , Stream::Closed
+    , Stream::Detached
+    , Stream::Remap
+};
+
+static const char * const qtscript_Stream_Status_keys[] = {
+    "Unknown"
+    , "New"
+    , "NewResolve"
+    , "SentConnect"
+    , "SentResolve"
+    , "Succeeded"
+    , "Failed"
+    , "Closed"
+    , "Detached"
+    , "Remap"
+};
+
+static QString qtscript_Stream_Status_toStringHelper(Stream::Status value)
+{
+    if ((value >= Stream::Unknown) && (value <= Stream::Remap))
+        return qtscript_Stream_Status_keys[static_cast<int>(value)-static_cast<int>(Stream::Unknown)];
+    return QString();
+}
+
+static QScriptValue qtscript_Stream_Status_toScriptValue(QScriptEngine *engine, const Stream::Status &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("Stream"));
+    return clazz.property(qtscript_Stream_Status_toStringHelper(value));
+}
+
+static void qtscript_Stream_Status_fromScriptValue(const QScriptValue &value, Stream::Status &out)
+{
+    out = qvariant_cast<Stream::Status>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_Stream_Status(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    if ((arg >= Stream::Unknown) && (arg <= Stream::Remap))
+        return qScriptValueFromValue(engine,  static_cast<Stream::Status>(arg));
+    return context->throwError(QString::fromLatin1("Status(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_Stream_Status_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    Stream::Status value = qscriptvalue_cast<Stream::Status>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_Stream_Status_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    Stream::Status value = qscriptvalue_cast<Stream::Status>(context->thisObject());
+    return QScriptValue(engine, qtscript_Stream_Status_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_Stream_Status_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_Stream_Status,
+        qtscript_Stream_Status_valueOf, qtscript_Stream_Status_toString);
+    qScriptRegisterMetaType<Stream::Status>(engine, qtscript_Stream_Status_toScriptValue,
+        qtscript_Stream_Status_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 10; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_Stream_Status_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_Stream_Status_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// Stream
+//
+
+static QScriptValue qtscript_Stream_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 8;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    Stream* _q_self = qscriptvalue_cast<Stream*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("Stream.%0(): this object is not a Stream")
+            .arg(qtscript_Stream_function_names[_id+6]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->circuitId();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->id();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->isValid();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 0) {
+        Stream::Status _q_result = _q_self->status();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->statusString();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 5:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->target();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 6:
+    if (context->argumentCount() == 0) {
+        QString _q_result = _q_self->targetAddress();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 7:
+    if (context->argumentCount() == 0) {
+        unsigned short _q_result = _q_self->targetPort();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 8: {
+    QString result = QString::fromLatin1("Stream");
+    return QScriptValue(context->engine(), result);
+    }
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_Stream_throw_ambiguity_error_helper(context,
+        qtscript_Stream_function_names[_id+6],
+        qtscript_Stream_function_signatures[_id+6]);
+}
+
+static QScriptValue qtscript_Stream_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("Stream(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        Stream* _q_cpp_result = new Stream();
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    } else if (context->argumentCount() == 4) {
+        QString _q_arg0 = context->argument(0).toString();
+        Stream::Status _q_arg1 = qscriptvalue_cast<Stream::Status>(context->argument(1));
+        QString _q_arg2 = context->argument(2).toString();
+        QString _q_arg3 = context->argument(3).toString();
+        Stream* _q_cpp_result = new Stream(_q_arg0, _q_arg1, _q_arg2, _q_arg3);
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    } else if (context->argumentCount() == 5) {
+        QString _q_arg0 = context->argument(0).toString();
+        Stream::Status _q_arg1 = qscriptvalue_cast<Stream::Status>(context->argument(1));
+        QString _q_arg2 = context->argument(2).toString();
+        QString _q_arg3 = context->argument(3).toString();
+        unsigned short _q_arg4 = qscriptvalue_cast<unsigned short>(context->argument(4));
+        Stream* _q_cpp_result = new Stream(_q_arg0, _q_arg1, _q_arg2, _q_arg3, _q_arg4);
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue(_q_cpp_result));
+        return _q_result;
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        Stream _q_result = Stream::fromString(_q_arg0);
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        bool _q_result = Stream::isValidStreamId(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        Stream::Status _q_result = Stream::toStatus(_q_arg0);
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 1) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        QString _q_result = Stream::tr(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 2) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        QString _q_result = Stream::tr(_q_arg0, _q_arg1);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 3) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        int _q_arg2 = context->argument(2).toInt32();
+        QString _q_result = Stream::tr(_q_arg0, _q_arg1, _q_arg2);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 5:
+    if (context->argumentCount() == 1) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        QString _q_result = Stream::trUtf8(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 2) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        QString _q_result = Stream::trUtf8(_q_arg0, _q_arg1);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 3) {
+        char* _q_arg0 = qscriptvalue_cast<char*>(context->argument(0));
+        char* _q_arg1 = qscriptvalue_cast<char*>(context->argument(1));
+        int _q_arg2 = context->argument(2).toInt32();
+        QString _q_result = Stream::trUtf8(_q_arg0, _q_arg1, _q_arg2);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_Stream_throw_ambiguity_error_helper(context,
+        qtscript_Stream_function_names[_id],
+        qtscript_Stream_function_signatures[_id]);
+}
+
+QScriptValue qtscript_create_Stream_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<Stream*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((Stream*)0));
+    for (int i = 0; i < 9; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_Stream_prototype_call, qtscript_Stream_function_lengths[i+6]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_Stream_function_names[i+6]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    engine->setDefaultPrototype(qMetaTypeId<Stream*>(), proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_Stream_static_call, proto, qtscript_Stream_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+    for (int i = 0; i < 5; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_Stream_static_call,
+            qtscript_Stream_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i+1)));
+        ctor.setProperty(QString::fromLatin1(qtscript_Stream_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    ctor.setProperty(QString::fromLatin1("Status"),
+        qtscript_create_Stream_Status_class(engine, ctor));
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_TorControl.cpp b/src/vidalia/plugin/extensions/qtscript_TorControl.cpp
index 67a3a7a..b0ce6e9 100644
--- a/src/vidalia/plugin/extensions/qtscript_TorControl.cpp
+++ b/src/vidalia/plugin/extensions/qtscript_TorControl.cpp
@@ -6,7 +6,12 @@
 #include <qmetaobject.h>
 
 #include <TorControl.h>
+#include <BootstrapStatus.h>
+#include <Circuit.h>
+#include <ControlCommand.h>
+#include <ControlReply.h>
 #include <QVariant>
+#include <Stream.h>
 #include <qbytearray.h>
 #include <qcoreevent.h>
 #include <qdatetime.h>
@@ -15,6 +20,8 @@
 #include <qobject.h>
 #include <qstringlist.h>
 
+#include "qtscriptshell_TorControl.h"
+
 static const char * const qtscript_TorControl_function_names[] = {
     "TorControl"
     // static
@@ -45,6 +52,7 @@ static const char * const qtscript_TorControl_function_names[] = {
     , "loadConf"
     , "resetConf"
     , "saveConf"
+    , "setConf"
     , "setEvents"
     , "shouldContinue"
     , "start"
@@ -55,10 +63,10 @@ static const char * const qtscript_TorControl_function_names[] = {
 };
 
 static const char * const qtscript_TorControl_function_signatures[] = {
-    ""
+    "Method method"
     // static
     // prototype
-    , "QByteArray cookie, String errmsg\nString password, String errmsg"
+    , "QByteArray cookie, bool safe, String errmsg\nString password, String errmsg"
     , ""
     , ""
     , "QHostAddress address, unsigned short port\nString path"
@@ -84,6 +92,7 @@ static const char * const qtscript_TorControl_function_signatures[] = {
     , "String contents, String errmsg"
     , "String key, String errmsg\nList keys, String errmsg"
     , "String errmsg"
+    , "String key, String value, String errmsg, ControlReply reply\nString keyAndValue, String errmsg, ControlReply reply"
     , "String errmsg"
     , "String errmsg"
     , "String tor, List args"
@@ -94,10 +103,10 @@ static const char * const qtscript_TorControl_function_signatures[] = {
 };
 
 static const int qtscript_TorControl_function_lengths[] = {
-    0
+    1
     // static
     // prototype
-    , 2
+    , 3
     , 0
     , 0
     , 2
@@ -123,6 +132,7 @@ static const int qtscript_TorControl_function_lengths[] = {
     , 2
     , 2
     , 1
+    , 4
     , 1
     , 1
     , 2
@@ -144,6 +154,7 @@ static QScriptValue qtscript_TorControl_throw_ambiguity_error_helper(
 }
 
 Q_DECLARE_METATYPE(TorControl*)
+Q_DECLARE_METATYPE(QtScriptShell_TorControl*)
 Q_DECLARE_METATYPE(QString*)
 Q_DECLARE_METATYPE(QHostAddress)
 Q_DECLARE_METATYPE(int*)
@@ -173,6 +184,8 @@ struct QMetaTypeId< QHash<QString,QString> > \
     } \
 };
 Q_DECLARE_METATYPE(QList<unsigned short>)
+Q_DECLARE_METATYPE(ControlReply*)
+Q_DECLARE_METATYPE(ControlMethod::Method)
 
 //
 // TorControl
@@ -188,7 +201,7 @@ static QScriptValue qtscript_TorControl_prototype_call(QScriptContext *context,
     if (context->callee().isFunction())
         _id = context->callee().data().toUInt32();
     else
-        _id = 0xBABE0000 + 32;
+        _id = 0xBABE0000 + 33;
 #endif
     Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
     _id &= 0x0000FFFF;
@@ -218,10 +231,10 @@ static QScriptValue qtscript_TorControl_prototype_call(QScriptContext *context,
     }
     if (context->argumentCount() == 2) {
         if ((qMetaTypeId<QByteArray>() == context->argument(0).toVariant().userType())
-            && qscriptvalue_cast<QString*>(context->argument(1))) {
+            && context->argument(1).isBoolean()) {
             QByteArray _q_arg0 = qscriptvalue_cast<QByteArray>(context->argument(0));
-            QString* _q_arg1 = qscriptvalue_cast<QString*>(context->argument(1));
-            bool _q_result = _q_self->authenticate(_q_arg0, false, _q_arg1);
+            bool _q_arg1 = context->argument(1).toBoolean();
+            bool _q_result = _q_self->authenticate(_q_arg0, _q_arg1);
             return QScriptValue(context->engine(), _q_result);
         } else if (context->argument(0).isString()
             && qscriptvalue_cast<QString*>(context->argument(1))) {
@@ -231,6 +244,13 @@ static QScriptValue qtscript_TorControl_prototype_call(QScriptContext *context,
             return QScriptValue(context->engine(), _q_result);
         }
     }
+    if (context->argumentCount() == 3) {
+        QByteArray _q_arg0 = qscriptvalue_cast<QByteArray>(context->argument(0));
+        bool _q_arg1 = context->argument(1).toBoolean();
+        QString* _q_arg2 = qscriptvalue_cast<QString*>(context->argument(2));
+        bool _q_result = _q_self->authenticate(_q_arg0, _q_arg1, _q_arg2);
+        return QScriptValue(context->engine(), _q_result);
+    }
     break;
 
     case 1:
@@ -575,6 +595,56 @@ static QScriptValue qtscript_TorControl_prototype_call(QScriptContext *context,
     break;
 
     case 26:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        bool _q_result = _q_self->setConf(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 2) {
+        if (context->argument(0).isString()
+            && context->argument(1).isString()) {
+            QString _q_arg0 = context->argument(0).toString();
+            QString _q_arg1 = context->argument(1).toString();
+            bool _q_result = _q_self->setConf(_q_arg0, _q_arg1);
+            return QScriptValue(context->engine(), _q_result);
+        } else if (context->argument(0).isString()
+            && qscriptvalue_cast<QString*>(context->argument(1))) {
+            QString _q_arg0 = context->argument(0).toString();
+            QString* _q_arg1 = qscriptvalue_cast<QString*>(context->argument(1));
+            bool _q_result = _q_self->setConf(_q_arg0, _q_arg1);
+            return QScriptValue(context->engine(), _q_result);
+        }
+    }
+    if (context->argumentCount() == 3) {
+        if (context->argument(0).isString()
+            && context->argument(1).isString()
+            && qscriptvalue_cast<QString*>(context->argument(2))) {
+            QString _q_arg0 = context->argument(0).toString();
+            QString _q_arg1 = context->argument(1).toString();
+            QString* _q_arg2 = qscriptvalue_cast<QString*>(context->argument(2));
+            bool _q_result = _q_self->setConf(_q_arg0, _q_arg1, _q_arg2);
+            return QScriptValue(context->engine(), _q_result);
+        } else if (context->argument(0).isString()
+            && qscriptvalue_cast<QString*>(context->argument(1))
+            && qscriptvalue_cast<ControlReply*>(context->argument(2))) {
+            QString _q_arg0 = context->argument(0).toString();
+            QString* _q_arg1 = qscriptvalue_cast<QString*>(context->argument(1));
+            ControlReply* _q_arg2 = qscriptvalue_cast<ControlReply*>(context->argument(2));
+            bool _q_result = _q_self->setConf(_q_arg0, _q_arg1, _q_arg2);
+            return QScriptValue(context->engine(), _q_result);
+        }
+    }
+    if (context->argumentCount() == 4) {
+        QString _q_arg0 = context->argument(0).toString();
+        QString _q_arg1 = context->argument(1).toString();
+        QString* _q_arg2 = qscriptvalue_cast<QString*>(context->argument(2));
+        ControlReply* _q_arg3 = qscriptvalue_cast<ControlReply*>(context->argument(3));
+        bool _q_result = _q_self->setConf(_q_arg0, _q_arg1, _q_arg2, _q_arg3);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 27:
     if (context->argumentCount() == 0) {
         bool _q_result = _q_self->setEvents();
         return QScriptValue(context->engine(), _q_result);
@@ -586,7 +656,7 @@ static QScriptValue qtscript_TorControl_prototype_call(QScriptContext *context,
     }
     break;
 
-    case 27:
+    case 28:
     if (context->argumentCount() == 0) {
         bool _q_result = _q_self->shouldContinue();
         return QScriptValue(context->engine(), _q_result);
@@ -598,7 +668,7 @@ static QScriptValue qtscript_TorControl_prototype_call(QScriptContext *context,
     }
     break;
 
-    case 28:
+    case 29:
     if (context->argumentCount() == 2) {
         QString _q_arg0 = context->argument(0).toString();
         QStringList _q_arg1;
@@ -608,7 +678,7 @@ static QScriptValue qtscript_TorControl_prototype_call(QScriptContext *context,
     }
     break;
 
-    case 29:
+    case 30:
     if (context->argumentCount() == 0) {
         bool _q_result = _q_self->stop();
         return QScriptValue(context->engine(), _q_result);
@@ -620,7 +690,7 @@ static QScriptValue qtscript_TorControl_prototype_call(QScriptContext *context,
     }
     break;
 
-    case 30:
+    case 31:
     if (context->argumentCount() == 1) {
         QString* _q_arg0 = qscriptvalue_cast<QString*>(context->argument(0));
         bool _q_result = _q_self->takeOwnership(_q_arg0);
@@ -628,7 +698,7 @@ static QScriptValue qtscript_TorControl_prototype_call(QScriptContext *context,
     }
     break;
 
-    case 31:
+    case 32:
     if (context->argumentCount() == 0) {
         bool _q_result = _q_self->useMicrodescriptors();
         return QScriptValue(context->engine(), _q_result);
@@ -640,7 +710,7 @@ static QScriptValue qtscript_TorControl_prototype_call(QScriptContext *context,
     }
     break;
 
-    case 32: {
+    case 33: {
     QString result = QString::fromLatin1("TorControl");
     return QScriptValue(context->engine(), result);
     }
@@ -660,8 +730,21 @@ static QScriptValue qtscript_TorControl_static_call(QScriptContext *context, QSc
     _id &= 0x0000FFFF;
     switch (_id) {
     case 0:
-    return context->throwError(QScriptContext::TypeError,
-        QString::fromLatin1("TorControl cannot be constructed"));
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("TorControl(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        QtScriptShell_TorControl* _q_cpp_result = new QtScriptShell_TorControl();
+        QScriptValue _q_result = context->engine()->newQObject(context->thisObject(), (TorControl*)_q_cpp_result, QScriptEngine::AutoOwnership);
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    } else if (context->argumentCount() == 1) {
+        ControlMethod::Method _q_arg0 = qscriptvalue_cast<ControlMethod::Method>(context->argument(0));
+        QtScriptShell_TorControl* _q_cpp_result = new QtScriptShell_TorControl(_q_arg0);
+        QScriptValue _q_result = context->engine()->newQObject(context->thisObject(), (TorControl*)_q_cpp_result, QScriptEngine::AutoOwnership);
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    }
     break;
 
     default:
@@ -687,14 +770,14 @@ QScriptValue qtscript_create_TorControl_class(QScriptEngine *engine)
     engine->setDefaultPrototype(qMetaTypeId<TorControl*>(), QScriptValue());
     QScriptValue proto = engine->newVariant(qVariantFromValue((TorControl*)0));
     proto.setPrototype(engine->defaultPrototype(qMetaTypeId<QObject*>()));
-    for (int i = 0; i < 33; ++i) {
+    for (int i = 0; i < 34; ++i) {
         QScriptValue fun = engine->newFunction(qtscript_TorControl_prototype_call, qtscript_TorControl_function_lengths[i+1]);
         fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
         proto.setProperty(QString::fromLatin1(qtscript_TorControl_function_names[i+1]),
             fun, QScriptValue::SkipInEnumeration);
     }
 
-    qScriptRegisterMetaType<TorControl*>(engine, qtscript_TorControl_toScriptValue,
+    qScriptRegisterMetaType<TorControl*>(engine, qtscript_TorControl_toScriptValue, 
         qtscript_TorControl_fromScriptValue, proto);
 
     QScriptValue ctor = engine->newFunction(qtscript_TorControl_static_call, proto, qtscript_TorControl_function_lengths[0]);
diff --git a/src/vidalia/plugin/extensions/qtscript_TorEvents.cpp b/src/vidalia/plugin/extensions/qtscript_TorEvents.cpp
new file mode 100644
index 0000000..74c647a
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_TorEvents.cpp
@@ -0,0 +1,297 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <TorEvents.h>
+#include <BootstrapStatus.h>
+#include <Circuit.h>
+#include <ControlReply.h>
+#include <QVariant>
+#include <ReplyLine.h>
+#include <Stream.h>
+#include <qbytearray.h>
+#include <qcoreevent.h>
+#include <qdatetime.h>
+#include <qhostaddress.h>
+#include <qlist.h>
+#include <qobject.h>
+#include <qpair.h>
+#include <qstringlist.h>
+
+#include "qtscriptshell_TorEvents.h"
+
+static const char * const qtscript_TorEvents_function_names[] = {
+    "TorEvents"
+    // static
+    , "toString"
+    // prototype
+    , "handleEvent"
+};
+
+static const char * const qtscript_TorEvents_function_signatures[] = {
+    "QObject parent"
+    // static
+    , "Event e"
+    // prototype
+    , "ControlReply reply"
+};
+
+static const int qtscript_TorEvents_function_lengths[] = {
+    1
+    // static
+    , 1
+    // prototype
+    , 1
+};
+
+static QScriptValue qtscript_TorEvents_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("TorEvents::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(TorEvents*)
+Q_DECLARE_METATYPE(QtScriptShell_TorEvents*)
+Q_DECLARE_METATYPE(TorEvents::Event)
+Q_DECLARE_METATYPE(ControlReply)
+
+static QScriptValue qtscript_create_enum_class_helper(
+    QScriptEngine *engine,
+    QScriptEngine::FunctionSignature construct,
+    QScriptEngine::FunctionSignature valueOf,
+    QScriptEngine::FunctionSignature toString)
+{
+    QScriptValue proto = engine->newObject();
+    proto.setProperty(QString::fromLatin1("valueOf"),
+        engine->newFunction(valueOf), QScriptValue::SkipInEnumeration);
+    proto.setProperty(QString::fromLatin1("toString"),
+        engine->newFunction(toString), QScriptValue::SkipInEnumeration);
+    return engine->newFunction(construct, proto, 1);
+}
+
+//
+// TorEvents::Event
+//
+
+static const TorEvents::Event qtscript_TorEvents_Event_values[] = {
+    TorEvents::Unknown
+    , TorEvents::Bandwidth
+    , TorEvents::LogDebug
+    , TorEvents::LogInfo
+    , TorEvents::LogNotice
+    , TorEvents::LogWarn
+    , TorEvents::LogError
+    , TorEvents::CircuitStatus
+    , TorEvents::StreamStatus
+    , TorEvents::OrConnStatus
+    , TorEvents::NewDescriptor
+    , TorEvents::AddressMap
+    , TorEvents::GeneralStatus
+    , TorEvents::ClientStatus
+    , TorEvents::ServerStatus
+    , TorEvents::NewConsensus
+    , TorEvents::StreamBandwidth
+};
+
+static const char * const qtscript_TorEvents_Event_keys[] = {
+    "Unknown"
+    , "Bandwidth"
+    , "LogDebug"
+    , "LogInfo"
+    , "LogNotice"
+    , "LogWarn"
+    , "LogError"
+    , "CircuitStatus"
+    , "StreamStatus"
+    , "OrConnStatus"
+    , "NewDescriptor"
+    , "AddressMap"
+    , "GeneralStatus"
+    , "ClientStatus"
+    , "ServerStatus"
+    , "NewConsensus"
+    , "StreamBandwidth"
+};
+
+static QString qtscript_TorEvents_Event_toStringHelper(TorEvents::Event value)
+{
+    if ((value >= TorEvents::Unknown) && (value <= TorEvents::StreamBandwidth))
+        return qtscript_TorEvents_Event_keys[static_cast<int>(value)-static_cast<int>(TorEvents::Unknown)];
+    return QString();
+}
+
+static QScriptValue qtscript_TorEvents_Event_toScriptValue(QScriptEngine *engine, const TorEvents::Event &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("TorEvents"));
+    return clazz.property(qtscript_TorEvents_Event_toStringHelper(value));
+}
+
+static void qtscript_TorEvents_Event_fromScriptValue(const QScriptValue &value, TorEvents::Event &out)
+{
+    out = qvariant_cast<TorEvents::Event>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_TorEvents_Event(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    if ((arg >= TorEvents::Unknown) && (arg <= TorEvents::StreamBandwidth))
+        return qScriptValueFromValue(engine,  static_cast<TorEvents::Event>(arg));
+    return context->throwError(QString::fromLatin1("Event(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_TorEvents_Event_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    TorEvents::Event value = qscriptvalue_cast<TorEvents::Event>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_TorEvents_Event_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    TorEvents::Event value = qscriptvalue_cast<TorEvents::Event>(context->thisObject());
+    return QScriptValue(engine, qtscript_TorEvents_Event_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_TorEvents_Event_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_TorEvents_Event,
+        qtscript_TorEvents_Event_valueOf, qtscript_TorEvents_Event_toString);
+    qScriptRegisterMetaType<TorEvents::Event>(engine, qtscript_TorEvents_Event_toScriptValue,
+        qtscript_TorEvents_Event_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 17; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_TorEvents_Event_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_TorEvents_Event_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// TorEvents
+//
+
+static QScriptValue qtscript_TorEvents_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 1;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    TorEvents* _q_self = qscriptvalue_cast<TorEvents*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("TorEvents.%0(): this object is not a TorEvents")
+            .arg(qtscript_TorEvents_function_names[_id+2]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 1) {
+        ControlReply _q_arg0 = qscriptvalue_cast<ControlReply>(context->argument(0));
+        _q_self->handleEvent(_q_arg0);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_TorEvents_throw_ambiguity_error_helper(context,
+        qtscript_TorEvents_function_names[_id+2],
+        qtscript_TorEvents_function_signatures[_id+2]);
+}
+
+static QScriptValue qtscript_TorEvents_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("TorEvents(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        QtScriptShell_TorEvents* _q_cpp_result = new QtScriptShell_TorEvents();
+        QScriptValue _q_result = context->engine()->newQObject(context->thisObject(), (TorEvents*)_q_cpp_result, QScriptEngine::AutoOwnership);
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    } else if (context->argumentCount() == 1) {
+        QObject* _q_arg0 = context->argument(0).toQObject();
+        QtScriptShell_TorEvents* _q_cpp_result = new QtScriptShell_TorEvents(_q_arg0);
+        QScriptValue _q_result = context->engine()->newQObject(context->thisObject(), (TorEvents*)_q_cpp_result, QScriptEngine::AutoOwnership);
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 1) {
+        TorEvents::Event _q_arg0 = qscriptvalue_cast<TorEvents::Event>(context->argument(0));
+        QString _q_result = TorEvents::toString(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_TorEvents_throw_ambiguity_error_helper(context,
+        qtscript_TorEvents_function_names[_id],
+        qtscript_TorEvents_function_signatures[_id]);
+}
+
+static QScriptValue qtscript_TorEvents_toScriptValue(QScriptEngine *engine, TorEvents* const &in)
+{
+    return engine->newQObject(in, QScriptEngine::QtOwnership, QScriptEngine::PreferExistingWrapperObject);
+}
+
+static void qtscript_TorEvents_fromScriptValue(const QScriptValue &value, TorEvents* &out)
+{
+    out = qobject_cast<TorEvents*>(value.toQObject());
+}
+
+QScriptValue qtscript_create_TorEvents_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<TorEvents*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((TorEvents*)0));
+    proto.setPrototype(engine->defaultPrototype(qMetaTypeId<QObject*>()));
+    for (int i = 0; i < 1; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_TorEvents_prototype_call, qtscript_TorEvents_function_lengths[i+2]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_TorEvents_function_names[i+2]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    qScriptRegisterMetaType<TorEvents*>(engine, qtscript_TorEvents_toScriptValue, 
+        qtscript_TorEvents_fromScriptValue, proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_TorEvents_static_call, proto, qtscript_TorEvents_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+    for (int i = 0; i < 1; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_TorEvents_static_call,
+            qtscript_TorEvents_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i+1)));
+        ctor.setProperty(QString::fromLatin1(qtscript_TorEvents_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    ctor.setProperty(QString::fromLatin1("Event"),
+        qtscript_create_TorEvents_Event_class(engine, ctor));
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_TorProcess.cpp b/src/vidalia/plugin/extensions/qtscript_TorProcess.cpp
new file mode 100644
index 0000000..21f008f
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_TorProcess.cpp
@@ -0,0 +1,232 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <TorProcess.h>
+#include <QVariant>
+#include <qbytearray.h>
+#include <qcoreevent.h>
+#include <qlist.h>
+#include <qobject.h>
+#include <qprocess.h>
+#include <qstringlist.h>
+
+#include "qtscriptshell_TorProcess.h"
+
+static const char * const qtscript_TorProcess_function_names[] = {
+    "TorProcess"
+    // static
+    , "version"
+    // prototype
+    , "closeStdout"
+    , "openStdout"
+    , "pid"
+    , "start"
+    , "stop"
+    , "toString"
+};
+
+static const char * const qtscript_TorProcess_function_signatures[] = {
+    "QObject parent"
+    // static
+    , "String exe"
+    // prototype
+    , ""
+    , ""
+    , ""
+    , "String app, List args"
+    , "String errmsg"
+""
+};
+
+static const int qtscript_TorProcess_function_lengths[] = {
+    1
+    // static
+    , 1
+    // prototype
+    , 0
+    , 0
+    , 0
+    , 2
+    , 1
+    , 0
+};
+
+static QScriptValue qtscript_TorProcess_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("TorProcess::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(TorProcess*)
+Q_DECLARE_METATYPE(QtScriptShell_TorProcess*)
+Q_DECLARE_METATYPE(QString*)
+Q_DECLARE_METATYPE(QProcess*)
+
+//
+// TorProcess
+//
+
+static QScriptValue qtscript_TorProcess_prototype_call(QScriptContext *context, QScriptEngine *)
+{
+#if QT_VERSION > 0x040400
+    Q_ASSERT(context->callee().isFunction());
+    uint _id = context->callee().data().toUInt32();
+#else
+    uint _id;
+    if (context->callee().isFunction())
+        _id = context->callee().data().toUInt32();
+    else
+        _id = 0xBABE0000 + 5;
+#endif
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    TorProcess* _q_self = qscriptvalue_cast<TorProcess*>(context->thisObject());
+    if (!_q_self) {
+        return context->throwError(QScriptContext::TypeError,
+            QString::fromLatin1("TorProcess.%0(): this object is not a TorProcess")
+            .arg(qtscript_TorProcess_function_names[_id+2]));
+    }
+
+    switch (_id) {
+    case 0:
+    if (context->argumentCount() == 0) {
+        _q_self->closeStdout();
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 0) {
+        _q_self->openStdout();
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 2:
+    if (context->argumentCount() == 0) {
+        unsigned long long _q_result = _q_self->pid();
+        return qScriptValueFromValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 3:
+    if (context->argumentCount() == 2) {
+        QString _q_arg0 = context->argument(0).toString();
+        QStringList _q_arg1;
+        qScriptValueToSequence(context->argument(1), _q_arg1);
+        _q_self->start(_q_arg0, _q_arg1);
+        return context->engine()->undefinedValue();
+    }
+    break;
+
+    case 4:
+    if (context->argumentCount() == 0) {
+        bool _q_result = _q_self->stop();
+        return QScriptValue(context->engine(), _q_result);
+    }
+    if (context->argumentCount() == 1) {
+        QString* _q_arg0 = qscriptvalue_cast<QString*>(context->argument(0));
+        bool _q_result = _q_self->stop(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    case 5: {
+    QString result = QString::fromLatin1("TorProcess");
+    return QScriptValue(context->engine(), result);
+    }
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_TorProcess_throw_ambiguity_error_helper(context,
+        qtscript_TorProcess_function_names[_id+2],
+        qtscript_TorProcess_function_signatures[_id+2]);
+}
+
+static QScriptValue qtscript_TorProcess_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("TorProcess(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        QtScriptShell_TorProcess* _q_cpp_result = new QtScriptShell_TorProcess();
+        QScriptValue _q_result = context->engine()->newQObject(context->thisObject(), (TorProcess*)_q_cpp_result, QScriptEngine::AutoOwnership);
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    } else if (context->argumentCount() == 1) {
+        QObject* _q_arg0 = context->argument(0).toQObject();
+        QtScriptShell_TorProcess* _q_cpp_result = new QtScriptShell_TorProcess(_q_arg0);
+        QScriptValue _q_result = context->engine()->newQObject(context->thisObject(), (TorProcess*)_q_cpp_result, QScriptEngine::AutoOwnership);
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 1) {
+        QString _q_arg0 = context->argument(0).toString();
+        QString _q_result = TorProcess::version(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_TorProcess_throw_ambiguity_error_helper(context,
+        qtscript_TorProcess_function_names[_id],
+        qtscript_TorProcess_function_signatures[_id]);
+}
+
+static QScriptValue qtscript_TorProcess_toScriptValue(QScriptEngine *engine, TorProcess* const &in)
+{
+    return engine->newQObject(in, QScriptEngine::QtOwnership, QScriptEngine::PreferExistingWrapperObject);
+}
+
+static void qtscript_TorProcess_fromScriptValue(const QScriptValue &value, TorProcess* &out)
+{
+    out = qobject_cast<TorProcess*>(value.toQObject());
+}
+
+QScriptValue qtscript_create_TorProcess_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<TorProcess*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((TorProcess*)0));
+    proto.setPrototype(engine->defaultPrototype(qMetaTypeId<QProcess*>()));
+    for (int i = 0; i < 6; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_TorProcess_prototype_call, qtscript_TorProcess_function_lengths[i+2]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i)));
+        proto.setProperty(QString::fromLatin1(qtscript_TorProcess_function_names[i+2]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    qScriptRegisterMetaType<TorProcess*>(engine, qtscript_TorProcess_toScriptValue, 
+        qtscript_TorProcess_fromScriptValue, proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_TorProcess_static_call, proto, qtscript_TorProcess_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+    for (int i = 0; i < 1; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_TorProcess_static_call,
+            qtscript_TorProcess_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i+1)));
+        ctor.setProperty(QString::fromLatin1(qtscript_TorProcess_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscript_TorSignal.cpp b/src/vidalia/plugin/extensions/qtscript_TorSignal.cpp
new file mode 100644
index 0000000..595c412
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscript_TorSignal.cpp
@@ -0,0 +1,196 @@
+#include <QtScript/QScriptEngine>
+#include <QtScript/QScriptContext>
+#include <QtScript/QScriptValue>
+#include <QtCore/QStringList>
+#include <QtCore/QDebug>
+#include <qmetaobject.h>
+
+#include <TorSignal.h>
+#include <QVariant>
+
+#include "qtscriptshell_TorSignal.h"
+
+static const char * const qtscript_TorSignal_function_names[] = {
+    "TorSignal"
+    // static
+    , "toString"
+    // prototype
+};
+
+static const char * const qtscript_TorSignal_function_signatures[] = {
+    ""
+    // static
+    , "Signal signal"
+    // prototype
+};
+
+static const int qtscript_TorSignal_function_lengths[] = {
+    0
+    // static
+    , 1
+    // prototype
+};
+
+static QScriptValue qtscript_TorSignal_throw_ambiguity_error_helper(
+    QScriptContext *context, const char *functionName, const char *signatures)
+{
+    QStringList lines = QString::fromLatin1(signatures).split(QLatin1Char('\n'));
+    QStringList fullSignatures;
+    for (int i = 0; i < lines.size(); ++i)
+        fullSignatures.append(QString::fromLatin1("%0(%1)").arg(functionName).arg(lines.at(i)));
+    return context->throwError(QString::fromLatin1("TorSignal::%0(): could not find a function match; candidates are:\n%1")
+        .arg(functionName).arg(fullSignatures.join(QLatin1String("\n"))));
+}
+
+Q_DECLARE_METATYPE(TorSignal*)
+Q_DECLARE_METATYPE(QtScriptShell_TorSignal*)
+Q_DECLARE_METATYPE(TorSignal::Signal)
+
+static QScriptValue qtscript_create_enum_class_helper(
+    QScriptEngine *engine,
+    QScriptEngine::FunctionSignature construct,
+    QScriptEngine::FunctionSignature valueOf,
+    QScriptEngine::FunctionSignature toString)
+{
+    QScriptValue proto = engine->newObject();
+    proto.setProperty(QString::fromLatin1("valueOf"),
+        engine->newFunction(valueOf), QScriptValue::SkipInEnumeration);
+    proto.setProperty(QString::fromLatin1("toString"),
+        engine->newFunction(toString), QScriptValue::SkipInEnumeration);
+    return engine->newFunction(construct, proto, 1);
+}
+
+//
+// TorSignal::Signal
+//
+
+static const TorSignal::Signal qtscript_TorSignal_Signal_values[] = {
+    TorSignal::Reload
+    , TorSignal::Shutdown
+    , TorSignal::Dump
+    , TorSignal::Debug
+    , TorSignal::Halt
+    , TorSignal::NewNym
+};
+
+static const char * const qtscript_TorSignal_Signal_keys[] = {
+    "Reload"
+    , "Shutdown"
+    , "Dump"
+    , "Debug"
+    , "Halt"
+    , "NewNym"
+};
+
+static QString qtscript_TorSignal_Signal_toStringHelper(TorSignal::Signal value)
+{
+    if ((value >= TorSignal::Reload) && (value <= TorSignal::NewNym))
+        return qtscript_TorSignal_Signal_keys[static_cast<int>(value)-static_cast<int>(TorSignal::Reload)];
+    return QString();
+}
+
+static QScriptValue qtscript_TorSignal_Signal_toScriptValue(QScriptEngine *engine, const TorSignal::Signal &value)
+{
+    QScriptValue clazz = engine->globalObject().property(QString::fromLatin1("TorSignal"));
+    return clazz.property(qtscript_TorSignal_Signal_toStringHelper(value));
+}
+
+static void qtscript_TorSignal_Signal_fromScriptValue(const QScriptValue &value, TorSignal::Signal &out)
+{
+    out = qvariant_cast<TorSignal::Signal>(value.toVariant());
+}
+
+static QScriptValue qtscript_construct_TorSignal_Signal(QScriptContext *context, QScriptEngine *engine)
+{
+    int arg = context->argument(0).toInt32();
+    if ((arg >= TorSignal::Reload) && (arg <= TorSignal::NewNym))
+        return qScriptValueFromValue(engine,  static_cast<TorSignal::Signal>(arg));
+    return context->throwError(QString::fromLatin1("Signal(): invalid enum value (%0)").arg(arg));
+}
+
+static QScriptValue qtscript_TorSignal_Signal_valueOf(QScriptContext *context, QScriptEngine *engine)
+{
+    TorSignal::Signal value = qscriptvalue_cast<TorSignal::Signal>(context->thisObject());
+    return QScriptValue(engine, static_cast<int>(value));
+}
+
+static QScriptValue qtscript_TorSignal_Signal_toString(QScriptContext *context, QScriptEngine *engine)
+{
+    TorSignal::Signal value = qscriptvalue_cast<TorSignal::Signal>(context->thisObject());
+    return QScriptValue(engine, qtscript_TorSignal_Signal_toStringHelper(value));
+}
+
+static QScriptValue qtscript_create_TorSignal_Signal_class(QScriptEngine *engine, QScriptValue &clazz)
+{
+    QScriptValue ctor = qtscript_create_enum_class_helper(
+        engine, qtscript_construct_TorSignal_Signal,
+        qtscript_TorSignal_Signal_valueOf, qtscript_TorSignal_Signal_toString);
+    qScriptRegisterMetaType<TorSignal::Signal>(engine, qtscript_TorSignal_Signal_toScriptValue,
+        qtscript_TorSignal_Signal_fromScriptValue, ctor.property(QString::fromLatin1("prototype")));
+    for (int i = 0; i < 6; ++i) {
+        clazz.setProperty(QString::fromLatin1(qtscript_TorSignal_Signal_keys[i]),
+            engine->newVariant(qVariantFromValue(qtscript_TorSignal_Signal_values[i])),
+            QScriptValue::ReadOnly | QScriptValue::Undeletable);
+    }
+    return ctor;
+}
+
+//
+// TorSignal
+//
+
+static QScriptValue qtscript_TorSignal_static_call(QScriptContext *context, QScriptEngine *)
+{
+    uint _id = context->callee().data().toUInt32();
+    Q_ASSERT((_id & 0xFFFF0000) == 0xBABE0000);
+    _id &= 0x0000FFFF;
+    switch (_id) {
+    case 0:
+    if (context->thisObject().strictlyEquals(context->engine()->globalObject())) {
+        return context->throwError(QString::fromLatin1("TorSignal(): Did you forget to construct with 'new'?"));
+    }
+    if (context->argumentCount() == 0) {
+        QtScriptShell_TorSignal* _q_cpp_result = new QtScriptShell_TorSignal();
+        QScriptValue _q_result = context->engine()->newVariant(context->thisObject(), qVariantFromValue((TorSignal*)_q_cpp_result));
+        _q_cpp_result->__qtscript_self = _q_result;
+        return _q_result;
+    }
+    break;
+
+    case 1:
+    if (context->argumentCount() == 1) {
+        TorSignal::Signal _q_arg0 = qscriptvalue_cast<TorSignal::Signal>(context->argument(0));
+        QString _q_result = TorSignal::toString(_q_arg0);
+        return QScriptValue(context->engine(), _q_result);
+    }
+    break;
+
+    default:
+    Q_ASSERT(false);
+    }
+    return qtscript_TorSignal_throw_ambiguity_error_helper(context,
+        qtscript_TorSignal_function_names[_id],
+        qtscript_TorSignal_function_signatures[_id]);
+}
+
+QScriptValue qtscript_create_TorSignal_class(QScriptEngine *engine)
+{
+    engine->setDefaultPrototype(qMetaTypeId<TorSignal*>(), QScriptValue());
+    QScriptValue proto = engine->newVariant(qVariantFromValue((TorSignal*)0));
+
+    engine->setDefaultPrototype(qMetaTypeId<TorSignal*>(), proto);
+
+    QScriptValue ctor = engine->newFunction(qtscript_TorSignal_static_call, proto, qtscript_TorSignal_function_lengths[0]);
+    ctor.setData(QScriptValue(engine, uint(0xBABE0000 + 0)));
+    for (int i = 0; i < 1; ++i) {
+        QScriptValue fun = engine->newFunction(qtscript_TorSignal_static_call,
+            qtscript_TorSignal_function_lengths[i+1]);
+        fun.setData(QScriptValue(engine, uint(0xBABE0000 + i+1)));
+        ctor.setProperty(QString::fromLatin1(qtscript_TorSignal_function_names[i+1]),
+            fun, QScriptValue::SkipInEnumeration);
+    }
+
+    ctor.setProperty(QString::fromLatin1("Signal"),
+        qtscript_create_TorSignal_Signal_class(engine, ctor));
+    return ctor;
+}
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_ControlConnection.cpp b/src/vidalia/plugin/extensions/qtscriptshell_ControlConnection.cpp
new file mode 100644
index 0000000..139fbeb
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_ControlConnection.cpp
@@ -0,0 +1,95 @@
+#include "qtscriptshell_ControlConnection.h"
+
+#include <QtScript/QScriptEngine>
+#include <ControlCommand.h>
+#include <ControlReply.h>
+#include <QVariant>
+#include <TorEvents.h>
+#include <qbytearray.h>
+#include <qcoreevent.h>
+#include <qhostaddress.h>
+#include <qlist.h>
+#include <qobject.h>
+
+#define QTSCRIPT_IS_GENERATED_FUNCTION(fun) ((fun.data().toUInt32() & 0xFFFF0000) == 0xBABE0000)
+
+Q_DECLARE_METATYPE(QChildEvent*)
+Q_DECLARE_METATYPE(QEvent*)
+Q_DECLARE_METATYPE(QTimerEvent*)
+
+QtScriptShell_ControlConnection::QtScriptShell_ControlConnection(ControlMethod::Method  method, TorEvents*  events)
+    : ControlConnection(method, events) {}
+
+QtScriptShell_ControlConnection::~QtScriptShell_ControlConnection() {}
+
+void QtScriptShell_ControlConnection::childEvent(QChildEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("childEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("childEvent") & QScriptValue::QObjectMember)) {
+        ControlConnection::childEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
+void QtScriptShell_ControlConnection::customEvent(QEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("customEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("customEvent") & QScriptValue::QObjectMember)) {
+        ControlConnection::customEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
+bool  QtScriptShell_ControlConnection::event(QEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("event");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("event") & QScriptValue::QObjectMember)) {
+        return ControlConnection::event(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1)));
+    }
+}
+
+bool  QtScriptShell_ControlConnection::eventFilter(QObject*  arg__1, QEvent*  arg__2)
+{
+    QScriptValue _q_function = __qtscript_self.property("eventFilter");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("eventFilter") & QScriptValue::QObjectMember)) {
+        return ControlConnection::eventFilter(arg__1, arg__2);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1)
+            << qScriptValueFromValue(_q_engine, arg__2)));
+    }
+}
+
+void QtScriptShell_ControlConnection::timerEvent(QTimerEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("timerEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("timerEvent") & QScriptValue::QObjectMember)) {
+        ControlConnection::timerEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_ControlConnection.h b/src/vidalia/plugin/extensions/qtscriptshell_ControlConnection.h
new file mode 100644
index 0000000..c5c1c5c
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_ControlConnection.h
@@ -0,0 +1,23 @@
+#ifndef QTSCRIPTSHELL_CONTROLCONNECTION_H
+#define QTSCRIPTSHELL_CONTROLCONNECTION_H
+
+#include <ControlConnection.h>
+
+#include <QtScript/qscriptvalue.h>
+
+class QtScriptShell_ControlConnection : public ControlConnection
+{
+public:
+    QtScriptShell_ControlConnection(ControlMethod::Method  method, TorEvents*  events = 0);
+    ~QtScriptShell_ControlConnection();
+
+    void childEvent(QChildEvent*  arg__1);
+    void customEvent(QEvent*  arg__1);
+    bool  event(QEvent*  arg__1);
+    bool  eventFilter(QObject*  arg__1, QEvent*  arg__2);
+    void timerEvent(QTimerEvent*  arg__1);
+
+    QScriptValue __qtscript_self;
+};
+
+#endif // QTSCRIPTSHELL_CONTROLCONNECTION_H
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_ControlMethod.cpp b/src/vidalia/plugin/extensions/qtscriptshell_ControlMethod.cpp
new file mode 100644
index 0000000..085a9be
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_ControlMethod.cpp
@@ -0,0 +1,13 @@
+#include "qtscriptshell_ControlMethod.h"
+
+#include <QtScript/QScriptEngine>
+#include <QVariant>
+
+#define QTSCRIPT_IS_GENERATED_FUNCTION(fun) ((fun.data().toUInt32() & 0xFFFF0000) == 0xBABE0000)
+
+
+QtScriptShell_ControlMethod::QtScriptShell_ControlMethod()
+    : ControlMethod() {}
+
+QtScriptShell_ControlMethod::~QtScriptShell_ControlMethod() {}
+
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_ControlMethod.h b/src/vidalia/plugin/extensions/qtscriptshell_ControlMethod.h
new file mode 100644
index 0000000..2cd553b
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_ControlMethod.h
@@ -0,0 +1,18 @@
+#ifndef QTSCRIPTSHELL_CONTROLMETHOD_H
+#define QTSCRIPTSHELL_CONTROLMETHOD_H
+
+#include <ControlMethod.h>
+
+#include <QtScript/qscriptvalue.h>
+
+class QtScriptShell_ControlMethod : public ControlMethod
+{
+public:
+    QtScriptShell_ControlMethod();
+    ~QtScriptShell_ControlMethod();
+
+
+    QScriptValue __qtscript_self;
+};
+
+#endif // QTSCRIPTSHELL_CONTROLMETHOD_H
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_ControlSocket.cpp b/src/vidalia/plugin/extensions/qtscriptshell_ControlSocket.cpp
new file mode 100644
index 0000000..252ae71
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_ControlSocket.cpp
@@ -0,0 +1,94 @@
+#include "qtscriptshell_ControlSocket.h"
+
+#include <QtScript/QScriptEngine>
+#include <ControlCommand.h>
+#include <ControlReply.h>
+#include <QVariant>
+#include <qbytearray.h>
+#include <qcoreevent.h>
+#include <qhostaddress.h>
+#include <qlist.h>
+#include <qobject.h>
+
+#define QTSCRIPT_IS_GENERATED_FUNCTION(fun) ((fun.data().toUInt32() & 0xFFFF0000) == 0xBABE0000)
+
+Q_DECLARE_METATYPE(QChildEvent*)
+Q_DECLARE_METATYPE(QEvent*)
+Q_DECLARE_METATYPE(QTimerEvent*)
+
+QtScriptShell_ControlSocket::QtScriptShell_ControlSocket(ControlMethod::Method  method)
+    : ControlSocket(method) {}
+
+QtScriptShell_ControlSocket::~QtScriptShell_ControlSocket() {}
+
+void QtScriptShell_ControlSocket::childEvent(QChildEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("childEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("childEvent") & QScriptValue::QObjectMember)) {
+        ControlSocket::childEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
+void QtScriptShell_ControlSocket::customEvent(QEvent*  event)
+{
+    QScriptValue _q_function = __qtscript_self.property("customEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("customEvent") & QScriptValue::QObjectMember)) {
+        ControlSocket::customEvent(event);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, event));
+    }
+}
+
+bool  QtScriptShell_ControlSocket::event(QEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("event");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("event") & QScriptValue::QObjectMember)) {
+        return ControlSocket::event(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1)));
+    }
+}
+
+bool  QtScriptShell_ControlSocket::eventFilter(QObject*  arg__1, QEvent*  arg__2)
+{
+    QScriptValue _q_function = __qtscript_self.property("eventFilter");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("eventFilter") & QScriptValue::QObjectMember)) {
+        return ControlSocket::eventFilter(arg__1, arg__2);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1)
+            << qScriptValueFromValue(_q_engine, arg__2)));
+    }
+}
+
+void QtScriptShell_ControlSocket::timerEvent(QTimerEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("timerEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("timerEvent") & QScriptValue::QObjectMember)) {
+        ControlSocket::timerEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_ControlSocket.h b/src/vidalia/plugin/extensions/qtscriptshell_ControlSocket.h
new file mode 100644
index 0000000..4c8f539
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_ControlSocket.h
@@ -0,0 +1,23 @@
+#ifndef QTSCRIPTSHELL_CONTROLSOCKET_H
+#define QTSCRIPTSHELL_CONTROLSOCKET_H
+
+#include <ControlSocket.h>
+
+#include <QtScript/qscriptvalue.h>
+
+class QtScriptShell_ControlSocket : public ControlSocket
+{
+public:
+    QtScriptShell_ControlSocket(ControlMethod::Method  method = ControlMethod::Port);
+    ~QtScriptShell_ControlSocket();
+
+    void childEvent(QChildEvent*  arg__1);
+    void customEvent(QEvent*  event);
+    bool  event(QEvent*  arg__1);
+    bool  eventFilter(QObject*  arg__1, QEvent*  arg__2);
+    void timerEvent(QTimerEvent*  arg__1);
+
+    QScriptValue __qtscript_self;
+};
+
+#endif // QTSCRIPTSHELL_CONTROLSOCKET_H
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_TorControl.cpp b/src/vidalia/plugin/extensions/qtscriptshell_TorControl.cpp
new file mode 100644
index 0000000..e0de255
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_TorControl.cpp
@@ -0,0 +1,99 @@
+#include "qtscriptshell_TorControl.h"
+
+#include <QtScript/QScriptEngine>
+#include <BootstrapStatus.h>
+#include <Circuit.h>
+#include <ControlCommand.h>
+#include <ControlReply.h>
+#include <QVariant>
+#include <Stream.h>
+#include <qbytearray.h>
+#include <qcoreevent.h>
+#include <qdatetime.h>
+#include <qhostaddress.h>
+#include <qlist.h>
+#include <qobject.h>
+#include <qstringlist.h>
+
+#define QTSCRIPT_IS_GENERATED_FUNCTION(fun) ((fun.data().toUInt32() & 0xFFFF0000) == 0xBABE0000)
+
+Q_DECLARE_METATYPE(QChildEvent*)
+Q_DECLARE_METATYPE(QEvent*)
+Q_DECLARE_METATYPE(QTimerEvent*)
+
+QtScriptShell_TorControl::QtScriptShell_TorControl(ControlMethod::Method  method)
+    : TorControl(method) {}
+
+QtScriptShell_TorControl::~QtScriptShell_TorControl() {}
+
+void QtScriptShell_TorControl::childEvent(QChildEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("childEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("childEvent") & QScriptValue::QObjectMember)) {
+        TorControl::childEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
+void QtScriptShell_TorControl::customEvent(QEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("customEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("customEvent") & QScriptValue::QObjectMember)) {
+        TorControl::customEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
+bool  QtScriptShell_TorControl::event(QEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("event");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("event") & QScriptValue::QObjectMember)) {
+        return TorControl::event(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1)));
+    }
+}
+
+bool  QtScriptShell_TorControl::eventFilter(QObject*  arg__1, QEvent*  arg__2)
+{
+    QScriptValue _q_function = __qtscript_self.property("eventFilter");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("eventFilter") & QScriptValue::QObjectMember)) {
+        return TorControl::eventFilter(arg__1, arg__2);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1)
+            << qScriptValueFromValue(_q_engine, arg__2)));
+    }
+}
+
+void QtScriptShell_TorControl::timerEvent(QTimerEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("timerEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("timerEvent") & QScriptValue::QObjectMember)) {
+        TorControl::timerEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_TorControl.h b/src/vidalia/plugin/extensions/qtscriptshell_TorControl.h
new file mode 100644
index 0000000..357a025
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_TorControl.h
@@ -0,0 +1,23 @@
+#ifndef QTSCRIPTSHELL_TORCONTROL_H
+#define QTSCRIPTSHELL_TORCONTROL_H
+
+#include <TorControl.h>
+
+#include <QtScript/qscriptvalue.h>
+
+class QtScriptShell_TorControl : public TorControl
+{
+public:
+    QtScriptShell_TorControl(ControlMethod::Method  method = ControlMethod::Port);
+    ~QtScriptShell_TorControl();
+
+    void childEvent(QChildEvent*  arg__1);
+    void customEvent(QEvent*  arg__1);
+    bool  event(QEvent*  arg__1);
+    bool  eventFilter(QObject*  arg__1, QEvent*  arg__2);
+    void timerEvent(QTimerEvent*  arg__1);
+
+    QScriptValue __qtscript_self;
+};
+
+#endif // QTSCRIPTSHELL_TORCONTROL_H
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_TorEvents.cpp b/src/vidalia/plugin/extensions/qtscriptshell_TorEvents.cpp
new file mode 100644
index 0000000..4f8a2f1
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_TorEvents.cpp
@@ -0,0 +1,100 @@
+#include "qtscriptshell_TorEvents.h"
+
+#include <QtScript/QScriptEngine>
+#include <BootstrapStatus.h>
+#include <Circuit.h>
+#include <ControlReply.h>
+#include <QVariant>
+#include <ReplyLine.h>
+#include <Stream.h>
+#include <qbytearray.h>
+#include <qcoreevent.h>
+#include <qdatetime.h>
+#include <qhostaddress.h>
+#include <qlist.h>
+#include <qobject.h>
+#include <qpair.h>
+#include <qstringlist.h>
+
+#define QTSCRIPT_IS_GENERATED_FUNCTION(fun) ((fun.data().toUInt32() & 0xFFFF0000) == 0xBABE0000)
+
+Q_DECLARE_METATYPE(QChildEvent*)
+Q_DECLARE_METATYPE(QEvent*)
+Q_DECLARE_METATYPE(QTimerEvent*)
+
+QtScriptShell_TorEvents::QtScriptShell_TorEvents(QObject*  parent)
+    : TorEvents(parent) {}
+
+QtScriptShell_TorEvents::~QtScriptShell_TorEvents() {}
+
+void QtScriptShell_TorEvents::childEvent(QChildEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("childEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("childEvent") & QScriptValue::QObjectMember)) {
+        TorEvents::childEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
+void QtScriptShell_TorEvents::customEvent(QEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("customEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("customEvent") & QScriptValue::QObjectMember)) {
+        TorEvents::customEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
+bool  QtScriptShell_TorEvents::event(QEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("event");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("event") & QScriptValue::QObjectMember)) {
+        return TorEvents::event(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1)));
+    }
+}
+
+bool  QtScriptShell_TorEvents::eventFilter(QObject*  arg__1, QEvent*  arg__2)
+{
+    QScriptValue _q_function = __qtscript_self.property("eventFilter");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("eventFilter") & QScriptValue::QObjectMember)) {
+        return TorEvents::eventFilter(arg__1, arg__2);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1)
+            << qScriptValueFromValue(_q_engine, arg__2)));
+    }
+}
+
+void QtScriptShell_TorEvents::timerEvent(QTimerEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("timerEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("timerEvent") & QScriptValue::QObjectMember)) {
+        TorEvents::timerEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_TorEvents.h b/src/vidalia/plugin/extensions/qtscriptshell_TorEvents.h
new file mode 100644
index 0000000..2cd2e95
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_TorEvents.h
@@ -0,0 +1,23 @@
+#ifndef QTSCRIPTSHELL_TOREVENTS_H
+#define QTSCRIPTSHELL_TOREVENTS_H
+
+#include <TorEvents.h>
+
+#include <QtScript/qscriptvalue.h>
+
+class QtScriptShell_TorEvents : public TorEvents
+{
+public:
+    QtScriptShell_TorEvents(QObject*  parent = 0);
+    ~QtScriptShell_TorEvents();
+
+    void childEvent(QChildEvent*  arg__1);
+    void customEvent(QEvent*  arg__1);
+    bool  event(QEvent*  arg__1);
+    bool  eventFilter(QObject*  arg__1, QEvent*  arg__2);
+    void timerEvent(QTimerEvent*  arg__1);
+
+    QScriptValue __qtscript_self;
+};
+
+#endif // QTSCRIPTSHELL_TOREVENTS_H
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_TorProcess.cpp b/src/vidalia/plugin/extensions/qtscriptshell_TorProcess.cpp
new file mode 100644
index 0000000..7d0235c
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_TorProcess.cpp
@@ -0,0 +1,306 @@
+#include "qtscriptshell_TorProcess.h"
+
+#include <QtScript/QScriptEngine>
+#include <QVariant>
+#include <qbytearray.h>
+#include <qcoreevent.h>
+#include <qlist.h>
+#include <qobject.h>
+#include <qprocess.h>
+#include <qstringlist.h>
+
+#define QTSCRIPT_IS_GENERATED_FUNCTION(fun) ((fun.data().toUInt32() & 0xFFFF0000) == 0xBABE0000)
+
+Q_DECLARE_METATYPE(QChildEvent*)
+Q_DECLARE_METATYPE(QEvent*)
+Q_DECLARE_METATYPE(QFlags<QIODevice::OpenModeFlag>)
+Q_DECLARE_METATYPE(char*)
+Q_DECLARE_METATYPE(QTimerEvent*)
+
+QtScriptShell_TorProcess::QtScriptShell_TorProcess(QObject*  parent)
+    : TorProcess(parent) {}
+
+QtScriptShell_TorProcess::~QtScriptShell_TorProcess() {}
+
+bool  QtScriptShell_TorProcess::atEnd() const
+{
+    QScriptValue _q_function = __qtscript_self.property("atEnd");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("atEnd") & QScriptValue::QObjectMember)) {
+        return TorProcess::atEnd();
+    } else {
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self));
+    }
+}
+
+qint64  QtScriptShell_TorProcess::bytesAvailable() const
+{
+    QScriptValue _q_function = __qtscript_self.property("bytesAvailable");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("bytesAvailable") & QScriptValue::QObjectMember)) {
+        return TorProcess::bytesAvailable();
+    } else {
+        return qscriptvalue_cast<qint64 >(_q_function.call(__qtscript_self));
+    }
+}
+
+qint64  QtScriptShell_TorProcess::bytesToWrite() const
+{
+    QScriptValue _q_function = __qtscript_self.property("bytesToWrite");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("bytesToWrite") & QScriptValue::QObjectMember)) {
+        return TorProcess::bytesToWrite();
+    } else {
+        return qscriptvalue_cast<qint64 >(_q_function.call(__qtscript_self));
+    }
+}
+
+bool  QtScriptShell_TorProcess::canReadLine() const
+{
+    QScriptValue _q_function = __qtscript_self.property("canReadLine");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("canReadLine") & QScriptValue::QObjectMember)) {
+        return TorProcess::canReadLine();
+    } else {
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self));
+    }
+}
+
+void QtScriptShell_TorProcess::childEvent(QChildEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("childEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("childEvent") & QScriptValue::QObjectMember)) {
+        TorProcess::childEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
+void QtScriptShell_TorProcess::close()
+{
+    QScriptValue _q_function = __qtscript_self.property("close");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("close") & QScriptValue::QObjectMember)) {
+        TorProcess::close();
+    } else {
+        _q_function.call(__qtscript_self);
+    }
+}
+
+void QtScriptShell_TorProcess::customEvent(QEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("customEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("customEvent") & QScriptValue::QObjectMember)) {
+        TorProcess::customEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
+bool  QtScriptShell_TorProcess::event(QEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("event");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("event") & QScriptValue::QObjectMember)) {
+        return TorProcess::event(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1)));
+    }
+}
+
+bool  QtScriptShell_TorProcess::eventFilter(QObject*  arg__1, QEvent*  arg__2)
+{
+    QScriptValue _q_function = __qtscript_self.property("eventFilter");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("eventFilter") & QScriptValue::QObjectMember)) {
+        return TorProcess::eventFilter(arg__1, arg__2);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1)
+            << qScriptValueFromValue(_q_engine, arg__2)));
+    }
+}
+
+bool  QtScriptShell_TorProcess::isSequential() const
+{
+    QScriptValue _q_function = __qtscript_self.property("isSequential");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("isSequential") & QScriptValue::QObjectMember)) {
+        return TorProcess::isSequential();
+    } else {
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self));
+    }
+}
+
+bool  QtScriptShell_TorProcess::open(QIODevice::OpenMode  mode)
+{
+    QScriptValue _q_function = __qtscript_self.property("open");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("open") & QScriptValue::QObjectMember)) {
+        return TorProcess::open(mode);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, mode)));
+    }
+}
+
+qint64  QtScriptShell_TorProcess::pos() const
+{
+    QScriptValue _q_function = __qtscript_self.property("pos");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("pos") & QScriptValue::QObjectMember)) {
+        return TorProcess::pos();
+    } else {
+        return qscriptvalue_cast<qint64 >(_q_function.call(__qtscript_self));
+    }
+}
+
+qint64  QtScriptShell_TorProcess::readData(char*  data, qint64  maxlen)
+{
+    QScriptValue _q_function = __qtscript_self.property("readData");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("readData") & QScriptValue::QObjectMember)) {
+        return TorProcess::readData(data, maxlen);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<qint64 >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, data)
+            << qScriptValueFromValue(_q_engine, maxlen)));
+    }
+}
+
+qint64  QtScriptShell_TorProcess::readLineData(char*  data, qint64  maxlen)
+{
+    QScriptValue _q_function = __qtscript_self.property("readLineData");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("readLineData") & QScriptValue::QObjectMember)) {
+        return TorProcess::readLineData(data, maxlen);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<qint64 >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, data)
+            << qScriptValueFromValue(_q_engine, maxlen)));
+    }
+}
+
+bool  QtScriptShell_TorProcess::reset()
+{
+    QScriptValue _q_function = __qtscript_self.property("reset");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("reset") & QScriptValue::QObjectMember)) {
+        return TorProcess::reset();
+    } else {
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self));
+    }
+}
+
+bool  QtScriptShell_TorProcess::seek(qint64  pos)
+{
+    QScriptValue _q_function = __qtscript_self.property("seek");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("seek") & QScriptValue::QObjectMember)) {
+        return TorProcess::seek(pos);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, pos)));
+    }
+}
+
+void QtScriptShell_TorProcess::setupChildProcess()
+{
+    QScriptValue _q_function = __qtscript_self.property("setupChildProcess");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("setupChildProcess") & QScriptValue::QObjectMember)) {
+        TorProcess::setupChildProcess();
+    } else {
+        _q_function.call(__qtscript_self);
+    }
+}
+
+qint64  QtScriptShell_TorProcess::size() const
+{
+    QScriptValue _q_function = __qtscript_self.property("size");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("size") & QScriptValue::QObjectMember)) {
+        return TorProcess::size();
+    } else {
+        return qscriptvalue_cast<qint64 >(_q_function.call(__qtscript_self));
+    }
+}
+
+void QtScriptShell_TorProcess::timerEvent(QTimerEvent*  arg__1)
+{
+    QScriptValue _q_function = __qtscript_self.property("timerEvent");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("timerEvent") & QScriptValue::QObjectMember)) {
+        TorProcess::timerEvent(arg__1);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        _q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, arg__1));
+    }
+}
+
+bool  QtScriptShell_TorProcess::waitForBytesWritten(int  msecs)
+{
+    QScriptValue _q_function = __qtscript_self.property("waitForBytesWritten");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("waitForBytesWritten") & QScriptValue::QObjectMember)) {
+        return TorProcess::waitForBytesWritten(msecs);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, msecs)));
+    }
+}
+
+bool  QtScriptShell_TorProcess::waitForReadyRead(int  msecs)
+{
+    QScriptValue _q_function = __qtscript_self.property("waitForReadyRead");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("waitForReadyRead") & QScriptValue::QObjectMember)) {
+        return TorProcess::waitForReadyRead(msecs);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<bool >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, msecs)));
+    }
+}
+
+qint64  QtScriptShell_TorProcess::writeData(const char*  data, qint64  len)
+{
+    QScriptValue _q_function = __qtscript_self.property("writeData");
+    if (!_q_function.isFunction() || QTSCRIPT_IS_GENERATED_FUNCTION(_q_function)
+        || (__qtscript_self.propertyFlags("writeData") & QScriptValue::QObjectMember)) {
+        return TorProcess::writeData(data, len);
+    } else {
+        QScriptEngine *_q_engine = __qtscript_self.engine();
+        return qscriptvalue_cast<qint64 >(_q_function.call(__qtscript_self,
+            QScriptValueList()
+            << qScriptValueFromValue(_q_engine, const_cast<char *>(data))
+            << qScriptValueFromValue(_q_engine, len)));
+    }
+}
+
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_TorProcess.h b/src/vidalia/plugin/extensions/qtscriptshell_TorProcess.h
new file mode 100644
index 0000000..34d05cd
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_TorProcess.h
@@ -0,0 +1,40 @@
+#ifndef QTSCRIPTSHELL_TORPROCESS_H
+#define QTSCRIPTSHELL_TORPROCESS_H
+
+#include <TorProcess.h>
+
+#include <QtScript/qscriptvalue.h>
+
+class QtScriptShell_TorProcess : public TorProcess
+{
+public:
+    QtScriptShell_TorProcess(QObject*  parent = 0);
+    ~QtScriptShell_TorProcess();
+
+    bool  atEnd() const;
+    qint64  bytesAvailable() const;
+    qint64  bytesToWrite() const;
+    bool  canReadLine() const;
+    void childEvent(QChildEvent*  arg__1);
+    void close();
+    void customEvent(QEvent*  arg__1);
+    bool  event(QEvent*  arg__1);
+    bool  eventFilter(QObject*  arg__1, QEvent*  arg__2);
+    bool  isSequential() const;
+    bool  open(QIODevice::OpenMode  mode);
+    qint64  pos() const;
+    qint64  readData(char*  data, qint64  maxlen);
+    qint64  readLineData(char*  data, qint64  maxlen);
+    bool  reset();
+    bool  seek(qint64  pos);
+    void setupChildProcess();
+    qint64  size() const;
+    void timerEvent(QTimerEvent*  arg__1);
+    bool  waitForBytesWritten(int  msecs);
+    bool  waitForReadyRead(int  msecs);
+    qint64  writeData(const char*  data, qint64  len);
+
+    QScriptValue __qtscript_self;
+};
+
+#endif // QTSCRIPTSHELL_TORPROCESS_H
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_TorSignal.cpp b/src/vidalia/plugin/extensions/qtscriptshell_TorSignal.cpp
new file mode 100644
index 0000000..27fa1c4
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_TorSignal.cpp
@@ -0,0 +1,13 @@
+#include "qtscriptshell_TorSignal.h"
+
+#include <QtScript/QScriptEngine>
+#include <QVariant>
+
+#define QTSCRIPT_IS_GENERATED_FUNCTION(fun) ((fun.data().toUInt32() & 0xFFFF0000) == 0xBABE0000)
+
+
+QtScriptShell_TorSignal::QtScriptShell_TorSignal()
+    : TorSignal() {}
+
+QtScriptShell_TorSignal::~QtScriptShell_TorSignal() {}
+
diff --git a/src/vidalia/plugin/extensions/qtscriptshell_TorSignal.h b/src/vidalia/plugin/extensions/qtscriptshell_TorSignal.h
new file mode 100644
index 0000000..f62043d
--- /dev/null
+++ b/src/vidalia/plugin/extensions/qtscriptshell_TorSignal.h
@@ -0,0 +1,18 @@
+#ifndef QTSCRIPTSHELL_TORSIGNAL_H
+#define QTSCRIPTSHELL_TORSIGNAL_H
+
+#include <TorSignal.h>
+
+#include <QtScript/qscriptvalue.h>
+
+class QtScriptShell_TorSignal : public TorSignal
+{
+public:
+    QtScriptShell_TorSignal();
+    ~QtScriptShell_TorSignal();
+
+
+    QScriptValue __qtscript_self;
+};
+
+#endif // QTSCRIPTSHELL_TORSIGNAL_H





More information about the tor-commits mailing list