Qt Remote objects done

This commit is contained in:
pokamest 2021-02-02 22:51:31 +03:00
parent 048a673d31
commit b2392c1943
15 changed files with 240 additions and 423 deletions

View file

@ -14,12 +14,12 @@
#endif
LocalServer::LocalServer(QObject *parent) : QObject(parent),
m_clientConnection(nullptr),
m_clientConnected(false),
// m_clientConnection(nullptr),
// m_clientConnected(false),
m_ipcServer(this)
{
m_server = QSharedPointer<QLocalServer>(new QLocalServer(this));
m_server->setSocketOptions(QLocalServer::WorldAccessOption);
// m_server = QSharedPointer<QLocalServer>(new QLocalServer(this));
// m_server->setSocketOptions(QLocalServer::WorldAccessOption);
// if (!m_server->listen(Utils::serverName())) {
// qDebug() << QString("Unable to start the server: %1.").arg(m_server->errorString());
@ -36,186 +36,186 @@ LocalServer::LocalServer(QObject *parent) : QObject(parent),
LocalServer::~LocalServer()
{
m_clientConnected = false;
m_server->disconnect();
// m_clientConnected = false;
// m_server->disconnect();
QFile::remove(Utils::serverName());
// QFile::remove(Utils::serverName());
qDebug() << "Local server stopped";
}
bool LocalServer::isRunning() const
{
return true;
//return m_server->isListening();
}
//bool LocalServer::isRunning() const
//{
// return true;
// //return m_server->isListening();
//}
void LocalServer::onNewConnection()
{
if (m_clientConnection) {
m_clientConnection->deleteLater();
}
//void LocalServer::onNewConnection()
//{
// if (m_clientConnection) {
// m_clientConnection->deleteLater();
// }
m_clientConnection = m_server->nextPendingConnection();
connect(m_clientConnection, &QLocalSocket::disconnected, this, &LocalServer::onDisconnected);
m_clientConnected = true;
// m_clientConnection = m_server->nextPendingConnection();
// connect(m_clientConnection, &QLocalSocket::disconnected, this, &LocalServer::onDisconnected);
// m_clientConnected = true;
qDebug() << "New connection";
// qDebug() << "New connection";
for(;;) {
qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
if (!m_clientConnected || !m_clientConnection) {
break;
}
// for(;;) {
// qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
// if (!m_clientConnected || !m_clientConnection) {
// break;
// }
if (m_clientConnection->waitForReadyRead(1000) && m_clientConnection->canReadLine()) {
char buf[1024];
qint64 lineLength = m_clientConnection->readLine(buf, sizeof(buf));
if (lineLength != -1) {
QString line = buf;
line = line.simplified();
qDebug().noquote() << QString("Read line: '%1'").arg(line);
Message incomingMessage(line);
if (!incomingMessage.isValid()) {
qWarning().noquote() << "Message is not valid!";
continue;
}
else {
qDebug().noquote() << QString("Got message id: '%1'").arg(static_cast<int>(incomingMessage.state()));
//qDebug().noquote() << incomingMessage.rawData();
}
// if (m_clientConnection->waitForReadyRead(1000) && m_clientConnection->canReadLine()) {
// char buf[1024];
// qint64 lineLength = m_clientConnection->readLine(buf, sizeof(buf));
// if (lineLength != -1) {
// QString line = buf;
// line = line.simplified();
// qDebug().noquote() << QString("Read line: '%1'").arg(line);
// Message incomingMessage(line);
// if (!incomingMessage.isValid()) {
// qWarning().noquote() << "Message is not valid!";
// continue;
// }
// else {
// qDebug().noquote() << QString("Got message id: '%1'").arg(static_cast<int>(incomingMessage.state()));
// //qDebug().noquote() << incomingMessage.rawData();
// }
switch (incomingMessage.state()) {
case Message::State::Initialize:
#ifdef Q_OS_WIN
TapController::Instance().checkAndSetup();
#endif
sendMessage(Message(Message::State::Initialize, QStringList({"Server"})));
break;
case Message::State::StartRequest:
startProcess(incomingMessage.args());
break;
case Message::State::FinishRequest:
finishProcess(incomingMessage.args());
break;
// switch (incomingMessage.state()) {
// case Message::State::Initialize:
// #ifdef Q_OS_WIN
// TapController::Instance().checkAndSetup();
// #endif
// sendMessage(Message(Message::State::Initialize, QStringList({"Server"})));
// break;
// case Message::State::StartRequest:
// startProcess(incomingMessage.args());
// break;
// case Message::State::FinishRequest:
// finishProcess(incomingMessage.args());
// break;
case Message::State::RoutesAddRequest:
routesAddRequest(incomingMessage.args());
break;
case Message::State::RouteDeleteRequest:
routeDeleteRequest(incomingMessage.args());
break;
case Message::State::ClearSavedRoutesRequest:
Router::Instance().clearSavedRoutes();
break;
case Message::State::FlushDnsRequest:
Router::Instance().flushDns();
break;
case Message::State::InstallDriverRequest:
checkAndInstallDriver(incomingMessage.args());
break;
// case Message::State::RoutesAddRequest:
// routesAddRequest(incomingMessage.args());
// break;
// case Message::State::RouteDeleteRequest:
// routeDeleteRequest(incomingMessage.args());
// break;
// case Message::State::ClearSavedRoutesRequest:
// Router::Instance().clearSavedRoutes();
// break;
// case Message::State::FlushDnsRequest:
// Router::Instance().flushDns();
// break;
// case Message::State::InstallDriverRequest:
// checkAndInstallDriver(incomingMessage.args());
// break;
default:
;
}
}
}
}
// default:
// ;
// }
// }
// }
// }
qDebug() << "Released";
}
// qDebug() << "Released";
//}
void LocalServer::finishProcess(const QStringList& args)
{
Q_UNUSED(args)
}
//void LocalServer::finishProcess(const QStringList& args)
//{
// Q_UNUSED(args)
//}
void LocalServer::startProcess(const QStringList& messageArgs)
{
if (messageArgs.size() < 1) {
return;
}
//void LocalServer::startProcess(const QStringList& messageArgs)
//{
// if (messageArgs.size() < 1) {
// return;
// }
QProcess* process = new QProcess();
connect(process, SIGNAL(started()), this, SLOT(onStarted()));
connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onFinished(int, QProcess::ExitStatus)));
// QProcess* process = new QProcess();
// connect(process, SIGNAL(started()), this, SLOT(onStarted()));
// connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(onFinished(int, QProcess::ExitStatus)));
const QString program = messageArgs.at(0);
QStringList args;
for (int i = 1; i < messageArgs.size(); i++) {
args.append(messageArgs.at(i));
}
// const QString program = messageArgs.at(0);
// QStringList args;
// for (int i = 1; i < messageArgs.size(); i++) {
// args.append(messageArgs.at(i));
// }
QFileInfo fi(program);
const QString baseName = fi.baseName();
if (!fi.exists()) {
qWarning() << "This program does not exist";
sendMessage(Message(Message::State::Started, QStringList({baseName})));
sendMessage(Message(Message::State::Finished, QStringList({baseName, QString::number(-1)})));
return;
}
// QFileInfo fi(program);
// const QString baseName = fi.baseName();
// if (!fi.exists()) {
// qWarning() << "This program does not exist";
// sendMessage(Message(Message::State::Started, QStringList({baseName})));
// sendMessage(Message(Message::State::Finished, QStringList({baseName, QString::number(-1)})));
// return;
// }
process->setObjectName(baseName);
// process->setObjectName(baseName);
qDebug().noquote() << QString("Start process '%1' - '%2' with args '%3'")
.arg(baseName).arg(program).arg(args.join(","));
// qDebug().noquote() << QString("Start process '%1' - '%2' with args '%3'")
// .arg(baseName).arg(program).arg(args.join(","));
process->start(program, args);
m_processList.append(process);
}
// process->start(program, args);
// m_processList.append(process);
//}
void LocalServer::routesAddRequest(const QStringList &messageArgs)
{
Router::Instance().routeAddList(messageArgs.first(), messageArgs.mid(1));
}
//void LocalServer::routesAddRequest(const QStringList &messageArgs)
//{
// Router::Instance().routeAddList(messageArgs.first(), messageArgs.mid(1));
//}
void LocalServer::routeDeleteRequest(const QStringList &messageArgs)
{
Router::Instance().routeDelete(messageArgs.first());
}
//void LocalServer::routeDeleteRequest(const QStringList &messageArgs)
//{
// Router::Instance().routeDelete(messageArgs.first());
//}
void LocalServer::checkAndInstallDriver(const QStringList &messageArgs)
{
//void LocalServer::checkAndInstallDriver(const QStringList &messageArgs)
//{
}
//}
void LocalServer::onFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
Q_UNUSED(exitStatus)
//void LocalServer::onFinished(int exitCode, QProcess::ExitStatus exitStatus)
//{
// Q_UNUSED(exitStatus)
QProcess* process = (QProcess*)sender();
sendMessage(Message(Message::State::Finished, QStringList({process->objectName(), QString::number(exitCode)})));
}
// QProcess* process = (QProcess*)sender();
// sendMessage(Message(Message::State::Finished, QStringList({process->objectName(), QString::number(exitCode)})));
//}
void LocalServer::onStarted()
{
QProcess* process = (QProcess*)sender();
sendMessage(Message(Message::State::Started, QStringList({process->objectName()})));
}
//void LocalServer::onStarted()
//{
// QProcess* process = (QProcess*)sender();
// sendMessage(Message(Message::State::Started, QStringList({process->objectName()})));
//}
void LocalServer::onDisconnected()
{
if (!m_clientConnected) {
return;
}
//void LocalServer::onDisconnected()
//{
// if (!m_clientConnected) {
// return;
// }
m_clientConnected = false;
QLocalSocket* clientConnection = (QLocalSocket*)sender();
clientConnection->deleteLater();
// m_clientConnected = false;
// QLocalSocket* clientConnection = (QLocalSocket*)sender();
// clientConnection->deleteLater();
qDebug() << "Diconnected";
}
// qDebug() << "Diconnected";
//}
void LocalServer::sendMessage(const Message& message)
{
if (!m_clientConnection || !m_clientConnected) {
qDebug()<< "Cannot send data, remote peer is not connected";
return;
}
//void LocalServer::sendMessage(const Message& message)
//{
// if (!m_clientConnection || !m_clientConnected) {
// qDebug()<< "Cannot send data, remote peer is not connected";
// return;
// }
const QString data = message.toString();
bool status = m_clientConnection->write(QString(data + "\n").toUtf8());
// const QString data = message.toString();
// bool status = m_clientConnection->write(QString(data + "\n").toUtf8());
qDebug().noquote() << QString("Send message '%1', status '%2'").arg(data).arg(Utils::toString(status));
}
// qDebug().noquote() << QString("Send message '%1', status '%2'").arg(data).arg(Utils::toString(status));
//}

View file

@ -23,30 +23,30 @@ public:
explicit LocalServer(QObject* parent = nullptr);
~LocalServer();
bool isRunning() const;
// bool isRunning() const;
protected slots:
void onDisconnected();
void onNewConnection();
// void onDisconnected();
// void onNewConnection();
void onFinished(int exitCode, QProcess::ExitStatus exitStatus);
void onStarted();
// void onFinished(int exitCode, QProcess::ExitStatus exitStatus);
// void onStarted();
private:
void finishProcess(const QStringList& messageArgs);
void sendMessage(const Message& message);
void startProcess(const QStringList& messageArgs);
// void finishProcess(const QStringList& messageArgs);
// void sendMessage(const Message& message);
// void startProcess(const QStringList& messageArgs);
void routesAddRequest(const QStringList& messageArgs);
void routeDeleteRequest(const QStringList& messageArgs);
// void routesAddRequest(const QStringList& messageArgs);
// void routeDeleteRequest(const QStringList& messageArgs);
void checkAndInstallDriver(const QStringList& messageArgs);
// void checkAndInstallDriver(const QStringList& messageArgs);
QSharedPointer<QLocalServer> m_server;
QPointer <QLocalSocket> m_clientConnection;
// QPointer <QLocalSocket> m_clientConnection;
QVector<QProcess*> m_processList;
bool m_clientConnected;
// QVector<QProcess*> m_processList;
// bool m_clientConnected;
IpcServer m_ipcServer;
QRemoteObjectHost m_serverNode;

View file

@ -10,9 +10,9 @@ int runApplication(int argc, char** argv)
{
QCoreApplication app(argc,argv);
LocalServer localServer;
if (!localServer.isRunning()) {
return -1;
}
// if (!localServer.isRunning()) {
// return -1;
// }
return app.exec();
}
int main(int argc, char **argv)

View file

@ -13,9 +13,9 @@ void SystemService::start()
QCoreApplication* app = application();
m_localServer = new LocalServer();
if (!m_localServer->isRunning()) {
app->quit();
}
// if (!m_localServer->isRunning()) {
// app->quit();
// }
}
void SystemService::stop()