Deskflow 1.24.0.365
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
ArchDaemonWindows.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
4 * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
5 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
6 */
7
8#pragma once
9
10#include "arch/IArchDaemon.h"
12
13#define WIN32_LEAN_AND_MEAN
14#include <Windows.h>
15#include <tchar.h>
16
17#include <functional>
18
19#include <QString>
20
21#define ARCH_DAEMON ArchDaemonWindows
22
25{
26public:
27 using RunFunc = std::function<int()>;
28
30 ~ArchDaemonWindows() override = default;
31
33
45 static int runDaemon(RunFunc runFunc);
46
48
53 static void daemonRunning(bool running);
54
56
60 static void daemonFailed(int result);
61
63
68 static UINT getDaemonQuitMessage();
69
70 // IArchDaemon overrides
71 int daemonize(DaemonFunc const &func) override;
72 QString commandLine() const override
73 {
74 return m_commandLine;
75 }
76
77private:
78 static HKEY openNTServicesKey();
79
80 int doRunDaemon(RunFunc runFunc);
81 void doDaemonRunning(bool running);
82 UINT doGetDaemonQuitMessage();
83
84 static void setStatus(DWORD state);
85 static void setStatus(DWORD state, DWORD step, DWORD waitHint);
86 static void setStatusError(DWORD error);
87
88 static bool isRunState(DWORD state);
89
90 void serviceMain(DWORD, LPTSTR *);
91 static void WINAPI serviceMainEntry(DWORD, LPTSTR *);
92
93 void serviceHandler(DWORD ctrl);
94 static void WINAPI serviceHandlerEntry(DWORD ctrl);
95
96 void start(const QString &name);
97 void stop(const QString &name);
98
99private:
100 class ArchDaemonRunException
101 {
102 public:
103 ArchDaemonRunException(int result) : m_result(result)
104 {
105 }
106
107 public:
108 int m_result;
109 };
110
111private:
112 static ArchDaemonWindows *s_daemon;
113
114 ArchMutex m_serviceMutex;
115 ArchCond m_serviceCondVar;
116 DWORD m_serviceState;
117 bool m_serviceHandlerWaiting;
118 bool m_serviceRunning;
119
120 DWORD m_daemonThreadID;
121 DaemonFunc m_daemonFunc;
122 int m_daemonResult;
123
124 SERVICE_STATUS_HANDLE m_statusHandle;
125
126 UINT m_quitMessage;
127
128 QString m_commandLine;
129};
static const struct sockaddr FAR * name
Definition ArchNetworkWinsock.cpp:28
static const WSAEVENT FAR DWORD
Definition ArchNetworkWinsock.cpp:55
static int(PASCAL FAR *bind_winsock)(SOCKET s
ArchMutexImpl * ArchMutex
Opaque mutex type. An opaque type representing a mutex.
Definition IArchMultithread.h:40
ArchCondImpl * ArchCond
Opaque condition variable type. An opaque type representing a condition variable.
Definition IArchMultithread.h:26
~ArchDaemonWindows() override=default
static UINT getDaemonQuitMessage()
Get daemon quit message.
Definition ArchDaemonWindows.cpp:41
static void daemonRunning(bool running)
Indicate daemon is in main loop.
Definition ArchDaemonWindows.cpp:34
int daemonize(DaemonFunc const &func) override
Daemonize the process.
Definition ArchDaemonWindows.cpp:56
std::function< int()> RunFunc
Definition ArchDaemonWindows.h:27
static void daemonFailed(int result)
Indicate failure of running daemon.
Definition ArchDaemonWindows.cpp:50
QString commandLine() const override
Get the command line.
Definition ArchDaemonWindows.h:72
static int runDaemon(RunFunc runFunc)
Run the daemon.
Definition ArchDaemonWindows.cpp:28
ArchDaemonWindows()
Definition ArchDaemonWindows.cpp:23
Interface for architecture dependent daemonizing.
Definition IArchDaemon.h:21
std::function< int()> DaemonFunc
Definition IArchDaemon.h:23