Deskflow 1.26.0.134
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
CoreProcess.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2025 Chris Rizzitello <sithlord48@gmail.com>
4 * SPDX-FileCopyrightText: (C) 2024 - 2025 Symless Ltd.
5 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
6 */
7
8#pragma once
9
10#include "common/Enums.h"
11#include "common/Settings.h"
12#include "gui/FileTail.h"
14
15#include <QMutex>
16#include <QObject>
17#include <QProcess>
18#include <QTimer>
19
20namespace deskflow::gui {
21
22namespace ipc {
23class CoreIpcClient;
24class DaemonIpcClient;
25} // namespace ipc
26
27class CoreProcess : public QObject
28{
29 using ConnectionState = deskflow::core::ConnectionState;
30 using ProcessMode = Settings::ProcessMode;
31 using ProcessState = deskflow::core::ProcessState;
32 Q_OBJECT
33
34public:
35 enum class Error
36 {
39 };
40
41 explicit CoreProcess(const ServerConfig &serverConfig);
42
43 void start(std::optional<ProcessMode> processMode = std::nullopt);
44 void stop(std::optional<ProcessMode> processMode = std::nullopt);
45 void restart();
46 void cleanup();
47 void applyLogLevel();
48 void clearSettings();
49 void retryDaemon();
50
51 // getters
53 {
54 return m_mode;
55 }
56 QString secureSocketVersion() const
57 {
58 return m_secureSocketVersion;
59 }
60 bool isStarted() const
61 {
62 return m_processState == ProcessState::Started;
63 }
64 ProcessState processState() const
65 {
66 return m_processState;
67 }
68 ConnectionState connectionState() const
69 {
70 return m_connectionState;
71 }
72
73 // setters
74 void setAddress(const QString &address)
75 {
76 m_address = correctedAddress(address);
77 }
79 {
80 m_mode = mode;
81 }
82
83Q_SIGNALS:
85 void logLine(const QString &line);
88 void secureSocket(bool enabled);
90 void connectedClientsChanged(const QStringList &clients);
91 void securityLevelChanged(QString securityLevel);
92 void unrecognisedClient(const QString &clientName);
94 void retryIn(int seconds);
95 void peerFingerprint(const QString &fingerprint);
96 void missingKeyboardLayouts(const QString &layouts);
97
98private Q_SLOTS:
99 void onProcessFinished(int exitCode, QProcess::ExitStatus);
100 void onProcessReadyReadStandardOutput();
101 void onProcessReadyReadStandardError();
102 void onCoreIpcMessageReceived(const QString &command, const QString &args);
103 void daemonIpcClientConnected();
104
105private:
106 void startForegroundProcess(const QStringList &args);
107 void startProcessFromDaemon(const QStringList &args);
108 void stopForegroundProcess() const;
109 void stopProcessFromDaemon();
110 QPair<bool, QString> persistServerConfig() const;
111 void setConnectionState(ConnectionState state);
112 void setProcessState(ProcessState state);
113 bool checkSecureSocket(const QString &line);
114 void handleLogLines(const QString &text);
115 QString correctedAddress(const QString &address) const;
116 void setupDaemonLogTail(const QString &logPath);
117 static QString makeQuotedArgs(const QString &app, const QStringList &args);
118 static QString processModeToString(const Settings::ProcessMode mode);
119 static QString processStateToString(const CoreProcess::ProcessState state);
120 static QString wrapIpv6(const QString &address);
121
122 const ServerConfig &m_serverConfig;
123 QString m_address;
124 ProcessState m_processState = ProcessState::Stopped;
125 ConnectionState m_connectionState = ConnectionState::Disconnected;
127 QMutex m_processMutex;
128 QString m_secureSocketVersion;
129 std::optional<ProcessMode> m_lastProcessMode = std::nullopt;
130 QTimer m_retryTimer;
131 deskflow::gui::ipc::CoreIpcClient *m_coreIpcClient = nullptr;
132 deskflow::gui::ipc::DaemonIpcClient *m_daemonIpcClient = nullptr;
133 FileTail *m_daemonFileTail = nullptr;
134 QProcess *m_process = nullptr;
135 QString m_appPath;
136};
137
138} // namespace deskflow::gui
Definition ServerConfig.h:34
CoreMode
Definition Settings.h:125
@ None
Definition Settings.h:126
ProcessMode
Definition Settings.h:118
void restart()
Definition CoreProcess.cpp:456
void stop(std::optional< ProcessMode > processMode=std::nullopt)
Definition CoreProcess.cpp:422
void secureSocket(bool enabled)
void retryDaemon()
Definition CoreProcess.cpp:631
void connectionStateChanged(deskflow::core::ConnectionState state)
void clearSettings()
Definition CoreProcess.cpp:615
void connectedClientsChanged(const QStringList &clients)
void securityLevelChanged(QString securityLevel)
ProcessState processState() const
Definition CoreProcess.h:64
Settings::CoreMode mode() const
Definition CoreProcess.h:52
bool isStarted() const
Definition CoreProcess.h:60
QString secureSocketVersion() const
Definition CoreProcess.h:56
void start(std::optional< ProcessMode > processMode=std::nullopt)
Definition CoreProcess.cpp:319
CoreProcess(const ServerConfig &serverConfig)
Definition CoreProcess.cpp:102
void applyLogLevel()
Definition CoreProcess.cpp:177
void error(deskflow::gui::CoreProcess::Error error)
void cleanup()
Definition CoreProcess.cpp:478
void connectionRefused(deskflow::core::ConnectionRefusal reason)
void setMode(Settings::CoreMode mode)
Definition CoreProcess.h:78
void missingKeyboardLayouts(const QString &layouts)
ConnectionState connectionState() const
Definition CoreProcess.h:68
Error
Definition CoreProcess.h:36
@ StartFailed
Definition CoreProcess.h:38
@ AddressMissing
Definition CoreProcess.h:37
void processStateChanged(deskflow::core::ProcessState state)
void logLine(const QString &line)
void peerFingerprint(const QString &fingerprint)
void setAddress(const QString &address)
Definition CoreProcess.h:74
void retryIn(int seconds)
void unrecognisedClient(const QString &clientName)
Definition FileTail.h:18
Definition CoreIpcClient.h:16
Definition DaemonIpcClient.h:16
ConnectionState
Definition Enums.h:39
ProcessState
Definition Enums.h:29
ConnectionRefusal
Definition Enums.h:48
Definition CoreProcess.h:22
Definition ServerConfig.h:26