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
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QVNCCLIENT_H
#define QVNCCLIENT_H
#include <QObject>
#include "qvnc_p.h"
QT_BEGIN_NAMESPACE
class QTcpSocket;
class QVncServer;
class QVncClient : public QObject
{
Q_OBJECT
public:
enum ClientMsg {
SetPixelFormat = 0,
FixColourMapEntries = 1,
SetEncodings = 2,
FramebufferUpdateRequest = 3,
KeyEvent = 4,
PointerEvent = 5,
ClientCutText = 6
};
explicit QVncClient(QTcpSocket *clientSocket, QVncServer *server);
~QVncClient();
QTcpSocket *clientSocket() const;
QVncServer *server() const { return m_server; }
void setDirty(const QRegion ®ion);
void setDirtyCursor() { m_dirtyCursor = true; scheduleUpdate(); }
QRegion dirtyRegion() const { return m_dirtyRegion; }
inline bool isConnected() const { return m_state == Connected; }
inline int clientBytesPerPixel() const {
return m_pixelFormat.bitsPerPixel / 8;
}
void convertPixels(char *dst, const char *src, int count, int depth) const;
inline bool doPixelConversion() const { return m_needConversion; }
signals:
private slots:
void readClient();
void discardClient();
void checkUpdate();
void scheduleUpdate();
protected:
bool event(QEvent *event) override;
private:
enum ClientState {
Disconnected,
Protocol,
Authentication,
Init,
Connected
};
enum ProtocolVersion {
V3_3,
V3_7,
V3_8
};
void setPixelFormat();
void setEncodings();
void frameBufferUpdateRequest();
void pointerEvent();
void keyEvent();
void clientCutText();
bool pixelConversionNeeded() const;
QVncServer *m_server;
QTcpSocket *m_clientSocket;
QRfbEncoder *m_encoder;
// Client State
ClientState m_state;
quint8 m_msgType;
bool m_handleMsg;
QRfbPixelFormat m_pixelFormat;
bool m_sameEndian;
bool m_needConversion;
int m_encodingsPending;
int m_cutTextPending;
uint m_supportCopyRect : 1;
uint m_supportRRE : 1;
uint m_supportCoRRE : 1;
uint m_supportHextile : 1;
uint m_supportZRLE : 1;
uint m_supportCursor : 1;
uint m_supportDesktopSize : 1;
bool m_wantUpdate;
Qt::KeyboardModifiers m_keymod;
bool m_dirtyCursor;
bool m_updatePending;
#if Q_BYTE_ORDER == Q_BIG_ENDIAN
bool m_swapBytes;
#endif
QRegion m_dirtyRegion;
ProtocolVersion m_protocolVersion;
};
QT_END_NAMESPACE
#endif // QVNCCLIENT_H
|