#ifndef REMOTING_HOST_CLIENT_SESSION_H_
#define REMOTING_HOST_CLIENT_SESSION_H_
#include <list>
#include "base/memory/ref_counted.h"
#include "base/sequenced_task_runner_helpers.h"
#include "base/time.h"
#include "base/timer.h"
#include "base/threading/non_thread_safe.h"
#include "remoting/host/mouse_clamping_filter.h"
#include "remoting/host/remote_input_filter.h"
#include "remoting/protocol/clipboard_echo_filter.h"
#include "remoting/protocol/clipboard_filter.h"
#include "remoting/protocol/clipboard_stub.h"
#include "remoting/protocol/connection_to_client.h"
#include "remoting/protocol/host_stub.h"
#include "remoting/protocol/input_event_tracker.h"
#include "remoting/protocol/input_filter.h"
#include "remoting/protocol/input_stub.h"
#include "third_party/skia/include/core/SkPoint.h"
#include "third_party/skia/include/core/SkSize.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace remoting {
class AudioEncoder;
class AudioScheduler;
struct ClientSessionTraits;
class DesktopEnvironment;
class ScreenRecorder;
class VideoEncoder;
class VideoFrameCapturer;
class ClientSession
: public base::RefCountedThreadSafe<ClientSession, ClientSessionTraits>,
public protocol::HostStub,
public protocol::ConnectionToClient::EventHandler,
public base::NonThreadSafe {
public:
class EventHandler {
public:
virtual void OnSessionAuthenticated(ClientSession* client) = 0;
virtual void OnSessionChannelsConnected(ClientSession* client) = 0;
virtual void OnSessionAuthenticationFailed(ClientSession* client) = 0;
virtual void OnSessionClosed(ClientSession* client) = 0;
virtual void OnSessionSequenceNumber(ClientSession* client,
int64 sequence_number) = 0;
virtual void OnSessionRouteChange(
ClientSession* client,
const std::string& channel_name,
const protocol::TransportRoute& route) = 0;
virtual void OnClientDimensionsChanged(ClientSession* client,
const SkISize& size) = 0;
protected:
virtual ~EventHandler() {}
};
ClientSession(EventHandler* event_handler,
scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> network_task_runner,
scoped_ptr<protocol::ConnectionToClient> connection,
scoped_ptr<DesktopEnvironment> desktop_environment,
const base::TimeDelta& max_duration);
virtual void NotifyClientDimensions(
const protocol::ClientDimensions& dimensions) OVERRIDE;
virtual void ControlVideo(
const protocol::VideoControl& video_control) OVERRIDE;
virtual void OnConnectionAuthenticated(
protocol::ConnectionToClient* connection) OVERRIDE;
virtual void OnConnectionChannelsConnected(
protocol::ConnectionToClient* connection) OVERRIDE;
virtual void OnConnectionClosed(protocol::ConnectionToClient* connection,
protocol::ErrorCode error) OVERRIDE;
virtual void OnSequenceNumberUpdated(
protocol::ConnectionToClient* connection, int64 sequence_number) OVERRIDE;
virtual void OnRouteChange(
protocol::ConnectionToClient* connection,
const std::string& channel_name,
const protocol::TransportRoute& route) OVERRIDE;
void Disconnect();
void Stop(const base::Closure& done_task);
protocol::ConnectionToClient* connection() const {
return connection_.get();
}
DesktopEnvironment* desktop_environment() const {
return desktop_environment_.get();
}
const std::string& client_jid() { return client_jid_; }
bool is_authenticated() { return auth_input_filter_.enabled(); }
void LocalMouseMoved(const SkIPoint& new_pos);
void SetDisableInputs(bool disable_inputs);
private:
friend class base::DeleteHelper<ClientSession>;
friend struct ClientSessionTraits;
virtual ~ClientSession();
scoped_ptr<protocol::ClipboardStub> CreateClipboardProxy();
void OnRecorderStopped();
static scoped_ptr<AudioEncoder> CreateAudioEncoder(
const protocol::SessionConfig& config);
static VideoEncoder* CreateVideoEncoder(
const protocol::SessionConfig& config);
EventHandler* event_handler_;
scoped_ptr<protocol::ConnectionToClient> connection_;
scoped_ptr<DesktopEnvironment> desktop_environment_;
std::string client_jid_;
protocol::ClipboardStub* host_clipboard_stub_;
protocol::InputStub* host_input_stub_;
protocol::InputEventTracker input_tracker_;
RemoteInputFilter remote_input_filter_;
MouseClampingFilter mouse_clamping_filter_;
protocol::ClipboardEchoFilter clipboard_echo_filter_;
protocol::InputFilter disable_input_filter_;
protocol::ClipboardFilter disable_clipboard_filter_;
protocol::InputFilter auth_input_filter_;
protocol::ClipboardFilter auth_clipboard_filter_;
base::WeakPtrFactory<protocol::ClipboardStub> client_clipboard_factory_;
base::TimeDelta max_duration_;
base::OneShotTimer<ClientSession> max_duration_timer_;
scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> network_task_runner_;
scoped_refptr<AudioScheduler> audio_scheduler_;
scoped_refptr<ScreenRecorder> video_recorder_;
int active_recorders_;
base::Closure done_task_;
DISALLOW_COPY_AND_ASSIGN(ClientSession);
};
struct ClientSessionTraits {
static void Destruct(const ClientSession* client);
};
}
#endif