Index: remoting/protocol/host_message_dispatcher.cc |
diff --git a/remoting/protocol/host_message_dispatcher.cc b/remoting/protocol/host_message_dispatcher.cc |
index 148dccf613b4106943a9f060083974c80d237e36..5406813e792f675afbedd83fb624b687430a4d83 100644 |
--- a/remoting/protocol/host_message_dispatcher.cc |
+++ b/remoting/protocol/host_message_dispatcher.cc |
@@ -9,13 +9,43 @@ |
#include "remoting/proto/video.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/host_stub.h" |
+#include "remoting/protocol/input_stub.h" |
#include "remoting/protocol/message_reader.h" |
+namespace { |
+ |
+// A single protobuf can contain multiple messages that will be handled by |
+// different message handlers. We use this wrapper to ensure that the |
+// protobuf is only deleted after all the handlers have finished executing. |
+template <typename T> |
+class RefCountedMessage : public base::RefCounted<RefCountedMessage<T> > { |
+ public: |
+ RefCountedMessage(T* message) : message_(message) { } |
+ |
+ T* message() { return message_.get(); } |
+ |
+ private: |
+ scoped_ptr<T> message_; |
+}; |
+ |
+// Dummy methods to destroy messages. |
+template <class T> |
+static void DeleteMessage(scoped_refptr<T> message) { } |
+ |
+template <class T> |
+static Task* NewDeleteTask(scoped_refptr<T> message) { |
+ return NewRunnableFunction(&DeleteMessage<T>, message); |
+} |
+ |
+} // namespace |
+ |
namespace remoting { |
+namespace protocol { |
-HostMessageDispatcher::HostMessageDispatcher() { |
+HostMessageDispatcher::HostMessageDispatcher() : |
+ host_stub_(NULL), |
+ input_stub_(NULL) { |
} |
HostMessageDispatcher::~HostMessageDispatcher() { |
@@ -23,44 +53,40 @@ HostMessageDispatcher::~HostMessageDispatcher() { |
bool HostMessageDispatcher::Initialize( |
ChromotocolConnection* connection, |
- HostControlMessageHandler* control_message_handler, |
- HostEventMessageHandler* event_message_handler) { |
- if (!connection || !control_message_handler || !event_message_handler || |
+ HostStub* host_stub, InputStub* input_stub) { |
+ if (!connection || !host_stub || !input_stub || |
!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); |
+ host_stub_ = host_stub; |
+ input_stub_ = input_stub; |
// Initialize the readers on the sockets provided by channels. |
- event_message_reader_->Init<ClientEventMessage>( |
+ event_message_reader_->Init<EventMessage>( |
connection->event_channel(), |
NewCallback(this, &HostMessageDispatcher::OnEventMessageReceived)); |
- control_message_reader_->Init<ClientControlMessage>( |
+ control_message_reader_->Init<ControlMessage>( |
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::OnControlMessageReceived(ControlMessage* message) { |
+ scoped_refptr<RefCountedMessage<ControlMessage> > ref_msg = |
+ new RefCountedMessage<ControlMessage>(message); |
+ if (message->has_suggest_resolution()) { |
+ host_stub_->SuggestResolution( |
+ message->suggest_resolution(), NewDeleteTask(ref_msg)); |
} |
} |
void HostMessageDispatcher::OnEventMessageReceived( |
- ClientEventMessage* message) { |
+ EventMessage* message) { |
// TODO(hclam): Implement. |
} |
+} // namespace protocol |
} // namespace remoting |