summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--remoting/host/basic_desktop_environment.cc64
-rw-r--r--remoting/host/basic_desktop_environment.h78
-rw-r--r--remoting/host/chromoting_host.cc10
-rw-r--r--remoting/host/chromoting_host_unittest.cc26
-rw-r--r--remoting/host/client_session.cc52
-rw-r--r--remoting/host/client_session.h42
-rw-r--r--remoting/host/client_session_control.h40
-rw-r--r--remoting/host/client_session_unittest.cc38
-rw-r--r--remoting/host/desktop_environment.h26
-rw-r--r--remoting/host/desktop_process.cc13
-rw-r--r--remoting/host/desktop_process.h4
-rw-r--r--remoting/host/desktop_process_main.cc18
-rw-r--r--remoting/host/desktop_process_unittest.cc29
-rw-r--r--remoting/host/desktop_session_agent.cc73
-rw-r--r--remoting/host/desktop_session_agent.h31
-rw-r--r--remoting/host/desktop_session_proxy.cc55
-rw-r--r--remoting/host/desktop_session_proxy.h30
-rw-r--r--remoting/host/host_mock_objects.cc32
-rw-r--r--remoting/host/host_mock_objects.h44
-rw-r--r--remoting/host/ipc_desktop_environment.cc76
-rw-r--r--remoting/host/ipc_desktop_environment.h36
-rw-r--r--remoting/host/ipc_desktop_environment_unittest.cc82
-rw-r--r--remoting/host/ipc_screen_controls.cc (renamed from remoting/host/ipc_session_controller.cc)8
-rw-r--r--remoting/host/ipc_screen_controls.h (renamed from remoting/host/ipc_session_controller.h)16
-rw-r--r--remoting/host/me2me_desktop_environment.cc51
-rw-r--r--remoting/host/me2me_desktop_environment.h20
-rw-r--r--remoting/host/plugin/host_script_object.cc5
-rw-r--r--remoting/host/remoting_me2me_host.cc10
-rw-r--r--remoting/host/resizing_host_observer.h10
-rw-r--r--remoting/host/screen_controls.h (renamed from remoting/host/session_controller.h)13
-rw-r--r--remoting/host/win/session_desktop_environment.cc45
-rw-r--r--remoting/host/win/session_desktop_environment.h20
-rw-r--r--remoting/remoting.gyp7
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',