Cmdr/src/common.h
Maurice ONeal ac364c1e8f Added multi-threaded support
along with the main thread, the project now supports 3
additional threads.

-the Session object operates in it's own thread that
 will take data directly from the host, process and
 direct it to various parts of the client.

-the main GUI and client command objects will continue
 to operate on the main thread.

-the GenFile object which is dedicated to processing
 GEN_FILE data to or from the host will operate in
 it's own thread.

-last thread is for a new object called TextWorker.
 this object will take all of the text buffered from
 all of other objects and then send the text to be
 displayed by the main GUI in a slower, controlled
 manner.

by building out all of these threads, the main GUI
will not lag even when the host or the client itself
is outputting an excessive amount of data.

fixed a bug that prevented the client from being able
to totally unhook a genfile command of it crashes.

also reduced the default max lines from 5000 to 1000.
2019-12-04 22:01:52 -05:00

271 lines
7.7 KiB
C++

#ifndef COMMON_H
#define COMMON_H
// This file is part of Cmdr.
// Cmdr 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.
// Cmdr 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 Cmdr under the LICENSE.md file. If not, see
// <http://www.gnu.org/licenses/>.
#include <QObject>
#include <QLineEdit>
#include <QTextEdit>
#include <QMainWindow>
#include <QVBoxLayout>
#include <QSizePolicy>
#include <QDockWidget>
#include <QSize>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QGuiApplication>
#include <QScreen>
#include <QResizeEvent>
#include <QPalette>
#include <QKeyEvent>
#include <QTextOption>
#include <QTextCursor>
#include <QTextStream>
#include <QThread>
#include <QInputMethodEvent>
#include <QContextMenuEvent>
#include <QMenu>
#include <QPaintEvent>
#include <QAction>
#include <QPixmapCache>
#include <QPair>
#include <QTextDocument>
#include <QBrush>
#include <QColor>
#include <QTextBlockFormat>
#include <QComboBox>
#include <QDebug>
#include <QTextCodec>
#include <QCoreApplication>
#include <QStringList>
#include <QHostAddress>
#include <QtEndian>
#include <QDir>
#include <QJsonDocument>
#include <QSslSocket>
#include <QFile>
#include <QFile>
#include <QRegExp>
#include <QFileInfo>
#include <QMutex>
#include "cmd_objs/long_txt.h"
#define DEFAULT_HIST_LIMIT 100
#define DEFAULT_MAX_LINES 1000
#define RDBUFF 128000
#define TXT_CODEC "UTF-16LE"
#define BOOKMARK_FOLDER "bookmarks"
#define CONFIG_FILENAME "config.json"
#define APP_NAME "Cmdr"
#define APP_TARGET "cmdr"
#define APP_VERSION "2.1.0"
enum TypeID : quint8
{
GEN_FILE = 1,
TEXT = 2,
ERR = 3,
PRIV_TEXT = 4,
IDLE = 5,
HOST_CERT = 6,
FILE_INFO = 7,
PEER_INFO = 8,
MY_INFO = 9,
PEER_STAT = 10,
P2P_REQUEST = 11,
P2P_CLOSE = 12,
P2P_OPEN = 13,
BYTES = 14,
SESSION_ID = 15,
NEW_CMD = 16,
CMD_ID = 17,
BIG_TEXT = 18,
TERM_CMD = 19,
HOST_VER = 20,
PRIV_IPC = 21,
PUB_IPC = 22,
PUB_IPC_WITH_FEEDBACK = 23,
PING_PEERS = 24,
CH_MEMBER_INFO = 25,
CH_ID = 26,
KILL_CMD = 27,
HALT_CMD = 28,
RESUME_CMD = 29
};
enum AsyncCommands : quint16
{
ASYNC_RDY = 1, // client | none
ASYNC_SYS_MSG = 2, // client | none
ASYNC_CAST = 4, // client | public
ASYNC_USER_DELETED = 7, // client | public
ASYNC_TO_PEER = 16, // client | public | retricted
ASYNC_LIMITED_CAST = 17, // client | public
ASYNC_P2P = 19, // client | public
ASYNC_NEW_CH_MEMBER = 21, // client | public
ASYNC_DEL_CH = 22, // client | public
ASYNC_RENAME_CH = 23, // client | public
ASYNC_NEW_SUB_CH = 25, // client | public
ASYNC_RM_SUB_CH = 26, // client | public
ASYNC_RENAME_SUB_CH = 27, // client | public
ASYNC_INVITED_TO_CH = 28, // client | public
ASYNC_RM_CH_MEMBER = 29, // client | public
ASYNC_INVITE_ACCEPTED = 30, // client | public
ASYNC_MEM_LEVEL_CHANGED = 31, // client | public
ASYNC_SUB_CH_LEVEL_CHG = 32, // client | public
ASYNC_ADD_RDONLY = 33, // client | public
ASYNC_RM_RDONLY = 34, // client | public
ASYNC_ADD_CMD = 35, // client | none
ASYNC_RM_CMD = 36, // client | none
};
enum ChannelMemberLevel
{
OWNER = 1,
ADMIN = 2,
OFFICER = 3,
REGULAR = 4,
PUBLIC = 5
};
enum UserIOFlags
{
HOST_HOOK = 1,
LOCAL_HOOK = 1 << 2,
GEN_HOOK = 1 << 3,
HIDDEN = 1 << 4
};
void setupTextSettings(QJsonObject *data);
void loadTextSettings(QJsonObject *data, QWidget *widget);
void saveLocalData(QJsonObject *obj);
void loadLocalData(QJsonObject *obj);
void wordWrap(const QString &label, QTextStream &txtOut, const QString &txtIn, QWidget *measureWid);
bool argExists(const QString &key, const QStringList &args);
QByteArray wrInt(quint64 num, int numOfBits);
QByteArray wrFrame(quint16 cmdId, const QByteArray &data, uchar dType);
QByteArray toTEXT(const QString &txt);
QByteArray fixedToTEXT(const QString &txt, int len);
QStringList parseArgs(const QByteArray &data, int maxArgs);
QStringList parseArgs(const QString &line);
QString fromTEXT(const QByteArray &txt);
QString appDataDir();
QString getParam(const QString &key, const QStringList &args);
QString extractCmdName(const QByteArray &data);
QString boolText(bool state);
QString verText(quint16 maj, quint16 min, quint16 patch);
quint64 rdInt(const QByteArray &bytes);
class Command;
class CmdLine;
class Genfile;
class MainWindow;
class Session;
class TextBody;
class TextWorker;
class ContextReloader;
class HostDoc;
class ThreadKiller;
class Shared : public QObject
{
Q_OBJECT
public:
static bool *connectedToHost;
static bool *activeDisp;
static QByteArray *sessionId;
static ushort *servMajor;
static ushort *servMinor;
static ushort *servPatch;
static QString *hostAddress;
static QString *clientHookedCmd;
static quint16 *hostPort;
static QStringList *hookBypass;
static QSslSocket *socket;
static QHash<QString, Command*> *clientCmds;
static QHash<quint16, QString> *hostCmds;
static QHash<quint16, QString> *genfileCmds;
static QHash<QString, Command*> *hostDocs;
static QList<quint8> *idCache;
static QList<QString> *txtCache;
static QJsonObject *localData;
static quint16 *termCmdId;
static CmdLine *cmdLine;
static Genfile *genFile;
static MainWindow *mainWin;
static Session *session;
static TextBody *textBody;
static TextWorker *textWorker;
static ContextReloader *contextReloader;
static QWidget *mainWidget;
static ThreadKiller *theadKiller;
enum CacheOp
{
TXT_IN,
TXT_OUT,
TXT_CLEAR,
TXT_IS_EMPTY
};
static bool cacheTxt(CacheOp op);
static bool cacheTxt(CacheOp op, quint8 &typeId, QString &txt);
explicit Shared(QObject *parent = nullptr);
};
class ContextReloader : public QObject
{
Q_OBJECT
public:
explicit ContextReloader(QObject *parent = nullptr);
public slots:
void reloadCmdLine();
};
class ThreadKiller : public QObject
{
Q_OBJECT
private:
int threadCount;
public:
explicit ThreadKiller(QObject *parent = nullptr);
public slots:
void threadFinished();
signals:
void quitThreads();
};
#endif // COMMON_H