Chromium Code Reviews| OLD | NEW | 
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "remoting/client/chromoting_client.h" | 5 #include "remoting/client/chromoting_client.h" | 
| 6 | 6 | 
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" | 
| 8 #include "remoting/client/chromoting_view.h" | 8 #include "remoting/client/chromoting_view.h" | 
| 9 #include "remoting/client/client_config.h" | |
| 10 #include "remoting/client/client_context.h" | |
| 9 #include "remoting/client/host_connection.h" | 11 #include "remoting/client/host_connection.h" | 
| 12 #include "remoting/client/input_handler.h" | |
| 10 | 13 | 
| 11 static const uint32 kCreatedColor = 0xffccccff; | 14 static const uint32 kCreatedColor = 0xffccccff; | 
| 12 static const uint32 kDisconnectedColor = 0xff00ccff; | 15 static const uint32 kDisconnectedColor = 0xff00ccff; | 
| 13 static const uint32 kFailedColor = 0xffcc00ff; | 16 static const uint32 kFailedColor = 0xffcc00ff; | 
| 14 | 17 | 
| 15 namespace remoting { | 18 namespace remoting { | 
| 16 | 19 | 
| 17 ChromotingClient::ChromotingClient(MessageLoop* message_loop, | 20 ChromotingClient::ChromotingClient(ClientConfig* config, | 
| 21 ClientContext* context, | |
| 18 HostConnection* connection, | 22 HostConnection* connection, | 
| 19 ChromotingView* view) | 23 ChromotingView* view, | 
| 20 : message_loop_(message_loop), | 24 InputHandler* input_handler, | 
| 21 state_(CREATED), | 25 CancelableTask* client_done) | 
| 22 host_connection_(connection), | 26 : config_(config), | 
| 23 view_(view) { | 27 context_(context), | 
| 28 connection_(connection), | |
| 29 view_(view), | |
| 30 input_handler_(input_handler), | |
| 31 client_done_(client_done), | |
| 32 state_(CREATED) { | |
| 24 } | 33 } | 
| 25 | 34 | 
| 26 ChromotingClient::~ChromotingClient() { | 35 ChromotingClient::~ChromotingClient() { | 
| 27 } | 36 } | 
| 28 | 37 | 
| 38 void ChromotingClient::Start() { | |
| 39 if (message_loop() != MessageLoop::current()) { | |
| 40 message_loop()->PostTask( | |
| 41 FROM_HERE, | |
| 42 NewRunnableMethod(this, &ChromotingClient::Start)); | |
| 43 return; | |
| 44 } | |
| 45 | |
| 46 connection_->Connect(config_, this); | |
| 47 | |
| 48 if (!view_->Initialize()) { | |
| 49 ClientDone(); | |
| 50 } | |
| 51 | |
| 
 
awong
2010/07/19 21:50:10
remove extra newline.
 
 | |
| 52 } | |
| 53 | |
| 54 void ChromotingClient::Stop() { | |
| 55 if (message_loop() != MessageLoop::current()) { | |
| 56 message_loop()->PostTask( | |
| 57 FROM_HERE, | |
| 58 NewRunnableMethod(this, &ChromotingClient::Stop)); | |
| 59 return; | |
| 60 } | |
| 61 | |
| 62 connection_->Disconnect(); | |
| 63 | |
| 64 view_->TearDown(); | |
| 65 | |
| 66 // Quit the current message loop. | |
| 67 message_loop()->PostTask(FROM_HERE, new MessageLoop::QuitTask()); | |
| 68 } | |
| 69 | |
| 70 void ChromotingClient::ClientDone() { | |
| 71 if (client_done_ != NULL) { | |
| 72 message_loop()->PostTask(FROM_HERE, client_done_); | |
| 73 } | |
| 74 } | |
| 75 | |
| 29 void ChromotingClient::Repaint() { | 76 void ChromotingClient::Repaint() { | 
| 30 message_loop()->PostTask( | 77 if (message_loop() != MessageLoop::current()) { | 
| 31 FROM_HERE, | 78 message_loop()->PostTask( | 
| 32 NewRunnableMethod(this, &ChromotingClient::DoRepaint)); | 79 FROM_HERE, | 
| 80 NewRunnableMethod(this, &ChromotingClient::Repaint)); | |
| 81 return; | |
| 82 } | |
| 83 | |
| 84 view_->Paint(); | |
| 33 } | 85 } | 
| 34 | 86 | 
| 35 void ChromotingClient::SetViewport(int x, int y, int width, int height) { | 87 void ChromotingClient::SetViewport(int x, int y, int width, int height) { | 
| 36 message_loop()->PostTask( | 88 if (message_loop() != MessageLoop::current()) { | 
| 37 FROM_HERE, | 89 message_loop()->PostTask( | 
| 38 NewRunnableMethod(this, &ChromotingClient::DoSetViewport, | 90 FROM_HERE, | 
| 39 x, y, width, height)); | 91 NewRunnableMethod(this, &ChromotingClient::SetViewport, | 
| 92 x, y, width, height)); | |
| 93 return; | |
| 94 } | |
| 95 | |
| 96 view_->SetViewport(x, y, width, height); | |
| 40 } | 97 } | 
| 41 | 98 | 
| 42 void ChromotingClient::HandleMessages(HostConnection* conn, | 99 void ChromotingClient::HandleMessages(HostConnection* conn, | 
| 43 HostMessageList* messages) { | 100 HostMessageList* messages) { | 
| 101 if (message_loop() != MessageLoop::current()) { | |
| 102 message_loop()->PostTask( | |
| 103 FROM_HERE, | |
| 104 NewRunnableMethod(this, &ChromotingClient::HandleMessages, | |
| 105 conn, messages)); | |
| 106 return; | |
| 107 } | |
| 108 | |
| 44 for (size_t i = 0; i < messages->size(); ++i) { | 109 for (size_t i = 0; i < messages->size(); ++i) { | 
| 45 HostMessage* msg = (*messages)[i]; | 110 HostMessage* msg = (*messages)[i]; | 
| 46 // TODO(ajwong): Consider creating a macro similar to the IPC message | 111 // TODO(ajwong): Consider creating a macro similar to the IPC message | 
| 47 // mappings. Also reconsider the lifetime of the message object. | 112 // mappings. Also reconsider the lifetime of the message object. | 
| 48 if (msg->has_init_client()) { | 113 if (msg->has_init_client()) { | 
| 49 message_loop()->PostTask( | 114 InitClient(msg); | 
| 50 FROM_HERE, | |
| 51 NewRunnableMethod(this, &ChromotingClient::DoInitClient, msg)); | |
| 52 } else if (msg->has_begin_update_stream()) { | 115 } else if (msg->has_begin_update_stream()) { | 
| 53 message_loop()->PostTask( | 116 BeginUpdate(msg); | 
| 54 FROM_HERE, | |
| 55 NewRunnableMethod(this, &ChromotingClient::DoBeginUpdate, msg)); | |
| 56 } else if (msg->has_update_stream_packet()) { | 117 } else if (msg->has_update_stream_packet()) { | 
| 57 message_loop()->PostTask( | 118 HandleUpdate(msg); | 
| 58 FROM_HERE, | |
| 59 NewRunnableMethod(this, &ChromotingClient::DoHandleUpdate, msg)); | |
| 60 } else if (msg->has_end_update_stream()) { | 119 } else if (msg->has_end_update_stream()) { | 
| 61 message_loop()->PostTask( | 120 EndUpdate(msg); | 
| 62 FROM_HERE, | |
| 63 NewRunnableMethod(this, &ChromotingClient::DoEndUpdate, msg)); | |
| 64 } else { | 121 } else { | 
| 65 NOTREACHED() << "Unknown message received"; | 122 NOTREACHED() << "Unknown message received"; | 
| 66 } | 123 } | 
| 67 } | 124 } | 
| 68 // Assume we have processed all the messages. | 125 // Assume we have processed all the messages. | 
| 69 messages->clear(); | 126 messages->clear(); | 
| 70 } | 127 } | 
| 71 | 128 | 
| 72 void ChromotingClient::OnConnectionOpened(HostConnection* conn) { | 129 void ChromotingClient::OnConnectionOpened(HostConnection* conn) { | 
| 73 LOG(INFO) << "ChromotingClient::OnConnectionOpened"; | 130 LOG(INFO) << "ChromotingClient::OnConnectionOpened"; | 
| 74 SetState(CONNECTED); | 131 SetState(CONNECTED); | 
| 75 } | 132 } | 
| 76 | 133 | 
| 77 void ChromotingClient::OnConnectionClosed(HostConnection* conn) { | 134 void ChromotingClient::OnConnectionClosed(HostConnection* conn) { | 
| 78 LOG(INFO) << "ChromotingClient::OnConnectionClosed"; | 135 LOG(INFO) << "ChromotingClient::OnConnectionClosed"; | 
| 79 SetState(DISCONNECTED); | 136 SetState(DISCONNECTED); | 
| 80 } | 137 } | 
| 81 | 138 | 
| 82 void ChromotingClient::OnConnectionFailed(HostConnection* conn) { | 139 void ChromotingClient::OnConnectionFailed(HostConnection* conn) { | 
| 83 LOG(INFO) << "ChromotingClient::OnConnectionFailed"; | 140 LOG(INFO) << "ChromotingClient::OnConnectionFailed"; | 
| 84 SetState(FAILED); | 141 SetState(FAILED); | 
| 85 } | 142 } | 
| 86 | 143 | 
| 87 MessageLoop* ChromotingClient::message_loop() { | 144 MessageLoop* ChromotingClient::message_loop() { | 
| 88 return message_loop_; | 145 return context_->jingle_thread()->message_loop(); | 
| 89 } | 146 } | 
| 90 | 147 | 
| 91 void ChromotingClient::SetState(State s) { | 148 void ChromotingClient::SetState(State s) { | 
| 92 // TODO(ajwong): We actually may want state to be a shared variable. Think | 149 // TODO(ajwong): We actually may want state to be a shared variable. Think | 
| 93 // through later. | 150 // through later. | 
| 94 message_loop()->PostTask( | 151 if (message_loop() != MessageLoop::current()) { | 
| 95 FROM_HERE, | 152 message_loop()->PostTask( | 
| 96 NewRunnableMethod(this, &ChromotingClient::DoSetState, s)); | 153 FROM_HERE, | 
| 97 } | 154 NewRunnableMethod(this, &ChromotingClient::SetState, s)); | 
| 98 | 155 return; | 
| 99 void ChromotingClient::DoSetState(State s) { | 156 } | 
| 100 DCHECK_EQ(message_loop(), MessageLoop::current()); | |
| 101 | 157 | 
| 102 state_ = s; | 158 state_ = s; | 
| 103 switch (state_) { | 159 switch (state_) { | 
| 104 case CREATED: | 160 case CREATED: | 
| 105 view_->SetSolidFill(kCreatedColor); | 161 view_->SetSolidFill(kCreatedColor); | 
| 106 break; | 162 break; | 
| 107 | 163 | 
| 108 case CONNECTED: | 164 case CONNECTED: | 
| 109 view_->UnsetSolidFill(); | 165 view_->UnsetSolidFill(); | 
| 110 break; | 166 break; | 
| 111 | 167 | 
| 112 case DISCONNECTED: | 168 case DISCONNECTED: | 
| 113 view_->SetSolidFill(kDisconnectedColor); | 169 view_->SetSolidFill(kDisconnectedColor); | 
| 114 break; | 170 break; | 
| 115 | 171 | 
| 116 case FAILED: | 172 case FAILED: | 
| 117 view_->SetSolidFill(kFailedColor); | 173 view_->SetSolidFill(kFailedColor); | 
| 118 break; | 174 break; | 
| 119 } | 175 } | 
| 120 | 176 | 
| 121 DoRepaint(); | 177 Repaint(); | 
| 122 } | 178 } | 
| 123 | 179 | 
| 124 void ChromotingClient::DoRepaint() { | 180 void ChromotingClient::InitClient(HostMessage* msg) { | 
| 125 DCHECK_EQ(message_loop(), MessageLoop::current()); | |
| 126 | |
| 127 view_->Paint(); | |
| 128 } | |
| 129 | |
| 130 void ChromotingClient::DoSetViewport(int x, int y, int width, int height) { | |
| 131 DCHECK_EQ(message_loop(), MessageLoop::current()); | |
| 132 | |
| 133 view_->SetViewport(x, y, width, height); | |
| 134 } | |
| 135 | |
| 136 void ChromotingClient::DoInitClient(HostMessage* msg) { | |
| 137 DCHECK_EQ(message_loop(), MessageLoop::current()); | 181 DCHECK_EQ(message_loop(), MessageLoop::current()); | 
| 138 DCHECK(msg->has_init_client()); | 182 DCHECK(msg->has_init_client()); | 
| 139 scoped_ptr<HostMessage> deleter(msg); | 183 scoped_ptr<HostMessage> deleter(msg); | 
| 140 | 184 | 
| 141 // Saves the dimension and resize the window. | 185 // Resize the window. | 
| 142 int width = msg->init_client().width(); | 186 int width = msg->init_client().width(); | 
| 143 int height = msg->init_client().height(); | 187 int height = msg->init_client().height(); | 
| 144 LOG(INFO) << "Init client received geometry: " << width << "x" << height; | 188 LOG(INFO) << "Init client received geometry: " << width << "x" << height; | 
| 145 | 189 | 
| 146 view_->SetBackingStoreSize(width, height); | 190 view_->SetHostScreenSize(width, height); | 
| 191 | |
| 192 // Schedule the input handler to process the event queue. | |
| 193 input_handler_->Initialize(); | |
| 147 } | 194 } | 
| 148 | 195 | 
| 149 void ChromotingClient::DoBeginUpdate(HostMessage* msg) { | 196 void ChromotingClient::BeginUpdate(HostMessage* msg) { | 
| 150 DCHECK_EQ(message_loop(), MessageLoop::current()); | 197 DCHECK_EQ(message_loop(), MessageLoop::current()); | 
| 151 DCHECK(msg->has_begin_update_stream()); | 198 DCHECK(msg->has_begin_update_stream()); | 
| 152 | 199 | 
| 153 view_->HandleBeginUpdateStream(msg); | 200 view_->HandleBeginUpdateStream(msg); | 
| 154 } | 201 } | 
| 155 | 202 | 
| 156 void ChromotingClient::DoHandleUpdate(HostMessage* msg) { | 203 void ChromotingClient::HandleUpdate(HostMessage* msg) { | 
| 157 DCHECK_EQ(message_loop(), MessageLoop::current()); | 204 DCHECK_EQ(message_loop(), MessageLoop::current()); | 
| 158 DCHECK(msg->has_update_stream_packet()); | 205 DCHECK(msg->has_update_stream_packet()); | 
| 159 | 206 | 
| 160 view_->HandleUpdateStreamPacket(msg); | 207 view_->HandleUpdateStreamPacket(msg); | 
| 161 } | 208 } | 
| 162 | 209 | 
| 163 void ChromotingClient::DoEndUpdate(HostMessage* msg) { | 210 void ChromotingClient::EndUpdate(HostMessage* msg) { | 
| 164 DCHECK_EQ(message_loop(), MessageLoop::current()); | 211 DCHECK_EQ(message_loop(), MessageLoop::current()); | 
| 165 DCHECK(msg->has_end_update_stream()); | 212 DCHECK(msg->has_end_update_stream()); | 
| 166 | 213 | 
| 167 view_->HandleEndUpdateStream(msg); | 214 view_->HandleEndUpdateStream(msg); | 
| 168 } | 215 } | 
| 169 | 216 | 
| 170 } // namespace remoting | 217 } // namespace remoting | 
| OLD | NEW |