From 3e32892e2b0470b22c700657b05ad5dccc27bcab Mon Sep 17 00:00:00 2001 From: Joe Ferris Date: Fri, 25 Feb 2011 23:29:36 -0500 Subject: [PATCH] Refactor Connection/Command so that arguments are passed in as a single QStringList instead of in consecutive calls to argumentReceived --- lib/capybara/driver/webkit/browser.rb | 5 +-- src/Attribute.cpp | 14 +++----- src/Attribute.h | 5 +-- src/Command.cpp | 7 ++-- src/Command.h | 4 +-- src/Connection.cpp | 51 +++++++++++++++++---------- src/Connection.h | 8 ++++- src/Find.cpp | 9 +---- src/Find.h | 2 +- src/Reset.cpp | 4 ++- src/Reset.h | 2 +- src/Server.cpp | 2 -- src/Visit.cpp | 8 ++--- src/Visit.h | 2 +- src/WebPage.h | 1 - src/main.cpp | 3 -- templates/Command.cpp | 7 ++-- templates/Command.h | 3 +- 18 files changed, 62 insertions(+), 75 deletions(-) diff --git a/lib/capybara/driver/webkit/browser.rb b/lib/capybara/driver/webkit/browser.rb index 1b75814..8834497 100644 --- a/lib/capybara/driver/webkit/browser.rb +++ b/lib/capybara/driver/webkit/browser.rb @@ -20,8 +20,8 @@ class Capybara::Driver::Webkit end def command(name, *args) - puts ">> Sending #{name}" @socket.puts name + @socket.puts args.size.to_s args.each { |arg| @socket.puts arg } check read_response @@ -35,12 +35,10 @@ class Capybara::Driver::Webkit end def connect - puts ">> Connecting" Capybara.timeout(5) do attempt_connect !@socket.nil? end - puts ">> Connected" end def attempt_connect @@ -50,7 +48,6 @@ class Capybara::Driver::Webkit def check result = @socket.gets.strip - puts ">> #{result}" unless result == 'ok' raise WebkitError, read_response end diff --git a/src/Attribute.cpp b/src/Attribute.cpp index 70f15de..b9bb9fe 100644 --- a/src/Attribute.cpp +++ b/src/Attribute.cpp @@ -4,15 +4,9 @@ Attribute::Attribute(WebPage *page, QObject *parent) : Command(page, parent) { } -void Attribute::receivedArgument(const char *argument) { - m_args.append(argument); - if (m_args.length() == 2) { - QString nodeIndex = m_args[0]; - QString attributeName = m_args[1]; - QString javascript = QString("Capybara.attribute(" + nodeIndex + ", \"" + attributeName + "\")"); - QVariant result = page()->mainFrame()->evaluateJavaScript(javascript); - QString attributeValue = result.toString(); - emit finished(true, attributeValue); - } +void Attribute::start(QStringList &arguments) { + QVariant result = page()->invokeCapybaraFunction("attribute", arguments); + QString attributeValue = result.toString(); + emit finished(true, attributeValue); } diff --git a/src/Attribute.h b/src/Attribute.h index e2525bc..b1a1a62 100644 --- a/src/Attribute.h +++ b/src/Attribute.h @@ -8,9 +8,6 @@ class Attribute : public Command { public: Attribute(WebPage *page, QObject *parent = 0); - virtual void receivedArgument(const char *argument); - - private: - QStringList m_args; + virtual void start(QStringList &arguments); }; diff --git a/src/Command.cpp b/src/Command.cpp index 7852849..6fdd77e 100644 --- a/src/Command.cpp +++ b/src/Command.cpp @@ -5,11 +5,8 @@ Command::Command(WebPage *page, QObject *parent) : QObject(parent) { m_page = page; } -void Command::receivedArgument(const char *argument) { - Q_UNUSED(argument); -} - -void Command::start() { +void Command::start(QStringList &arguments) { + Q_UNUSED(arguments); } WebPage *Command::page() { diff --git a/src/Command.h b/src/Command.h index 3df167d..da166c5 100644 --- a/src/Command.h +++ b/src/Command.h @@ -2,6 +2,7 @@ #define COMMAND_H #include +#include class WebPage; @@ -10,8 +11,7 @@ class Command : public QObject { public: Command(WebPage *page, QObject *parent = 0); - virtual void start(); - virtual void receivedArgument(const char *argument); + virtual void start(QStringList &arguments); signals: void finished(bool success, QString &response); diff --git a/src/Connection.cpp b/src/Connection.cpp index 05c9d6e..8936a57 100644 --- a/src/Connection.cpp +++ b/src/Connection.cpp @@ -6,7 +6,6 @@ #include "Attribute.h" #include -#include Connection::Connection(QTcpSocket *socket, WebPage *page, QObject *parent) : QObject(parent) { @@ -17,46 +16,62 @@ Connection::Connection(QTcpSocket *socket, WebPage *page, QObject *parent) : } void Connection::checkNext() { - std::cout << "<< Data ready to read" << std::endl; while (m_socket->canReadLine()) { readNext(); } } void Connection::readNext() { - std::cout << "<< Reading line" << std::endl; char buffer[1024]; qint64 lineLength = m_socket->readLine(buffer, 1024); if (lineLength != -1) { buffer[lineLength - 1] = 0; - std::cout << "<< Got line: " << buffer << std::endl; + processLine(buffer); + } +} + +void Connection::processLine(const char *line) { + if (m_command) { + continueCommand(line); + } else { + m_command = createCommand(line); if (m_command) { - m_command->receivedArgument(buffer); + startCommand(); } else { - m_command = startCommand(buffer); - if (m_command) { - connect(m_command, - SIGNAL(finished(bool, QString &)), - this, - SLOT(finishCommand(bool, QString &))); - m_command->start(); - } else { - m_socket->write("bad command\n"); - } + m_socket->write("bad command\n"); } } } -Command *Connection::startCommand(const char *name) { +Command *Connection::createCommand(const char *name) { #include "find_command.h" - - std::cout << ">> Unknown command" << std::endl; return NULL; } +void Connection::startCommand() { + m_argumentsExpected = -1; + connect(m_command, + SIGNAL(finished(bool, QString &)), + this, + SLOT(finishCommand(bool, QString &))); +} + +void Connection::continueCommand(const char *line) { + if (m_argumentsExpected == -1) { + m_argumentsExpected = QString(line).toInt(); + } else { + m_arguments.append(line); + } + + if (m_arguments.length() == m_argumentsExpected) { + m_command->start(m_arguments); + } +} + void Connection::finishCommand(bool success, QString &response) { m_command->deleteLater(); m_command = NULL; + m_arguments.clear(); if (success) { m_socket->write("ok\n"); } else { diff --git a/src/Connection.h b/src/Connection.h index a0c6285..38588eb 100644 --- a/src/Connection.h +++ b/src/Connection.h @@ -1,4 +1,5 @@ #include +#include class QTcpSocket; class WebPage; @@ -16,10 +17,15 @@ class Connection : public QObject { private: void readNext(); - Command *startCommand(const char *name); + void processLine(const char *line); + Command *createCommand(const char *name); + void startCommand(); + void continueCommand(const char *line); QTcpSocket *m_socket; Command *m_command; + QStringList m_arguments; + int m_argumentsExpected; WebPage *m_page; }; diff --git a/src/Find.cpp b/src/Find.cpp index 74f80ad..da55f75 100644 --- a/src/Find.cpp +++ b/src/Find.cpp @@ -1,23 +1,16 @@ #include "Find.h" #include "Command.h" #include "WebPage.h" -#include Find::Find(WebPage *page, QObject *parent) : Command(page, parent) { } -void Find::receivedArgument(const char *xpath) { - QStringList arguments; +void Find::start(QStringList &arguments) { QString response; - arguments.append(QString(xpath)); QVariant result = page()->invokeCapybaraFunction("find", arguments); if (result.isValid()) { response = result.toString(); - - std::cout << "<< Got result:" << std::endl; - std::cout << response.toAscii().data() << std::endl; - emit finished(true, response); } else { response = "Invalid XPath expression"; diff --git a/src/Find.h b/src/Find.h index a8b15ae..91ce0de 100644 --- a/src/Find.h +++ b/src/Find.h @@ -7,7 +7,7 @@ class Find : public Command { public: Find(WebPage *page, QObject *parent = 0); - virtual void receivedArgument(const char *argument); + virtual void start(QStringList &arguments); }; diff --git a/src/Reset.cpp b/src/Reset.cpp index 319c54a..b32886c 100644 --- a/src/Reset.cpp +++ b/src/Reset.cpp @@ -4,7 +4,9 @@ Reset::Reset(WebPage *page, QObject *parent) : Command(page, parent) { } -void Reset::start() { +void Reset::start(QStringList &arguments) { + Q_UNUSED(arguments); + page()->triggerAction(QWebPage::Stop); page()->mainFrame()->setHtml(""); QString response = ""; diff --git a/src/Reset.h b/src/Reset.h index 905161b..268c0f3 100644 --- a/src/Reset.h +++ b/src/Reset.h @@ -7,6 +7,6 @@ class Reset : public Command { public: Reset(WebPage *page, QObject *parent = 0); - virtual void start(); + virtual void start(QStringList &arguments); }; diff --git a/src/Server.cpp b/src/Server.cpp index 2cb81d2..c9b5d17 100644 --- a/src/Server.cpp +++ b/src/Server.cpp @@ -3,7 +3,6 @@ #include "Connection.h" #include -#include Server::Server(QObject *parent) : QObject(parent) { m_tcp_server = new QTcpServer(this); @@ -16,7 +15,6 @@ bool Server::start() { } void Server::handleConnection() { - std::cout << "<< Got connection" << std::endl; QTcpSocket *socket = m_tcp_server->nextPendingConnection(); new Connection(socket, m_page, this); } diff --git a/src/Visit.cpp b/src/Visit.cpp index dbac86d..830fec0 100644 --- a/src/Visit.cpp +++ b/src/Visit.cpp @@ -1,21 +1,17 @@ #include "Visit.h" #include "Command.h" #include "WebPage.h" -#include Visit::Visit(WebPage *page, QObject *parent) : Command(page, parent) { connect(page, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool))); } -void Visit::receivedArgument(const char *url) { - std::cout << ">> Loading page: " << url << std::endl; - page()->mainFrame()->setUrl(QUrl(url)); +void Visit::start(QStringList &arguments) { + page()->mainFrame()->setUrl(QUrl(arguments[0])); } void Visit::loadFinished(bool success) { - std::cout << ">> Page loaded" << std::endl; QString response; - std::cout << page()->mainFrame()->toHtml().toAscii().constData() << std::endl; emit finished(success, response); } diff --git a/src/Visit.h b/src/Visit.h index cd49795..a4beb6a 100644 --- a/src/Visit.h +++ b/src/Visit.h @@ -7,7 +7,7 @@ class Visit : public Command { public: Visit(WebPage *page, QObject *parent = 0); - virtual void receivedArgument(const char *argument); + virtual void start(QStringList &arguments); private slots: void loadFinished(bool success); diff --git a/src/WebPage.h b/src/WebPage.h index d12e1fb..06fb956 100644 --- a/src/WebPage.h +++ b/src/WebPage.h @@ -1,5 +1,4 @@ #include -#include class WebPage : public QWebPage { Q_OBJECT diff --git a/src/main.cpp b/src/main.cpp index 72db042..7da7c68 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,5 @@ #include "Server.h" #include - #include int main(int argc, char **argv) { @@ -11,8 +10,6 @@ int main(int argc, char **argv) { Server server; if (server.start()) { - std::cout << "<< Started server" << std::endl; - return app.exec(); } else { std::cerr << "Couldn't start server" << std::endl; diff --git a/templates/Command.cpp b/templates/Command.cpp index ec64e71..8dc6790 100644 --- a/templates/Command.cpp +++ b/templates/Command.cpp @@ -4,10 +4,7 @@ NAME::NAME(WebPage *page, QObject *parent) : Command(page, parent) { } -void NAME::start() { -} - -void NAME::receivedArgument(const char *argument) { - Q_UNUSED(argument); +void NAME::start(QStringList &arguments) { + Q_UNUSED(arguments); } diff --git a/templates/Command.h b/templates/Command.h index e8dae92..3b3f869 100644 --- a/templates/Command.h +++ b/templates/Command.h @@ -7,7 +7,6 @@ class NAME : public Command { public: NAME(WebPage *page, QObject *parent = 0); - virtual void start(); - virtual void receivedArgument(const char *argument); + virtual void start(QStringList &arguments); };