#ifndef CMD_PROC_H
#define CMD_PROC_H
// This file is part of MRCI.
// MRCI is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// MRCI is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with MRCI under the LICENSE.md file. If not, see
// .
#include "common.h"
class ModProcess : public QProcess
{
Q_OBJECT
private:
QHash cmdRanks;
QHash *modCmdNames;
QHash *cmdUniqueNames;
QHash *cmdRealNames;
QHash *cmdAppById;
QList *cmdIds;
IdleTimer *idleTimer;
quint16 genCmdId();
QString makeCmdUnique(const QString &name);
bool allowCmdLoad(const QString &cmdName);
protected:
QString pipeName;
QString fullPipe;
QString sesMemKey;
QString hostMemKey;
quint8 ipcTypeId;
quint32 ipcDataSize;
quint32 hostRank;
quint32 flags;
QLocalServer *ipcServ;
QLocalSocket *ipcSocket;
virtual void onReady();
virtual void onFailToStart();
virtual void onDataFromProc(quint8 typeId, const QByteArray &data);
void cleanupPipe();
void wrIpcFrame(quint8 typeId, const QByteArray &data);
bool startProc(const QStringList &args);
bool isCmdLoaded(const QString &name);
bool openPipe();
protected slots:
virtual void onFinished(int exitCode, QProcess::ExitStatus exitStatus);
virtual void rdFromStdErr();
virtual void rdFromStdOut();
void rdFromIPC();
void newIPCLink();
void ipcDisconnected();
void err(QProcess::ProcessError error);
public:
explicit ModProcess(const QString &app, const QString &memSes, const QString &memHos, const QString &pipe, QObject *parent = nullptr);
void setSessionParams(QHash *uniqueNames,
QHash *realNames,
QHash *appById,
QHash *namesForMod,
QList *ids,
quint32 rnk);
bool loadPublicCmds();
bool loadUserCmds();
bool loadExemptCmds();
signals:
void cmdUnloaded(quint16 cmdId);
void dataToClient(quint32 cmdId, const QByteArray &data, quint8 typeId);
};
//----------------------------
class CmdProcess : public ModProcess
{
Q_OBJECT
private:
quint32 cmdId;
QString cmdName;
bool cmdIdle;
QSharedMemory *sesMem;
char *sessionId;
char *openWritableSubChs;
void onReady();
void onFailToStart();
void onFinished(int exitCode, QProcess::ExitStatus exitStatus);
void onDataFromProc(quint8 typeId, const QByteArray &data);
bool validAsync(quint16 async, const QByteArray &data, QTextStream &errMsg);
private slots:
void killCmd();
void rdFromStdErr();
void rdFromStdOut();
public slots:
void killCmd16(quint16 id16);
void killCmd32(quint32 id32);
public:
explicit CmdProcess(quint32 id, const QString &cmd, const QString &modApp, const QString &memSes, const QString &memHos, const QString &pipe, QObject *parent = nullptr);
void dataFromSession(quint32 id, const QByteArray &data, quint8 dType);
void setSessionParams(QSharedMemory *mem, char *sesId, char *wrableSubChs);
bool startCmdProc();
signals:
void cmdProcFinished(quint32 id);
void cmdProcReady(quint32 id, CmdProcess *obj);
void pubIPC(quint16 cmdId, const QByteArray &data);
void privIPC(quint16 cmdId, const QByteArray &data);
void pubIPCWithFeedBack(quint16 cmdId, const QByteArray &data);
};
#endif // CMD_PROC_H