1fab1498f2f42726c7de46c3ed560d56dd072a8b3rossberg@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
5ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "remoting/protocol/host_event_dispatcher.h"
6ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
7ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org#include "base/callback_helpers.h"
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "net/socket/stream_socket.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "remoting/base/constants.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "remoting/proto/event.pb.h"
111e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org#include "remoting/proto/internal.pb.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "remoting/protocol/input_stub.h"
13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
144b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.orgnamespace remoting {
15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgnamespace protocol {
16196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
17196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgHostEventDispatcher::HostEventDispatcher()
18196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org    : ChannelDispatcherBase(kEventChannelName),
19196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org      input_stub_(NULL) {
203e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org}
21196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org
22196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgHostEventDispatcher::~HostEventDispatcher() {
23196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org}
244b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org
25196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.orgvoid HostEventDispatcher::OnInitialized() {
26ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  reader_.Init(channel(), base::Bind(
27ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      &HostEventDispatcher::OnMessageReceived, base::Unretained(this)));
285de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org}
295de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org
305de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.orgvoid HostEventDispatcher::OnMessageReceived(
315de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    scoped_ptr<EventMessage> message, const base::Closure& done_task) {
325de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  DCHECK(input_stub_);
33ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
34ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  base::ScopedClosureRunner done_runner(done_task);
35ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
3647390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org  if (message->has_sequence_number() && !sequence_number_callback_.is_null())
37ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    sequence_number_callback_.Run(message->sequence_number());
38ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
3947390597afd6b17870f41dfb5dd8c057aea1f068machenbach@chromium.org  if (message->has_key_event()) {
40e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    const KeyEvent& event = message->key_event();
41ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (event.has_usb_keycode() && event.has_pressed()) {
4257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org      input_stub_->InjectKeyEvent(event);
43ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    } else {
44ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      LOG(WARNING) << "Received invalid key event.";
45ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
46ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (message->has_text_event()) {
47ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    const TextEvent& event = message->text_event();
48ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    if (event.has_text()) {
49ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      input_stub_->InjectTextEvent(event);
50c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org    } else {
51ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      LOG(WARNING) << "Received invalid text event.";
52ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    }
53ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (message->has_mouse_event()) {
54ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    input_stub_->InjectMouseEvent(message->mouse_event());
55ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else {
56750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org    LOG(WARNING) << "Unknown event message received.";
57750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  }
58ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
59c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
6057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org}  // namespace protocol
615924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org}  // namespace remoting
62ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org