Chromium Code Reviews| Index: remoting/client/chromoting_client.cc |
| =================================================================== |
| --- remoting/client/chromoting_client.cc (revision 52921) |
| +++ remoting/client/chromoting_client.cc (working copy) |
| @@ -6,7 +6,10 @@ |
| #include "base/message_loop.h" |
| #include "remoting/client/chromoting_view.h" |
| +#include "remoting/client/client_config.h" |
| +#include "remoting/client/client_context.h" |
| #include "remoting/client/host_connection.h" |
| +#include "remoting/client/input_handler.h" |
| static const uint32 kCreatedColor = 0xffccccff; |
| static const uint32 kDisconnectedColor = 0xff00ccff; |
| @@ -14,53 +17,107 @@ |
| namespace remoting { |
| -ChromotingClient::ChromotingClient(MessageLoop* message_loop, |
| +ChromotingClient::ChromotingClient(ClientConfig* config, |
| + ClientContext* context, |
| HostConnection* connection, |
| - ChromotingView* view) |
| - : message_loop_(message_loop), |
| - state_(CREATED), |
| - host_connection_(connection), |
| - view_(view) { |
| + ChromotingView* view, |
| + InputHandler* input_handler, |
| + CancelableTask* client_done) |
| + : config_(config), |
| + context_(context), |
| + connection_(connection), |
| + view_(view), |
| + input_handler_(input_handler), |
| + client_done_(client_done), |
| + state_(CREATED) { |
| } |
| ChromotingClient::~ChromotingClient() { |
| } |
| +void ChromotingClient::Start() { |
| + if (message_loop() != MessageLoop::current()) { |
| + message_loop()->PostTask( |
| + FROM_HERE, |
| + NewRunnableMethod(this, &ChromotingClient::Start)); |
| + return; |
| + } |
| + |
| + connection_->Connect(config_, this); |
| + |
| + if (!view_->Initialize()) { |
| + ClientDone(); |
| + } |
| + |
|
awong
2010/07/19 21:50:10
remove extra newline.
|
| +} |
| + |
| +void ChromotingClient::Stop() { |
| + if (message_loop() != MessageLoop::current()) { |
| + message_loop()->PostTask( |
| + FROM_HERE, |
| + NewRunnableMethod(this, &ChromotingClient::Stop)); |
| + return; |
| + } |
| + |
| + connection_->Disconnect(); |
| + |
| + view_->TearDown(); |
| + |
| + // Quit the current message loop. |
| + message_loop()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
| +} |
| + |
| +void ChromotingClient::ClientDone() { |
| + if (client_done_ != NULL) { |
| + message_loop()->PostTask(FROM_HERE, client_done_); |
| + } |
| +} |
| + |
| void ChromotingClient::Repaint() { |
| - message_loop()->PostTask( |
| - FROM_HERE, |
| - NewRunnableMethod(this, &ChromotingClient::DoRepaint)); |
| + if (message_loop() != MessageLoop::current()) { |
| + message_loop()->PostTask( |
| + FROM_HERE, |
| + NewRunnableMethod(this, &ChromotingClient::Repaint)); |
| + return; |
| + } |
| + |
| + view_->Paint(); |
| } |
| void ChromotingClient::SetViewport(int x, int y, int width, int height) { |
| - message_loop()->PostTask( |
| - FROM_HERE, |
| - NewRunnableMethod(this, &ChromotingClient::DoSetViewport, |
| - x, y, width, height)); |
| + if (message_loop() != MessageLoop::current()) { |
| + message_loop()->PostTask( |
| + FROM_HERE, |
| + NewRunnableMethod(this, &ChromotingClient::SetViewport, |
| + x, y, width, height)); |
| + return; |
| + } |
| + |
| + view_->SetViewport(x, y, width, height); |
| } |
| void ChromotingClient::HandleMessages(HostConnection* conn, |
| HostMessageList* messages) { |
| + if (message_loop() != MessageLoop::current()) { |
| + message_loop()->PostTask( |
| + FROM_HERE, |
| + NewRunnableMethod(this, &ChromotingClient::HandleMessages, |
| + conn, messages)); |
| + return; |
| + } |
| + |
| for (size_t i = 0; i < messages->size(); ++i) { |
| HostMessage* msg = (*messages)[i]; |
| // 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()) { |
| - message_loop()->PostTask( |
| - FROM_HERE, |
| - NewRunnableMethod(this, &ChromotingClient::DoInitClient, msg)); |
| + InitClient(msg); |
| } else if (msg->has_begin_update_stream()) { |
| - message_loop()->PostTask( |
| - FROM_HERE, |
| - NewRunnableMethod(this, &ChromotingClient::DoBeginUpdate, msg)); |
| + BeginUpdate(msg); |
| } else if (msg->has_update_stream_packet()) { |
| - message_loop()->PostTask( |
| - FROM_HERE, |
| - NewRunnableMethod(this, &ChromotingClient::DoHandleUpdate, msg)); |
| + HandleUpdate(msg); |
| } else if (msg->has_end_update_stream()) { |
| - message_loop()->PostTask( |
| - FROM_HERE, |
| - NewRunnableMethod(this, &ChromotingClient::DoEndUpdate, msg)); |
| + EndUpdate(msg); |
| } else { |
| NOTREACHED() << "Unknown message received"; |
| } |
| @@ -85,20 +142,19 @@ |
| } |
| MessageLoop* ChromotingClient::message_loop() { |
| - return message_loop_; |
| + return context_->jingle_thread()->message_loop(); |
| } |
| void ChromotingClient::SetState(State s) { |
| // TODO(ajwong): We actually may want state to be a shared variable. Think |
| // through later. |
| - message_loop()->PostTask( |
| - FROM_HERE, |
| - NewRunnableMethod(this, &ChromotingClient::DoSetState, s)); |
| -} |
| + if (message_loop() != MessageLoop::current()) { |
| + message_loop()->PostTask( |
| + FROM_HERE, |
| + NewRunnableMethod(this, &ChromotingClient::SetState, s)); |
| + return; |
| + } |
| -void ChromotingClient::DoSetState(State s) { |
| - DCHECK_EQ(message_loop(), MessageLoop::current()); |
| - |
| state_ = s; |
| switch (state_) { |
| case CREATED: |
| @@ -118,49 +174,40 @@ |
| break; |
| } |
| - DoRepaint(); |
| + Repaint(); |
| } |
| -void ChromotingClient::DoRepaint() { |
| +void ChromotingClient::InitClient(HostMessage* msg) { |
| DCHECK_EQ(message_loop(), MessageLoop::current()); |
| - |
| - view_->Paint(); |
| -} |
| - |
| -void ChromotingClient::DoSetViewport(int x, int y, int width, int height) { |
| - DCHECK_EQ(message_loop(), MessageLoop::current()); |
| - |
| - view_->SetViewport(x, y, width, height); |
| -} |
| - |
| -void ChromotingClient::DoInitClient(HostMessage* msg) { |
| - DCHECK_EQ(message_loop(), MessageLoop::current()); |
| DCHECK(msg->has_init_client()); |
| scoped_ptr<HostMessage> deleter(msg); |
| - // Saves the dimension and resize the window. |
| + // Resize the window. |
| int width = msg->init_client().width(); |
| int height = msg->init_client().height(); |
| LOG(INFO) << "Init client received geometry: " << width << "x" << height; |
| - view_->SetBackingStoreSize(width, height); |
| + view_->SetHostScreenSize(width, height); |
| + |
| + // Schedule the input handler to process the event queue. |
| + input_handler_->Initialize(); |
| } |
| -void ChromotingClient::DoBeginUpdate(HostMessage* msg) { |
| +void ChromotingClient::BeginUpdate(HostMessage* msg) { |
| DCHECK_EQ(message_loop(), MessageLoop::current()); |
| DCHECK(msg->has_begin_update_stream()); |
| view_->HandleBeginUpdateStream(msg); |
| } |
| -void ChromotingClient::DoHandleUpdate(HostMessage* msg) { |
| +void ChromotingClient::HandleUpdate(HostMessage* msg) { |
| DCHECK_EQ(message_loop(), MessageLoop::current()); |
| DCHECK(msg->has_update_stream_packet()); |
| view_->HandleUpdateStreamPacket(msg); |
| } |
| -void ChromotingClient::DoEndUpdate(HostMessage* msg) { |
| +void ChromotingClient::EndUpdate(HostMessage* msg) { |
| DCHECK_EQ(message_loop(), MessageLoop::current()); |
| DCHECK(msg->has_end_update_stream()); |