| // 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/protocol/host_event_dispatcher.h" | 
 |  | 
 | #include "base/memory/ref_counted.h" | 
 | #include "net/socket/stream_socket.h" | 
 | #include "remoting/base/compound_buffer.h" | 
 | #include "remoting/base/constants.h" | 
 | #include "remoting/proto/event.pb.h" | 
 | #include "remoting/proto/internal.pb.h" | 
 | #include "remoting/protocol/input_stub.h" | 
 | #include "remoting/protocol/message_serialization.h" | 
 |  | 
 | namespace remoting { | 
 | namespace protocol { | 
 |  | 
 | HostEventDispatcher::HostEventDispatcher() | 
 |     : ChannelDispatcherBase(kEventChannelName), | 
 |       event_timestamps_source_(new InputEventTimestampsSourceImpl()) {} | 
 |  | 
 | HostEventDispatcher::~HostEventDispatcher() = default; | 
 |  | 
 | void HostEventDispatcher::OnIncomingMessage( | 
 |     std::unique_ptr<CompoundBuffer> buffer) { | 
 |   DCHECK(input_stub_); | 
 |  | 
 |   std::unique_ptr<EventMessage> message = | 
 |       ParseMessage<EventMessage>(buffer.get()); | 
 |   if (!message) | 
 |     return; | 
 |  | 
 |   event_timestamps_source_->OnEventReceived(InputEventTimestamps{ | 
 |       base::TimeTicks::FromInternalValue(message->timestamp()), | 
 |       base::TimeTicks::Now()}); | 
 |  | 
 |   if (message->has_key_event()) { | 
 |     const KeyEvent& event = message->key_event(); | 
 |     if (event.has_usb_keycode() && event.has_pressed()) { | 
 |       input_stub_->InjectKeyEvent(event); | 
 |     } else { | 
 |       LOG(WARNING) << "Received invalid key event."; | 
 |     } | 
 |   } else if (message->has_text_event()) { | 
 |     const TextEvent& event = message->text_event(); | 
 |     if (event.has_text()) { | 
 |       input_stub_->InjectTextEvent(event); | 
 |     } else { | 
 |       LOG(WARNING) << "Received invalid text event."; | 
 |     } | 
 |   } else if (message->has_mouse_event()) { | 
 |     input_stub_->InjectMouseEvent(message->mouse_event()); | 
 |   } else if (message->has_touch_event()) { | 
 |     input_stub_->InjectTouchEvent(message->touch_event()); | 
 |   } else { | 
 |     LOG(WARNING) << "Unknown event message received."; | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace protocol | 
 | }  // namespace remoting |