#ifndef PLATFORM_IMPL_LINUX_DEVICE_INFO_H_ #define PLATFORM_IMPL_LINUX_DEVICE_INFO_H_ #include #include #include #include #include #include #include "absl/container/flat_hash_map.h" #include "absl/strings/string_view.h" #include "absl/synchronization/mutex.h" #include "internal/platform/implementation/device_info.h" #include "internal/platform/implementation/linux/hostname_client_glue.h" #include "internal/platform/implementation/linux/login_manager_client_glue.h" #include "internal/platform/implementation/linux/login_session_client_glue.h" namespace nearby { namespace linux { class CurrentUserSession : public sdbus::ProxyInterfaces { public: CurrentUserSession(sdbus::IConnection &system_bus) : ProxyInterfaces(system_bus, "org.freedesktop.login1", "/org/freedesktop/login1/session/auto") { registerProxy(); } ~CurrentUserSession() { unregisterProxy(); } void RegisterScreenLockedListener( absl::string_view listener_name, std::function callback) ABSL_LOCKS_EXCLUDED(screen_lock_listeners_mutex_); void UnregisterScreenLockedListener(absl::string_view listener_name) ABSL_LOCKS_EXCLUDED(screen_lock_listeners_mutex_); protected: void onPauseDevice(const uint32_t &major, const uint32_t &minor, const std::string &type) override {} void onResumeDevice(const uint32_t &major, const uint32_t &minor, const sdbus::UnixFd &fd) override {} void onLock() override ABSL_LOCKS_EXCLUDED(screen_lock_listeners_mutex_); void onUnlock() override ABSL_LOCKS_EXCLUDED(screen_lock_listeners_mutex_); private: absl::Mutex screen_lock_listeners_mutex_; absl::flat_hash_map> screen_lock_listeners_ ABSL_GUARDED_BY(screen_lock_listeners_mutex_); }; class Hostnamed : public sdbus::ProxyInterfaces { public: Hostnamed(sdbus::IConnection &system_bus) : ProxyInterfaces(system_bus, "org.freedesktop.hostname1", "/org/freedesktop/hostname1") { registerProxy(); } ~Hostnamed() { unregisterProxy(); } }; class LoginManager : public sdbus::ProxyInterfaces { public: LoginManager(sdbus::IConnection &system_bus) : ProxyInterfaces("org.freedesktop.login1", "/org/freedesktop/hostname1") { registerProxy(); } ~LoginManager() { unregisterProxy(); } protected: void onSessionNew(const std::string &session_id, const sdbus::ObjectPath &object_path) override {} void onSessionRemoved(const std::string &session_id, const sdbus::ObjectPath &object_path) override {} void onUserNew(const uint32_t &uid, const sdbus::ObjectPath &object_path) override {} void onUserRemoved(const uint32_t &uid, const sdbus::ObjectPath &object_path) override {} void onSeatNew(const std::string &seat_id, const sdbus::ObjectPath &object_path) override {} void onSeatRemoved(const std::string &seat_id, const sdbus::ObjectPath &object_path) override {} void onPrepareForShutdown(const bool &start) override {} void onPrepareForSleep(const bool &start) override {} }; class DeviceInfo : public api::DeviceInfo { public: DeviceInfo(sdbus::IConnection &system_bus); ~DeviceInfo() override = default; std::optional GetOsDeviceName() const override; api::DeviceInfo::DeviceType GetDeviceType() const override; api::DeviceInfo::OsType GetOsType() const override { return api::DeviceInfo::OsType::kWindows; // Or ChromeOS? } std::optional GetFullName() const override; std::optional GetGivenName() const override { return GetFullName(); } std::optional GetLastName() const override { return GetFullName(); } std::optional GetProfileUserName() const override; std::optional GetDownloadPath() const override; std::optional GetLocalAppDataPath() const override; std::optional GetCommonAppDataPath() const override { return std::nullopt; }; std::optional GetTemporaryPath() const override; std::optional GetLogPath() const override; std::optional GetCrashDumpPath() const override; bool IsScreenLocked() const override; void RegisterScreenLockedListener( absl::string_view listener_name, std::function callback) override { current_user_session_->RegisterScreenLockedListener(listener_name, std::move(callback)); } void UnregisterScreenLockedListener(absl::string_view listener_name) override { current_user_session_->UnregisterScreenLockedListener(listener_name); } bool PreventSleep() override; bool AllowSleep() override; private: sdbus::IConnection &system_bus_; std::unique_ptr current_user_session_; std::unique_ptr login_manager_; std::optional inhibit_fd_; }; } // namespace linux } // namespace nearby #endif // PLATFORM_IMPL_LINUX_DEVICE_INFO_H_