You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
1.9 KiB
C++

#ifndef __TP_PROTOCOL_H__
#define __TP_PROTOCOL_H__
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonObject>
#include <QtCore/qjsonarray.h>
#include <QtCore/QTextStream>
#include <QQueue>
#include <QByteArray>
#include <QMap>
#include <QDateTime>
#include <QTcpSocket>
#include <QSharedPointer>
const quint8 TP_PROTO_VERSION = 77;
const quint8 TP_PROTO_MAGIC = 88;
const quint16 TP_PROTO_SERVER = 9999;
const quint32 TP_PROTO_MAX_SIZE = 100 * 1024 * 1024; //100M
const quint32 TP_PROTO_HEAD_SIZE = 8;
typedef enum TpServerStatus
{
ON_RUNNING = 0,
ON_SHUTDOWN = 1,
}TpServerStatus;
typedef struct tagTP_CLIENT_STATUS
{
QString strClientName;
QString strClientIP;
QString strHostIP;
QAbstractSocket::SocketState status;
int nSessID;
QDateTime tLastActive;
}TP_CLIENT_STATUS;
typedef QMap<QString, TP_CLIENT_STATUS> ClientsStatusMap;
typedef enum TpProtoParserStatus
{
ON_PARSER_INIT = 0,
ON_PARSER_HAED = 1,
ON_PARSER_BODY = 2,
}TpProtoParserStatus;
typedef struct tagTP_PROTOCOL_HEAD
{
quint8 version;
quint8 magic;
quint16 server;
quint32 len;
}TP_PROTOCOL_HEAD;
class TP_PROTOCOL_MESSAGE
{
public:
TP_PROTOCOL_MESSAGE(){}
~TP_PROTOCOL_MESSAGE(){}
public:
TP_PROTOCOL_HEAD head;
QJsonObject body;
};
class TpProtocolEnCode
{
public:
TpProtocolEnCode();
~TpProtocolEnCode();
static QSharedPointer<QByteArray> encode(TP_PROTOCOL_MESSAGE& msg);
};
class TpProtocolDeCode
{
public:
void init();
void clear();
bool parser(QByteArray inData);
bool empty();
QSharedPointer<TP_PROTOCOL_MESSAGE> front();
void pop();
private:
bool parserHead(QByteArray& curData, quint32& curLen, quint32& parserLen, bool & parserBreak);
bool parserBody(QByteArray& curData, quint32& curLen, quint32& parserLen, bool & parserBreak);
private:
TP_PROTOCOL_MESSAGE mCurMsg;
QQueue<QSharedPointer<TP_PROTOCOL_MESSAGE> > mMsgQ;
QByteArray mCurReserved;
TpProtoParserStatus mCurParserStatus;
};
#endif //__TP_PROTOCOL_H__