diff options
33 files changed, 624 insertions, 480 deletions
diff --git a/remoting/host/basic_desktop_environment.cc b/remoting/host/basic_desktop_environment.cc index a10c6e0..e6d57b7 100644 --- a/remoting/host/basic_desktop_environment.cc +++ b/remoting/host/basic_desktop_environment.cc @@ -5,65 +5,83 @@ #include "remoting/host/basic_desktop_environment.h" #include "base/logging.h" +#include "base/single_thread_task_runner.h" #include "media/video/capture/screen/screen_capturer.h" #include "remoting/host/audio_capturer.h" +#include "remoting/host/client_session_control.h" #include "remoting/host/input_injector.h" -#include "remoting/host/session_controller.h" +#include "remoting/host/screen_controls.h" namespace remoting { BasicDesktopEnvironment::~BasicDesktopEnvironment() { - DCHECK(CalledOnValidThread()); + DCHECK(caller_task_runner_->BelongsToCurrentThread()); } -scoped_ptr<AudioCapturer> BasicDesktopEnvironment::CreateAudioCapturer( - scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner) { - DCHECK(CalledOnValidThread()); +scoped_ptr<AudioCapturer> BasicDesktopEnvironment::CreateAudioCapturer() { + DCHECK(caller_task_runner_->BelongsToCurrentThread()); return AudioCapturer::Create(); } -scoped_ptr<InputInjector> BasicDesktopEnvironment::CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { - DCHECK(CalledOnValidThread()); +scoped_ptr<InputInjector> BasicDesktopEnvironment::CreateInputInjector() { + DCHECK(caller_task_runner_->BelongsToCurrentThread()); - return InputInjector::Create(input_task_runner, ui_task_runner); + return InputInjector::Create(input_task_runner(), ui_task_runner()); } -scoped_ptr<SessionController> -BasicDesktopEnvironment::CreateSessionController() { - DCHECK(CalledOnValidThread()); +scoped_ptr<ScreenControls> BasicDesktopEnvironment::CreateScreenControls() { + DCHECK(caller_task_runner_->BelongsToCurrentThread()); - return scoped_ptr<SessionController>(); + return scoped_ptr<ScreenControls>(); } -scoped_ptr<media::ScreenCapturer> BasicDesktopEnvironment::CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) { - DCHECK(CalledOnValidThread()); +scoped_ptr<media::ScreenCapturer> +BasicDesktopEnvironment::CreateVideoCapturer() { + DCHECK(caller_task_runner_->BelongsToCurrentThread()); // The basic desktop environment does not use X DAMAGE, since it is // broken on many systems - see http://crbug.com/73423. return media::ScreenCapturer::Create(); } -BasicDesktopEnvironment::BasicDesktopEnvironment() { +BasicDesktopEnvironment::BasicDesktopEnvironment( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, + base::WeakPtr<ClientSessionControl> client_session_control) + : caller_task_runner_(caller_task_runner), + input_task_runner_(input_task_runner), + ui_task_runner_(ui_task_runner) { + DCHECK(caller_task_runner_->BelongsToCurrentThread()); } -BasicDesktopEnvironmentFactory::BasicDesktopEnvironmentFactory() { +BasicDesktopEnvironmentFactory::BasicDesktopEnvironmentFactory( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) + : caller_task_runner_(caller_task_runner), + input_task_runner_(input_task_runner), + ui_task_runner_(ui_task_runner) { } BasicDesktopEnvironmentFactory::~BasicDesktopEnvironmentFactory() { } scoped_ptr<DesktopEnvironment> BasicDesktopEnvironmentFactory::Create( - const std::string& client_jid, - const base::Closure& disconnect_callback) { - return scoped_ptr<DesktopEnvironment>(new BasicDesktopEnvironment()); + base::WeakPtr<ClientSessionControl> client_session_control) { + DCHECK(caller_task_runner_->BelongsToCurrentThread()); + + return scoped_ptr<DesktopEnvironment>( + new BasicDesktopEnvironment(caller_task_runner(), + input_task_runner(), + ui_task_runner(), + client_session_control)); } bool BasicDesktopEnvironmentFactory::SupportsAudioCapture() const { + DCHECK(caller_task_runner_->BelongsToCurrentThread()); + return AudioCapturer::IsSupported(); } diff --git a/remoting/host/basic_desktop_environment.h b/remoting/host/basic_desktop_environment.h index a7f12cf..21e7be9 100644 --- a/remoting/host/basic_desktop_environment.h +++ b/remoting/host/basic_desktop_environment.h @@ -8,52 +8,94 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/ref_counted.h" -#include "base/single_thread_task_runner.h" -#include "base/threading/non_thread_safe.h" #include "remoting/host/desktop_environment.h" namespace remoting { // Used to create audio/video capturers and event executor that work with // the local console. -class BasicDesktopEnvironment - : public base::NonThreadSafe, - public DesktopEnvironment { +class BasicDesktopEnvironment : public DesktopEnvironment { public: virtual ~BasicDesktopEnvironment(); // DesktopEnvironment implementation. - virtual scoped_ptr<AudioCapturer> CreateAudioCapturer( - scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner) OVERRIDE; - virtual scoped_ptr<InputInjector> CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) OVERRIDE; - virtual scoped_ptr<SessionController> CreateSessionController() OVERRIDE; - virtual scoped_ptr<media::ScreenCapturer> CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) OVERRIDE; + virtual scoped_ptr<AudioCapturer> CreateAudioCapturer() OVERRIDE; + virtual scoped_ptr<InputInjector> CreateInputInjector() OVERRIDE; + virtual scoped_ptr<ScreenControls> CreateScreenControls() OVERRIDE; + virtual scoped_ptr<media::ScreenCapturer> CreateVideoCapturer() OVERRIDE; protected: friend class BasicDesktopEnvironmentFactory; - BasicDesktopEnvironment(); + BasicDesktopEnvironment( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, + base::WeakPtr<ClientSessionControl> client_session_control); + + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner() const { + return caller_task_runner_; + } + + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner() const { + return input_task_runner_; + } + + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() const { + return ui_task_runner_; + } private: + // Task runner on which methods of DesktopEnvironment interface should be + // called. + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; + + // Used to run input-related tasks. + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_; + + // Used to run UI code. + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; + DISALLOW_COPY_AND_ASSIGN(BasicDesktopEnvironment); }; // Used to create |BasicDesktopEnvironment| instances. class BasicDesktopEnvironmentFactory : public DesktopEnvironmentFactory { public: - BasicDesktopEnvironmentFactory(); + BasicDesktopEnvironmentFactory( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); virtual ~BasicDesktopEnvironmentFactory(); // DesktopEnvironmentFactory implementation. virtual scoped_ptr<DesktopEnvironment> Create( - const std::string& client_jid, - const base::Closure& disconnect_callback) OVERRIDE; + base::WeakPtr<ClientSessionControl> client_session_control) OVERRIDE; virtual bool SupportsAudioCapture() const OVERRIDE; + protected: + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner() const { + return caller_task_runner_; + } + + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner() const { + return input_task_runner_; + } + + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner() const { + return ui_task_runner_; + } + private: + // Task runner on which methods of DesktopEnvironmentFactory interface should + // be called. + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; + + // Used to run input-related tasks. + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_; + + // Used to run UI code. + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; + DISALLOW_COPY_AND_ASSIGN(BasicDesktopEnvironmentFactory); }; diff --git a/remoting/host/chromoting_host.cc b/remoting/host/chromoting_host.cc index c9579b9..0a465c4 100644 --- a/remoting/host/chromoting_host.cc +++ b/remoting/host/chromoting_host.cc @@ -142,7 +142,7 @@ void ChromotingHost::Shutdown(const base::Closure& shutdown_task) { // Disconnect all of the clients. while (!clients_.empty()) { - clients_.front()->Disconnect(); + clients_.front()->DisconnectSession(); } // Run the remaining shutdown tasks. @@ -193,7 +193,7 @@ void ChromotingHost::OnSessionAuthenticated(ClientSession* client) { while (it != clients_.end()) { ClientSession* other_client = *it++; if (other_client != client) - other_client->Disconnect(); + other_client->DisconnectSession(); } // Disconnects above must have destroyed all other clients. @@ -210,7 +210,7 @@ void ChromotingHost::OnSessionAuthenticated(ClientSession* client) { authenticating_client_ = false; if (reject_authenticating_client_) { - client->Disconnect(); + client->DisconnectSession(); } } @@ -339,7 +339,7 @@ void ChromotingHost::OnLocalMouseMoved(const SkIPoint& new_pos) { ClientList::iterator client; for (client = clients_.begin(); client != clients_.end(); ++client) { - (*client)->LocalMouseMoved(new_pos); + (*client)->OnLocalMouseMoved(new_pos); } } @@ -365,7 +365,7 @@ void ChromotingHost::DisconnectAllClients() { while (!clients_.empty()) { size_t size = clients_.size(); - clients_.front()->Disconnect(); + clients_.front()->DisconnectSession(); CHECK_EQ(clients_.size(), size - 1); } } diff --git a/remoting/host/chromoting_host_unittest.cc b/remoting/host/chromoting_host_unittest.cc index 1b57042..1159367 100644 --- a/remoting/host/chromoting_host_unittest.cc +++ b/remoting/host/chromoting_host_unittest.cc @@ -291,16 +291,14 @@ class ChromotingHostTest : public testing::Test { // DesktopEnvironmentFactory::Create(). DesktopEnvironment* CreateDesktopEnvironment() { MockDesktopEnvironment* desktop_environment = new MockDesktopEnvironment(); - EXPECT_CALL(*desktop_environment, CreateAudioCapturerPtr(_)) + EXPECT_CALL(*desktop_environment, CreateAudioCapturerPtr()) .Times(0); - EXPECT_CALL(*desktop_environment, CreateInputInjectorPtr(_, _)) + EXPECT_CALL(*desktop_environment, CreateInputInjectorPtr()) .Times(AnyNumber()) .WillRepeatedly(Invoke(this, &ChromotingHostTest::CreateInputInjector)); - EXPECT_CALL(*desktop_environment, CreateSessionControllerPtr()) - .Times(AnyNumber()) - .WillRepeatedly(Invoke(this, - &ChromotingHostTest::CreateSessionController)); - EXPECT_CALL(*desktop_environment, CreateVideoCapturerPtr(_, _)) + EXPECT_CALL(*desktop_environment, CreateScreenControlsPtr()) + .Times(AnyNumber()); + EXPECT_CALL(*desktop_environment, CreateVideoCapturerPtr()) .Times(AnyNumber()) .WillRepeatedly(Invoke(this, &ChromotingHostTest::CreateVideoCapturer)); @@ -309,25 +307,15 @@ class ChromotingHostTest : public testing::Test { // Creates a dummy InputInjector, to mock // DesktopEnvironment::CreateInputInjector(). - InputInjector* CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { + InputInjector* CreateInputInjector() { MockInputInjector* input_injector = new MockInputInjector(); EXPECT_CALL(*input_injector, StartPtr(_)); return input_injector; } - // Creates a dummy SessionController, to mock - // DesktopEnvironment::CreateSessionController(). - SessionController* CreateSessionController() { - return new MockSessionController(); - } - // Creates a fake media::ScreenCapturer, to mock // DesktopEnvironment::CreateVideoCapturer(). - media::ScreenCapturer* CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) { + media::ScreenCapturer* CreateVideoCapturer() { return new media::ScreenCapturerFake(); } diff --git a/remoting/host/client_session.cc b/remoting/host/client_session.cc index 80a155c..58b49a5 100644 --- a/remoting/host/client_session.cc +++ b/remoting/host/client_session.cc @@ -19,8 +19,8 @@ #include "remoting/host/audio_scheduler.h" #include "remoting/host/desktop_environment.h" #include "remoting/host/input_injector.h" +#include "remoting/host/screen_controls.h" #include "remoting/host/screen_resolution.h" -#include "remoting/host/session_controller.h" #include "remoting/host/video_scheduler.h" #include "remoting/proto/control.pb.h" #include "remoting/proto/event.pb.h" @@ -45,8 +45,8 @@ ClientSession::ClientSession( const base::TimeDelta& max_duration) : event_handler_(event_handler), connection_(connection.Pass()), - connection_factory_(connection_.get()), client_jid_(connection_->session()->jid()), + control_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), desktop_environment_factory_(desktop_environment_factory), input_tracker_(&host_input_filter_), remote_input_filter_(&input_tracker_), @@ -86,8 +86,9 @@ ClientSession::ClientSession( ClientSession::~ClientSession() { DCHECK(CalledOnValidThread()); DCHECK(!audio_scheduler_); + DCHECK(!desktop_environment_); DCHECK(!input_injector_); - DCHECK(!session_controller_); + DCHECK(!screen_controls_); DCHECK(!video_scheduler_); connection_.reset(); @@ -102,7 +103,7 @@ void ClientSession::NotifyClientResolution( << resolution.dips_width() << ", dips_height=" << resolution.dips_height() << ")"; - if (!session_controller_) + if (!screen_controls_) return; ScreenResolution client_resolution( @@ -111,7 +112,7 @@ void ClientSession::NotifyClientResolution( // Try to match the client's resolution. if (client_resolution.IsValid()) - session_controller_->SetScreenResolution(client_resolution); + screen_controls_->SetScreenResolution(client_resolution); } void ClientSession::ControlVideo(const protocol::VideoControl& video_control) { @@ -147,7 +148,7 @@ void ClientSession::OnConnectionAuthenticated( // TODO(simonmorris): Let Disconnect() tell the client that the // disconnection was caused by the session exceeding its maximum duration. max_duration_timer_.Start(FROM_HERE, max_duration_, - this, &ClientSession::Disconnect); + this, &ClientSession::DisconnectSession); } event_handler_->OnSessionAuthenticated(this); @@ -158,22 +159,19 @@ void ClientSession::OnConnectionChannelsConnected( DCHECK(CalledOnValidThread()); DCHECK_EQ(connection_.get(), connection); DCHECK(!audio_scheduler_); + DCHECK(!desktop_environment_); DCHECK(!input_injector_); - DCHECK(!session_controller_); + DCHECK(!screen_controls_); DCHECK(!video_scheduler_); - scoped_ptr<DesktopEnvironment> desktop_environment = - desktop_environment_factory_->Create( - client_jid_, - base::Bind(&protocol::ConnectionToClient::Disconnect, - connection_factory_.GetWeakPtr())); + desktop_environment_ = + desktop_environment_factory_->Create(control_factory_.GetWeakPtr()); - // Create the session controller. - session_controller_ = desktop_environment->CreateSessionController(); + // Create the object that controls the screen resolution. + screen_controls_ = desktop_environment_->CreateScreenControls(); // Create and start the event executor. - input_injector_ = desktop_environment->CreateInputInjector( - input_task_runner_, ui_task_runner_); + input_injector_ = desktop_environment_->CreateInputInjector(); input_injector_->Start(CreateClipboardProxy()); // Connect the host clipboard and input stubs. @@ -191,8 +189,7 @@ void ClientSession::OnConnectionChannelsConnected( video_capture_task_runner_, video_encode_task_runner_, network_task_runner_, - desktop_environment->CreateVideoCapturer(video_capture_task_runner_, - video_encode_task_runner_), + desktop_environment_->CreateVideoCapturer(), video_encoder.Pass(), connection_->client_stub(), &mouse_clamping_filter_); @@ -204,7 +201,7 @@ void ClientSession::OnConnectionChannelsConnected( audio_scheduler_ = AudioScheduler::Create( audio_task_runner_, network_task_runner_, - desktop_environment->CreateAudioCapturer(audio_task_runner_), + desktop_environment_->CreateAudioCapturer(), audio_encoder.Pass(), connection_->audio_stub()); } @@ -219,8 +216,8 @@ void ClientSession::OnConnectionClosed( DCHECK(CalledOnValidThread()); DCHECK_EQ(connection_.get(), connection); - // Ignore any further callbacks from the DesktopEnvironment. - connection_factory_.InvalidateWeakPtrs(); + // Ignore any further callbacks. + control_factory_.InvalidateWeakPtrs(); // If the client never authenticated then the session failed. if (!auth_input_filter_.enabled()) @@ -248,7 +245,8 @@ void ClientSession::OnConnectionClosed( client_clipboard_factory_.InvalidateWeakPtrs(); input_injector_.reset(); - session_controller_.reset(); + screen_controls_.reset(); + desktop_environment_.reset(); // Notify the ChromotingHost that this client is disconnected. // TODO(sergeyu): Log failure reason? @@ -275,7 +273,11 @@ void ClientSession::OnRouteChange( event_handler_->OnSessionRouteChange(this, channel_name, route); } -void ClientSession::Disconnect() { +const std::string& ClientSession::client_jid() const { + return client_jid_; +} + +void ClientSession::DisconnectSession() { DCHECK(CalledOnValidThread()); DCHECK(connection_.get()); @@ -286,9 +288,9 @@ void ClientSession::Disconnect() { connection_->Disconnect(); } -void ClientSession::LocalMouseMoved(const SkIPoint& mouse_pos) { +void ClientSession::OnLocalMouseMoved(const SkIPoint& position) { DCHECK(CalledOnValidThread()); - remote_input_filter_.LocalMouseMoved(mouse_pos); + remote_input_filter_.LocalMouseMoved(position); } void ClientSession::SetDisableInputs(bool disable_inputs) { diff --git a/remoting/host/client_session.h b/remoting/host/client_session.h index e48deb1..da850bc 100644 --- a/remoting/host/client_session.h +++ b/remoting/host/client_session.h @@ -10,9 +10,10 @@ #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" #include "base/sequenced_task_runner_helpers.h" +#include "base/threading/non_thread_safe.h" #include "base/time.h" #include "base/timer.h" -#include "base/threading/non_thread_safe.h" +#include "remoting/host/client_session_control.h" #include "remoting/host/mouse_clamping_filter.h" #include "remoting/host/remote_input_filter.h" #include "remoting/protocol/clipboard_echo_filter.h" @@ -37,16 +38,17 @@ class AudioScheduler; class DesktopEnvironment; class DesktopEnvironmentFactory; class InputInjector; -class SessionController; +class ScreenControls; class VideoEncoder; class VideoScheduler; // A ClientSession keeps a reference to a connection to a client, and maintains // per-client state. class ClientSession - : public protocol::HostStub, + : public base::NonThreadSafe, + public protocol::HostStub, public protocol::ConnectionToClient::EventHandler, - public base::NonThreadSafe { + public ClientSessionControl { public: // Callback interface for passing events to the ChromotingHost. class EventHandler { @@ -117,28 +119,18 @@ class ClientSession const std::string& channel_name, const protocol::TransportRoute& route) OVERRIDE; - // Disconnects the session, tears down transport resources and stops scheduler - // components. |event_handler_| is guaranteed not to be called after this - // method returns. - void Disconnect(); + // ClientSessionControl interface. + virtual const std::string& client_jid() const OVERRIDE; + virtual void DisconnectSession() OVERRIDE; + virtual void OnLocalMouseMoved(const SkIPoint& position) OVERRIDE; + virtual void SetDisableInputs(bool disable_inputs) OVERRIDE; protocol::ConnectionToClient* connection() const { return connection_.get(); } - const std::string& client_jid() { return client_jid_; } - bool is_authenticated() { return auth_input_filter_.enabled(); } - // Indicate that local mouse activity has been detected. This causes remote - // inputs to be ignored for a short time so that the local user will always - // have the upper hand in 'pointer wars'. - void LocalMouseMoved(const SkIPoint& new_pos); - - // Disable handling of input events from this client. If the client has any - // keys or mouse buttons pressed then these will be released. - void SetDisableInputs(bool disable_inputs); - private: // Creates a proxy for sending clipboard events to the client. scoped_ptr<protocol::ClipboardStub> CreateClipboardProxy(); @@ -156,14 +148,18 @@ class ClientSession // The connection to the client. scoped_ptr<protocol::ConnectionToClient> connection_; - // Used to disable callbacks to |connection_| once it is disconnected. - base::WeakPtrFactory<protocol::ConnectionToClient> connection_factory_; - std::string client_jid_; + // Used to disable callbacks to |this| once DisconnectSession() has been + // called. + base::WeakPtrFactory<ClientSessionControl> control_factory_; + // Used to create a DesktopEnvironment instance for this session. DesktopEnvironmentFactory* desktop_environment_factory_; + // The DesktopEnvironment instance for this session. + scoped_ptr<DesktopEnvironment> desktop_environment_; + // Filter used as the final element in the input pipeline. protocol::InputFilter host_input_filter_; @@ -217,7 +213,7 @@ class ClientSession scoped_ptr<InputInjector> input_injector_; // Used to apply client-requested changes in screen resolution. - scoped_ptr<SessionController> session_controller_; + scoped_ptr<ScreenControls> screen_controls_; DISALLOW_COPY_AND_ASSIGN(ClientSession); }; diff --git a/remoting/host/client_session_control.h b/remoting/host/client_session_control.h new file mode 100644 index 0000000..7d46586 --- /dev/null +++ b/remoting/host/client_session_control.h @@ -0,0 +1,40 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef REMOTING_HOST_CLIENT_SESSION_CONTROL_H_ +#define REMOTING_HOST_CLIENT_SESSION_CONTROL_H_ + +#include "base/basictypes.h" +#include "remoting/host/mouse_move_observer.h" +#include "third_party/skia/include/core/SkPoint.h" + +namespace remoting { + +// Allows the desktop environment to disconnect the client session and +// to control the remote input handling (i.e. disable, enable, and pause +// temporarily if the local mouse movements are detected). +// +// TODO(alexeypa): remove the MouseMoveObserver interface entirely. +// See http://crbug.com/104544. +class ClientSessionControl : public MouseMoveObserver { + public: + virtual ~ClientSessionControl() {} + + // Returns the authenticated JID of the client session. + virtual const std::string& client_jid() const = 0; + + // Disconnects the client session, tears down transport resources and stops + // scheduler components. + virtual void DisconnectSession() = 0; + + // Called when local mouse movement is detected. + virtual void OnLocalMouseMoved(const SkIPoint& position) = 0; + + // Disables or enables the remote input in the client session. + virtual void SetDisableInputs(bool disable_inputs) = 0; +}; + +} // namespace remoting + +#endif // REMOTING_HOST_CLIENT_SESSION_CONTROL_H_ diff --git a/remoting/host/client_session_unittest.cc b/remoting/host/client_session_unittest.cc index 076d460..e12758e 100644 --- a/remoting/host/client_session_unittest.cc +++ b/remoting/host/client_session_unittest.cc @@ -48,7 +48,7 @@ ACTION_P2(InjectMouseEvent, connection, event) { } ACTION_P2(LocalMouseMoved, client_session, event) { - client_session->LocalMouseMoved(SkIPoint::Make(event.x(), event.y())); + client_session->OnLocalMouseMoved(SkIPoint::Make(event.x(), event.y())); } } // namespace @@ -73,19 +73,11 @@ class ClientSessionTest : public testing::Test { // Returns |input_injector_| created and initialized by SetUp(), to mock // DesktopEnvironment::CreateInputInjector(). - InputInjector* CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); - - // Creates a dummy SessionController, to mock - // DesktopEnvironment::CreateSessionController(). - SessionController* CreateSessionController(); + InputInjector* CreateInputInjector(); // Creates a fake media::ScreenCapturer, to mock // DesktopEnvironment::CreateVideoCapturer(). - media::ScreenCapturer* CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner); + media::ScreenCapturer* CreateVideoCapturer(); // Notifies the client session that the client connection has been // authenticated and channels have been connected. This effectively enables @@ -179,7 +171,7 @@ void ClientSessionTest::TearDown() { } void ClientSessionTest::DisconnectClientSession() { - client_session_->Disconnect(); + client_session_->DisconnectSession(); // MockSession won't trigger OnConnectionClosed, so fake it. client_session_->OnConnectionClosed(client_session_->connection(), protocol::OK); @@ -193,32 +185,24 @@ void ClientSessionTest::StopClientSession() { DesktopEnvironment* ClientSessionTest::CreateDesktopEnvironment() { MockDesktopEnvironment* desktop_environment = new MockDesktopEnvironment(); - EXPECT_CALL(*desktop_environment, CreateAudioCapturerPtr(_)) + EXPECT_CALL(*desktop_environment, CreateAudioCapturerPtr()) .Times(0); - EXPECT_CALL(*desktop_environment, CreateInputInjectorPtr(_, _)) + EXPECT_CALL(*desktop_environment, CreateInputInjectorPtr()) .WillOnce(Invoke(this, &ClientSessionTest::CreateInputInjector)); - EXPECT_CALL(*desktop_environment, CreateSessionControllerPtr()) - .WillOnce(Invoke(this, &ClientSessionTest::CreateSessionController)); - EXPECT_CALL(*desktop_environment, CreateVideoCapturerPtr(_, _)) + EXPECT_CALL(*desktop_environment, CreateScreenControlsPtr()) + .Times(1); + EXPECT_CALL(*desktop_environment, CreateVideoCapturerPtr()) .WillOnce(Invoke(this, &ClientSessionTest::CreateVideoCapturer)); return desktop_environment; } -InputInjector* ClientSessionTest::CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { +InputInjector* ClientSessionTest::CreateInputInjector() { EXPECT_TRUE(input_injector_); return input_injector_.release(); } -SessionController* ClientSessionTest::CreateSessionController() { - return new MockSessionController(); -} - -media::ScreenCapturer* ClientSessionTest::CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) { +media::ScreenCapturer* ClientSessionTest::CreateVideoCapturer() { return new media::ScreenCapturerFake(); } diff --git a/remoting/host/desktop_environment.h b/remoting/host/desktop_environment.h index 7f2ed54..0df2e01a 100644 --- a/remoting/host/desktop_environment.h +++ b/remoting/host/desktop_environment.h @@ -11,6 +11,7 @@ #include "base/callback_forward.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" +#include "base/memory/weak_ptr.h" namespace base { class SingleThreadTaskRunner; @@ -23,8 +24,9 @@ class ScreenCapturer; namespace remoting { class AudioCapturer; +class ClientSessionControl; class InputInjector; -class SessionController; +class ScreenControls; // Provides factory methods for creation of audio/video capturers and event // executor for a given desktop environment. @@ -33,16 +35,11 @@ class DesktopEnvironment { virtual ~DesktopEnvironment() {} // Factory methods used to create audio/video capturers, event executor, and - // session controller for a particular desktop environment. - virtual scoped_ptr<AudioCapturer> CreateAudioCapturer( - scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner) = 0; - virtual scoped_ptr<InputInjector> CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) = 0; - virtual scoped_ptr<SessionController> CreateSessionController() = 0; - virtual scoped_ptr<media::ScreenCapturer> CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) = 0; + // screen controls object for a particular desktop environment. + virtual scoped_ptr<AudioCapturer> CreateAudioCapturer() = 0; + virtual scoped_ptr<InputInjector> CreateInputInjector() = 0; + virtual scoped_ptr<ScreenControls> CreateScreenControls() = 0; + virtual scoped_ptr<media::ScreenCapturer> CreateVideoCapturer() = 0; }; // Used to create |DesktopEnvironment| instances. @@ -50,11 +47,10 @@ class DesktopEnvironmentFactory { public: virtual ~DesktopEnvironmentFactory() {} - // Creates an instance of |DesktopEnvironment|. |disconnect_callback| may be - // used by the DesktopEnvironment to disconnect the client session. + // Creates an instance of |DesktopEnvironment|. |client_session_control| must + // outlive |this|. virtual scoped_ptr<DesktopEnvironment> Create( - const std::string& client_jid, - const base::Closure& disconnect_callback) = 0; + base::WeakPtr<ClientSessionControl> client_session_control) = 0; // Returns |true| if created |DesktopEnvironment| instances support audio // capture. diff --git a/remoting/host/desktop_process.cc b/remoting/host/desktop_process.cc index 9e2fc75..c62e85c 100644 --- a/remoting/host/desktop_process.cc +++ b/remoting/host/desktop_process.cc @@ -25,8 +25,10 @@ namespace remoting { DesktopProcess::DesktopProcess( scoped_refptr<AutoThreadTaskRunner> caller_task_runner, + scoped_refptr<AutoThreadTaskRunner> input_task_runner, const std::string& daemon_channel_name) : caller_task_runner_(caller_task_runner), + input_task_runner_(input_task_runner), daemon_channel_name_(daemon_channel_name) { DCHECK(caller_task_runner_->BelongsToCurrentThread()); DCHECK_EQ(MessageLoop::current()->type(), MessageLoop::TYPE_UI); @@ -83,6 +85,8 @@ void DesktopProcess::OnChannelError() { } caller_task_runner_ = NULL; + input_task_runner_ = NULL; + desktop_environment_factory_.reset(); } bool DesktopProcess::Start( @@ -106,11 +110,6 @@ bool DesktopProcess::Start( "ChromotingAudioThread", caller_task_runner_, MessageLoop::TYPE_IO); #endif // !defined(OS_WIN) - // Launch the input thread. - scoped_refptr<AutoThreadTaskRunner> input_task_runner = - AutoThread::CreateWithType("Input thread", caller_task_runner_, - MessageLoop::TYPE_IO); - // Launch the I/O thread. scoped_refptr<AutoThreadTaskRunner> io_task_runner = AutoThread::CreateWithType("I/O thread", caller_task_runner_, @@ -123,7 +122,7 @@ bool DesktopProcess::Start( // Create a desktop agent. desktop_agent_ = DesktopSessionAgent::Create(audio_task_runner, caller_task_runner_, - input_task_runner, + input_task_runner_, io_task_runner, video_capture_task_runner); @@ -132,6 +131,8 @@ bool DesktopProcess::Start( if (!desktop_agent_->Start(AsWeakPtr(), &desktop_pipe)) { desktop_agent_ = NULL; caller_task_runner_ = NULL; + input_task_runner_ = NULL; + desktop_environment_factory_.reset(); return false; } diff --git a/remoting/host/desktop_process.h b/remoting/host/desktop_process.h index 8db886e..bddbaaa 100644 --- a/remoting/host/desktop_process.h +++ b/remoting/host/desktop_process.h @@ -33,6 +33,7 @@ class DesktopProcess : public DesktopSessionAgent::Delegate, public: DesktopProcess( scoped_refptr<AutoThreadTaskRunner> caller_task_runner, + scoped_refptr<AutoThreadTaskRunner> input_task_runner, const std::string& daemon_channel_name); virtual ~DesktopProcess(); @@ -63,6 +64,9 @@ class DesktopProcess : public DesktopSessionAgent::Delegate, // Task runner on which public methods of this class should be called. scoped_refptr<AutoThreadTaskRunner> caller_task_runner_; + // Used to run input-related tasks. + scoped_refptr<AutoThreadTaskRunner> input_task_runner_; + // Factory used to create integration components for use by |desktop_agent_|. scoped_ptr<DesktopEnvironmentFactory> desktop_environment_factory_; diff --git a/remoting/host/desktop_process_main.cc b/remoting/host/desktop_process_main.cc index 5bfec67..28dd3ed 100644 --- a/remoting/host/desktop_process_main.cc +++ b/remoting/host/desktop_process_main.cc @@ -11,6 +11,7 @@ #include "base/memory/scoped_ptr.h" #include "base/message_loop.h" #include "base/run_loop.h" +#include "remoting/base/auto_thread.h" #include "remoting/base/auto_thread_task_runner.h" #include "remoting/host/desktop_process.h" #include "remoting/host/host_exit_codes.h" @@ -35,17 +36,30 @@ int DesktopProcessMain() { new AutoThreadTaskRunner(message_loop.message_loop_proxy(), run_loop.QuitClosure()); - DesktopProcess desktop_process(ui_task_runner, channel_name); + // Launch the input thread. + scoped_refptr<AutoThreadTaskRunner> input_task_runner = + AutoThread::CreateWithType("Input thread", ui_task_runner, + MessageLoop::TYPE_IO); + + DesktopProcess desktop_process(ui_task_runner, + input_task_runner, + channel_name); // Create a platform-dependent environment factory. scoped_ptr<DesktopEnvironmentFactory> desktop_environment_factory; #if defined(OS_WIN) desktop_environment_factory.reset( new SessionDesktopEnvironmentFactory( + ui_task_runner, + input_task_runner, + ui_task_runner, base::Bind(&DesktopProcess::InjectSas, desktop_process.AsWeakPtr()))); #else // !defined(OS_WIN) - desktop_environment_factory.reset(new Me2MeDesktopEnvironmentFactory()); + desktop_environment_factory.reset(new Me2MeDesktopEnvironmentFactory( + ui_task_runner, + input_task_runner, + ui_task_runner)); #endif // !defined(OS_WIN) if (!desktop_process.Start(desktop_environment_factory.Pass())) diff --git a/remoting/host/desktop_process_unittest.cc b/remoting/host/desktop_process_unittest.cc index 759dacc..5814244 100644 --- a/remoting/host/desktop_process_unittest.cc +++ b/remoting/host/desktop_process_unittest.cc @@ -112,10 +112,6 @@ class DesktopProcessTest : public testing::Test { // DesktopEnvironment::CreateInputInjector(). InputInjector* CreateInputInjector(); - // Creates a dummy SessionController, to mock - // DesktopEnvironment::CreateSessionController(). - SessionController* CreateSessionController(); - // Creates a fake media::ScreenCapturer, to mock // DesktopEnvironment::CreateVideoCapturer(). media::ScreenCapturer* CreateVideoCapturer(); @@ -199,21 +195,16 @@ void DesktopProcessTest::OnDesktopAttached( DesktopEnvironment* DesktopProcessTest::CreateDesktopEnvironment() { MockDesktopEnvironment* desktop_environment = new MockDesktopEnvironment(); - EXPECT_CALL(*desktop_environment, CreateAudioCapturerPtr(_)) + EXPECT_CALL(*desktop_environment, CreateAudioCapturerPtr()) .Times(0); - EXPECT_CALL(*desktop_environment, CreateInputInjectorPtr(_, _)) - .Times(AnyNumber()) - .WillRepeatedly( - InvokeWithoutArgs(this, &DesktopProcessTest::CreateInputInjector)); - EXPECT_CALL(*desktop_environment, CreateSessionControllerPtr()) + EXPECT_CALL(*desktop_environment, CreateInputInjectorPtr()) .Times(AnyNumber()) - .WillRepeatedly( - InvokeWithoutArgs(this, - &DesktopProcessTest::CreateSessionController)); - EXPECT_CALL(*desktop_environment, CreateVideoCapturerPtr(_, _)) + .WillRepeatedly(Invoke(this, &DesktopProcessTest::CreateInputInjector)); + EXPECT_CALL(*desktop_environment, CreateScreenControlsPtr()) + .Times(AnyNumber()); + EXPECT_CALL(*desktop_environment, CreateVideoCapturerPtr()) .Times(AnyNumber()) - .WillRepeatedly( - InvokeWithoutArgs(this, &DesktopProcessTest::CreateVideoCapturer)); + .WillRepeatedly(Invoke(this, &DesktopProcessTest::CreateVideoCapturer)); // Notify the test that the desktop environment has been created. network_listener_.OnDesktopEnvironmentCreated(); @@ -226,10 +217,6 @@ InputInjector* DesktopProcessTest::CreateInputInjector() { return input_injector; } -SessionController* DesktopProcessTest::CreateSessionController() { - return new MockSessionController(); -} - media::ScreenCapturer* DesktopProcessTest::CreateVideoCapturer() { return new media::ScreenCapturerFake(); } @@ -274,7 +261,7 @@ void DesktopProcessTest::RunDesktopProcess() { .Times(AnyNumber()) .WillRepeatedly(Return(false)); - DesktopProcess desktop_process(ui_task_runner, channel_name); + DesktopProcess desktop_process(ui_task_runner, io_task_runner_, channel_name); EXPECT_TRUE(desktop_process.Start( desktop_environment_factory.PassAs<DesktopEnvironmentFactory>())); diff --git a/remoting/host/desktop_session_agent.cc b/remoting/host/desktop_session_agent.cc index afd80b8..be78c87 100644 --- a/remoting/host/desktop_session_agent.cc +++ b/remoting/host/desktop_session_agent.cc @@ -19,8 +19,8 @@ #include "remoting/host/input_injector.h" #include "remoting/host/local_input_monitor.h" #include "remoting/host/remote_input_filter.h" +#include "remoting/host/screen_controls.h" #include "remoting/host/screen_resolution.h" -#include "remoting/host/session_controller.h" #include "remoting/proto/audio.pb.h" #include "remoting/proto/control.pb.h" #include "remoting/proto/event.pb.h" @@ -69,9 +69,11 @@ DesktopSessionAgent::Delegate::~Delegate() { DesktopSessionAgent::~DesktopSessionAgent() { DCHECK(!audio_capturer_); + DCHECK(!desktop_environment_); DCHECK(!disconnect_window_); DCHECK(!local_input_monitor_); DCHECK(!network_channel_); + DCHECK(!screen_controls_); DCHECK(!video_capturer_); CloseDesktopPipeHandle(); @@ -131,12 +133,6 @@ void DesktopSessionAgent::OnChannelError() { delegate_->OnNetworkProcessDisconnected(); } -void DesktopSessionAgent::OnLocalMouseMoved(const SkIPoint& new_pos) { - DCHECK(caller_task_runner()->BelongsToCurrentThread()); - - remote_input_filter_->LocalMouseMoved(new_pos); -} - scoped_refptr<media::SharedBuffer> DesktopSessionAgent::CreateSharedBuffer( uint32 size) { DCHECK(video_capture_task_runner()->BelongsToCurrentThread()); @@ -172,32 +168,53 @@ void DesktopSessionAgent::ReleaseSharedBuffer( new ChromotingDesktopNetworkMsg_ReleaseSharedBuffer(buffer->id())); } +const std::string& DesktopSessionAgent::client_jid() const { + return client_jid_; +} + +void DesktopSessionAgent::DisconnectSession() { + SendToNetwork(new ChromotingDesktopNetworkMsg_DisconnectSession()); +} + +void DesktopSessionAgent::OnLocalMouseMoved(const SkIPoint& new_pos) { + DCHECK(caller_task_runner()->BelongsToCurrentThread()); + + remote_input_filter_->LocalMouseMoved(new_pos); +} + +void DesktopSessionAgent::SetDisableInputs(bool disable_inputs) { + DCHECK(caller_task_runner()->BelongsToCurrentThread()); + + // Do not expect this method to be called because it is only used by It2Me. + NOTREACHED(); +} + void DesktopSessionAgent::OnStartSessionAgent( const std::string& authenticated_jid, const ScreenResolution& resolution) { DCHECK(caller_task_runner()->BelongsToCurrentThread()); DCHECK(!started_); DCHECK(!audio_capturer_); + DCHECK(!desktop_environment_); + DCHECK(!disconnect_window_); DCHECK(!input_injector_); + DCHECK(!local_input_monitor_); + DCHECK(!screen_controls_); DCHECK(!video_capturer_); started_ = true; + client_jid_ = authenticated_jid; // Create a desktop environment for the new session. - base::Closure disconnect_session = - base::Bind(&DesktopSessionAgent::DisconnectSession, this); - scoped_ptr<DesktopEnvironment> desktop_environment = - delegate_->desktop_environment_factory().Create(authenticated_jid, - disconnect_session); + desktop_environment_ = delegate_->desktop_environment_factory().Create( + control_factory_.GetWeakPtr()); // Create the session controller and set the initial screen resolution. - session_controller_ = desktop_environment->CreateSessionController(); + screen_controls_ = desktop_environment_->CreateScreenControls(); SetScreenResolution(resolution); // Create the input injector. - input_injector_ = - desktop_environment->CreateInputInjector(input_task_runner(), - caller_task_runner()); + input_injector_ = desktop_environment_->CreateInputInjector(); // Hook up the input filter. input_tracker_.reset(new protocol::InputEventTracker(input_injector_.get())); @@ -215,6 +232,8 @@ void DesktopSessionAgent::OnStartSessionAgent( input_injector_->Start(clipboard_stub.Pass()); // Create the disconnect window. + base::Closure disconnect_session = + base::Bind(&DesktopSessionAgent::DisconnectSession, this); disconnect_window_ = DisconnectWindow::Create(&ui_strings_); disconnect_window_->Show( disconnect_session, @@ -228,15 +247,13 @@ void DesktopSessionAgent::OnStartSessionAgent( // Start the audio capturer. if (delegate_->desktop_environment_factory().SupportsAudioCapture()) { - audio_capturer_ = desktop_environment->CreateAudioCapturer( - audio_capture_task_runner()); + audio_capturer_ = desktop_environment_->CreateAudioCapturer(); audio_capture_task_runner()->PostTask( FROM_HERE, base::Bind(&DesktopSessionAgent::StartAudioCapturer, this)); } // Start the video capturer. - video_capturer_ = desktop_environment->CreateVideoCapturer( - video_capture_task_runner(), caller_task_runner()); + video_capturer_ = desktop_environment_->CreateVideoCapturer(); video_capture_task_runner()->PostTask( FROM_HERE, base::Bind(&DesktopSessionAgent::StartVideoCapturer, this)); } @@ -326,6 +343,10 @@ void DesktopSessionAgent::Stop() { disconnect_window_->Hide(); disconnect_window_.reset(); + // Ignore any further callbacks. + control_factory_.InvalidateWeakPtrs(); + client_jid_.clear(); + // Stop monitoring to local input. local_input_monitor_->Stop(); local_input_monitor_.reset(); @@ -337,7 +358,8 @@ void DesktopSessionAgent::Stop() { input_tracker_.reset(); input_injector_.reset(); - session_controller_.reset(); + screen_controls_.reset(); + desktop_environment_.reset(); // Stop the audio capturer. audio_capture_task_runner()->PostTask( @@ -463,12 +485,8 @@ void DesktopSessionAgent::SetScreenResolution( const ScreenResolution& resolution) { DCHECK(caller_task_runner()->BelongsToCurrentThread()); - if (session_controller_ && resolution.IsValid()) - session_controller_->SetScreenResolution(resolution); -} - -void DesktopSessionAgent::DisconnectSession() { - SendToNetwork(new ChromotingDesktopNetworkMsg_DisconnectSession()); + if (screen_controls_ && resolution.IsValid()) + screen_controls_->SetScreenResolution(resolution); } void DesktopSessionAgent::SendToNetwork(IPC::Message* message) { @@ -531,6 +549,7 @@ DesktopSessionAgent::DesktopSessionAgent( input_task_runner_(input_task_runner), io_task_runner_(io_task_runner), video_capture_task_runner_(video_capture_task_runner), + control_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), desktop_pipe_(IPC::InvalidPlatformFileForTransit()), current_size_(SkISize::Make(0, 0)), next_shared_buffer_id_(1), diff --git a/remoting/host/desktop_session_agent.h b/remoting/host/desktop_session_agent.h index bb0a413..ae9961e 100644 --- a/remoting/host/desktop_session_agent.h +++ b/remoting/host/desktop_session_agent.h @@ -17,7 +17,7 @@ #include "ipc/ipc_platform_file.h" #include "media/video/capture/screen/screen_capturer.h" #include "media/video/capture/screen/shared_buffer.h" -#include "remoting/host/mouse_move_observer.h" +#include "remoting/host/client_session_control.h" #include "remoting/host/ui_strings.h" #include "remoting/protocol/clipboard_stub.h" #include "third_party/skia/include/core/SkRect.h" @@ -33,13 +33,14 @@ namespace remoting { class AudioCapturer; class AudioPacket; class AutoThreadTaskRunner; +class DesktopEnvironment; class DesktopEnvironmentFactory; class DisconnectWindow; class InputInjector; class LocalInputMonitor; class RemoteInputFilter; +class ScreenControls; class ScreenResolution; -class SessionController; namespace protocol { class InputEventTracker; @@ -50,8 +51,8 @@ class InputEventTracker; class DesktopSessionAgent : public base::RefCountedThreadSafe<DesktopSessionAgent>, public IPC::Listener, - public MouseMoveObserver, - public media::ScreenCapturer::Delegate { + public media::ScreenCapturer::Delegate, + public ClientSessionControl { public: class Delegate { public: @@ -77,9 +78,6 @@ class DesktopSessionAgent virtual void OnChannelConnected(int32 peer_pid) OVERRIDE; virtual void OnChannelError() OVERRIDE; - // MouseMoveObserver implementation. - virtual void OnLocalMouseMoved(const SkIPoint& new_pos) OVERRIDE; - // media::ScreenCapturer::Delegate implementation. virtual scoped_refptr<media::SharedBuffer> CreateSharedBuffer( uint32 size) OVERRIDE; @@ -117,6 +115,12 @@ class DesktopSessionAgent friend class base::RefCountedThreadSafe<DesktopSessionAgent>; virtual ~DesktopSessionAgent(); + // ClientSessionControl interface. + virtual const std::string& client_jid() const OVERRIDE; + virtual void DisconnectSession() OVERRIDE; + virtual void OnLocalMouseMoved(const SkIPoint& position) OVERRIDE; + virtual void SetDisableInputs(bool disable_inputs) OVERRIDE; + // Creates a connected IPC channel to be used to access the screen/audio // recorders and input stubs. virtual bool CreateChannelForNetworkProcess( @@ -145,9 +149,6 @@ class DesktopSessionAgent // the client. void SetScreenResolution(const ScreenResolution& resolution); - // Sends DisconnectSession request to the host. - void DisconnectSession(); - // Sends a message to the network process. void SendToNetwork(IPC::Message* message); @@ -211,8 +212,16 @@ class DesktopSessionAgent // Captures audio output. scoped_ptr<AudioCapturer> audio_capturer_; + std::string client_jid_; + + // Used to disable callbacks to |this|. + base::WeakPtrFactory<ClientSessionControl> control_factory_; + base::WeakPtr<Delegate> delegate_; + // The DesktopEnvironment instance used by this agent. + scoped_ptr<DesktopEnvironment> desktop_environment_; + // Provides a user interface allowing the local user to close the connection. scoped_ptr<DisconnectWindow> disconnect_window_; @@ -230,7 +239,7 @@ class DesktopSessionAgent scoped_ptr<RemoteInputFilter> remote_input_filter_; // Used to apply client-requested changes in screen resolution. - scoped_ptr<SessionController> session_controller_; + scoped_ptr<ScreenControls> screen_controls_; // IPC channel connecting the desktop process with the network process. scoped_ptr<IPC::ChannelProxy> network_channel_; diff --git a/remoting/host/desktop_session_proxy.cc b/remoting/host/desktop_session_proxy.cc index 65dac1a..05a8188 100644 --- a/remoting/host/desktop_session_proxy.cc +++ b/remoting/host/desktop_session_proxy.cc @@ -14,12 +14,12 @@ #include "media/video/capture/screen/screen_capture_data.h" #include "remoting/host/chromoting_messages.h" #include "remoting/host/client_session.h" +#include "remoting/host/client_session_control.h" #include "remoting/host/desktop_session_connector.h" #include "remoting/host/ipc_audio_capturer.h" #include "remoting/host/ipc_input_injector.h" -#include "remoting/host/ipc_session_controller.h" +#include "remoting/host/ipc_screen_controls.h" #include "remoting/host/ipc_video_frame_capturer.h" -#include "remoting/host/session_controller.h" #include "remoting/proto/audio.pb.h" #include "remoting/proto/control.pb.h" #include "remoting/proto/event.pb.h" @@ -31,49 +31,42 @@ namespace remoting { DesktopSessionProxy::DesktopSessionProxy( + scoped_refptr<base::SingleThreadTaskRunner> audio_capture_task_runner, scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, - const std::string& client_jid, - const base::Closure& disconnect_callback) - : caller_task_runner_(caller_task_runner), + scoped_refptr<base::SingleThreadTaskRunner> video_capture_task_runner, + base::WeakPtr<ClientSessionControl> client_session_control) + : audio_capture_task_runner_(audio_capture_task_runner), + caller_task_runner_(caller_task_runner), io_task_runner_(io_task_runner), - disconnect_callback_(disconnect_callback), - client_jid_(client_jid), + video_capture_task_runner_(video_capture_task_runner), + client_session_control_(client_session_control), desktop_process_(base::kNullProcessHandle), pending_capture_frame_requests_(0) { DCHECK(caller_task_runner_->BelongsToCurrentThread()); - DCHECK(!client_jid_.empty()); - DCHECK(!disconnect_callback_.is_null()); } -scoped_ptr<AudioCapturer> DesktopSessionProxy::CreateAudioCapturer( - scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner) { +scoped_ptr<AudioCapturer> DesktopSessionProxy::CreateAudioCapturer() { DCHECK(caller_task_runner_->BelongsToCurrentThread()); - DCHECK(!audio_capture_task_runner_); - audio_capture_task_runner_ = audio_task_runner; return scoped_ptr<AudioCapturer>(new IpcAudioCapturer(this)); } -scoped_ptr<InputInjector> DesktopSessionProxy::CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { +scoped_ptr<InputInjector> DesktopSessionProxy::CreateInputInjector() { DCHECK(caller_task_runner_->BelongsToCurrentThread()); return scoped_ptr<InputInjector>(new IpcInputInjector(this)); } -scoped_ptr<SessionController> DesktopSessionProxy::CreateSessionController() { - return scoped_ptr<SessionController>(new IpcSessionController(this)); +scoped_ptr<ScreenControls> DesktopSessionProxy::CreateScreenControls() { + DCHECK(caller_task_runner_->BelongsToCurrentThread()); + + return scoped_ptr<ScreenControls>(new IpcScreenControls(this)); } -scoped_ptr<media::ScreenCapturer> DesktopSessionProxy::CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) { +scoped_ptr<media::ScreenCapturer> DesktopSessionProxy::CreateVideoCapturer() { DCHECK(caller_task_runner_->BelongsToCurrentThread()); - DCHECK(!video_capture_task_runner_.get()); - video_capture_task_runner_ = capture_task_runner; return scoped_ptr<media::ScreenCapturer>(new IpcVideoFrameCapturer(this)); } @@ -118,10 +111,16 @@ bool DesktopSessionProxy::AttachToDesktop( base::ProcessHandle desktop_process, IPC::PlatformFileForTransit desktop_pipe) { DCHECK(caller_task_runner_->BelongsToCurrentThread()); - DCHECK(!client_jid_.empty()); DCHECK(!desktop_channel_); DCHECK_EQ(desktop_process_, base::kNullProcessHandle); + // Ignore the attach notification if the client session has been disconnected + // already. + if (!client_session_control_) { + base::CloseProcessHandle(desktop_process); + return false; + } + desktop_process_ = desktop_process; #if defined(OS_WIN) @@ -132,6 +131,9 @@ bool DesktopSessionProxy::AttachToDesktop( pipe.Receive(), 0, FALSE, DUPLICATE_SAME_ACCESS)) { LOG_GETLASTERROR(ERROR) << "Failed to duplicate the desktop-to-network" " pipe handle"; + + desktop_process_ = base::kNullProcessHandle; + base::CloseProcessHandle(desktop_process); return false; } @@ -156,7 +158,7 @@ bool DesktopSessionProxy::AttachToDesktop( // Pass ID of the client (which is authenticated at this point) to the desktop // session agent and start the agent. SendToDesktop(new ChromotingNetworkDesktopMsg_StartSessionAgent( - client_jid_, screen_resolution_)); + client_session_control_->client_jid(), screen_resolution_)); return true; } @@ -231,7 +233,8 @@ void DesktopSessionProxy::DisconnectSession() { DCHECK(caller_task_runner_->BelongsToCurrentThread()); // Disconnect the client session if it hasn't been disconnected yet. - disconnect_callback_.Run(); + if (client_session_control_) + client_session_control_->DisconnectSession(); } void DesktopSessionProxy::InjectClipboardEvent( diff --git a/remoting/host/desktop_session_proxy.h b/remoting/host/desktop_session_proxy.h index 8421a20..c172228 100644 --- a/remoting/host/desktop_session_proxy.h +++ b/remoting/host/desktop_session_proxy.h @@ -39,11 +39,12 @@ namespace remoting { class AudioPacket; class ClientSession; +class ClientSessionControl; class DesktopSessionConnector; struct DesktopSessionProxyTraits; class IpcAudioCapturer; class IpcVideoFrameCapturer; -class SessionController; +class ScreenControls; // DesktopSessionProxy is created by an owning DesktopEnvironment to route // requests from stubs to the DesktopSessionAgent instance through @@ -65,21 +66,17 @@ class DesktopSessionProxy public IPC::Listener { public: DesktopSessionProxy( + scoped_refptr<base::SingleThreadTaskRunner> audio_capture_task_runner, scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, - const std::string& client_jid, - const base::Closure& disconnect_callback); + scoped_refptr<base::SingleThreadTaskRunner> video_capture_task_runner, + base::WeakPtr<ClientSessionControl> client_session_control); // Mirrors DesktopEnvironment. - scoped_ptr<AudioCapturer> CreateAudioCapturer( - scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner); - scoped_ptr<InputInjector> CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); - scoped_ptr<SessionController> CreateSessionController(); - scoped_ptr<media::ScreenCapturer> CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner); + scoped_ptr<AudioCapturer> CreateAudioCapturer(); + scoped_ptr<InputInjector> CreateInputInjector(); + scoped_ptr<ScreenControls> CreateScreenControls(); + scoped_ptr<media::ScreenCapturer> CreateVideoCapturer(); // IPC::Listener implementation. virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; @@ -183,19 +180,16 @@ class DesktopSessionProxy // Points to the client stub passed to StartInputInjector(). scoped_ptr<protocol::ClipboardStub> client_clipboard_; + // Used to disconnect the client session. + base::WeakPtr<ClientSessionControl> client_session_control_; + // Used to bind to a desktop session and receive notifications every time // the desktop process is replaced. base::WeakPtr<DesktopSessionConnector> desktop_session_connector_; - // Disconnects the client session when invoked. - base::Closure disconnect_callback_; - // Points to the video capturer receiving captured video frames. base::WeakPtr<IpcVideoFrameCapturer> video_capturer_; - // JID of the client session. - std::string client_jid_; - // IPC channel to the desktop session agent. scoped_ptr<IPC::ChannelProxy> desktop_channel_; diff --git a/remoting/host/host_mock_objects.cc b/remoting/host/host_mock_objects.cc index 5900179..adbcd67 100644 --- a/remoting/host/host_mock_objects.cc +++ b/remoting/host/host_mock_objects.cc @@ -22,28 +22,21 @@ MockDesktopEnvironment::MockDesktopEnvironment() {} MockDesktopEnvironment::~MockDesktopEnvironment() {} -scoped_ptr<AudioCapturer> MockDesktopEnvironment::CreateAudioCapturer( - scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner) { - return scoped_ptr<AudioCapturer>(CreateAudioCapturerPtr(audio_task_runner)); +scoped_ptr<AudioCapturer> MockDesktopEnvironment::CreateAudioCapturer() { + return scoped_ptr<AudioCapturer>(CreateAudioCapturerPtr()); } -scoped_ptr<InputInjector> MockDesktopEnvironment::CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { - return scoped_ptr<InputInjector>(CreateInputInjectorPtr(input_task_runner, - ui_task_runner)); +scoped_ptr<InputInjector> MockDesktopEnvironment::CreateInputInjector() { + return scoped_ptr<InputInjector>(CreateInputInjectorPtr()); } -scoped_ptr<SessionController> -MockDesktopEnvironment::CreateSessionController() { - return scoped_ptr<SessionController>(CreateSessionControllerPtr()); +scoped_ptr<ScreenControls> MockDesktopEnvironment::CreateScreenControls() { + return scoped_ptr<ScreenControls>(CreateScreenControlsPtr()); } -scoped_ptr<media::ScreenCapturer> MockDesktopEnvironment::CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) { - return scoped_ptr<media::ScreenCapturer>(CreateVideoCapturerPtr( - capture_task_runner, encode_task_runner)); +scoped_ptr<media::ScreenCapturer> +MockDesktopEnvironment::CreateVideoCapturer() { + return scoped_ptr<media::ScreenCapturer>(CreateVideoCapturerPtr()); } MockDesktopEnvironmentFactory::MockDesktopEnvironmentFactory() {} @@ -51,8 +44,7 @@ MockDesktopEnvironmentFactory::MockDesktopEnvironmentFactory() {} MockDesktopEnvironmentFactory::~MockDesktopEnvironmentFactory() {} scoped_ptr<DesktopEnvironment> MockDesktopEnvironmentFactory::Create( - const std::string& client_jid, - const base::Closure& disconnect_callback) { + base::WeakPtr<ClientSessionControl> client_session_control) { return scoped_ptr<DesktopEnvironment>(CreatePtr()); } @@ -94,8 +86,4 @@ MockHostStatusObserver::MockHostStatusObserver() {} MockHostStatusObserver::~MockHostStatusObserver() {} -MockSessionController::MockSessionController() {} - -MockSessionController::~MockSessionController() {} - } // namespace remoting diff --git a/remoting/host/host_mock_objects.h b/remoting/host/host_mock_objects.h index 4c83685..04aaaa7 100644 --- a/remoting/host/host_mock_objects.h +++ b/remoting/host/host_mock_objects.h @@ -8,14 +8,15 @@ #include "net/base/ip_endpoint.h" #include "remoting/host/chromoting_host_context.h" #include "remoting/host/client_session.h" +#include "remoting/host/client_session_control.h" #include "remoting/host/continue_window.h" #include "remoting/host/desktop_environment.h" #include "remoting/host/disconnect_window.h" #include "remoting/host/host_status_observer.h" #include "remoting/host/input_injector.h" #include "remoting/host/local_input_monitor.h" +#include "remoting/host/screen_controls.h" #include "remoting/host/screen_resolution.h" -#include "remoting/host/session_controller.h" #include "remoting/proto/control.pb.h" #include "testing/gmock/include/gmock/gmock.h" @@ -30,27 +31,16 @@ class MockDesktopEnvironment : public DesktopEnvironment { MockDesktopEnvironment(); virtual ~MockDesktopEnvironment(); - MOCK_METHOD1(CreateAudioCapturerPtr, - AudioCapturer*(scoped_refptr<base::SingleThreadTaskRunner>)); - MOCK_METHOD2(CreateInputInjectorPtr, - InputInjector*(scoped_refptr<base::SingleThreadTaskRunner>, - scoped_refptr<base::SingleThreadTaskRunner>)); - MOCK_METHOD0(CreateSessionControllerPtr, SessionController*()); - MOCK_METHOD2( - CreateVideoCapturerPtr, - media::ScreenCapturer*(scoped_refptr<base::SingleThreadTaskRunner>, - scoped_refptr<base::SingleThreadTaskRunner>)); + MOCK_METHOD0(CreateAudioCapturerPtr, AudioCapturer*()); + MOCK_METHOD0(CreateInputInjectorPtr, InputInjector*()); + MOCK_METHOD0(CreateScreenControlsPtr, ScreenControls*()); + MOCK_METHOD0(CreateVideoCapturerPtr, media::ScreenCapturer*()); // DesktopEnvironment implementation. - virtual scoped_ptr<AudioCapturer> CreateAudioCapturer( - scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner) OVERRIDE; - virtual scoped_ptr<InputInjector> CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) OVERRIDE; - virtual scoped_ptr<SessionController> CreateSessionController() OVERRIDE; - virtual scoped_ptr<media::ScreenCapturer> CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) OVERRIDE; + virtual scoped_ptr<AudioCapturer> CreateAudioCapturer() OVERRIDE; + virtual scoped_ptr<InputInjector> CreateInputInjector() OVERRIDE; + virtual scoped_ptr<ScreenControls> CreateScreenControls() OVERRIDE; + virtual scoped_ptr<media::ScreenCapturer> CreateVideoCapturer() OVERRIDE; }; class MockDisconnectWindow : public DisconnectWindow { @@ -112,8 +102,7 @@ class MockDesktopEnvironmentFactory : public DesktopEnvironmentFactory { MOCK_CONST_METHOD0(SupportsAudioCapture, bool()); virtual scoped_ptr<DesktopEnvironment> Create( - const std::string& client_jid, - const base::Closure& disconnect_callback) OVERRIDE; + base::WeakPtr<ClientSessionControl> client_session_control) OVERRIDE; private: DISALLOW_COPY_AND_ASSIGN(MockDesktopEnvironmentFactory); @@ -154,17 +143,6 @@ class MockHostStatusObserver : public HostStatusObserver { MOCK_METHOD0(OnShutdown, void()); }; -class MockSessionController : public SessionController { - public: - MockSessionController(); - virtual ~MockSessionController(); - - MOCK_METHOD1(SetScreenResolution, void(const ScreenResolution&)); - - private: - DISALLOW_COPY_AND_ASSIGN(MockSessionController); -}; - } // namespace remoting #endif // REMOTING_HOST_HOST_MOCK_OBJECTS_H_ diff --git a/remoting/host/ipc_desktop_environment.cc b/remoting/host/ipc_desktop_environment.cc index 59373a8..797cbd5 100644 --- a/remoting/host/ipc_desktop_environment.cc +++ b/remoting/host/ipc_desktop_environment.cc @@ -6,7 +6,6 @@ #include <utility> -#include "base/callback.h" #include "base/compiler_specific.h" #include "base/logging.h" #include "base/process_util.h" @@ -15,71 +14,62 @@ #include "media/video/capture/screen/screen_capturer.h" #include "remoting/host/audio_capturer.h" #include "remoting/host/chromoting_messages.h" +#include "remoting/host/client_session_control.h" #include "remoting/host/desktop_session.h" #include "remoting/host/desktop_session_proxy.h" #include "remoting/host/input_injector.h" -#include "remoting/host/session_controller.h" +#include "remoting/host/screen_controls.h" namespace remoting { IpcDesktopEnvironment::IpcDesktopEnvironment( + scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner, scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, - const std::string& client_jid, - const base::Closure& disconnect_callback, + base::WeakPtr<ClientSessionControl> client_session_control, base::WeakPtr<DesktopSessionConnector> desktop_session_connector, - bool virtual_terminal) - : caller_task_runner_(caller_task_runner), - desktop_session_proxy_(new DesktopSessionProxy(caller_task_runner, - io_task_runner, - client_jid, - disconnect_callback)) { - DCHECK(caller_task_runner_->BelongsToCurrentThread()); + bool virtual_terminal) { + DCHECK(caller_task_runner->BelongsToCurrentThread()); + + desktop_session_proxy_ = new DesktopSessionProxy(audio_task_runner, + caller_task_runner, + io_task_runner, + capture_task_runner, + client_session_control); desktop_session_proxy_->ConnectToDesktopSession(desktop_session_connector, virtual_terminal); } IpcDesktopEnvironment::~IpcDesktopEnvironment() { - DCHECK(caller_task_runner_->BelongsToCurrentThread()); } -scoped_ptr<AudioCapturer> IpcDesktopEnvironment::CreateAudioCapturer( - scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner) { - DCHECK(caller_task_runner_->BelongsToCurrentThread()); - - return desktop_session_proxy_->CreateAudioCapturer(audio_task_runner); +scoped_ptr<AudioCapturer> IpcDesktopEnvironment::CreateAudioCapturer() { + return desktop_session_proxy_->CreateAudioCapturer(); } -scoped_ptr<InputInjector> IpcDesktopEnvironment::CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { - DCHECK(caller_task_runner_->BelongsToCurrentThread()); - - return desktop_session_proxy_->CreateInputInjector(input_task_runner, - ui_task_runner); +scoped_ptr<InputInjector> IpcDesktopEnvironment::CreateInputInjector() { + return desktop_session_proxy_->CreateInputInjector(); } -scoped_ptr<SessionController> IpcDesktopEnvironment::CreateSessionController() { - DCHECK(caller_task_runner_->BelongsToCurrentThread()); - - return desktop_session_proxy_->CreateSessionController(); +scoped_ptr<ScreenControls> IpcDesktopEnvironment::CreateScreenControls() { + return desktop_session_proxy_->CreateScreenControls(); } -scoped_ptr<media::ScreenCapturer> IpcDesktopEnvironment::CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) { - DCHECK(caller_task_runner_->BelongsToCurrentThread()); - - return desktop_session_proxy_->CreateVideoCapturer(capture_task_runner, - encode_task_runner); +scoped_ptr<media::ScreenCapturer> IpcDesktopEnvironment::CreateVideoCapturer() { + return desktop_session_proxy_->CreateVideoCapturer(); } IpcDesktopEnvironmentFactory::IpcDesktopEnvironmentFactory( + scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner, scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, IPC::Sender* daemon_channel) - : caller_task_runner_(caller_task_runner), + : audio_task_runner_(audio_task_runner), + caller_task_runner_(caller_task_runner), + capture_task_runner_(capture_task_runner), io_task_runner_(io_task_runner), curtain_activated_(false), daemon_channel_(daemon_channel), @@ -97,13 +87,17 @@ void IpcDesktopEnvironmentFactory::SetActivated(bool activated) { } scoped_ptr<DesktopEnvironment> IpcDesktopEnvironmentFactory::Create( - const std::string& client_jid, - const base::Closure& disconnect_callback) { + base::WeakPtr<ClientSessionControl> client_session_control) { DCHECK(caller_task_runner_->BelongsToCurrentThread()); - return scoped_ptr<DesktopEnvironment>(new IpcDesktopEnvironment( - caller_task_runner_, io_task_runner_, client_jid, disconnect_callback, - connector_factory_.GetWeakPtr(), curtain_activated_)); + return scoped_ptr<DesktopEnvironment>( + new IpcDesktopEnvironment(audio_task_runner_, + caller_task_runner_, + capture_task_runner_, + io_task_runner_, + client_session_control, + connector_factory_.GetWeakPtr(), + curtain_activated_)); } bool IpcDesktopEnvironmentFactory::SupportsAudioCapture() const { diff --git a/remoting/host/ipc_desktop_environment.h b/remoting/host/ipc_desktop_environment.h index bf5aaff..b4a8818 100644 --- a/remoting/host/ipc_desktop_environment.h +++ b/remoting/host/ipc_desktop_environment.h @@ -27,6 +27,7 @@ class Sender; namespace remoting { +class ClientSessionControl; class DesktopSessionProxy; class ScreenResolution; @@ -38,29 +39,22 @@ class IpcDesktopEnvironment : public DesktopEnvironment { // a desktop session, to be notified every time the desktop process is // restarted. IpcDesktopEnvironment( + scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner, scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, - const std::string& client_jid, - const base::Closure& disconnect_callback, + base::WeakPtr<ClientSessionControl> client_session_control, base::WeakPtr<DesktopSessionConnector> desktop_session_connector, bool virtual_terminal); virtual ~IpcDesktopEnvironment(); // DesktopEnvironment implementation. - virtual scoped_ptr<AudioCapturer> CreateAudioCapturer( - scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner) OVERRIDE; - virtual scoped_ptr<InputInjector> CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) OVERRIDE; - virtual scoped_ptr<SessionController> CreateSessionController() OVERRIDE; - virtual scoped_ptr<media::ScreenCapturer> CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) OVERRIDE; + virtual scoped_ptr<AudioCapturer> CreateAudioCapturer() OVERRIDE; + virtual scoped_ptr<InputInjector> CreateInputInjector() OVERRIDE; + virtual scoped_ptr<ScreenControls> CreateScreenControls() OVERRIDE; + virtual scoped_ptr<media::ScreenCapturer> CreateVideoCapturer() OVERRIDE; private: - // Task runner on which public methods of this class should be called. - scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; - scoped_refptr<DesktopSessionProxy> desktop_session_proxy_; DISALLOW_COPY_AND_ASSIGN(IpcDesktopEnvironment); @@ -76,7 +70,9 @@ class IpcDesktopEnvironmentFactory // Passes a reference to the IPC channel connected to the daemon process and // relevant task runners. |daemon_channel| must outlive this object. IpcDesktopEnvironmentFactory( + scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner, scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, scoped_refptr<base::SingleThreadTaskRunner> io_task_runner, IPC::Sender* daemon_channel); virtual ~IpcDesktopEnvironmentFactory(); @@ -86,8 +82,7 @@ class IpcDesktopEnvironmentFactory // DesktopEnvironmentFactory implementation. virtual scoped_ptr<DesktopEnvironment> Create( - const std::string& client_jid, - const base::Closure& disconnect_callback) OVERRIDE; + base::WeakPtr<ClientSessionControl> client_session_control) OVERRIDE; virtual bool SupportsAudioCapture() const OVERRIDE; // DesktopSessionConnector implementation. @@ -107,9 +102,16 @@ class IpcDesktopEnvironmentFactory virtual void OnTerminalDisconnected(int terminal_id) OVERRIDE; private: - // Task runner on which public methods of this class should be called. + // Used to run the audio capturer. + scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner_; + + // Task runner on which methods of DesktopEnvironmentFactory interface should + // be called. scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner_; + // Used to run the video capturer. + scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner_; + // Task runner used for running background I/O. scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_; diff --git a/remoting/host/ipc_desktop_environment_unittest.cc b/remoting/host/ipc_desktop_environment_unittest.cc index 535b328..72c53d1 100644 --- a/remoting/host/ipc_desktop_environment_unittest.cc +++ b/remoting/host/ipc_desktop_environment_unittest.cc @@ -37,6 +37,7 @@ using testing::_; using testing::AnyNumber; using testing::AtLeast; using testing::Return; +using testing::ReturnRef; namespace remoting { @@ -76,6 +77,20 @@ class MockDaemonListener : public IPC::Listener { DISALLOW_COPY_AND_ASSIGN(MockDaemonListener); }; +class MockClientSessionControl : public ClientSessionControl { + public: + MockClientSessionControl() {} + virtual ~MockClientSessionControl() {} + + MOCK_CONST_METHOD0(client_jid, const std::string&()); + MOCK_METHOD0(DisconnectSession, void()); + MOCK_METHOD1(OnLocalMouseMoved, void(const SkIPoint&)); + MOCK_METHOD1(SetDisableInputs, void(bool)); + + private: + DISALLOW_COPY_AND_ASSIGN(MockClientSessionControl); +}; + bool FakeDaemonSender::Send(IPC::Message* message) { OnMessageReceived(*message); delete message; @@ -129,10 +144,6 @@ class IpcDesktopEnvironmentTest : public testing::Test { // DesktopEnvironment::CreateInputInjector(). InputInjector* CreateInputInjector(); - // Creates a dummy SessionController, to mock - // DesktopEnvironment::CreateSessionController(). - SessionController* CreateSessionController(); - // Creates a fake media::ScreenCapturer, to mock // DesktopEnvironment::CreateVideoCapturer(). media::ScreenCapturer* CreateVideoCapturer(); @@ -167,6 +178,8 @@ class IpcDesktopEnvironmentTest : public testing::Test { scoped_refptr<AutoThreadTaskRunner> task_runner_; scoped_refptr<AutoThreadTaskRunner> io_task_runner_; + std::string client_jid_; + // Clipboard stub that receives clipboard events from the desktop process. protocol::ClipboardStub* clipboard_stub_; @@ -200,13 +213,18 @@ class IpcDesktopEnvironmentTest : public testing::Test { int terminal_id_; media::MockScreenCapturerDelegate screen_capturer_delegate_; + + MockClientSessionControl client_session_control_; + base::WeakPtrFactory<ClientSessionControl> client_session_control_factory_; }; IpcDesktopEnvironmentTest::IpcDesktopEnvironmentTest() : message_loop_(MessageLoop::TYPE_UI), + client_jid_("user@domain/rest-of-jid"), clipboard_stub_(NULL), remote_input_injector_(NULL), - terminal_id_(-1) { + terminal_id_(-1), + client_session_control_factory_(&client_session_control_) { } IpcDesktopEnvironmentTest::~IpcDesktopEnvironmentTest() { @@ -245,21 +263,34 @@ void IpcDesktopEnvironmentTest::SetUp() { .WillRepeatedly(Invoke(this, &IpcDesktopEnvironmentTest::DisconnectTerminal)); + EXPECT_CALL(client_session_control_, client_jid()) + .Times(AnyNumber()) + .WillRepeatedly(ReturnRef(client_jid_)); + EXPECT_CALL(client_session_control_, DisconnectSession()) + .Times(AnyNumber()) + .WillRepeatedly(Invoke( + this, &IpcDesktopEnvironmentTest::DeleteDesktopEnvironment)); + EXPECT_CALL(client_session_control_, OnLocalMouseMoved(_)) + .Times(0); + EXPECT_CALL(client_session_control_, SetDisableInputs(_)) + .Times(0); + // Create a desktop environment instance. desktop_environment_factory_.reset(new IpcDesktopEnvironmentFactory( - task_runner_, io_task_runner_, &daemon_channel_)); + task_runner_, + task_runner_, + task_runner_, + io_task_runner_, + &daemon_channel_)); desktop_environment_ = desktop_environment_factory_->Create( - "user@domain/rest-of-jid", - base::Bind(&IpcDesktopEnvironmentTest::OnDisconnectCallback, - base::Unretained(this))); + client_session_control_factory_.GetWeakPtr()); // Create the input injector. - input_injector_ = - desktop_environment_->CreateInputInjector(task_runner_, task_runner_); + input_injector_ = desktop_environment_->CreateInputInjector(); // Create the screen capturer. video_capturer_ = - desktop_environment_->CreateVideoCapturer(task_runner_, task_runner_); + desktop_environment_->CreateVideoCapturer(); } void IpcDesktopEnvironmentTest::ConnectTerminal( @@ -282,22 +313,18 @@ void IpcDesktopEnvironmentTest::DisconnectTerminal(int terminal_id) { DesktopEnvironment* IpcDesktopEnvironmentTest::CreateDesktopEnvironment() { MockDesktopEnvironment* desktop_environment = new MockDesktopEnvironment(); - EXPECT_CALL(*desktop_environment, CreateAudioCapturerPtr(_)) + EXPECT_CALL(*desktop_environment, CreateAudioCapturerPtr()) .Times(0); - EXPECT_CALL(*desktop_environment, CreateInputInjectorPtr(_, _)) - .Times(AnyNumber()) - .WillRepeatedly( - InvokeWithoutArgs(this, - &IpcDesktopEnvironmentTest::CreateInputInjector)); - EXPECT_CALL(*desktop_environment, CreateSessionControllerPtr()) + EXPECT_CALL(*desktop_environment, CreateInputInjectorPtr()) .Times(AnyNumber()) - .WillRepeatedly(InvokeWithoutArgs( - this, &IpcDesktopEnvironmentTest::CreateSessionController)); - EXPECT_CALL(*desktop_environment, CreateVideoCapturerPtr(_, _)) + .WillRepeatedly(Invoke( + this, &IpcDesktopEnvironmentTest::CreateInputInjector)); + EXPECT_CALL(*desktop_environment, CreateScreenControlsPtr()) + .Times(AnyNumber()); + EXPECT_CALL(*desktop_environment, CreateVideoCapturerPtr()) .Times(AnyNumber()) - .WillRepeatedly( - InvokeWithoutArgs(this, - &IpcDesktopEnvironmentTest::CreateVideoCapturer)); + .WillRepeatedly(Invoke( + this, &IpcDesktopEnvironmentTest::CreateVideoCapturer)); // Let tests know that the remote desktop environment is created. message_loop_.PostTask(FROM_HERE, setup_run_loop_->QuitClosure()); @@ -313,10 +340,6 @@ InputInjector* IpcDesktopEnvironmentTest::CreateInputInjector() { return remote_input_injector_; } -SessionController* IpcDesktopEnvironmentTest::CreateSessionController() { - return new MockSessionController(); -} - media::ScreenCapturer* IpcDesktopEnvironmentTest::CreateVideoCapturer() { return new media::ScreenCapturerFake(); } @@ -348,6 +371,7 @@ void IpcDesktopEnvironmentTest::CreateDesktopProcess() { // Create and start the desktop process. desktop_process_.reset(new DesktopProcess(task_runner_, + io_task_runner_, desktop_channel_name_)); scoped_ptr<MockDesktopEnvironmentFactory> desktop_environment_factory( diff --git a/remoting/host/ipc_session_controller.cc b/remoting/host/ipc_screen_controls.cc index d82be60..daa56dd 100644 --- a/remoting/host/ipc_session_controller.cc +++ b/remoting/host/ipc_screen_controls.cc @@ -2,22 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "remoting/host/ipc_session_controller.h" +#include "remoting/host/ipc_screen_controls.h" #include "base/logging.h" #include "remoting/host/desktop_session_proxy.h" namespace remoting { -IpcSessionController::IpcSessionController( +IpcScreenControls::IpcScreenControls( scoped_refptr<DesktopSessionProxy> desktop_session_proxy) : desktop_session_proxy_(desktop_session_proxy) { } -IpcSessionController::~IpcSessionController() { +IpcScreenControls::~IpcScreenControls() { } -void IpcSessionController::SetScreenResolution( +void IpcScreenControls::SetScreenResolution( const ScreenResolution& resolution) { desktop_session_proxy_->SetScreenResolution(resolution); } diff --git a/remoting/host/ipc_session_controller.h b/remoting/host/ipc_screen_controls.h index 63d677e..48daa16 100644 --- a/remoting/host/ipc_session_controller.h +++ b/remoting/host/ipc_screen_controls.h @@ -2,23 +2,23 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef REMOTING_HOST_IPC_SESSION_CONTROLLER_H_ -#define REMOTING_HOST_IPC_SESSION_CONTROLLER_H_ +#ifndef REMOTING_HOST_IPC_SCREEN_CONTROLS_H_ +#define REMOTING_HOST_IPC_SCREEN_CONTROLS_H_ #include "base/basictypes.h" #include "base/memory/ref_counted.h" -#include "remoting/host/session_controller.h" +#include "remoting/host/screen_controls.h" namespace remoting { class DesktopSessionProxy; class ScreenResolution; -class IpcSessionController : public SessionController { +class IpcScreenControls : public ScreenControls { public: - explicit IpcSessionController( + explicit IpcScreenControls( scoped_refptr<DesktopSessionProxy> desktop_session_proxy); - virtual ~IpcSessionController(); + virtual ~IpcScreenControls(); // SessionController interface. virtual void SetScreenResolution(const ScreenResolution& resolution) OVERRIDE; @@ -27,9 +27,9 @@ class IpcSessionController : public SessionController { // Wraps the IPC channel to the desktop session agent. scoped_refptr<DesktopSessionProxy> desktop_session_proxy_; - DISALLOW_COPY_AND_ASSIGN(IpcSessionController); + DISALLOW_COPY_AND_ASSIGN(IpcScreenControls); }; } // namespace remoting -#endif // REMOTING_HOST_IPC_SESSION_CONTROLLER_H_ +#endif // REMOTING_HOST_IPC_SCREEN_CONTROLS_H_ diff --git a/remoting/host/me2me_desktop_environment.cc b/remoting/host/me2me_desktop_environment.cc index 9b2b9af..5764ac5 100644 --- a/remoting/host/me2me_desktop_environment.cc +++ b/remoting/host/me2me_desktop_environment.cc @@ -5,30 +5,29 @@ #include "remoting/host/me2me_desktop_environment.h" #include "base/logging.h" +#include "base/single_thread_task_runner.h" #include "media/video/capture/screen/screen_capturer.h" +#include "remoting/host/client_session_control.h" #include "remoting/host/desktop_resizer.h" #include "remoting/host/resizing_host_observer.h" -#include "remoting/host/session_controller.h" +#include "remoting/host/screen_controls.h" namespace remoting { Me2MeDesktopEnvironment::~Me2MeDesktopEnvironment() { - DCHECK(CalledOnValidThread()); + DCHECK(caller_task_runner()->BelongsToCurrentThread()); } -scoped_ptr<SessionController> -Me2MeDesktopEnvironment::CreateSessionController() { - DCHECK(CalledOnValidThread()); +scoped_ptr<ScreenControls> Me2MeDesktopEnvironment::CreateScreenControls() { + DCHECK(caller_task_runner()->BelongsToCurrentThread()); - scoped_ptr<SessionController> session_controller( + return scoped_ptr<ScreenControls>( new ResizingHostObserver(DesktopResizer::Create())); - return session_controller.Pass(); } -scoped_ptr<media::ScreenCapturer> Me2MeDesktopEnvironment::CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) { - DCHECK(CalledOnValidThread()); +scoped_ptr<media::ScreenCapturer> +Me2MeDesktopEnvironment::CreateVideoCapturer() { + DCHECK(caller_task_runner()->BelongsToCurrentThread()); #if defined(OS_LINUX) return media::ScreenCapturer::CreateWithXDamage(true); @@ -37,19 +36,39 @@ scoped_ptr<media::ScreenCapturer> Me2MeDesktopEnvironment::CreateVideoCapturer( #endif // !defined(OS_LINUX) } -Me2MeDesktopEnvironment::Me2MeDesktopEnvironment() { +Me2MeDesktopEnvironment::Me2MeDesktopEnvironment( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, + base::WeakPtr<ClientSessionControl> client_session_control) + : BasicDesktopEnvironment(caller_task_runner, + input_task_runner, + ui_task_runner, + client_session_control) { + DCHECK(caller_task_runner->BelongsToCurrentThread()); } -Me2MeDesktopEnvironmentFactory::Me2MeDesktopEnvironmentFactory() { +Me2MeDesktopEnvironmentFactory::Me2MeDesktopEnvironmentFactory( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) + : BasicDesktopEnvironmentFactory(caller_task_runner, + input_task_runner, + ui_task_runner) { } Me2MeDesktopEnvironmentFactory::~Me2MeDesktopEnvironmentFactory() { } scoped_ptr<DesktopEnvironment> Me2MeDesktopEnvironmentFactory::Create( - const std::string& client_jid, - const base::Closure& disconnect_callback) { - return scoped_ptr<DesktopEnvironment>(new Me2MeDesktopEnvironment()); + base::WeakPtr<ClientSessionControl> client_session_control) { + DCHECK(caller_task_runner()->BelongsToCurrentThread()); + + return scoped_ptr<DesktopEnvironment>( + new Me2MeDesktopEnvironment(caller_task_runner(), + input_task_runner(), + ui_task_runner(), + client_session_control)); } } // namespace remoting diff --git a/remoting/host/me2me_desktop_environment.h b/remoting/host/me2me_desktop_environment.h index f07bc51..97f63bf 100644 --- a/remoting/host/me2me_desktop_environment.h +++ b/remoting/host/me2me_desktop_environment.h @@ -16,14 +16,16 @@ class Me2MeDesktopEnvironment : public BasicDesktopEnvironment { virtual ~Me2MeDesktopEnvironment(); // DesktopEnvironment interface. - virtual scoped_ptr<SessionController> CreateSessionController() OVERRIDE; - virtual scoped_ptr<media::ScreenCapturer> CreateVideoCapturer( - scoped_refptr<base::SingleThreadTaskRunner> capture_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) OVERRIDE; + virtual scoped_ptr<ScreenControls> CreateScreenControls() OVERRIDE; + virtual scoped_ptr<media::ScreenCapturer> CreateVideoCapturer() OVERRIDE; protected: friend class Me2MeDesktopEnvironmentFactory; - Me2MeDesktopEnvironment(); + Me2MeDesktopEnvironment( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, + base::WeakPtr<ClientSessionControl> client_session_control); private: DISALLOW_COPY_AND_ASSIGN(Me2MeDesktopEnvironment); @@ -32,13 +34,15 @@ class Me2MeDesktopEnvironment : public BasicDesktopEnvironment { // Used to create |Me2MeDesktopEnvironment| instances. class Me2MeDesktopEnvironmentFactory : public BasicDesktopEnvironmentFactory { public: - Me2MeDesktopEnvironmentFactory(); + Me2MeDesktopEnvironmentFactory( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner); virtual ~Me2MeDesktopEnvironmentFactory(); // DesktopEnvironmentFactory interface. virtual scoped_ptr<DesktopEnvironment> Create( - const std::string& client_jid, - const base::Closure& disconnect_callback) OVERRIDE; + base::WeakPtr<ClientSessionControl> client_session_control) OVERRIDE; private: DISALLOW_COPY_AND_ASSIGN(Me2MeDesktopEnvironmentFactory); diff --git a/remoting/host/plugin/host_script_object.cc b/remoting/host/plugin/host_script_object.cc index 2d7e98a..844a43b 100644 --- a/remoting/host/plugin/host_script_object.cc +++ b/remoting/host/plugin/host_script_object.cc @@ -227,7 +227,10 @@ void HostNPScriptObject::It2MeImpl::Connect( return; } - desktop_environment_factory_.reset(new BasicDesktopEnvironmentFactory()); + desktop_environment_factory_.reset(new BasicDesktopEnvironmentFactory( + host_context_->network_task_runner(), + host_context_->input_task_runner(), + host_context_->ui_task_runner())); // Start monitoring configured policies. policy_watcher_.reset( diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc index 58ed0dc..8ef959a 100644 --- a/remoting/host/remoting_me2me_host.cc +++ b/remoting/host/remoting_me2me_host.cc @@ -590,19 +590,27 @@ void HostProcess::StartOnUiThread() { #if defined(REMOTING_MULTI_PROCESS) IpcDesktopEnvironmentFactory* desktop_environment_factory = new IpcDesktopEnvironmentFactory( + context_->audio_task_runner(), context_->network_task_runner(), + context_->video_capture_task_runner(), context_->network_task_runner(), daemon_channel_.get()); desktop_session_connector_ = desktop_environment_factory; #else // !defined(REMOTING_MULTI_PROCESS) DesktopEnvironmentFactory* desktop_environment_factory = new SessionDesktopEnvironmentFactory( + context_->network_task_runner(), + context_->input_task_runner(), + context_->ui_task_runner(), base::Bind(&HostProcess::SendSasToConsole, this)); #endif // !defined(REMOTING_MULTI_PROCESS) #else // !defined(OS_WIN) DesktopEnvironmentFactory* desktop_environment_factory = - new Me2MeDesktopEnvironmentFactory(); + new Me2MeDesktopEnvironmentFactory( + context_->network_task_runner(), + context_->input_task_runner(), + context_->ui_task_runner()); #endif // !defined(OS_WIN) desktop_environment_factory_.reset(desktop_environment_factory); diff --git a/remoting/host/resizing_host_observer.h b/remoting/host/resizing_host_observer.h index d6f4390..2682d76 100644 --- a/remoting/host/resizing_host_observer.h +++ b/remoting/host/resizing_host_observer.h @@ -8,7 +8,7 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" -#include "remoting/host/session_controller.h" +#include "remoting/host/screen_controls.h" #include "third_party/skia/include/core/SkSize.h" namespace remoting { @@ -19,15 +19,15 @@ class ScreenResolution; // TODO(alexeypa): Rename this class to reflect that it is not // HostStatusObserver any more. -// Use the specified DesktopResizer to match host desktop size to the client -// view size as closely as is possible. When the connection closes, restore +// Uses the specified DesktopResizer to match host desktop size to the client +// view size as closely as is possible. When the connection closes, restores // the original desktop size. -class ResizingHostObserver : public SessionController { +class ResizingHostObserver : public ScreenControls { public: explicit ResizingHostObserver(scoped_ptr<DesktopResizer> desktop_resizer); virtual ~ResizingHostObserver(); - // SessionController interface. + // ScreenControls interface. virtual void SetScreenResolution(const ScreenResolution& resolution) OVERRIDE; private: diff --git a/remoting/host/session_controller.h b/remoting/host/screen_controls.h index 8587a44..1f707f9 100644 --- a/remoting/host/session_controller.h +++ b/remoting/host/screen_controls.h @@ -2,20 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef REMOTING_HOST_SESSION_CONTROLLER_H_ -#define REMOTING_HOST_SESSION_CONTROLLER_H_ +#ifndef REMOTING_HOST_SCREEN_CONTROLS_H_ +#define REMOTING_HOST_SCREEN_CONTROLS_H_ #include "base/basictypes.h" -#include "third_party/skia/include/core/SkPoint.h" -#include "third_party/skia/include/core/SkSize.h" namespace remoting { class ScreenResolution; -class SessionController { +// Used to change the screen resolution (both dimensions and DPI). +class ScreenControls { public: - virtual ~SessionController() {} + virtual ~ScreenControls() {} // Attempts to set new screen resolution in the session. virtual void SetScreenResolution(const ScreenResolution& resolution) = 0; @@ -23,4 +22,4 @@ class SessionController { } // namespace remoting -#endif // REMOTING_HOST_SESSION_CONTROLLER_H_ +#endif // REMOTING_HOST_SCREEN_CONTROLS_H_ diff --git a/remoting/host/win/session_desktop_environment.cc b/remoting/host/win/session_desktop_environment.cc index e99a50d..934436c 100644 --- a/remoting/host/win/session_desktop_environment.cc +++ b/remoting/host/win/session_desktop_environment.cc @@ -9,43 +9,64 @@ #include "media/video/capture/screen/screen_capturer.h" #include "remoting/host/audio_capturer.h" #include "remoting/host/input_injector.h" +#include "remoting/host/screen_controls.h" #include "remoting/host/win/session_input_injector.h" namespace remoting { SessionDesktopEnvironment::SessionDesktopEnvironment( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, + base::WeakPtr<ClientSessionControl> client_session_control, const base::Closure& inject_sas) - : inject_sas_(inject_sas){ + : Me2MeDesktopEnvironment(caller_task_runner, + input_task_runner, + ui_task_runner, + client_session_control), + inject_sas_(inject_sas) { } SessionDesktopEnvironment::~SessionDesktopEnvironment() { } -scoped_ptr<InputInjector> SessionDesktopEnvironment::CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) { - DCHECK(CalledOnValidThread()); +scoped_ptr<InputInjector> SessionDesktopEnvironment::CreateInputInjector() { + DCHECK(caller_task_runner()->BelongsToCurrentThread()); scoped_ptr<InputInjector> input_injector = InputInjector::Create( - input_task_runner, ui_task_runner); - input_injector.reset(new SessionInputInjectorWin( - input_task_runner, input_injector.Pass(), ui_task_runner, inject_sas_)); + input_task_runner(), ui_task_runner()); + input_injector.reset(new SessionInputInjectorWin(input_task_runner(), + input_injector.Pass(), + ui_task_runner(), + inject_sas_)); return input_injector.Pass(); } SessionDesktopEnvironmentFactory::SessionDesktopEnvironmentFactory( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, const base::Closure& inject_sas) - : inject_sas_(inject_sas) { + : Me2MeDesktopEnvironmentFactory(caller_task_runner, + input_task_runner, + ui_task_runner), + inject_sas_(inject_sas) { + DCHECK(caller_task_runner->BelongsToCurrentThread()); } SessionDesktopEnvironmentFactory::~SessionDesktopEnvironmentFactory() { } scoped_ptr<DesktopEnvironment> SessionDesktopEnvironmentFactory::Create( - const std::string& client_jid, - const base::Closure& disconnect_callback) { + base::WeakPtr<ClientSessionControl> client_session_control) { + DCHECK(caller_task_runner()->BelongsToCurrentThread()); + return scoped_ptr<DesktopEnvironment>( - new SessionDesktopEnvironment(inject_sas_)); + new SessionDesktopEnvironment(caller_task_runner(), + input_task_runner(), + ui_task_runner(), + client_session_control, + inject_sas_)); } } // namespace remoting diff --git a/remoting/host/win/session_desktop_environment.h b/remoting/host/win/session_desktop_environment.h index 60fdef1..b9423bc 100644 --- a/remoting/host/win/session_desktop_environment.h +++ b/remoting/host/win/session_desktop_environment.h @@ -20,13 +20,16 @@ class SessionDesktopEnvironment : public Me2MeDesktopEnvironment { virtual ~SessionDesktopEnvironment(); // DesktopEnvironment implementation. - virtual scoped_ptr<InputInjector> CreateInputInjector( - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, - scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) OVERRIDE; + virtual scoped_ptr<InputInjector> CreateInputInjector() OVERRIDE; private: friend class SessionDesktopEnvironmentFactory; - explicit SessionDesktopEnvironment(const base::Closure& inject_sas); + SessionDesktopEnvironment( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, + base::WeakPtr<ClientSessionControl> client_session_control, + const base::Closure& inject_sas); // Used to ask the daemon to inject Secure Attention Sequence. base::Closure inject_sas_; @@ -37,13 +40,16 @@ class SessionDesktopEnvironment : public Me2MeDesktopEnvironment { // Used to create |SessionDesktopEnvironment| instances. class SessionDesktopEnvironmentFactory : public Me2MeDesktopEnvironmentFactory { public: - explicit SessionDesktopEnvironmentFactory(const base::Closure& inject_sas); + SessionDesktopEnvironmentFactory( + scoped_refptr<base::SingleThreadTaskRunner> caller_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> input_task_runner, + scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner, + const base::Closure& inject_sas); virtual ~SessionDesktopEnvironmentFactory(); // DesktopEnvironmentFactory implementation. virtual scoped_ptr<DesktopEnvironment> Create( - const std::string& client_jid, - const base::Closure& disconnect_callback) OVERRIDE; + base::WeakPtr<ClientSessionControl> client_session_control) OVERRIDE; private: // Used to ask the daemon to inject Secure Attention Sequence. diff --git a/remoting/remoting.gyp b/remoting/remoting.gyp index 84bf7c3..a049650 100644 --- a/remoting/remoting.gyp +++ b/remoting/remoting.gyp @@ -324,6 +324,7 @@ 'host/chromoting_messages.h', 'host/client_session.cc', 'host/client_session.h', + 'host/client_session_control.h', 'host/clipboard.h', 'host/clipboard_linux.cc', 'host/clipboard_mac.mm', @@ -382,8 +383,8 @@ 'host/ipc_input_injector.h', 'host/ipc_host_event_logger.cc', 'host/ipc_host_event_logger.h', - 'host/ipc_session_controller.cc', - 'host/ipc_session_controller.h', + 'host/ipc_screen_controls.cc', + 'host/ipc_screen_controls.h', 'host/ipc_video_frame_capturer.cc', 'host/ipc_video_frame_capturer.h', 'host/it2me_host_user_interface.cc', @@ -425,6 +426,7 @@ 'host/resizing_host_observer.h', 'host/sas_injector.h', 'host/sas_injector_win.cc', + 'host/screen_controls.h', 'host/screen_resolution.cc', 'host/screen_resolution.h', 'host/server_log_entry.cc', @@ -433,7 +435,6 @@ 'host/service_client.h', 'host/service_urls.cc', 'host/service_urls.h', - 'host/session_controller.h', 'host/session_manager_factory.cc', 'host/session_manager_factory.h', 'host/signaling_connector.cc', |