1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef REMOTING_HOST_REMOTE_INPUT_FILTER_H_
6#define REMOTING_HOST_REMOTE_INPUT_FILTER_H_
7
8#include <list>
9
10#include "base/basictypes.h"
11#include "base/compiler_specific.h"
12#include "base/time/time.h"
13#include "remoting/protocol/input_event_tracker.h"
14#include "remoting/protocol/input_stub.h"
15
16namespace remoting {
17
18// Filtering InputStub that filters remotely-injected input if it has been
19// notified of local input recently.
20class RemoteInputFilter : public protocol::InputStub {
21 public:
22  // Creates a filter forwarding events to the specified InputEventTracker.
23  // The filter needs a tracker to release buttons & keys when blocking input.
24  explicit RemoteInputFilter(protocol::InputEventTracker* event_tracker);
25  virtual ~RemoteInputFilter();
26
27  // Informs the filter that local mouse activity has been detected.  If the
28  // activity does not match events we injected then we assume that it is local,
29  // and block remote input for a short while.
30  void LocalMouseMoved(const webrtc::DesktopVector& mouse_pos);
31
32  // Informs the filter that injecting input causes an echo.
33  void SetExpectLocalEcho(bool expect_local_echo);
34
35  // InputStub overrides.
36  virtual void InjectKeyEvent(const protocol::KeyEvent& event) OVERRIDE;
37  virtual void InjectTextEvent(const protocol::TextEvent& event) OVERRIDE;
38  virtual void InjectMouseEvent(const protocol::MouseEvent& event) OVERRIDE;
39
40 private:
41  bool ShouldIgnoreInput() const;
42
43  protocol::InputEventTracker* event_tracker_;
44
45  // Queue of recently-injected mouse positions used to distinguish echoes of
46  // injected events from movements from a local input device.
47  std::list<webrtc::DesktopVector> injected_mouse_positions_;
48
49  // Time at which local input events were most recently observed.
50  base::TimeTicks latest_local_input_time_;
51
52  // If |true| than the filter assumes that injecting input causes an echo.
53  bool expect_local_echo_;
54
55  DISALLOW_COPY_AND_ASSIGN(RemoteInputFilter);
56};
57
58}  // namespace remoting
59
60#endif  // REMOTING_HOST_REMOTE_INPUT_FILTER_H_
61