103 lines
2.2 KiB
C++
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();
|
||
|
}
|