aboutsummaryrefslogtreecommitdiff
path: root/VMProtect/remotecontrol.cc
diff options
context:
space:
mode:
Diffstat (limited to 'VMProtect/remotecontrol.cc')
-rw-r--r--VMProtect/remotecontrol.cc102
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();
+}