mirror of
https://github.com/kunkundi/crossdesk.git
synced 2026-10-27 16:13:13 +08:00
69 lines
2.2 KiB
C++
69 lines
2.2 KiB
C++
/* Copyright (c) 2026 by DI JUNKUN, All Rights Reserved. */
|
|
#ifndef _PRIVACY_CONTROLLER_H_
|
|
#define _PRIVACY_CONTROLLER_H_
|
|
|
|
#include <remote_action.h>
|
|
#include <atomic>
|
|
#include <condition_variable>
|
|
#include <functional>
|
|
#include <mutex>
|
|
#include <thread>
|
|
#include "privacy_backend.h"
|
|
|
|
namespace crossdesk {
|
|
|
|
// Privacy is optional: it must never gate desktop video, audio or remote input.
|
|
// A failed backend is recovered automatically while the session keeps running.
|
|
class PrivacyController {
|
|
public:
|
|
using Factory = std::function<std::unique_ptr<PrivacyBackend>()>;
|
|
explicit PrivacyController(Factory factory = {});
|
|
~PrivacyController();
|
|
PrivacyController(const PrivacyController&) = delete;
|
|
PrivacyController& operator=(const PrivacyController&) = delete;
|
|
PrivacyStatus Snapshot() const;
|
|
void SetText(const PrivacyScreenText& text);
|
|
void Enable(bool block_input, bool wait_for_recovery = false);
|
|
void RejectCommand(const std::string& reason);
|
|
void EnableOnConnection();
|
|
// Preserve automatic session intent while Windows shows another desktop.
|
|
void SuspendForDesktop();
|
|
void ResumeAfterDesktopRecovery();
|
|
void CancelAutomaticResume();
|
|
void Disable();
|
|
void Disconnected();
|
|
void Shutdown();
|
|
void Fail(const std::string& reason);
|
|
bool Engaged() const { return engaged_.load(); }
|
|
void CaptureChanged(bool running);
|
|
|
|
private:
|
|
void Run(Factory factory);
|
|
void WakeLocked();
|
|
void SetState(PrivacyState state, const std::string& reason);
|
|
void FailLocked(const std::string& reason);
|
|
void EnableOnConnectionLocked();
|
|
void DisableLocked();
|
|
static uint64_t Now();
|
|
mutable std::mutex mutex_;
|
|
std::condition_variable wake_;
|
|
std::thread thread_;
|
|
std::unique_ptr<PrivacyBackend> backend_;
|
|
PrivacyStatus status_{};
|
|
PrivacyScreenText text_;
|
|
bool text_pending_ = false;
|
|
std::atomic<bool> engaged_{false};
|
|
bool quit_ = false;
|
|
bool enable_pending_ = false;
|
|
bool disable_pending_ = false;
|
|
bool block_requested_ = false;
|
|
bool automatic_enable_ = false;
|
|
bool resume_after_unlock_ = false;
|
|
bool capture_running_ = false;
|
|
std::string failure_;
|
|
uint64_t started_ = 0;
|
|
uint64_t last_capability_check_ = 0;
|
|
};
|
|
} // namespace crossdesk
|
|
#endif
|