15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/host_event_dispatcher.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/socket/stream_socket.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/base/constants.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/proto/event.pb.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/proto/internal.pb.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "remoting/protocol/input_stub.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace remoting { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protocol { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostEventDispatcher::HostEventDispatcher() 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ChannelDispatcherBase(kEventChannelName), 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_stub_(NULL) { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HostEventDispatcher::~HostEventDispatcher() { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostEventDispatcher::OnInitialized() { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reader_.Init(channel(), base::Bind( 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &HostEventDispatcher::OnMessageReceived, base::Unretained(this))); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HostEventDispatcher::OnMessageReceived( 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<EventMessage> message, const base::Closure& done_task) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(input_stub_); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ScopedClosureRunner done_runner(done_task); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (message->has_sequence_number() && !sequence_number_callback_.is_null()) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sequence_number_callback_.Run(message->sequence_number()); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (message->has_key_event()) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const KeyEvent& event = message->key_event(); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event.has_usb_keycode() && event.has_pressed()) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_stub_->InjectKeyEvent(event); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Received invalid key event."; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (message->has_mouse_event()) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_stub_->InjectMouseEvent(message->mouse_event()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(WARNING) << "Unknown event message received."; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protocol 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace remoting 55