diff options
Diffstat (limited to 'VMProtect/remotecontrol.cc')
-rw-r--r-- | VMProtect/remotecontrol.cc | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/VMProtect/remotecontrol.cc b/VMProtect/remotecontrol.cc new file mode 100644 index 0000000..2761c3b --- /dev/null +++ b/VMProtect/remotecontrol.cc @@ -0,0 +1,102 @@ +//#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(); +} |