Deskflow 1.26.0.314
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
Client.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2025 - 2026 Deskflow Developers
4 * SPDX-FileCopyrightText: (C) 2012 - 2016, 2026 Synergy App Ltd
5 * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
6 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
7 */
8
9#pragma once
10
11#include "deskflow/IClient.h"
12
13#include "base/Event.h"
14#include "base/EventTypes.h"
15#include "common/Enums.h"
16#include "deskflow/IClipboard.h"
17#include "net/NetworkAddress.h"
18
19#include <climits>
20#include <string>
21
22class Event;
23class EventQueueTimer;
24namespace deskflow {
25class Screen;
26}
27class ServerProxy;
28class IDataSocket;
29class ISocketFactory;
30namespace deskflow {
31class IStream;
32}
33class IEventQueue;
34class Thread;
35class TCPSocket;
36
38
41class Client : public IClient
42{
43public:
45 {
46 public:
47 enum class Kind
48 {
51 };
52
53 DisconnectRequest(Kind kind, const char *message);
55
56 Kind kind() const
57 {
58 return m_kind;
59 }
60
62 {
63 return m_refusalReason;
64 }
65
66 const char *message() const
67 {
68 return m_message.empty() ? nullptr : m_message.c_str();
69 }
70
71 private:
72 Kind m_kind = Kind::Disconnect;
74 std::string m_message;
75 };
76
78 {
79 public:
80 explicit FailInfo(const char *what) : m_what(what)
81 {
82 // do nothing
83 }
84 bool m_retry = false;
85 QString m_what;
86 };
87
88public:
94 Client(
95 IEventQueue *events, const std::string &name, const NetworkAddress &address, ISocketFactory *socketFactory,
96 deskflow::Screen *screen
97 );
98 Client(Client const &) = delete;
99 Client(Client &&) = delete;
100 ~Client() override;
101
102 Client &operator=(Client const &) = delete;
103 Client &operator=(Client &&) = delete;
104
106
107
109
113 void connect(size_t addressIndex = 0);
114 void setServerAddress(const NetworkAddress &address);
115
117
120 void disconnect(const char *msg);
121
123
127 void refuseConnection(deskflow::core::ConnectionRefusal reason, const char *msg);
128
130
133 virtual void handshakeComplete();
134
136
138
140
143 bool isConnected() const;
144
146
150 bool isConnecting() const;
151
153
158
161 {
162 return m_resolvedAddressesCount;
163 }
165
167
168 // IScreen overrides
169 void *getEventTarget() const final;
170 bool getClipboard(ClipboardID id, IClipboard *) const override;
171 void getShape(int32_t &x, int32_t &y, int32_t &width, int32_t &height) const override;
172 void getCursorPos(int32_t &x, int32_t &y) const override;
173
174 // IClient overrides
175 void enter(int32_t xAbs, int32_t yAbs, uint32_t seqNum, KeyModifierMask mask, bool forScreensaver) override;
176 bool leave() override;
177 void setClipboard(ClipboardID, const IClipboard *) override;
178 void grabClipboard(ClipboardID) override;
179 void setClipboardDirty(ClipboardID, bool) override;
180 void keyDown(KeyID, KeyModifierMask, KeyButton, const std::string &) override;
181 void keyRepeat(KeyID, KeyModifierMask, int32_t count, KeyButton, const std::string &lang) override;
182 void keyUp(KeyID, KeyModifierMask, KeyButton) override;
183 void mouseDown(ButtonID) override;
184 void mouseUp(ButtonID) override;
185 void mouseMove(int32_t xAbs, int32_t yAbs) override;
186 void mouseRelativeMove(int32_t xRel, int32_t yRel) override;
187 void mouseWheel(int32_t xDelta, int32_t yDelta) override;
188 void screensaver(bool activate) override;
189 void resetOptions() override;
190 void setOptions(const OptionsList &options) override;
191 std::string getName() const override;
192
193private:
194 void saveRelativeRestorePosition();
195 void sendClipboard(ClipboardID);
196 void sendEvent(deskflow::EventTypes);
197 void sendConnectionFailedEvent(const char *msg);
198 void setupConnecting();
199 void setupConnection();
200 void setupScreen();
201 void setupTimer();
202 void cleanup();
203 void cleanupConnecting();
204 void cleanupConnection();
205 void cleanupScreen();
206 void cleanupTimer();
207 void cleanupStream();
208 void handleConnected();
209 void handleConnectionFailed(const Event &event);
210 void handleConnectTimeout();
211 void handleOutputError();
212 void handleDisconnected();
213 void handleDisconnectRequested(const Event &event);
214 void handleShapeChanged();
215 void handleClipboardGrabbed(const Event &event);
216 void handleHello();
217 void handleSuspend();
218 void handleResume();
219 void sendClipboardThread(void *);
220 void bindNetworkInterface(IDataSocket *socket) const;
221
222private:
223 std::string m_name;
224 NetworkAddress m_serverAddress;
225 ISocketFactory *m_socketFactory = nullptr;
226 deskflow::Screen *m_screen = nullptr;
227 deskflow::IStream *m_stream = nullptr;
228 EventQueueTimer *m_timer = nullptr;
229 ServerProxy *m_server = nullptr;
230 bool m_ready = false;
231 bool m_active = false;
232 bool m_suspended = false;
233 bool m_connectOnResume = false;
234 bool m_ownClipboard[kClipboardEnd];
235 bool m_sentClipboard[kClipboardEnd];
236 IClipboard::Time m_timeClipboard[kClipboardEnd];
237 std::string m_dataClipboard[kClipboardEnd];
238 IEventQueue *m_events = nullptr;
239 bool m_useSecureNetwork = false;
240 bool m_enableClipboard = true;
241 bool m_relativeMouseMoves = false;
242 bool m_hasRelativeRestorePosition = false;
243 int32_t m_relativeRestoreX = 0;
244 int32_t m_relativeRestoreY = 0;
245 size_t m_maximumClipboardReceiveSize = 0;
246 size_t m_maximumClipboardSize = INT_MAX;
247 size_t m_resolvedAddressesCount = 0;
248};
static const struct sockaddr FAR * name
Definition ArchNetworkWinsock.cpp:28
static const ClipboardID kClipboardEnd
Definition ClipboardTypes.h:30
uint8_t ClipboardID
Clipboard ID.
Definition ClipboardTypes.h:16
uint32_t KeyID
Key ID.
Definition KeyTypes.h:21
uint16_t KeyButton
Key Code.
Definition KeyTypes.h:34
uint32_t KeyModifierMask
Modifier key mask.
Definition KeyTypes.h:44
uint8_t ButtonID
Mouse button ID.
Definition MouseTypes.h:16
std::vector< uint32_t > OptionsList
Definition OptionTypes.h:26
int y
Definition ServerConfig.cpp:24
int x
Definition ServerConfig.cpp:23
DisconnectRequest(Kind kind, const char *message)
Definition Client.cpp:40
deskflow::core::ConnectionRefusal refusalReason() const
Definition Client.h:61
Kind
Definition Client.h:48
@ Disconnect
Definition Client.h:49
@ Refuse
Definition Client.h:50
const char * message() const
Definition Client.h:66
Kind kind() const
Definition Client.h:56
bool m_retry
Definition Client.h:84
QString m_what
Definition Client.h:85
FailInfo(const char *what)
Definition Client.h:80
void refuseConnection(deskflow::core::ConnectionRefusal reason, const char *msg)
Refuse connection.
Definition Client.cpp:155
void enter(int32_t xAbs, int32_t yAbs, uint32_t seqNum, KeyModifierMask mask, bool forScreensaver) override
Enter screen.
Definition Client.cpp:220
void resetOptions() override
Notify of options changes.
Definition Client.cpp:317
void grabClipboard(ClipboardID) override
Grab clipboard.
Definition Client.cpp:260
void keyUp(KeyID, KeyModifierMask, KeyButton) override
Notify of key release.
Definition Client.cpp:282
void mouseRelativeMove(int32_t xRel, int32_t yRel) override
Notify of mouse motion.
Definition Client.cpp:302
virtual void handshakeComplete()
Notify of handshake complete.
Definition Client.cpp:170
Client(Client &&)=delete
Client(IEventQueue *events, const std::string &name, const NetworkAddress &address, ISocketFactory *socketFactory, deskflow::Screen *screen)
Definition Client.cpp:53
std::string getName() const override
Get client name.
Definition Client.cpp:372
void keyRepeat(KeyID, KeyModifierMask, int32_t count, KeyButton, const std::string &lang) override
Notify of key repeat.
Definition Client.cpp:277
size_t getMaximumClipboardReceiveSizeBytes() const
Definition Client.cpp:195
void screensaver(bool activate) override
Notify of screen saver change.
Definition Client.cpp:312
void setOptions(const OptionsList &options) override
Notify of options changes.
Definition Client.cpp:324
void connect(size_t addressIndex=0)
Connect to server.
Definition Client.cpp:92
void disconnect(const char *msg)
Disconnect.
Definition Client.cpp:144
bool getClipboard(ClipboardID id, IClipboard *) const override
Get clipboard.
Definition Client.cpp:205
Client(Client const &)=delete
void mouseWheel(int32_t xDelta, int32_t yDelta) override
Notify of mouse wheel motion.
Definition Client.cpp:307
NetworkAddress getServerAddress() const
Get address of server.
Definition Client.cpp:190
void mouseMove(int32_t xAbs, int32_t yAbs) override
Notify of mouse motion.
Definition Client.cpp:297
void keyDown(KeyID, KeyModifierMask, KeyButton, const std::string &) override
Notify of key press.
Definition Client.cpp:272
void mouseUp(ButtonID) override
Notify of mouse release.
Definition Client.cpp:292
void setClipboardDirty(ClipboardID, bool) override
Mark clipboard dirty.
Definition Client.cpp:267
void mouseDown(ButtonID) override
Notify of mouse press.
Definition Client.cpp:287
bool isConnecting() const
Test if connecting.
Definition Client.cpp:185
bool isConnected() const
Test if connected.
Definition Client.cpp:180
void setClipboard(ClipboardID, const IClipboard *) override
Set clipboard.
Definition Client.cpp:253
void getShape(int32_t &x, int32_t &y, int32_t &width, int32_t &height) const override
Get screen shape.
Definition Client.cpp:210
void * getEventTarget() const final
Get event target.
Definition Client.cpp:200
size_t getLastResolvedAddressesCount() const
Return last resolved adresses count.
Definition Client.h:160
Client & operator=(Client &&)=delete
bool leave() override
Leave screen.
Definition Client.cpp:232
void getCursorPos(int32_t &x, int32_t &y) const override
Get cursor position.
Definition Client.cpp:215
~Client() override
Definition Client.cpp:75
Client & operator=(Client const &)=delete
void setServerAddress(const NetworkAddress &address)
Definition Client.cpp:87
EventData()=default
Definition EventQueueTimer.h:12
Event.
Definition Event.h:43
Client interface.
Definition IClient.h:24
Clipboard interface.
Definition IClipboard.h:19
Data stream socket interface.
Definition IDataSocket.h:21
Event queue interface.
Definition IEventQueue.h:29
Socket factory.
Definition ISocketFactory.h:23
Network address type.
Definition NetworkAddress.h:17
Definition Screen.h:26
Proxy for server.
Definition ServerProxy.h:32
TCP data socket.
Definition TCPSocket.h:28
Thread handle.
Definition Thread.h:33
Bidirectional stream interface.
Definition IStream.h:22
Platform independent screen.
Definition Screen.h:30
ConnectionRefusal
Definition Enums.h:48
@ ProtocolError
Definition Enums.h:52
Definition DaemonApp.h:18
EventTypes
Definition EventTypes.h:13
Definition Config.h:29