Merge branch 'master' of git@scm.dev.nokia.troll.no:creator/mainline

This commit is contained in:
Roberto Raggi
2009-05-14 11:04:06 +02:00
2 changed files with 92 additions and 52 deletions

View File

@@ -40,6 +40,7 @@
#include "watchhandler.h" #include "watchhandler.h"
#include "watchutils.h" #include "watchutils.h"
#include "moduleshandler.h" #include "moduleshandler.h"
#include "gdbmi.h"
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -74,6 +75,21 @@ using namespace Debugger::Constants;
#define STRINGIFY(x) STRINGIFY_INTERNAL(x) #define STRINGIFY(x) STRINGIFY_INTERNAL(x)
#define CB(callback) &TcfEngine::callback, STRINGIFY(callback) #define CB(callback) &TcfEngine::callback, STRINGIFY(callback)
///////////////////////////////////////////////////////////////////////
//
// TcfData
//
///////////////////////////////////////////////////////////////////////
TcfData::TcfData(const QByteArray &data)
{
fromString(data);
qDebug() << "TCF RESPONSE: " << data << " -> " << toString();
}
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
// //
// TcfEngine // TcfEngine
@@ -119,8 +135,15 @@ void TcfEngine::socketReadyRead()
{ {
//XSDEBUG("TcfEngine::socketReadyRead()"); //XSDEBUG("TcfEngine::socketReadyRead()");
m_inbuffer.append(m_socket->readAll()); m_inbuffer.append(m_socket->readAll());
//handleResponse(QByteArray::fromRawData(m_inbuffer.constData() + start, end - start)); int pos = 0;
handleResponse(m_inbuffer); while (1) {
int next = m_inbuffer.indexOf("\3\1", pos);
//qDebug() << "pos: " << pos << "next: " << next;
if (next == -1)
break;
handleResponse(m_inbuffer.mid(pos, next - pos));
pos = next + 2;
}
m_inbuffer.clear(); m_inbuffer.clear();
} }
@@ -268,28 +291,61 @@ QList<Symbol> TcfEngine::moduleSymbols(const QString & /*moduleName*/)
} }
void TcfEngine::handleResponse(const QByteArray &buf) void TcfEngine::handleResponse(const QByteArray &response)
{ {
static QTime lastTime; static QTime lastTime;
//emit tcfOutputAvailable(_(" "), currentTime()); //emit tcfOutputAvailable(_(" "), currentTime());
TcfResponse response; QList<QByteArray> parts = response.split('\0');
QList<QByteArray> parts = buf.split('\0'); if (parts.size() < 2 || !parts.last().isEmpty()) {
qDebug() << "Wrong response packet layout"
<< quoteUnprintableLatin1(response);
return;
}
parts.removeLast(); // always empty
QByteArray tag = parts.at(0);
int n = parts.size(); int n = parts.size();
if (n >= 1) if (n == 1 && tag == "N") { // unidentified command
response.tag = parts.at(0); qDebug() << "Command not recognized.";
if (n >= 2) } else if (n == 2 && tag == "N") { // flow control
response.service = parts.at(1); int congestion = parts.at(1).toInt();
if (n >= 3) qDebug() << "Congestion: " << congestion;
response.cmd = parts.at(2); } else if (n == 4 && tag == "R") { // result data
if (n >= 4) int token = parts.at(1).toInt();
response.data = parts.at(3); QByteArray message = parts.at(2);
if (response.cmd != "peerHeartBeat") TcfData data(parts.at(3));
emit tcfOutputAvailable(_("\ntcf:"), quoteUnprintableLatin1(buf)); emit tcfOutputAvailable(_("\ntcf R:"), quoteUnprintableLatin1(response));
//emit tcfOutputAvailable(_("\ntcf:"), response.toString()); TcfCommand tcf = m_cookieForToken[token];
qDebug() << response.toString(); TcfData result(data);
//qDebug() << "Good response: " << quoteUnprintableLatin1(response);
if (tcf.callback)
(this->*(tcf.callback))(result, tcf.cookie);
} else if (n == 3 && tag == "P") { // progress data (partial result)
//int token = parts.at(1).toInt();
QByteArray data = parts.at(2);
emit tcfOutputAvailable(_("\ntcf P:"), quoteUnprintableLatin1(response));
} else if (n == 4 && tag == "E") { // an event
QByteArray service = parts.at(1);
QByteArray eventName = parts.at(2);
TcfData data(parts.at(3));
if (eventName != "peerHeartBeat")
emit tcfOutputAvailable(_("\ntcf E:"), quoteUnprintableLatin1(response));
if (service == "Locator" && eventName == "Hello") {
m_services.clear();
foreach (const GdbMi &service, data.children()) {
qDebug() << "Found service: " << service.data();
m_services.append(service.data());
}
QTimer::singleShot(0, this, SLOT(startDebugging()));
}
} else {
qDebug() << "Unknown response packet"
<< quoteUnprintableLatin1(response) << parts;
}
}
if (response.service == "Locator" && response.cmd == "Hello") { void TcfEngine::startDebugging()
{
//postCommand('C', CB(handleRunControlSuspend), //postCommand('C', CB(handleRunControlSuspend),
// "RunControl", "suspend", "\"Thread1\""); // "RunControl", "suspend", "\"Thread1\"");
//postCommand('C', CB(handleRunControlSuspend), //postCommand('C', CB(handleRunControlSuspend),
@@ -304,12 +360,6 @@ void TcfEngine::handleResponse(const QByteArray &buf)
//postCommand('E', "Locator", "Hello", ""); //postCommand('E', "Locator", "Hello", "");
//postCommand('C', "Locator", "sync", ""); //postCommand('C', "Locator", "sync", "");
//postCommand("Locator", "redirect", "ID"); //postCommand("Locator", "redirect", "ID");
return;
}
TcfCommand tcf = m_cookieForToken[1];
if (tcf.callback)
(this->*(tcf.callback))(response, tcf.cookie);
} }
void TcfEngine::postCommand(char tag, void TcfEngine::postCommand(char tag,
@@ -319,7 +369,7 @@ void TcfEngine::postCommand(char tag,
const QByteArray &cmd, const QByteArray &cmd,
const QByteArray &args) const QByteArray &args)
{ {
static int token; static int token = 50;
++token; ++token;
const char delim = 0; const char delim = 0;
@@ -330,7 +380,7 @@ void TcfEngine::postCommand(char tag,
QByteArray ba; QByteArray ba;
ba.append(tag); ba.append(tag);
ba.append(delim); ba.append(delim);
ba.append(QString::number(token).toLatin1()); ba.append(QByteArray::number(token));
ba.append(delim); ba.append(delim);
ba.append(service); ba.append(service);
ba.append(delim); ba.append(delim);
@@ -353,21 +403,22 @@ void TcfEngine::postCommand(char tag,
emit tcfInputAvailable("send", QString::number(result)); emit tcfInputAvailable("send", QString::number(result));
} }
void TcfEngine::handleRunControlSuspend(const TcfResponse &response, const QVariant &) void TcfEngine::handleRunControlSuspend(const TcfData &data, const QVariant &)
{ {
qDebug() << "HANDLE RESULT"; qDebug() << "HANDLE RESULT";
} }
void TcfEngine::handleRunControlGetChildren(const TcfResponse &response, const QVariant &) void TcfEngine::handleRunControlGetChildren(const TcfData &data, const QVariant &)
{ {
qDebug() << "HANDLE RESULT" << response.toString(); qDebug() << "HANDLE RUN CONTROL GET CHILDREN" << data.toString();
} }
void TcfEngine::handleSysMonitorGetChildren(const TcfResponse &response, const QVariant &) void TcfEngine::handleSysMonitorGetChildren(const TcfData &data, const QVariant &)
{ {
qDebug() << "HANDLE RESULT" << response.toString(); qDebug() << "HANDLE RUN CONTROL GET CHILDREN" << data.toString();
} }
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// //
// Tooltip specific stuff // Tooltip specific stuff

View File

@@ -47,6 +47,7 @@ QT_END_NAMESPACE
#include "idebuggerengine.h" #include "idebuggerengine.h"
#include "debuggermanager.h" #include "debuggermanager.h"
#include "gdbmi.h"
namespace Debugger { namespace Debugger {
namespace Internal { namespace Internal {
@@ -56,25 +57,10 @@ class IDebuggerManagerAccessForEngines;
class ScriptAgent; class ScriptAgent;
class WatchData; class WatchData;
class TcfResponse class TcfData : public GdbMi
{ {
public: public:
enum ResponseType TcfData(const QByteArray &data);
{
HelloResponse,
HeartBeatResponse
};
QString toString() const
{
return _("TAG: " + tag + " SERVICE: " + service
+ " CMD: " + cmd + " DATA: " + data);
}
QByteArray tag;
QByteArray service;
QByteArray cmd;
QByteArray data;
}; };
class TcfEngine : public IDebuggerEngine class TcfEngine : public IDebuggerEngine
@@ -140,13 +126,15 @@ private:
Q_SLOT void socketReadyRead(); Q_SLOT void socketReadyRead();
void handleResponse(const QByteArray &ba); void handleResponse(const QByteArray &ba);
void handleRunControlSuspend(const TcfResponse &response, const QVariant &); void handleRunControlSuspend(const TcfData &response, const QVariant &);
void handleRunControlGetChildren(const TcfResponse &response, const QVariant &); void handleRunControlGetChildren(const TcfData &response, const QVariant &);
void handleSysMonitorGetChildren(const TcfResponse &response, const QVariant &); void handleSysMonitorGetChildren(const TcfData &response, const QVariant &);
private: private:
Q_SLOT void startDebugging();
typedef void (TcfEngine::*TcfCommandCallback) typedef void (TcfEngine::*TcfCommandCallback)
(const TcfResponse &record, const QVariant &cookie); (const TcfData &record, const QVariant &cookie);
struct TcfCommand struct TcfCommand
{ {
@@ -171,6 +159,7 @@ private:
IDebuggerManagerAccessForEngines *qq; IDebuggerManagerAccessForEngines *qq;
QTcpSocket *m_socket; QTcpSocket *m_socket;
QByteArray m_inbuffer; QByteArray m_inbuffer;
QStringList m_services;
}; };
} // namespace Internal } // namespace Internal