vmprotect-3.5.1/VMProtect/remotecontrol.cc

103 lines
2.2 KiB
C++

//#include "../core/objects.h"
#include "remotecontrol.h"
#include "moc/moc_remotecontrol.cc"
#ifndef VMP_GNU
#include "remotecontrol_win.h"
#include "moc/moc_remotecontrol_win.cc"
StdInListenerWin::StdInListenerWin(QObject *parent)
: QThread(parent)
{
}
StdInListenerWin::~StdInListenerWin()
{
terminate();
wait();
}
void StdInListenerWin::run()
{
bool ok = true;
char chBuf[4096];
DWORD dwRead;
HANDLE hStdin, hStdinDup;
hStdin = GetStdHandle(STD_INPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE)
return;
DuplicateHandle(GetCurrentProcess(), hStdin,
GetCurrentProcess(), &hStdinDup,
0, false, DUPLICATE_SAME_ACCESS);
CloseHandle(hStdin);
while (ok) {
ok = ReadFile(hStdinDup, chBuf, sizeof(chBuf), &dwRead, NULL);
if (ok && dwRead != 0)
emit receivedCommand(QString::fromLocal8Bit(chBuf, dwRead));
}
CloseHandle(hStdinDup);
}
#endif
RemoteControl::RemoteControl(QMainWindow *mainWindow)
: QObject(mainWindow)
{
#ifndef VMP_GNU
StdInListenerWin *l = new StdInListenerWin(this);
connect(l, SIGNAL(receivedCommand(QString)),
this, SLOT(handleCommandString(QString)));
l->start();
#else
QSocketNotifier *notifier = new QSocketNotifier(fileno(stdin),
QSocketNotifier::Read, this);
connect(notifier, SIGNAL(activated(int)), this, SLOT(receivedData()));
notifier->setEnabled(true);
#endif
}
void RemoteControl::receivedData()
{
QByteArray ba;
while (true) {
int c = getc(stdin);
if (c == EOF || c == 0)
break;
ba.append(char(c));
if (c == '\n')
break;
}
handleCommandString(QString::fromLocal8Bit(ba));
}
void RemoteControl::handleCommandString(const QString &cmdString)
{
QStringList cmds = cmdString.split(QLatin1Char(';'));
QStringList::const_iterator it = cmds.constBegin();
while (it != cmds.constEnd()) {
QString cmd, arg;
splitInputString(*it, cmd, arg);
if (cmd == QLatin1String("navigatetokeyword"))
emit handleNavigateToKeywordCommand(arg);
else
break;
++it;
}
}
void RemoteControl::splitInputString(const QString &input, QString &cmd,
QString &arg)
{
QString cmdLine = input.trimmed();
int i = cmdLine.indexOf(QLatin1Char('#'));
cmd = cmdLine.left(i);
arg = cmdLine.mid(i+1);
cmd = cmd.toLower();
}