#ifndef REMOTING_HOST_DAEMON_PROCESS_H_
#define REMOTING_HOST_DAEMON_PROCESS_H_
#include <stdint.h>
#include <list>
#include <memory>
#include <string>
#include "base/compiler_specific.h"
#include "base/memory/scoped_refptr.h"
#include "base/process/process.h"
#include "base/time/time.h"
#include "ipc/ipc_message.h"
#include "mojo/public/cpp/bindings/associated_receiver.h"
#include "mojo/public/cpp/bindings/scoped_interface_endpoint_handle.h"
#include "mojo/public/cpp/system/message_pipe.h"
#include "remoting/host/config_watcher.h"
#include "remoting/host/host_status_monitor.h"
#include "remoting/host/host_status_observer.h"
#include "remoting/host/mojom/desktop_session.mojom.h"
#include "remoting/host/worker_process_ipc_delegate.h"
namespace base {
class Location;
}
namespace remoting {
class AutoThreadTaskRunner;
class DesktopSession;
class HostEventLogger;
class ScreenResolution;
class DaemonProcess : public ConfigWatcher::Delegate,
public WorkerProcessIpcDelegate,
public HostStatusObserver,
public mojom::DesktopSessionManager {
public:
typedef std::list<DesktopSession*> DesktopSessionList;
DaemonProcess(const DaemonProcess&) = delete;
DaemonProcess& operator=(const DaemonProcess&) = delete;
~DaemonProcess() override;
static std::unique_ptr<DaemonProcess> Create(
scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
scoped_refptr<AutoThreadTaskRunner> io_task_runner,
const base::OnceClosure stopped_callback);
void OnConfigUpdated(const std::string& serialized_config) override;
void OnConfigWatcherError() override;
scoped_refptr<HostStatusMonitor> status_monitor() { return status_monitor_; }
void OnChannelConnected(int32_t peer_pid) override;
void OnPermanentError(int exit_code) override;
void OnWorkerProcessStopped() override;
void OnAssociatedInterfaceRequest(
const std::string& interface_name,
mojo::ScopedInterfaceEndpointHandle handle) override;
void CreateDesktopSession(int terminal_id,
const ScreenResolution& resolution,
bool virtual_terminal) override;
void CloseDesktopSession(int terminal_id) override;
void SetScreenResolution(int terminal_id,
const ScreenResolution& resolution) override;
virtual bool OnDesktopSessionAgentAttached(
int terminal_id,
int session_id,
mojo::ScopedMessagePipeHandle desktop_pipe) = 0;
void CrashNetworkProcess(const base::Location& location);
protected:
DaemonProcess(scoped_refptr<AutoThreadTaskRunner> caller_task_runner,
scoped_refptr<AutoThreadTaskRunner> io_task_runner,
base::OnceClosure stopped_callback);
void Initialize();
void Stop();
bool WasTerminalIdAllocated(int terminal_id);
void OnClientAccessDenied(const std::string& signaling_id) override;
void OnClientAuthenticated(const std::string& signaling_id) override;
void OnClientConnected(const std::string& signaling_id) override;
void OnClientDisconnected(const std::string& signaling_id) override;
void OnClientRouteChange(const std::string& signaling_id,
const std::string& channel_name,
const protocol::TransportRoute& route) override;
void OnHostStarted(const std::string& owner_email) override;
void OnHostShutdown() override;
virtual std::unique_ptr<DesktopSession> DoCreateDesktopSession(
int terminal_id,
const ScreenResolution& resolution,
bool virtual_terminal) = 0;
virtual void DoCrashNetworkProcess(const base::Location& location) = 0;
virtual void LaunchNetworkProcess() = 0;
virtual void SendHostConfigToNetworkProcess(
const std::string& serialized_config) = 0;
virtual void SendTerminalDisconnected(int terminal_id) = 0;
scoped_refptr<AutoThreadTaskRunner> caller_task_runner() {
return caller_task_runner_;
}
scoped_refptr<AutoThreadTaskRunner> io_task_runner() {
return io_task_runner_;
}
friend class DaemonProcessTest;
const DesktopSessionList& desktop_sessions() const {
return desktop_sessions_;
}
private:
void DeleteAllDesktopSessions();
base::FilePath GetConfigPath();
scoped_refptr<AutoThreadTaskRunner> caller_task_runner_;
scoped_refptr<AutoThreadTaskRunner> io_task_runner_;
std::unique_ptr<ConfigWatcher> config_watcher_;
std::string serialized_config_;
DesktopSessionList desktop_sessions_;
int next_terminal_id_;
base::OnceClosure stopped_callback_;
std::unique_ptr<HostEventLogger> host_event_logger_;
mojo::AssociatedReceiver<mojom::DesktopSessionManager>
desktop_session_manager_{this};
mojo::AssociatedReceiver<mojom::HostStatusObserver> host_status_observer_{
this};
scoped_refptr<HostStatusMonitor> status_monitor_;
};
}
#endif