diff options
Diffstat (limited to 'remoting/protocol/host_message_dispatcher.cc')
-rw-r--r-- | remoting/protocol/host_message_dispatcher.cc | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/remoting/protocol/host_message_dispatcher.cc b/remoting/protocol/host_message_dispatcher.cc index 834b5f8..818934f 100644 --- a/remoting/protocol/host_message_dispatcher.cc +++ b/remoting/protocol/host_message_dispatcher.cc @@ -2,27 +2,64 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/message_loop_proxy.h" +#include "net/base/io_buffer.h" +#include "remoting/base/multiple_array_input_stream.h" #include "remoting/proto/control.pb.h" #include "remoting/proto/event.pb.h" +#include "remoting/protocol/chromotocol_connection.h" #include "remoting/protocol/host_message_dispatcher.h" #include "remoting/protocol/host_control_message_handler.h" #include "remoting/protocol/host_event_message_handler.h" -#include "remoting/protocol/stream_reader.h" +#include "remoting/protocol/message_reader.h" namespace remoting { -HostMessageDispatcher::HostMessageDispatcher( - base::MessageLoopProxy* message_loop_proxy, - ChromotingConnection* connection, - HostControlMessageHandler* control_message_handler, - HostEventMessageHandler* event_message_handler) - : message_loop_proxy_(message_loop_proxy), - control_message_handler_(control_message_handler), - event_message_handler_(event_message_handler) { +HostMessageDispatcher::HostMessageDispatcher() { } HostMessageDispatcher::~HostMessageDispatcher() { } +bool HostMessageDispatcher::Initialize( + ChromotocolConnection* connection, + HostControlMessageHandler* control_message_handler, + HostEventMessageHandler* event_message_handler) { + if (!connection || !control_message_handler || !event_message_handler || + !connection->event_channel() || !connection->control_channel()) { + return false; + } + + control_message_reader_.reset(new MessageReader()); + event_message_reader_.reset(new MessageReader()); + control_message_handler_.reset(control_message_handler); + event_message_handler_.reset(event_message_handler); + + // Initialize the readers on the sockets provided by channels. + event_message_reader_->Init<ClientEventMessage>( + connection->event_channel(), + NewCallback(this, &HostMessageDispatcher::OnEventMessageReceived)); + control_message_reader_->Init<ClientControlMessage>( + connection->control_channel(), + NewCallback(this, &HostMessageDispatcher::OnControlMessageReceived)); + return true; +} + +void HostMessageDispatcher::OnControlMessageReceived( + ClientControlMessage* message) { + scoped_refptr<RefCountedMessage<ClientControlMessage> > ref_msg = + new RefCountedMessage<ClientControlMessage>(message); + if (message->has_suggest_screen_resolution_request()) { + control_message_handler_->OnSuggestScreenResolutionRequest( + message->suggest_screen_resolution_request(), + NewRunnableFunction( + &DeleteMessage<RefCountedMessage<ClientControlMessage> >, + ref_msg)); + } +} + +void HostMessageDispatcher::OnEventMessageReceived( + ClientEventMessage* message) { + // TODO(hclam): Implement. +} + } // namespace remoting |