Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(401)

Unified Diff: remoting/host/event_executor_win.cc

Issue 9617027: Chromoting: Implemented security attention sequence (SAS) emulation on Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: remoting/host/event_executor_win.cc
diff --git a/remoting/host/event_executor_win.cc b/remoting/host/event_executor_win.cc
index b1f58427f4c01799147294faa6b264b37c15ac0d..724e18c66d002f1ff59229694655606eeca0aa60 100644
--- a/remoting/host/event_executor_win.cc
+++ b/remoting/host/event_executor_win.cc
@@ -9,10 +9,14 @@
#include "base/bind.h"
#include "base/compiler_specific.h"
#include "base/message_loop.h"
+#include "ipc/ipc_channel.h"
+#include "ipc/ipc_channel_proxy.h"
#include "remoting/host/capturer.h"
#include "remoting/proto/event.pb.h"
#include "ui/base/keycodes/keyboard_codes.h"
+#include "remoting/host/chromoting_service_messages.h"
+
namespace remoting {
using protocol::MouseEvent;
@@ -20,15 +24,23 @@ using protocol::KeyEvent;
namespace {
+// Name of the chromoting service IPC channel.
+const char kChromotingServiceChannelName[] = "chromoting_service";
+
// A class to generate events on Windows.
-class EventExecutorWin : public EventExecutor {
+class EventExecutorWin : public EventExecutor, public IPC::Channel::Listener {
public:
- EventExecutorWin(MessageLoop* message_loop, Capturer* capturer);
+ EventExecutorWin(MessageLoop* message_loop,
+ base::MessageLoopProxy* io_message_loop,
+ Capturer* capturer);
Wez 2012/03/07 01:56:13 EventExecutorWin is responsible just for injecting
alexeypa (please no reviews) 2012/03/07 19:59:08 There is DesktopEnvironment class that looks like
Wez 2012/03/08 00:01:33 DesktopEnvironment is a cross-platform interface f
alexeypa (please no reviews) 2012/03/08 01:52:54 OK, makes sense.
virtual ~EventExecutorWin() {}
virtual void InjectKeyEvent(const KeyEvent& event) OVERRIDE;
virtual void InjectMouseEvent(const MouseEvent& event) OVERRIDE;
+ // IPC::Channel::Listener implementation.
+ virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
+
private:
void HandleKey(const KeyEvent& event);
void HandleMouse(const MouseEvent& event);
@@ -36,13 +48,28 @@ class EventExecutorWin : public EventExecutor {
MessageLoop* message_loop_;
Capturer* capturer_;
+ // IPC channel connecting the host with the chromoting service.
+ scoped_ptr<IPC::ChannelProxy> chromoting_service_;
+
+ bool scroll_pressed_;
+
DISALLOW_COPY_AND_ASSIGN(EventExecutorWin);
};
EventExecutorWin::EventExecutorWin(MessageLoop* message_loop,
+ base::MessageLoopProxy* io_message_loop,
Capturer* capturer)
: message_loop_(message_loop),
- capturer_(capturer) {
+ capturer_(capturer),
+ scroll_pressed_(false) {
+ // Connect to the service.
+ if (io_message_loop) {
+ chromoting_service_.reset(new IPC::ChannelProxy(
+ kChromotingServiceChannelName,
+ IPC::Channel::MODE_CLIENT,
+ this,
+ io_message_loop));
+ }
}
void EventExecutorWin::InjectKeyEvent(const KeyEvent& event) {
@@ -54,6 +81,22 @@ void EventExecutorWin::InjectKeyEvent(const KeyEvent& event) {
return;
}
+ // Poor man's Ctrl+Alt+Delete emulation: a double Scroll Lock is converted to
+ // the security attention sequence.
+ // TODO(alexeypa): replace this with proper SAS handling.
+ if (chromoting_service_.get() != NULL && event.keycode() == VK_SCROLL) {
+ if (event.pressed()) {
+ if (scroll_pressed_) {
+ chromoting_service_->Send(new ChromotingServiceMsg_SendSas());
+ scroll_pressed_ = false;
+ } else {
+ scroll_pressed_ = true;
+ }
+ }
+ } else {
+ scroll_pressed_ = false;
+ }
+
HandleKey(event);
}
@@ -165,11 +208,16 @@ void EventExecutorWin::HandleMouse(const MouseEvent& event) {
}
}
+bool EventExecutorWin::OnMessageReceived(const IPC::Message& message) {
+ return false;
+}
+
} // namespace
EventExecutor* EventExecutor::Create(MessageLoop* message_loop,
+ base::MessageLoopProxy* io_message_loop,
Capturer* capturer) {
- return new EventExecutorWin(message_loop, capturer);
+ return new EventExecutorWin(message_loop, io_message_loop, capturer);
}
} // namespace remoting

Powered by Google App Engine
This is Rietveld 408576698