| // Copyright (c) 2011 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 "base/memory/ref_counted.h" |
| #include "net/base/io_buffer.h" |
| #include "remoting/proto/control.pb.h" |
| #include "remoting/proto/event.pb.h" |
| #include "remoting/proto/internal.pb.h" |
| #include "remoting/protocol/connection_to_client.h" |
| #include "remoting/protocol/host_message_dispatcher.h" |
| #include "remoting/protocol/host_stub.h" |
| #include "remoting/protocol/input_stub.h" |
| #include "remoting/protocol/message_reader.h" |
| #include "remoting/protocol/session.h" |
| |
| namespace remoting { |
| namespace protocol { |
| |
| HostMessageDispatcher::HostMessageDispatcher() |
| : connection_(NULL), |
| host_stub_(NULL), |
| input_stub_(NULL) { |
| } |
| |
| HostMessageDispatcher::~HostMessageDispatcher() { |
| } |
| |
| void HostMessageDispatcher::Initialize( |
| ConnectionToClient* connection, |
| HostStub* host_stub, InputStub* input_stub) { |
| if (!connection || !host_stub || !input_stub || |
| !connection->session()->event_channel() || |
| !connection->session()->control_channel()) { |
| return; |
| } |
| |
| control_message_reader_.reset(new ProtobufMessageReader<ControlMessage>()); |
| event_message_reader_.reset(new ProtobufMessageReader<EventMessage>()); |
| connection_ = connection; |
| host_stub_ = host_stub; |
| input_stub_ = input_stub; |
| |
| // Initialize the readers on the sockets provided by channels. |
| event_message_reader_->Init( |
| connection->session()->event_channel(), |
| base::Bind(&HostMessageDispatcher::OnEventMessageReceived, |
| base::Unretained(this))); |
| control_message_reader_->Init( |
| connection->session()->control_channel(), |
| base::Bind(&HostMessageDispatcher::OnControlMessageReceived, |
| base::Unretained(this))); |
| } |
| |
| void HostMessageDispatcher::OnControlMessageReceived( |
| ControlMessage* message, const base::Closure& done_task) { |
| if (message->has_begin_session_request()) { |
| const BeginSessionRequest& request = message->begin_session_request(); |
| if (request.has_credentials() && request.credentials().has_type()) { |
| host_stub_->BeginSessionRequest(&request.credentials(), done_task); |
| return; |
| } |
| } |
| |
| LOG(WARNING) << "Invalid control message received."; |
| done_task.Run(); |
| } |
| |
| void HostMessageDispatcher::OnEventMessageReceived( |
| EventMessage* message, const base::Closure& done_task) { |
| base::ScopedClosureRunner done_runner(done_task); |
| |
| connection_->UpdateSequenceNumber(message->sequence_number()); |
| |
| if (message->has_key_event()) { |
| const KeyEvent& event = message->key_event(); |
| if (event.has_keycode() && event.has_pressed()) { |
| input_stub_->InjectKeyEvent(event); |
| return; |
| } |
| } else if (message->has_mouse_event()) { |
| input_stub_->InjectMouseEvent(message->mouse_event()); |
| return; |
| } |
| |
| LOG(WARNING) << "Unknown event message received."; |
| } |
| |
| } // namespace protocol |
| } // namespace remoting |