forked from qt-creator/qt-creator
Merge branch 'master' of git@scm.dev.nokia.troll.no:creator/mainline
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user