| Index: remoting/host/win/session_event_executor.cc
|
| diff --git a/remoting/host/win/session_event_executor.cc b/remoting/host/win/session_event_executor.cc
|
| deleted file mode 100644
|
| index 78121f1b15e47699013687f27501e863ceb1b433..0000000000000000000000000000000000000000
|
| --- a/remoting/host/win/session_event_executor.cc
|
| +++ /dev/null
|
| @@ -1,224 +0,0 @@
|
| -// Copyright (c) 2012 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.
|
| -
|
| -#include "remoting/host/win/session_event_executor.h"
|
| -
|
| -#include <set>
|
| -#include <string>
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/callback.h"
|
| -#include "base/compiler_specific.h"
|
| -#include "base/location.h"
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "base/win/windows_version.h"
|
| -#include "media/video/capture/screen/win/desktop.h"
|
| -#include "media/video/capture/screen/win/scoped_thread_desktop.h"
|
| -#include "remoting/host/sas_injector.h"
|
| -#include "remoting/proto/event.pb.h"
|
| -
|
| -namespace {
|
| -
|
| -const uint32 kUsbLeftControl = 0x0700e0;
|
| -const uint32 kUsbRightControl = 0x0700e4;
|
| -const uint32 kUsbLeftAlt = 0x0700e2;
|
| -const uint32 kUsbRightAlt = 0x0700e6;
|
| -const uint32 kUsbDelete = 0x07004c;
|
| -
|
| -bool CheckCtrlAndAltArePressed(const std::set<uint32>& pressed_keys) {
|
| - size_t ctrl_keys = pressed_keys.count(kUsbLeftControl) +
|
| - pressed_keys.count(kUsbRightControl);
|
| - size_t alt_keys = pressed_keys.count(kUsbLeftAlt) +
|
| - pressed_keys.count(kUsbRightAlt);
|
| - return ctrl_keys != 0 && alt_keys != 0 &&
|
| - (ctrl_keys + alt_keys == pressed_keys.size());
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace remoting {
|
| -
|
| -using protocol::ClipboardEvent;
|
| -using protocol::MouseEvent;
|
| -using protocol::KeyEvent;
|
| -
|
| -class SessionEventExecutorWin::Core
|
| - : public base::RefCountedThreadSafe<SessionEventExecutorWin::Core>,
|
| - public EventExecutor {
|
| - public:
|
| - Core(
|
| - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
|
| - scoped_ptr<EventExecutor> nested_executor,
|
| - scoped_refptr<base::SingleThreadTaskRunner> inject_sas_task_runner,
|
| - const base::Closure& inject_sas);
|
| -
|
| - // EventExecutor implementation.
|
| - virtual void Start(
|
| - scoped_ptr<protocol::ClipboardStub> client_clipboard) OVERRIDE;
|
| -
|
| - // protocol::ClipboardStub implementation.
|
| - virtual void InjectClipboardEvent(
|
| - const protocol::ClipboardEvent& event) OVERRIDE;
|
| -
|
| - // protocol::InputStub implementation.
|
| - virtual void InjectKeyEvent(const protocol::KeyEvent& event) OVERRIDE;
|
| - virtual void InjectMouseEvent(const protocol::MouseEvent& event) OVERRIDE;
|
| -
|
| - private:
|
| - friend class base::RefCountedThreadSafe<Core>;
|
| - virtual ~Core();
|
| -
|
| - // Switches to the desktop receiving a user input if different from
|
| - // the current one.
|
| - void SwitchToInputDesktop();
|
| -
|
| - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner_;
|
| -
|
| - // Pointer to the next event executor.
|
| - scoped_ptr<EventExecutor> nested_executor_;
|
| -
|
| - scoped_refptr<base::SingleThreadTaskRunner> inject_sas_task_runner_;
|
| -
|
| - media::ScopedThreadDesktop desktop_;
|
| -
|
| - // Used to inject Secure Attention Sequence on Vista+.
|
| - base::Closure inject_sas_;
|
| -
|
| - // Used to inject Secure Attention Sequence on XP.
|
| - scoped_ptr<SasInjector> sas_injector_;
|
| -
|
| - // Keys currently pressed by the client, used to detect Ctrl-Alt-Del.
|
| - std::set<uint32> pressed_keys_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Core);
|
| -};
|
| -
|
| -SessionEventExecutorWin::Core::Core(
|
| - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
|
| - scoped_ptr<EventExecutor> nested_executor,
|
| - scoped_refptr<base::SingleThreadTaskRunner> inject_sas_task_runner,
|
| - const base::Closure& inject_sas)
|
| - : input_task_runner_(input_task_runner),
|
| - nested_executor_(nested_executor.Pass()),
|
| - inject_sas_task_runner_(inject_sas_task_runner),
|
| - inject_sas_(inject_sas) {
|
| -}
|
| -
|
| -void SessionEventExecutorWin::Core::Start(
|
| - scoped_ptr<protocol::ClipboardStub> client_clipboard) {
|
| - if (!input_task_runner_->BelongsToCurrentThread()) {
|
| - input_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(&Core::Start, this, base::Passed(&client_clipboard)));
|
| - return;
|
| - }
|
| -
|
| - nested_executor_->Start(client_clipboard.Pass());
|
| -}
|
| -
|
| -void SessionEventExecutorWin::Core::InjectClipboardEvent(
|
| - const ClipboardEvent& event) {
|
| - if (!input_task_runner_->BelongsToCurrentThread()) {
|
| - input_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&Core::InjectClipboardEvent, this, event));
|
| - return;
|
| - }
|
| -
|
| - nested_executor_->InjectClipboardEvent(event);
|
| -}
|
| -
|
| -void SessionEventExecutorWin::Core::InjectKeyEvent(const KeyEvent& event) {
|
| - if (!input_task_runner_->BelongsToCurrentThread()) {
|
| - input_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&Core::InjectKeyEvent, this, event));
|
| - return;
|
| - }
|
| -
|
| - // HostEventDispatcher should drop events lacking the pressed field.
|
| - DCHECK(event.has_pressed());
|
| -
|
| - if (event.has_usb_keycode()) {
|
| - if (event.pressed()) {
|
| - // Simulate secure attention sequence if Ctrl-Alt-Del was just pressed.
|
| - if (event.usb_keycode() == kUsbDelete &&
|
| - CheckCtrlAndAltArePressed(pressed_keys_)) {
|
| - VLOG(3) << "Sending Secure Attention Sequence to console";
|
| -
|
| - if (base::win::GetVersion() < base::win::VERSION_VISTA) {
|
| - if (!sas_injector_)
|
| - sas_injector_ = SasInjector::Create();
|
| - if (!sas_injector_->InjectSas())
|
| - LOG(ERROR) << "Failed to inject Secure Attention Sequence.";
|
| - } else {
|
| - inject_sas_task_runner_->PostTask(FROM_HERE, inject_sas_);
|
| - }
|
| - }
|
| -
|
| - pressed_keys_.insert(event.usb_keycode());
|
| - } else {
|
| - pressed_keys_.erase(event.usb_keycode());
|
| - }
|
| - }
|
| -
|
| - SwitchToInputDesktop();
|
| - nested_executor_->InjectKeyEvent(event);
|
| -}
|
| -
|
| -void SessionEventExecutorWin::Core::InjectMouseEvent(const MouseEvent& event) {
|
| - if (!input_task_runner_->BelongsToCurrentThread()) {
|
| - input_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(&Core::InjectMouseEvent, this, event));
|
| - return;
|
| - }
|
| -
|
| - SwitchToInputDesktop();
|
| - nested_executor_->InjectMouseEvent(event);
|
| -}
|
| -
|
| -SessionEventExecutorWin::Core::~Core() {
|
| -}
|
| -
|
| -void SessionEventExecutorWin::Core::SwitchToInputDesktop() {
|
| - // Switch to the desktop receiving user input if different from the current
|
| - // one.
|
| - scoped_ptr<media::Desktop> input_desktop = media::Desktop::GetInputDesktop();
|
| - if (input_desktop.get() != NULL && !desktop_.IsSame(*input_desktop)) {
|
| - // If SetThreadDesktop() fails, the thread is still assigned a desktop.
|
| - // So we can continue capture screen bits, just from a diffected desktop.
|
| - desktop_.SetThreadDesktop(input_desktop.Pass());
|
| - }
|
| -}
|
| -
|
| -SessionEventExecutorWin::SessionEventExecutorWin(
|
| - scoped_refptr<base::SingleThreadTaskRunner> input_task_runner,
|
| - scoped_ptr<EventExecutor> nested_executor,
|
| - scoped_refptr<base::SingleThreadTaskRunner> inject_sas_task_runner,
|
| - const base::Closure& inject_sas) {
|
| - core_ = new Core(input_task_runner, nested_executor.Pass(),
|
| - inject_sas_task_runner, inject_sas);
|
| -}
|
| -
|
| -SessionEventExecutorWin::~SessionEventExecutorWin() {
|
| -}
|
| -
|
| -void SessionEventExecutorWin::Start(
|
| - scoped_ptr<protocol::ClipboardStub> client_clipboard) {
|
| - core_->Start(client_clipboard.Pass());
|
| -}
|
| -
|
| -void SessionEventExecutorWin::InjectClipboardEvent(
|
| - const protocol::ClipboardEvent& event) {
|
| - core_->InjectClipboardEvent(event);
|
| -}
|
| -
|
| -void SessionEventExecutorWin::InjectKeyEvent(const protocol::KeyEvent& event) {
|
| - core_->InjectKeyEvent(event);
|
| -}
|
| -
|
| -void SessionEventExecutorWin::InjectMouseEvent(
|
| - const protocol::MouseEvent& event) {
|
| - core_->InjectMouseEvent(event);
|
| -}
|
| -
|
| -} // namespace remoting
|
|
|