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

Side by Side Diff: remoting/host/client_session.cc

Issue 7799014: Fix stuck keys problem with Chromoting when host disconnects while keys are (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: use DeleteTask Created 9 years, 3 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/host/client_session.h" 5 #include "remoting/host/client_session.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/task.h" 9 #include "base/task.h"
10 #include "remoting/host/user_authenticator.h" 10 #include "remoting/host/user_authenticator.h"
11 #include "remoting/proto/auth.pb.h" 11 #include "remoting/proto/auth.pb.h"
12 #include "remoting/proto/event.pb.h" 12 #include "remoting/proto/event.pb.h"
13 13
14 // The number of remote mouse events to record for the purpose of eliminating 14 // The number of remote mouse events to record for the purpose of eliminating
15 // "echoes" detected by the local input detector. The value should be large 15 // "echoes" detected by the local input detector. The value should be large
16 // enough to cope with the fact that multiple events might be injected before 16 // enough to cope with the fact that multiple events might be injected before
17 // any echoes are detected. 17 // any echoes are detected.
18 static const unsigned int kNumRemoteMousePositions = 50; 18 static const unsigned int kNumRemoteMousePositions = 50;
19 19
20 // The number of milliseconds for which to block remote input when local input 20 // The number of milliseconds for which to block remote input when local input
21 // is received. 21 // is received.
22 static const int64 kRemoteBlockTimeoutMillis = 2000; 22 static const int64 kRemoteBlockTimeoutMillis = 2000;
23 23
24 namespace remoting { 24 namespace remoting {
25 25
26 using protocol::KeyEvent;
27
26 ClientSession::ClientSession( 28 ClientSession::ClientSession(
27 EventHandler* event_handler, 29 EventHandler* event_handler,
28 UserAuthenticator* user_authenticator, 30 UserAuthenticator* user_authenticator,
29 scoped_refptr<protocol::ConnectionToClient> connection, 31 scoped_refptr<protocol::ConnectionToClient> connection,
30 protocol::InputStub* input_stub) 32 protocol::InputStub* input_stub)
31 : event_handler_(event_handler), 33 : event_handler_(event_handler),
32 user_authenticator_(user_authenticator), 34 user_authenticator_(user_authenticator),
33 connection_(connection), 35 connection_(connection),
34 input_stub_(input_stub), 36 input_stub_(input_stub),
35 authenticated_(false), 37 authenticated_(false),
(...skipping 28 matching lines...) Expand all
64 void ClientSession::OnAuthorizationComplete(bool success) { 66 void ClientSession::OnAuthorizationComplete(bool success) {
65 if (success) { 67 if (success) {
66 authenticated_ = true; 68 authenticated_ = true;
67 event_handler_->LocalLoginSucceeded(connection_.get()); 69 event_handler_->LocalLoginSucceeded(connection_.get());
68 } else { 70 } else {
69 LOG(WARNING) << "Login failed"; 71 LOG(WARNING) << "Login failed";
70 event_handler_->LocalLoginFailed(connection_.get()); 72 event_handler_->LocalLoginFailed(connection_.get());
71 } 73 }
72 } 74 }
73 75
74 void ClientSession::InjectKeyEvent(const protocol::KeyEvent* event, 76 void ClientSession::InjectKeyEvent(const KeyEvent* event, Task* done) {
75 Task* done) {
76 base::ScopedTaskRunner done_runner(done); 77 base::ScopedTaskRunner done_runner(done);
77 if (authenticated_ && !ShouldIgnoreRemoteKeyboardInput(event)) { 78 if (authenticated_ && !ShouldIgnoreRemoteKeyboardInput(event)) {
78 RecordKeyEvent(event); 79 RecordKeyEvent(event);
79 input_stub_->InjectKeyEvent(event, done_runner.Release()); 80 input_stub_->InjectKeyEvent(event, done_runner.Release());
80 } 81 }
81 } 82 }
82 83
83 void ClientSession::InjectMouseEvent(const protocol::MouseEvent* event, 84 void ClientSession::InjectMouseEvent(const protocol::MouseEvent* event,
84 Task* done) { 85 Task* done) {
85 base::ScopedTaskRunner done_runner(done); 86 base::ScopedTaskRunner done_runner(done);
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 return true; 149 return true;
149 // Otherwise, ignore remote mouse events if the local mouse moved recently. 150 // Otherwise, ignore remote mouse events if the local mouse moved recently.
150 int64 millis = (base::Time::Now() - latest_local_input_time_) 151 int64 millis = (base::Time::Now() - latest_local_input_time_)
151 .InMilliseconds(); 152 .InMilliseconds();
152 if (millis < kRemoteBlockTimeoutMillis) 153 if (millis < kRemoteBlockTimeoutMillis)
153 return true; 154 return true;
154 return false; 155 return false;
155 } 156 }
156 157
157 bool ClientSession::ShouldIgnoreRemoteKeyboardInput( 158 bool ClientSession::ShouldIgnoreRemoteKeyboardInput(
158 const protocol::KeyEvent* event) const { 159 const KeyEvent* event) const {
159 // If the host user has not yet approved the continuation of the connection, 160 // If the host user has not yet approved the continuation of the connection,
160 // then all remote keyboard input is ignored, except to release keys that 161 // then all remote keyboard input is ignored, except to release keys that
161 // were already pressed. 162 // were already pressed.
162 if (awaiting_continue_approval_) { 163 if (awaiting_continue_approval_) {
163 return event->pressed() || 164 return event->pressed() ||
164 (pressed_keys_.find(event->keycode()) == pressed_keys_.end()); 165 (pressed_keys_.find(event->keycode()) == pressed_keys_.end());
165 } 166 }
166 return false; 167 return false;
167 } 168 }
168 169
169 void ClientSession::RecordKeyEvent(const protocol::KeyEvent* event) { 170 void ClientSession::RecordKeyEvent(const KeyEvent* event) {
170 if (event->pressed()) { 171 if (event->pressed()) {
171 pressed_keys_.insert(event->keycode()); 172 pressed_keys_.insert(event->keycode());
172 } else { 173 } else {
173 pressed_keys_.erase(event->keycode()); 174 pressed_keys_.erase(event->keycode());
174 } 175 }
175 } 176 }
176 177
177 void ClientSession::UnpressKeys() { 178 void ClientSession::UnpressKeys() {
178 std::set<int>::iterator i; 179 std::set<int>::iterator i;
179 for (i = pressed_keys_.begin(); i != pressed_keys_.end(); ++i) { 180 for (i = pressed_keys_.begin(); i != pressed_keys_.end(); ++i) {
180 protocol::KeyEvent key; 181 KeyEvent* key = new protocol::KeyEvent();
Sergey Ulanov 2011/08/30 02:27:39 nit: s/protocol:://
garykac 2011/08/30 16:31:48 Done.
181 key.set_keycode(*i); 182 key->set_keycode(*i);
182 key.set_pressed(false); 183 key->set_pressed(false);
183 input_stub_->InjectKeyEvent(&key, NULL); 184 input_stub_->InjectKeyEvent(key, new DeleteTask<KeyEvent>(key));
Sergey Ulanov 2011/08/30 02:27:39 Please add DCHECK(done_task) in InputSender::Injec
garykac 2011/08/30 16:31:48 Done.
184 } 185 }
185 pressed_keys_.clear(); 186 pressed_keys_.clear();
186 } 187 }
187 188
188 } // namespace remoting 189 } // namespace remoting
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698