| Index: remoting/client/chromoting_client.cc
|
| diff --git a/remoting/client/chromoting_client.cc b/remoting/client/chromoting_client.cc
|
| index 8b46a9d68309b1b6e7dba16082758eb20acdfbfe..c47ecd819226a8ee0d63d0116b6124e2e4d0139f 100644
|
| --- a/remoting/client/chromoting_client.cc
|
| +++ b/remoting/client/chromoting_client.cc
|
| @@ -30,7 +30,7 @@ ChromotingClient::ChromotingClient(const ClientConfig& config,
|
| input_handler_(input_handler),
|
| client_done_(client_done),
|
| state_(CREATED),
|
| - message_being_processed_(false) {
|
| + packet_being_processed_(false) {
|
| }
|
|
|
| ChromotingClient::~ChromotingClient() {
|
| @@ -44,7 +44,7 @@ void ChromotingClient::Start() {
|
| return;
|
| }
|
|
|
| - connection_->Connect(config_, this);
|
| + connection_->Connect(config_, this, this);
|
|
|
| if (!view_->Initialize()) {
|
| ClientDone();
|
| @@ -103,51 +103,47 @@ void ChromotingClient::HandleMessage(HostConnection* conn,
|
| return;
|
| }
|
|
|
| - // Put all messages in the queue.
|
| - received_messages_.push_back(msg);
|
| -
|
| - if (!message_being_processed_) {
|
| - DispatchMessage();
|
| - }
|
| -}
|
| -
|
| -void ChromotingClient::DispatchMessage() {
|
| - DCHECK_EQ(message_loop(), MessageLoop::current());
|
| - CHECK(!message_being_processed_);
|
| -
|
| - if (received_messages_.empty()) {
|
| - // Nothing to do!
|
| - return;
|
| - }
|
| -
|
| - ChromotingHostMessage* msg = received_messages_.front();
|
| - received_messages_.pop_front();
|
| - message_being_processed_ = true;
|
| -
|
| // TODO(ajwong): Consider creating a macro similar to the IPC message
|
| // mappings. Also reconsider the lifetime of the message object.
|
| if (msg->has_init_client()) {
|
| ScopedTracer tracer("Handle Init Client");
|
| - // TODO(ajwong): Change this to use a done callback.
|
| - InitClient(msg->init_client(),
|
| - NewTracedMethod(this, &ChromotingClient::OnMessageDone, msg));
|
| - } else if (msg->has_video_packet()) {
|
| - ScopedTracer tracer("Handle Rectangle Update");
|
| - rectangle_decoder_->DecodePacket(
|
| - msg->video_packet(),
|
| - NewTracedMethod(this, &ChromotingClient::OnMessageDone, msg));
|
| + InitClient(msg->init_client());
|
| + delete msg;
|
| } else {
|
| NOTREACHED() << "Unknown message received";
|
| + }
|
| +}
|
|
|
| - // We have an unknown message. Drop it, and schedule another dispatch.
|
| - // Call DispatchMessage as a continuation to avoid growing the stack.
|
| - delete msg;
|
| - message_being_processed_ = false;
|
| +void ChromotingClient::ProcessVideoPacket(const VideoPacket* packet,
|
| + Task* done) {
|
| + if (message_loop() != MessageLoop::current()) {
|
| message_loop()->PostTask(
|
| FROM_HERE,
|
| - NewTracedMethod(this, &ChromotingClient::DispatchMessage));
|
| + NewRunnableMethod(this, &ChromotingClient::ProcessVideoPacket,
|
| + packet, done));
|
| + return;
|
| + }
|
| +
|
| + received_packets_.push_back(QueuedVideoPacket(packet, done));
|
| + if (!packet_being_processed_)
|
| + DispatchPacket();
|
| +}
|
| +
|
| +void ChromotingClient::DispatchPacket() {
|
| + DCHECK_EQ(message_loop(), MessageLoop::current());
|
| + CHECK(!packet_being_processed_);
|
| +
|
| + if (received_packets_.empty()) {
|
| + // Nothing to do!
|
| return;
|
| }
|
| +
|
| + const VideoPacket* packet = received_packets_.front().packet;
|
| + packet_being_processed_ = true;
|
| +
|
| + ScopedTracer tracer("Handle video packet");
|
| + rectangle_decoder_->DecodePacket(
|
| + *packet, NewTracedMethod(this, &ChromotingClient::OnPacketDone));
|
| }
|
|
|
| void ChromotingClient::OnConnectionOpened(HostConnection* conn) {
|
| @@ -185,23 +181,26 @@ void ChromotingClient::SetConnectionState(ConnectionState s) {
|
| Repaint();
|
| }
|
|
|
| -void ChromotingClient::OnMessageDone(ChromotingHostMessage* message) {
|
| +void ChromotingClient::OnPacketDone() {
|
| if (message_loop() != MessageLoop::current()) {
|
| message_loop()->PostTask(
|
| FROM_HERE,
|
| - NewTracedMethod(this, &ChromotingClient::OnMessageDone, message));
|
| + NewTracedMethod(this, &ChromotingClient::OnPacketDone));
|
| return;
|
| }
|
|
|
| - TraceContext::tracer()->PrintString("Message done");
|
| + TraceContext::tracer()->PrintString("Packet done");
|
|
|
| - message_being_processed_ = false;
|
| - delete message;
|
| - DispatchMessage();
|
| + received_packets_.front().done->Run();
|
| + delete received_packets_.front().done;
|
| + received_packets_.pop_front();
|
| +
|
| + packet_being_processed_ = false;
|
| +
|
| + DispatchPacket();
|
| }
|
|
|
| -void ChromotingClient::InitClient(const InitClientMessage& init_client,
|
| - Task* done) {
|
| +void ChromotingClient::InitClient(const InitClientMessage& init_client) {
|
| DCHECK_EQ(message_loop(), MessageLoop::current());
|
| TraceContext::tracer()->PrintString("Init received");
|
|
|
| @@ -217,9 +216,6 @@ void ChromotingClient::InitClient(const InitClientMessage& init_client,
|
|
|
| // Schedule the input handler to process the event queue.
|
| input_handler_->Initialize();
|
| -
|
| - done->Run();
|
| - delete done;
|
| }
|
|
|
| } // namespace remoting
|
|
|