forked from qt-creator/qt-creator
S60: Compile on Linux
This commit is contained in:
@@ -504,6 +504,16 @@ RunControl* S60DeviceRunConfigurationRunner::run(QSharedPointer<RunConfiguration
|
|||||||
return runControl;
|
return runControl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString S60DeviceRunConfigurationRunner::displayName() const
|
||||||
|
{
|
||||||
|
return tr("Run on Device");
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget *S60DeviceRunConfigurationRunner::configurationWidget(QSharedPointer<ProjectExplorer::RunConfiguration> /* runConfiguration */)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// ======== S60DeviceRunControl
|
// ======== S60DeviceRunControl
|
||||||
|
|
||||||
S60DeviceRunControl::S60DeviceRunControl(QSharedPointer<RunConfiguration> runConfiguration)
|
S60DeviceRunControl::S60DeviceRunControl(QSharedPointer<RunConfiguration> runConfiguration)
|
||||||
|
|||||||
@@ -138,8 +138,8 @@ public:
|
|||||||
S60DeviceRunConfigurationRunner(QObject *parent = 0);
|
S60DeviceRunConfigurationRunner(QObject *parent = 0);
|
||||||
bool canRun(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration, const QString &mode);
|
bool canRun(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration, const QString &mode);
|
||||||
ProjectExplorer::RunControl* run(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration, const QString &mode);
|
ProjectExplorer::RunControl* run(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration, const QString &mode);
|
||||||
QString displayName() const { return "Run on Device"; }
|
QString displayName() const;
|
||||||
QWidget *configurationWidget(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration) { return 0; }
|
QWidget *configurationWidget(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration);
|
||||||
};
|
};
|
||||||
|
|
||||||
class S60DeviceRunControl : public ProjectExplorer::RunControl
|
class S60DeviceRunControl : public ProjectExplorer::RunControl
|
||||||
|
|||||||
@@ -277,6 +277,16 @@ RunControl* S60EmulatorRunConfigurationRunner::run(QSharedPointer<RunConfigurati
|
|||||||
return runControl;
|
return runControl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString S60EmulatorRunConfigurationRunner::displayName() const
|
||||||
|
{
|
||||||
|
return tr("Run in Emulator");
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget *S60EmulatorRunConfigurationRunner::configurationWidget(QSharedPointer<ProjectExplorer::RunConfiguration> /* runConfiguration */)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// ======== S60EmulatorRunControl
|
// ======== S60EmulatorRunControl
|
||||||
|
|
||||||
S60EmulatorRunControl::S60EmulatorRunControl(QSharedPointer<RunConfiguration> runConfiguration)
|
S60EmulatorRunControl::S60EmulatorRunControl(QSharedPointer<RunConfiguration> runConfiguration)
|
||||||
|
|||||||
@@ -106,8 +106,8 @@ public:
|
|||||||
S60EmulatorRunConfigurationRunner(QObject *parent = 0);
|
S60EmulatorRunConfigurationRunner(QObject *parent = 0);
|
||||||
bool canRun(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration, const QString &mode);
|
bool canRun(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration, const QString &mode);
|
||||||
ProjectExplorer::RunControl* run(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration, const QString &mode);
|
ProjectExplorer::RunControl* run(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration, const QString &mode);
|
||||||
QString displayName() const { return "Run in Emulator"; }
|
QString displayName() const;
|
||||||
QWidget *configurationWidget(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration) { return 0; }
|
QWidget *configurationWidget(QSharedPointer<ProjectExplorer::RunConfiguration> runConfiguration);
|
||||||
};
|
};
|
||||||
|
|
||||||
class S60EmulatorRunControl : public ProjectExplorer::RunControl
|
class S60EmulatorRunControl : public ProjectExplorer::RunControl
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
#include "gccetoolchain.h"
|
#include "gccetoolchain.h"
|
||||||
#include "rvcttoolchain.h"
|
#include "rvcttoolchain.h"
|
||||||
#include "s60emulatorrunconfiguration.h"
|
#include "s60emulatorrunconfiguration.h"
|
||||||
#include "s60Devicerunconfiguration.h"
|
#include "s60devicerunconfiguration.h"
|
||||||
|
|
||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
#include <extensionsystem/pluginmanager.h>
|
#include <extensionsystem/pluginmanager.h>
|
||||||
|
|||||||
@@ -28,8 +28,16 @@
|
|||||||
**************************************************************************/
|
**************************************************************************/
|
||||||
|
|
||||||
#include "launcher.h"
|
#include "launcher.h"
|
||||||
|
#include "trkutils.h"
|
||||||
|
|
||||||
#if USE_NATIVE
|
#include <QtCore/QTimer>
|
||||||
|
#include <QtCore/QDateTime>
|
||||||
|
#include <QtCore/QVariant>
|
||||||
|
#include <QtCore/QDebug>
|
||||||
|
#include <QtCore/QQueue>
|
||||||
|
#include <QtCore/QFile>
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
// Format windows error from GetLastError() value: TODO: Use the one provided by the utisl lib.
|
// Format windows error from GetLastError() value: TODO: Use the one provided by the utisl lib.
|
||||||
@@ -74,46 +82,98 @@ BOOL WINAPI TryReadFile(HANDLE hFile,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
using namespace trk;
|
namespace trk {
|
||||||
|
|
||||||
|
struct TrkMessage {
|
||||||
|
TrkMessage() { code = token = 0; callBack = 0; }
|
||||||
|
byte code;
|
||||||
|
byte token;
|
||||||
|
QByteArray data;
|
||||||
|
QVariant cookie;
|
||||||
|
Launcher::TrkCallBack callBack;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LauncherPrivate {
|
||||||
|
LauncherPrivate();
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
HANDLE m_hdevice;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
QString m_trkServerName;
|
||||||
|
QByteArray m_trkReadBuffer;
|
||||||
|
|
||||||
|
unsigned char m_trkWriteToken;
|
||||||
|
QQueue<TrkMessage> m_trkWriteQueue;
|
||||||
|
QHash<byte, TrkMessage> m_writtenTrkMessages;
|
||||||
|
QByteArray m_trkReadQueue;
|
||||||
|
bool m_trkWriteBusy;
|
||||||
|
|
||||||
|
void logMessage(const QString &msg);
|
||||||
|
// Debuggee state
|
||||||
|
Session m_session; // global-ish data (process id, target information)
|
||||||
|
|
||||||
|
int m_timerId;
|
||||||
|
QString m_fileName;
|
||||||
|
QString m_copySrcFileName;
|
||||||
|
QString m_copyDstFileName;
|
||||||
|
QString m_installFileName;
|
||||||
|
};
|
||||||
|
|
||||||
|
LauncherPrivate::LauncherPrivate() :
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
m_hdevice(0),
|
||||||
|
#endif
|
||||||
|
m_trkWriteToken(0),
|
||||||
|
m_trkWriteBusy(false),
|
||||||
|
m_timerId(-1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
#define CB(s) &Launcher::s
|
#define CB(s) &Launcher::s
|
||||||
|
|
||||||
Launcher::Launcher()
|
Launcher::Launcher() :
|
||||||
|
d(new LauncherPrivate)
|
||||||
{
|
{
|
||||||
// Trk
|
|
||||||
#if USE_NATIVE
|
|
||||||
m_hdevice = NULL;
|
|
||||||
#else
|
|
||||||
m_trkDevice = 0;
|
|
||||||
#endif
|
|
||||||
m_trkWriteToken = 0;
|
|
||||||
m_trkWriteBusy = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Launcher::~Launcher()
|
Launcher::~Launcher()
|
||||||
{
|
{
|
||||||
// Trk
|
|
||||||
#if USE_NATIVE
|
|
||||||
CloseHandle(m_hdevice);
|
|
||||||
#else
|
|
||||||
m_trkDevice->abort();
|
|
||||||
delete m_trkDevice;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
logMessage("Shutting down.\n");
|
logMessage("Shutting down.\n");
|
||||||
|
delete d;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::setTrkServerName(const QString &name)
|
||||||
|
{
|
||||||
|
d->m_trkServerName = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::setFileName(const QString &name)
|
||||||
|
{
|
||||||
|
d->m_fileName = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::setCopyFileName(const QString &srcName, const QString &dstName)
|
||||||
|
{
|
||||||
|
d->m_copySrcFileName = srcName;
|
||||||
|
d->m_copyDstFileName = dstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::setInstallFileName(const QString &name)
|
||||||
|
{
|
||||||
|
d->m_installFileName = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Launcher::startServer(QString *errorMessage)
|
bool Launcher::startServer(QString *errorMessage)
|
||||||
{
|
{
|
||||||
if (!openTrkPort(m_trkServerName, errorMessage))
|
if (!openTrkPort(d->m_trkServerName, errorMessage))
|
||||||
return false;
|
return false;
|
||||||
m_timerId = startTimer(100);
|
d->m_timerId = startTimer(100);
|
||||||
sendTrkInitialPing();
|
sendTrkInitialPing();
|
||||||
sendTrkMessage(TrkConnect); // Connect
|
sendTrkMessage(TrkConnect); // Connect
|
||||||
sendTrkMessage(TrkSupported, CB(handleSupportMask));
|
sendTrkMessage(TrkSupported, CB(handleSupportMask));
|
||||||
sendTrkMessage(TrkCpuType, CB(handleCpuType));
|
sendTrkMessage(TrkCpuType, CB(handleCpuType));
|
||||||
sendTrkMessage(TrkVersions); // Versions
|
sendTrkMessage(TrkVersions); // Versions
|
||||||
if (!m_copySrcFileName.isEmpty() && !m_copyDstFileName.isEmpty())
|
if (!d->m_copySrcFileName.isEmpty() && !d->m_copyDstFileName.isEmpty())
|
||||||
copyFileToRemote();
|
copyFileToRemote();
|
||||||
else
|
else
|
||||||
installAndRun();
|
installAndRun();
|
||||||
@@ -122,8 +182,8 @@ bool Launcher::startServer(QString *errorMessage)
|
|||||||
|
|
||||||
void Launcher::installAndRun()
|
void Launcher::installAndRun()
|
||||||
{
|
{
|
||||||
if (!m_installFileName.isEmpty()) {
|
if (!d->m_installFileName.isEmpty()) {
|
||||||
installRemotePackageSilently(m_installFileName);
|
installRemotePackageSilently(d->m_installFileName);
|
||||||
} else {
|
} else {
|
||||||
startInferiorIfNeeded();
|
startInferiorIfNeeded();
|
||||||
}
|
}
|
||||||
@@ -136,8 +196,8 @@ void Launcher::logMessage(const QString &msg)
|
|||||||
|
|
||||||
bool Launcher::openTrkPort(const QString &port, QString *errorMessage)
|
bool Launcher::openTrkPort(const QString &port, QString *errorMessage)
|
||||||
{
|
{
|
||||||
#if USE_NATIVE
|
#ifdef Q_OS_WIN
|
||||||
m_hdevice = CreateFile(port.toStdWString().c_str(),
|
d->m_hdevice = CreateFile(port.toStdWString().c_str(),
|
||||||
GENERIC_READ | GENERIC_WRITE,
|
GENERIC_READ | GENERIC_WRITE,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -145,33 +205,17 @@ bool Launcher::openTrkPort(const QString &port, QString *errorMessage)
|
|||||||
FILE_ATTRIBUTE_NORMAL,
|
FILE_ATTRIBUTE_NORMAL,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (INVALID_HANDLE_VALUE == m_hdevice){
|
if (INVALID_HANDLE_VALUE == d->m_hdevice){
|
||||||
*errorMessage = QString::fromLatin1("Could not open device '%1': %2").arg(port, winErrorMessage(GetLastError()));
|
*errorMessage = QString::fromLatin1("Could not open device '%1': %2").arg(port, winErrorMessage(GetLastError()));
|
||||||
logMessage(*errorMessage);
|
logMessage(*errorMessage);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
#if 0
|
Q_UNUSED(port)
|
||||||
m_trkDevice = new Win_QextSerialPort(port);
|
*errorMessage = QString::fromLatin1("Not implemented");
|
||||||
m_trkDevice->setBaudRate(BAUD115200);
|
logMessage(*errorMessage);
|
||||||
m_trkDevice->setDataBits(DATA_8);
|
return false;
|
||||||
m_trkDevice->setParity(PAR_NONE);
|
|
||||||
//m_trkDevice->setStopBits(STO);
|
|
||||||
m_trkDevice->setFlowControl(FLOW_OFF);
|
|
||||||
m_trkDevice->setTimeout(0, 500);
|
|
||||||
|
|
||||||
if (!m_trkDevice->open(QIODevice::ReadWrite)) {
|
|
||||||
*errorMessage = QString::fromLatin1("Could not open device '%1': %2").arg(port, m_trkDevice->errorString());
|
|
||||||
logMessage(*errorMessage);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
#else
|
|
||||||
m_trkDevice = new QLocalSocket(this);
|
|
||||||
m_trkDevice->connectToServer(port);
|
|
||||||
return m_trkDevice->waitForConnected();
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,10 +228,10 @@ void Launcher::timerEvent(QTimerEvent *)
|
|||||||
|
|
||||||
byte Launcher::nextTrkWriteToken()
|
byte Launcher::nextTrkWriteToken()
|
||||||
{
|
{
|
||||||
++m_trkWriteToken;
|
++d->m_trkWriteToken;
|
||||||
if (m_trkWriteToken == 0)
|
if (d->m_trkWriteToken == 0)
|
||||||
++m_trkWriteToken;
|
++d->m_trkWriteToken;
|
||||||
return m_trkWriteToken;
|
return d->m_trkWriteToken;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Launcher::sendTrkMessage(byte code, TrkCallBack callBack,
|
void Launcher::sendTrkMessage(byte code, TrkCallBack callBack,
|
||||||
@@ -220,7 +264,7 @@ void Launcher::terminate()
|
|||||||
{
|
{
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
appendShort(&ba, 0x0000, TargetByteOrder);
|
appendShort(&ba, 0x0000, TargetByteOrder);
|
||||||
appendInt(&ba, m_session.pid, TargetByteOrder);
|
appendInt(&ba, d->m_session.pid, TargetByteOrder);
|
||||||
sendTrkMessage(TrkDeleteItem, CB(waitForTrkFinished), ba);
|
sendTrkMessage(TrkDeleteItem, CB(waitForTrkFinished), ba);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,17 +283,17 @@ void Launcher::sendTrkAck(byte token)
|
|||||||
|
|
||||||
void Launcher::queueTrkMessage(const TrkMessage &msg)
|
void Launcher::queueTrkMessage(const TrkMessage &msg)
|
||||||
{
|
{
|
||||||
m_trkWriteQueue.append(msg);
|
d->m_trkWriteQueue.append(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Launcher::tryTrkWrite()
|
void Launcher::tryTrkWrite()
|
||||||
{
|
{
|
||||||
if (m_trkWriteBusy)
|
if (d->m_trkWriteBusy)
|
||||||
return;
|
return;
|
||||||
if (m_trkWriteQueue.isEmpty())
|
if (d->m_trkWriteQueue.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
TrkMessage msg = m_trkWriteQueue.dequeue();
|
TrkMessage msg = d->m_trkWriteQueue.dequeue();
|
||||||
trkWrite(msg);
|
trkWrite(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -257,55 +301,42 @@ void Launcher::trkWrite(const TrkMessage &msg)
|
|||||||
{
|
{
|
||||||
QByteArray ba = frameMessage(msg.code, msg.token, msg.data);
|
QByteArray ba = frameMessage(msg.code, msg.token, msg.data);
|
||||||
|
|
||||||
m_writtenTrkMessages.insert(msg.token, msg);
|
d->m_writtenTrkMessages.insert(msg.token, msg);
|
||||||
m_trkWriteBusy = true;
|
d->m_trkWriteBusy = true;
|
||||||
|
|
||||||
logMessage("WRITE: " + stringFromArray(ba));
|
logMessage("WRITE: " + stringFromArray(ba));
|
||||||
|
|
||||||
#if USE_NATIVE
|
#ifdef Q_OS_WIN
|
||||||
DWORD charsWritten;
|
DWORD charsWritten;
|
||||||
if (!WriteFile(m_hdevice, ba.data(), ba.size(), &charsWritten, NULL))
|
if (!WriteFile(d->m_hdevice, ba.data(), ba.size(), &charsWritten, NULL))
|
||||||
logMessage("WRITE ERROR: ");
|
logMessage("WRITE ERROR: ");
|
||||||
|
|
||||||
//logMessage("WRITE: " + stringFromArray(ba));
|
//logMessage("WRITE: " + stringFromArray(ba));
|
||||||
FlushFileBuffers(m_hdevice);
|
FlushFileBuffers(d->m_hdevice);
|
||||||
#else
|
|
||||||
if (!m_trkDevice->write(ba))
|
|
||||||
logMessage("WRITE ERROR: " + m_trkDevice->errorString());
|
|
||||||
m_trkDevice->flush();
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Launcher::tryTrkRead()
|
void Launcher::tryTrkRead()
|
||||||
{
|
{
|
||||||
#if USE_NATIVE
|
#ifdef Q_OS_WIN
|
||||||
const DWORD BUFFERSIZE = 1024;
|
const DWORD BUFFERSIZE = 1024;
|
||||||
char buffer[BUFFERSIZE];
|
char buffer[BUFFERSIZE];
|
||||||
DWORD charsRead;
|
DWORD charsRead;
|
||||||
|
|
||||||
while (TryReadFile(m_hdevice, buffer, BUFFERSIZE, &charsRead, NULL)) {
|
while (TryReadFile(d->m_hdevice, buffer, BUFFERSIZE, &charsRead, NULL)) {
|
||||||
m_trkReadQueue.append(buffer, charsRead);
|
d->m_trkReadQueue.append(buffer, charsRead);
|
||||||
if (isValidTrkResult(m_trkReadQueue))
|
if (isValidTrkResult(d->m_trkReadQueue))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!isValidTrkResult(m_trkReadQueue)) {
|
if (!isValidTrkResult(d->m_trkReadQueue)) {
|
||||||
logMessage("Partial message: " + stringFromArray(m_trkReadQueue));
|
logMessage("Partial message: " + stringFromArray(d->m_trkReadQueue));
|
||||||
return;
|
|
||||||
}
|
|
||||||
#else // USE_NATIVE
|
|
||||||
if (m_trkDevice->bytesAvailable() == 0 && m_trkReadQueue.isEmpty()) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
#endif // Q_OS_WIN
|
||||||
|
logMessage("READ: " + stringFromArray(d->m_trkReadQueue));
|
||||||
|
handleResult(extractResult(&d->m_trkReadQueue));
|
||||||
|
|
||||||
QByteArray res = m_trkDevice->readAll();
|
d->m_trkWriteBusy = false;
|
||||||
m_trkReadQueue.append(res);
|
|
||||||
#endif // USE_NATIVE
|
|
||||||
|
|
||||||
logMessage("READ: " + stringFromArray(m_trkReadQueue));
|
|
||||||
handleResult(extractResult(&m_trkReadQueue));
|
|
||||||
|
|
||||||
m_trkWriteBusy = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -324,10 +355,10 @@ void Launcher::handleResult(const TrkResult &result)
|
|||||||
if (!result.data.isEmpty() && result.data.at(0))
|
if (!result.data.isEmpty() && result.data.at(0))
|
||||||
logMessage(prefix + "ERR: " +QByteArray::number(result.data.at(0)));
|
logMessage(prefix + "ERR: " +QByteArray::number(result.data.at(0)));
|
||||||
//logMessage("READ RESULT FOR TOKEN: " << token);
|
//logMessage("READ RESULT FOR TOKEN: " << token);
|
||||||
if (!m_writtenTrkMessages.contains(result.token)) {
|
if (!d->m_writtenTrkMessages.contains(result.token)) {
|
||||||
logMessage("NO ENTRY FOUND!");
|
logMessage("NO ENTRY FOUND!");
|
||||||
}
|
}
|
||||||
TrkMessage msg = m_writtenTrkMessages.take(result.token);
|
TrkMessage msg = d->m_writtenTrkMessages.take(result.token);
|
||||||
TrkResult result1 = result;
|
TrkResult result1 = result;
|
||||||
result1.cookie = msg.cookie;
|
result1.cookie = msg.cookie;
|
||||||
TrkCallBack cb = msg.callBack;
|
TrkCallBack cb = msg.callBack;
|
||||||
@@ -395,8 +426,8 @@ void Launcher::handleResult(const TrkResult &result)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
appendInt(&ba, m_session.pid);
|
appendInt(&ba, d->m_session.pid);
|
||||||
appendInt(&ba, m_session.tid);
|
appendInt(&ba, d->m_session.tid);
|
||||||
sendTrkMessage(TrkContinue, 0, ba, "CONTINUE");
|
sendTrkMessage(TrkContinue, 0, ba, "CONTINUE");
|
||||||
//sendTrkAck(result.token)
|
//sendTrkAck(result.token)
|
||||||
break;
|
break;
|
||||||
@@ -438,7 +469,7 @@ void Launcher::handleFileCreation(const TrkResult &result)
|
|||||||
// we don't do any error handling yet, which is bad
|
// we don't do any error handling yet, which is bad
|
||||||
const char *data = result.data.data();
|
const char *data = result.data.data();
|
||||||
uint copyFileHandle = extractInt(data + 2);
|
uint copyFileHandle = extractInt(data + 2);
|
||||||
QFile file(m_copySrcFileName);
|
QFile file(d->m_copySrcFileName);
|
||||||
file.open(QIODevice::ReadOnly);
|
file.open(QIODevice::ReadOnly);
|
||||||
QByteArray src = file.readAll();
|
QByteArray src = file.readAll();
|
||||||
file.close();
|
file.close();
|
||||||
@@ -471,13 +502,13 @@ void Launcher::handleCpuType(const TrkResult &result)
|
|||||||
// Command: 0x80 Acknowledge
|
// Command: 0x80 Acknowledge
|
||||||
// Error: 0x00
|
// Error: 0x00
|
||||||
// [80 03 00 04 00 00 04 00 00 00]
|
// [80 03 00 04 00 00 04 00 00 00]
|
||||||
m_session.cpuMajor = result.data[0];
|
d->m_session.cpuMajor = result.data[0];
|
||||||
m_session.cpuMinor = result.data[1];
|
d->m_session.cpuMinor = result.data[1];
|
||||||
m_session.bigEndian = result.data[2];
|
d->m_session.bigEndian = result.data[2];
|
||||||
m_session.defaultTypeSize = result.data[3];
|
d->m_session.defaultTypeSize = result.data[3];
|
||||||
m_session.fpTypeSize = result.data[4];
|
d->m_session.fpTypeSize = result.data[4];
|
||||||
m_session.extended1TypeSize = result.data[5];
|
d->m_session.extended1TypeSize = result.data[5];
|
||||||
//m_session.extended2TypeSize = result.data[6];
|
//d->m_session.extended2TypeSize = result.data[6];
|
||||||
}
|
}
|
||||||
|
|
||||||
void Launcher::handleCreateProcess(const TrkResult &result)
|
void Launcher::handleCreateProcess(const TrkResult &result)
|
||||||
@@ -486,25 +517,25 @@ void Launcher::handleCreateProcess(const TrkResult &result)
|
|||||||
//logMessage(" RESULT: " + result.toString());
|
//logMessage(" RESULT: " + result.toString());
|
||||||
// [80 08 00 00 00 01 B5 00 00 01 B6 78 67 40 00 00 40 00 00]
|
// [80 08 00 00 00 01 B5 00 00 01 B6 78 67 40 00 00 40 00 00]
|
||||||
const char *data = result.data.data();
|
const char *data = result.data.data();
|
||||||
m_session.pid = extractInt(data + 1);
|
d->m_session.pid = extractInt(data + 1);
|
||||||
m_session.tid = extractInt(data + 5);
|
d->m_session.tid = extractInt(data + 5);
|
||||||
m_session.codeseg = extractInt(data + 9);
|
d->m_session.codeseg = extractInt(data + 9);
|
||||||
m_session.dataseg = extractInt(data + 13);
|
d->m_session.dataseg = extractInt(data + 13);
|
||||||
logMessage(QString(" READ PID: %1").arg(m_session.pid));
|
logMessage(QString(" READ PID: %1").arg(d->m_session.pid));
|
||||||
logMessage(QString(" READ TID: %1").arg(m_session.tid));
|
logMessage(QString(" READ TID: %1").arg(d->m_session.tid));
|
||||||
logMessage(QString(" READ CODE: %1").arg(m_session.codeseg));
|
logMessage(QString(" READ CODE: %1").arg(d->m_session.codeseg));
|
||||||
logMessage(QString(" READ DATA: %1").arg(m_session.dataseg));
|
logMessage(QString(" READ DATA: %1").arg(d->m_session.dataseg));
|
||||||
emit applicationRunning(m_session.pid);
|
emit applicationRunning(d->m_session.pid);
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
appendInt(&ba, m_session.pid);
|
appendInt(&ba, d->m_session.pid);
|
||||||
appendInt(&ba, m_session.tid);
|
appendInt(&ba, d->m_session.tid);
|
||||||
sendTrkMessage(TrkContinue, 0, ba, "CONTINUE");
|
sendTrkMessage(TrkContinue, 0, ba, "CONTINUE");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Launcher::handleWaitForFinished(const TrkResult &result)
|
void Launcher::handleWaitForFinished(const TrkResult &result)
|
||||||
{
|
{
|
||||||
logMessage(" FINISHED: " + stringFromArray(result.data));
|
logMessage(" FINISHED: " + stringFromArray(result.data));
|
||||||
killTimer(m_timerId);
|
killTimer(d->m_timerId);
|
||||||
emit finished();
|
emit finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -533,7 +564,7 @@ void Launcher::cleanUp()
|
|||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
appendByte(&ba, 0x00);
|
appendByte(&ba, 0x00);
|
||||||
appendByte(&ba, 0x00);
|
appendByte(&ba, 0x00);
|
||||||
appendInt(&ba, m_session.pid);
|
appendInt(&ba, d->m_session.pid);
|
||||||
sendTrkMessage(TrkDeleteItem, 0, ba, "Delete process");
|
sendTrkMessage(TrkDeleteItem, 0, ba, "Delete process");
|
||||||
|
|
||||||
//---TRK------------------------------------------------------
|
//---TRK------------------------------------------------------
|
||||||
@@ -581,7 +612,7 @@ void Launcher::copyFileToRemote()
|
|||||||
emit copyingStarted();
|
emit copyingStarted();
|
||||||
QByteArray ba;
|
QByteArray ba;
|
||||||
appendByte(&ba, 0x10);
|
appendByte(&ba, 0x10);
|
||||||
appendString(&ba, m_copyDstFileName.toLocal8Bit(), TargetByteOrder, false);
|
appendString(&ba, d->m_copyDstFileName.toLocal8Bit(), TargetByteOrder, false);
|
||||||
sendTrkMessage(TrkOpenFile, CB(handleFileCreation), ba);
|
sendTrkMessage(TrkOpenFile, CB(handleFileCreation), ba);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -602,7 +633,7 @@ void Launcher::handleInstallPackageFinished(const TrkResult &)
|
|||||||
void Launcher::startInferiorIfNeeded()
|
void Launcher::startInferiorIfNeeded()
|
||||||
{
|
{
|
||||||
emit startingApplication();
|
emit startingApplication();
|
||||||
if (m_session.pid != 0) {
|
if (d->m_session.pid != 0) {
|
||||||
logMessage("Process already 'started'");
|
logMessage("Process already 'started'");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -611,6 +642,8 @@ void Launcher::startInferiorIfNeeded()
|
|||||||
appendByte(&ba, 0); // ?
|
appendByte(&ba, 0); // ?
|
||||||
appendByte(&ba, 0); // ?
|
appendByte(&ba, 0); // ?
|
||||||
appendByte(&ba, 0); // ?
|
appendByte(&ba, 0); // ?
|
||||||
appendString(&ba, m_fileName.toLocal8Bit(), TargetByteOrder);
|
appendString(&ba, d->m_fileName.toLocal8Bit(), TargetByteOrder);
|
||||||
sendTrkMessage(TrkCreateItem, CB(handleCreateProcess), ba); // Create Item
|
sendTrkMessage(TrkCreateItem, CB(handleCreateProcess), ba); // Create Item
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -29,36 +29,27 @@
|
|||||||
#ifndef LAUNCHER_H
|
#ifndef LAUNCHER_H
|
||||||
#define LAUNCHER_H
|
#define LAUNCHER_H
|
||||||
|
|
||||||
#include "trkutils.h"
|
#include <QtCore/QObject>
|
||||||
|
#include <QtCore/QVariant>
|
||||||
#include <QtCore/QCoreApplication>
|
|
||||||
#include <QtCore/QFile>
|
|
||||||
#include <QtCore/QQueue>
|
|
||||||
#include <QtCore/QTimer>
|
|
||||||
#include <QtCore/QDateTime>
|
|
||||||
|
|
||||||
#include <QtNetwork/QTcpServer>
|
|
||||||
#include <QtNetwork/QTcpSocket>
|
|
||||||
#include <QtNetwork/QLocalServer>
|
|
||||||
#include <QtNetwork/QLocalSocket>
|
|
||||||
|
|
||||||
#if USE_NATIVE
|
|
||||||
#include <windows.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace trk {
|
namespace trk {
|
||||||
|
|
||||||
|
struct TrkResult;
|
||||||
|
struct TrkMessage;
|
||||||
|
struct LauncherPrivate;
|
||||||
|
|
||||||
class Launcher : public QObject
|
class Launcher : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
typedef void (Launcher::*TrkCallBack)(const TrkResult &);
|
||||||
|
|
||||||
Launcher();
|
Launcher();
|
||||||
~Launcher();
|
~Launcher();
|
||||||
void setTrkServerName(const QString &name) { m_trkServerName = name; }
|
void setTrkServerName(const QString &name);
|
||||||
void setFileName(const QString &name) { m_fileName = name; }
|
void setFileName(const QString &name);
|
||||||
void setCopyFileName(const QString &srcName, const QString &dstName) { m_copySrcFileName = srcName; m_copyDstFileName = dstName; }
|
void setCopyFileName(const QString &srcName, const QString &dstName);
|
||||||
void setInstallFileName(const QString &name) { m_installFileName = name; }
|
void setInstallFileName(const QString &name);
|
||||||
bool startServer(QString *errorMessage);
|
bool startServer(QString *errorMessage);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@@ -73,23 +64,8 @@ public slots:
|
|||||||
void terminate();
|
void terminate();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//
|
|
||||||
// TRK
|
|
||||||
//
|
|
||||||
typedef void (Launcher::*TrkCallBack)(const TrkResult &);
|
|
||||||
|
|
||||||
struct TrkMessage
|
|
||||||
{
|
|
||||||
TrkMessage() { code = token = 0; callBack = 0; }
|
|
||||||
byte code;
|
|
||||||
byte token;
|
|
||||||
QByteArray data;
|
|
||||||
QVariant cookie;
|
|
||||||
TrkCallBack callBack;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool openTrkPort(const QString &port, QString *errorMessage); // or server name for local server
|
bool openTrkPort(const QString &port, QString *errorMessage); // or server name for local server
|
||||||
void sendTrkMessage(byte code,
|
void sendTrkMessage(unsigned char code,
|
||||||
TrkCallBack callBack = 0,
|
TrkCallBack callBack = 0,
|
||||||
const QByteArray &data = QByteArray(),
|
const QByteArray &data = QByteArray(),
|
||||||
const QVariant &cookie = QVariant());
|
const QVariant &cookie = QVariant());
|
||||||
@@ -101,13 +77,13 @@ private:
|
|||||||
void trkWrite(const TrkMessage &msg);
|
void trkWrite(const TrkMessage &msg);
|
||||||
// convienience messages
|
// convienience messages
|
||||||
void sendTrkInitialPing();
|
void sendTrkInitialPing();
|
||||||
void sendTrkAck(byte token);
|
void sendTrkAck(unsigned char token);
|
||||||
|
|
||||||
// kill process and breakpoints
|
// kill process and breakpoints
|
||||||
void cleanUp();
|
void cleanUp();
|
||||||
|
|
||||||
void timerEvent(QTimerEvent *ev);
|
void timerEvent(QTimerEvent *ev);
|
||||||
byte nextTrkWriteToken();
|
unsigned char nextTrkWriteToken();
|
||||||
|
|
||||||
void handleFileCreation(const TrkResult &result);
|
void handleFileCreation(const TrkResult &result);
|
||||||
void handleFileCreated(const TrkResult &result);
|
void handleFileCreated(const TrkResult &result);
|
||||||
@@ -127,30 +103,9 @@ private:
|
|||||||
void installAndRun();
|
void installAndRun();
|
||||||
void startInferiorIfNeeded();
|
void startInferiorIfNeeded();
|
||||||
|
|
||||||
#if USE_NATIVE
|
|
||||||
HANDLE m_hdevice;
|
|
||||||
#else
|
|
||||||
QLocalSocket *m_trkDevice;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
QString m_trkServerName;
|
|
||||||
QByteArray m_trkReadBuffer;
|
|
||||||
|
|
||||||
unsigned char m_trkWriteToken;
|
|
||||||
QQueue<TrkMessage> m_trkWriteQueue;
|
|
||||||
QHash<byte, TrkMessage> m_writtenTrkMessages;
|
|
||||||
QByteArray m_trkReadQueue;
|
|
||||||
bool m_trkWriteBusy;
|
|
||||||
|
|
||||||
void logMessage(const QString &msg);
|
void logMessage(const QString &msg);
|
||||||
// Debuggee state
|
|
||||||
Session m_session; // global-ish data (process id, target information)
|
|
||||||
|
|
||||||
int m_timerId;
|
LauncherPrivate *d;
|
||||||
QString m_fileName;
|
|
||||||
QString m_copySrcFileName;
|
|
||||||
QString m_copyDstFileName;
|
|
||||||
QString m_installFileName;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Trk
|
} // namespace Trk
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "launcher.h"
|
#include "launcher.h"
|
||||||
|
|
||||||
using namespace trk;
|
#include <QtCore/QCoreApplication>
|
||||||
|
#include <QtCore/QDebug>
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@@ -16,7 +17,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
QCoreApplication app(argc, argv);
|
QCoreApplication app(argc, argv);
|
||||||
|
|
||||||
Launcher launcher;
|
trk::Launcher launcher;
|
||||||
launcher.setTrkServerName(argv[1]);
|
launcher.setTrkServerName(argv[1]);
|
||||||
if (argc == 3) {
|
if (argc == 3) {
|
||||||
launcher.setFileName(argv[2]);
|
launcher.setFileName(argv[2]);
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
win32:DEFINES += USE_NATIVE
|
|
||||||
DEFINES += DEBUG_TRK=0
|
DEFINES += DEBUG_TRK=0
|
||||||
INCLUDEPATH *= $$PWD
|
INCLUDEPATH *= $$PWD
|
||||||
SOURCES += $$PWD/launcher.cpp \
|
SOURCES += $$PWD/launcher.cpp \
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
TEMPLATE = app
|
TEMPLATE = app
|
||||||
QT = core network
|
QT = core
|
||||||
include($$PWD/trklauncher.pri)
|
include($$PWD/trklauncher.pri)
|
||||||
DEFINES += DEBUG_TRK=1
|
DEFINES += DEBUG_TRK=1
|
||||||
win32:CONFIG += console
|
win32:CONFIG += console
|
||||||
|
|||||||
Reference in New Issue
Block a user