Deskflow 1.22.0.197
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) 2024 - 2025 Symless Ltd.
4 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
5 */
6
7#pragma once
8
9#include "common/Settings.h"
10#include "gui/FileTail.h"
13
14#include <memory>
15
16#include <QFileSystemWatcher>
17#include <QMutex>
18#include <QObject>
19#include <QString>
20#include <QStringList>
21#include <QTimer>
22
23namespace deskflow::gui {
24
25namespace ipc {
26class DaemonIpcClient;
27}
28
29class CoreProcess : public QObject
30{
31 using ProcessMode = Settings::ProcessMode;
32 using IServerConfig = deskflow::gui::IServerConfig;
33 using QProcessProxy = deskflow::gui::proxy::QProcessProxy;
34
35 Q_OBJECT
36
37public:
38 struct Deps
39 {
40 virtual ~Deps() = default;
41 virtual QProcessProxy &process()
42 {
43 return m_process;
44 }
45 virtual QString appPath(const QString &name) const;
46 virtual bool fileExists(const QString &path) const;
47
48 private:
49 QProcessProxy m_process;
50 };
51
52 enum class Error
53 {
56 };
72
73 explicit CoreProcess(const IServerConfig &serverConfig, std::shared_ptr<Deps> deps = std::make_shared<Deps>());
74
75 void extracted(QString &app, QStringList &args);
76 void start(std::optional<ProcessMode> processMode = std::nullopt);
77 void stop(std::optional<ProcessMode> processMode = std::nullopt);
78 void restart();
79 void cleanup();
80 void applyLogLevel();
81 void clearSettings();
82 void retryDaemon();
83
84 // getters
86 {
87 return m_mode;
88 }
89 QString secureSocketVersion() const
90 {
91 return m_secureSocketVersion;
92 }
93 bool isStarted() const
94 {
95 return m_processState == ProcessState::Started;
96 }
98 {
99 return m_processState;
100 }
102 {
103 return m_connectionState;
104 }
105
106 // setters
107 void setAddress(const QString &address)
108 {
109 m_address = address.trimmed();
110 }
112 {
113 m_mode = mode;
114 }
115
116Q_SIGNALS:
117 void starting();
119 void logLine(const QString &line);
122 void secureSocket(bool enabled);
124
125private Q_SLOTS:
126 void onProcessFinished(int exitCode, QProcess::ExitStatus);
127 void onProcessReadyReadStandardOutput();
128 void onProcessReadyReadStandardError();
129 void daemonIpcClientConnected();
130
131private:
132 void startForegroundProcess(const QString &app, const QStringList &args);
133 void startProcessFromDaemon(const QString &app, const QStringList &args);
134 void stopForegroundProcess() const;
135 void stopProcessFromDaemon();
136 bool addGenericArgs(QStringList &args, const ProcessMode processMode) const;
137 bool addServerArgs(QStringList &args, QString &app);
138 bool addClientArgs(QStringList &args, QString &app);
139 QString persistServerConfig() const;
140 QString modeString() const;
141 QString processModeString() const;
142 void setConnectionState(ConnectionState state);
143 void setProcessState(ProcessState state);
144 void checkLogLine(const QString &line);
145 bool checkSecureSocket(const QString &line);
146 void handleLogLines(const QString &text);
147 QString correctedInterface() const;
148 QString correctedAddress() const;
149 QString requestDaemonLogPath();
150 void persistLogDir() const;
151
152#ifdef Q_OS_MAC
153 void checkOSXNotification(const QString &line);
154#endif
155
156 const IServerConfig &m_serverConfig;
157 std::shared_ptr<Deps> m_pDeps;
158 QString m_address;
159 ProcessState m_processState = ProcessState::Stopped;
162 QMutex m_processMutex;
163 QString m_secureSocketVersion = "";
164 std::optional<ProcessMode> m_lastProcessMode = std::nullopt;
165 QTimer m_retryTimer;
166 int m_connections = 0;
167 deskflow::gui::ipc::DaemonIpcClient *m_daemonIpcClient = nullptr;
168 FileTail *m_daemonFileTail = nullptr;
169};
170
171} // namespace deskflow::gui
static const struct sockaddr FAR * name
Definition ArchNetworkWinsock.cpp:27
CoreMode
Definition Settings.h:106
@ None
Definition Settings.h:107
ProcessMode
Definition Settings.h:99
void restart()
Definition CoreProcess.cpp:418
void processStateChanged(ProcessState state)
void stop(std::optional< ProcessMode > processMode=std::nullopt)
Definition CoreProcess.cpp:390
void secureSocket(bool enabled)
void extracted(QString &app, QStringList &args)
void retryDaemon()
Definition CoreProcess.cpp:716
void clearSettings()
Definition CoreProcess.cpp:700
void connectionStateChanged(ConnectionState state)
ProcessState processState() const
Definition CoreProcess.h:97
Settings::CoreMode mode() const
Definition CoreProcess.h:85
bool isStarted() const
Definition CoreProcess.h:93
void error(Error error)
QString secureSocketVersion() const
Definition CoreProcess.h:89
void start(std::optional< ProcessMode > processMode=std::nullopt)
Definition CoreProcess.cpp:331
CoreProcess(const IServerConfig &serverConfig, std::shared_ptr< Deps > deps=std::make_shared< Deps >())
Definition CoreProcess.cpp:137
void applyLogLevel()
Definition CoreProcess.cpp:224
ConnectionState
Definition CoreProcess.h:66
@ Connected
Definition CoreProcess.h:69
@ Listening
Definition CoreProcess.h:70
@ Connecting
Definition CoreProcess.h:68
@ Disconnected
Definition CoreProcess.h:67
void cleanup()
Definition CoreProcess.cpp:444
ProcessState
Definition CoreProcess.h:58
@ Stopping
Definition CoreProcess.h:61
@ Started
Definition CoreProcess.h:60
@ RetryPending
Definition CoreProcess.h:63
@ Stopped
Definition CoreProcess.h:62
@ Starting
Definition CoreProcess.h:59
void setMode(Settings::CoreMode mode)
Definition CoreProcess.h:111
ConnectionState connectionState() const
Definition CoreProcess.h:101
Error
Definition CoreProcess.h:53
@ StartFailed
Definition CoreProcess.h:55
@ AddressMissing
Definition CoreProcess.h:54
void logLine(const QString &line)
void setAddress(const QString &address)
Definition CoreProcess.h:107
Definition FileTail.h:17
Definition IServerConfig.h:17
Definition DaemonIpcClient.h:16
Definition QProcessProxy.h:15
Definition CoreProcess.h:25
Definition IServerConfig.h:14
Definition CoreProcess.h:39
virtual QProcessProxy & process()
Definition CoreProcess.h:41
virtual QString appPath(const QString &name) const
Definition CoreProcess.cpp:122
virtual bool fileExists(const QString &path) const
Definition CoreProcess.cpp:128