1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#ifndef BASELINEPROTOCOL_H
#define BASELINEPROTOCOL_H
#include <QDataStream>
#include <QTcpSocket>
#include <QImage>
#include <QVector>
#define QLS QLatin1String
#define QLC QLatin1Char
#define FileFormat "png"
struct PlatformInfo
{
PlatformInfo(bool useLocal = false);
QString hostName;
QString osName;
int osVersion;
QString qtVersion;
QString buildKey;
QString gitCommit;
};
QDataStream & operator<< (QDataStream &stream, const PlatformInfo &p);
QDataStream & operator>> (QDataStream& stream, PlatformInfo& p);
struct ImageItem
{
public:
ImageItem()
: status(Ok), renderFormat(QImage::Format_Invalid), engine(Raster), scriptChecksum(0)
{}
ImageItem(const ImageItem &other)
{ *this = other; }
~ImageItem()
{}
ImageItem &operator=(const ImageItem &other);
static quint64 computeChecksum(const QImage& image);
QString engineAsString() const;
QString formatAsString() const;
enum ItemStatus {
Ok = 0,
BaselineNotFound = 1,
IgnoreItem = 2
};
enum GraphicsEngine {
Raster = 0,
OpenGL = 1
};
QString scriptName;
ItemStatus status;
QImage::Format renderFormat;
GraphicsEngine engine;
QImage image;
QList<quint64> imageChecksums;
// tbd: add diffscore
quint16 scriptChecksum;
};
QDataStream & operator<< (QDataStream &stream, const ImageItem &ii);
QDataStream & operator>> (QDataStream& stream, ImageItem& ii);
Q_DECLARE_METATYPE(ImageItem);
typedef QVector<ImageItem> ImageItemList;
class BaselineProtocol
{
public:
BaselineProtocol() {}
~BaselineProtocol();
// ****************************************************
// Important constants here
// ****************************************************
enum Constant {
ProtocolVersion = 1,
ServerPort = 54129,
Timeout = 10000
};
enum Command {
UnknownError = 0,
// Queries
AcceptPlatformInfo = 1,
RequestBaselineChecksums = 2,
AcceptNewBaseline = 4,
AcceptMismatch = 5,
// Responses
Ack = 128,
};
// For client:
bool connect();
bool requestBaselineChecksums(ImageItemList *itemList);
bool submitNewBaseline(const ImageItem &item, QByteArray *serverMsg);
bool submitMismatch(const ImageItem &item, QByteArray *serverMsg);
// For server:
bool acceptConnection(PlatformInfo *pi);
QString errorMessage();
private:
bool sendItem(Command cmd, const ImageItem &item);
bool sendBlock(Command cmd, const QByteArray &block);
bool receiveBlock(Command *cmd, QByteArray *block);
QString errMsg;
QTcpSocket socket;
friend class BaselineThread;
friend class BaselineHandler;
};
#endif // BASELINEPROTOCOL_H
|