OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "chrome/browser/extensions/api/serial/serial_connection.h" | 5 #include "chrome/browser/extensions/api/serial/serial_connection.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
11 #include "chrome/common/extensions/api/serial.h" | 11 #include "chrome/common/extensions/api/serial.h" |
12 #include "extensions/browser/api/api_resource_manager.h" | 12 #include "extensions/browser/api/api_resource_manager.h" |
13 | 13 |
14 namespace extensions { | 14 namespace extensions { |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 const int kDefaultBufferSize = 4096; | 18 const int kDefaultBufferSize = 4096; |
| 19 |
| 20 api::serial::SendError ConvertSendErrorFromMojo( |
| 21 device::serial::SendError input) { |
| 22 switch (input) { |
| 23 case device::serial::SEND_ERROR_NONE: |
| 24 return api::serial::SEND_ERROR_NONE; |
| 25 case device::serial::SEND_ERROR_DISCONNECTED: |
| 26 return api::serial::SEND_ERROR_DISCONNECTED; |
| 27 case device::serial::SEND_ERROR_PENDING: |
| 28 return api::serial::SEND_ERROR_PENDING; |
| 29 case device::serial::SEND_ERROR_TIMEOUT: |
| 30 return api::serial::SEND_ERROR_TIMEOUT; |
| 31 case device::serial::SEND_ERROR_SYSTEM_ERROR: |
| 32 return api::serial::SEND_ERROR_SYSTEM_ERROR; |
| 33 } |
| 34 return api::serial::SEND_ERROR_NONE; |
19 } | 35 } |
20 | 36 |
| 37 api::serial::ReceiveError ConvertReceiveErrorFromMojo( |
| 38 device::serial::ReceiveError input) { |
| 39 switch (input) { |
| 40 case device::serial::RECEIVE_ERROR_NONE: |
| 41 return api::serial::RECEIVE_ERROR_NONE; |
| 42 case device::serial::RECEIVE_ERROR_DISCONNECTED: |
| 43 return api::serial::RECEIVE_ERROR_DISCONNECTED; |
| 44 case device::serial::RECEIVE_ERROR_TIMEOUT: |
| 45 return api::serial::RECEIVE_ERROR_TIMEOUT; |
| 46 case device::serial::RECEIVE_ERROR_DEVICE_LOST: |
| 47 return api::serial::RECEIVE_ERROR_DEVICE_LOST; |
| 48 case device::serial::RECEIVE_ERROR_SYSTEM_ERROR: |
| 49 return api::serial::RECEIVE_ERROR_SYSTEM_ERROR; |
| 50 } |
| 51 return api::serial::RECEIVE_ERROR_NONE; |
| 52 } |
| 53 |
| 54 api::serial::DataBits ConvertDataBitsFromMojo(device::serial::DataBits input) { |
| 55 switch (input) { |
| 56 case device::serial::DATA_BITS_NONE: |
| 57 return api::serial::DATA_BITS_NONE; |
| 58 case device::serial::DATA_BITS_SEVEN: |
| 59 return api::serial::DATA_BITS_SEVEN; |
| 60 case device::serial::DATA_BITS_EIGHT: |
| 61 return api::serial::DATA_BITS_EIGHT; |
| 62 } |
| 63 return api::serial::DATA_BITS_NONE; |
| 64 } |
| 65 |
| 66 device::serial::DataBits ConvertDataBitsToMojo(api::serial::DataBits input) { |
| 67 switch (input) { |
| 68 case api::serial::DATA_BITS_NONE: |
| 69 return device::serial::DATA_BITS_NONE; |
| 70 case api::serial::DATA_BITS_SEVEN: |
| 71 return device::serial::DATA_BITS_SEVEN; |
| 72 case api::serial::DATA_BITS_EIGHT: |
| 73 return device::serial::DATA_BITS_EIGHT; |
| 74 } |
| 75 return device::serial::DATA_BITS_NONE; |
| 76 } |
| 77 |
| 78 api::serial::ParityBit ConvertParityBitFromMojo( |
| 79 device::serial::ParityBit input) { |
| 80 switch (input) { |
| 81 case device::serial::PARITY_BIT_NONE: |
| 82 return api::serial::PARITY_BIT_NONE; |
| 83 case device::serial::PARITY_BIT_ODD: |
| 84 return api::serial::PARITY_BIT_ODD; |
| 85 case device::serial::PARITY_BIT_NO: |
| 86 return api::serial::PARITY_BIT_NO; |
| 87 case device::serial::PARITY_BIT_EVEN: |
| 88 return api::serial::PARITY_BIT_EVEN; |
| 89 } |
| 90 return api::serial::PARITY_BIT_NONE; |
| 91 } |
| 92 |
| 93 device::serial::ParityBit ConvertParityBitToMojo(api::serial::ParityBit input) { |
| 94 switch (input) { |
| 95 case api::serial::PARITY_BIT_NONE: |
| 96 return device::serial::PARITY_BIT_NONE; |
| 97 case api::serial::PARITY_BIT_NO: |
| 98 return device::serial::PARITY_BIT_NO; |
| 99 case api::serial::PARITY_BIT_ODD: |
| 100 return device::serial::PARITY_BIT_ODD; |
| 101 case api::serial::PARITY_BIT_EVEN: |
| 102 return device::serial::PARITY_BIT_EVEN; |
| 103 } |
| 104 return device::serial::PARITY_BIT_NONE; |
| 105 } |
| 106 |
| 107 api::serial::StopBits ConvertStopBitsFromMojo(device::serial::StopBits input) { |
| 108 switch (input) { |
| 109 case device::serial::STOP_BITS_NONE: |
| 110 return api::serial::STOP_BITS_NONE; |
| 111 case device::serial::STOP_BITS_ONE: |
| 112 return api::serial::STOP_BITS_ONE; |
| 113 case device::serial::STOP_BITS_TWO: |
| 114 return api::serial::STOP_BITS_TWO; |
| 115 } |
| 116 return api::serial::STOP_BITS_NONE; |
| 117 } |
| 118 |
| 119 device::serial::StopBits ConvertStopBitsToMojo(api::serial::StopBits input) { |
| 120 switch (input) { |
| 121 case api::serial::STOP_BITS_NONE: |
| 122 return device::serial::STOP_BITS_NONE; |
| 123 case api::serial::STOP_BITS_ONE: |
| 124 return device::serial::STOP_BITS_ONE; |
| 125 case api::serial::STOP_BITS_TWO: |
| 126 return device::serial::STOP_BITS_TWO; |
| 127 } |
| 128 return device::serial::STOP_BITS_NONE; |
| 129 } |
| 130 |
| 131 } // namespace |
| 132 |
21 static base::LazyInstance< | 133 static base::LazyInstance< |
22 BrowserContextKeyedAPIFactory<ApiResourceManager<SerialConnection> > > | 134 BrowserContextKeyedAPIFactory<ApiResourceManager<SerialConnection> > > |
23 g_factory = LAZY_INSTANCE_INITIALIZER; | 135 g_factory = LAZY_INSTANCE_INITIALIZER; |
24 | 136 |
25 // static | 137 // static |
26 template <> | 138 template <> |
27 BrowserContextKeyedAPIFactory<ApiResourceManager<SerialConnection> >* | 139 BrowserContextKeyedAPIFactory<ApiResourceManager<SerialConnection> >* |
28 ApiResourceManager<SerialConnection>::GetFactoryInstance() { | 140 ApiResourceManager<SerialConnection>::GetFactoryInstance() { |
29 return g_factory.Pointer(); | 141 return g_factory.Pointer(); |
30 } | 142 } |
31 | 143 |
32 SerialConnection::SerialConnection(const std::string& port, | 144 SerialConnection::SerialConnection(const std::string& port, |
33 const std::string& owner_extension_id) | 145 const std::string& owner_extension_id) |
34 : ApiResource(owner_extension_id), | 146 : ApiResource(owner_extension_id), |
35 port_(port), | 147 port_(port), |
36 persistent_(false), | 148 persistent_(false), |
37 buffer_size_(kDefaultBufferSize), | 149 buffer_size_(kDefaultBufferSize), |
38 receive_timeout_(0), | 150 receive_timeout_(0), |
39 send_timeout_(0), | 151 send_timeout_(0), |
40 paused_(false), | 152 paused_(false), |
41 io_handler_(SerialIoHandler::Create()) { | 153 io_handler_(SerialIoHandler::Create()) { |
42 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 154 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
43 io_handler_->Initialize( | 155 io_handler_->Initialize( |
44 base::Bind(&SerialConnection::OnAsyncReadComplete, AsWeakPtr()), | 156 base::Bind(&SerialConnection::OnAsyncReadComplete, AsWeakPtr()), |
45 base::Bind(&SerialConnection::OnAsyncWriteComplete, AsWeakPtr())); | 157 base::Bind(&SerialConnection::OnAsyncWriteComplete, AsWeakPtr())); |
46 } | 158 } |
47 | 159 |
48 SerialConnection::~SerialConnection() { | 160 SerialConnection::~SerialConnection() { |
49 io_handler_->CancelRead(api::serial::RECEIVE_ERROR_DISCONNECTED); | 161 io_handler_->CancelRead(device::serial::RECEIVE_ERROR_DISCONNECTED); |
50 io_handler_->CancelWrite(api::serial::SEND_ERROR_DISCONNECTED); | 162 io_handler_->CancelWrite(device::serial::SEND_ERROR_DISCONNECTED); |
51 } | 163 } |
52 | 164 |
53 bool SerialConnection::IsPersistent() const { return persistent(); } | 165 bool SerialConnection::IsPersistent() const { return persistent(); } |
54 | 166 |
55 void SerialConnection::set_buffer_size(int buffer_size) { | 167 void SerialConnection::set_buffer_size(int buffer_size) { |
56 buffer_size_ = buffer_size; | 168 buffer_size_ = buffer_size; |
57 } | 169 } |
58 | 170 |
59 void SerialConnection::set_receive_timeout(int receive_timeout) { | 171 void SerialConnection::set_receive_timeout(int receive_timeout) { |
60 receive_timeout_ = receive_timeout; | 172 receive_timeout_ = receive_timeout; |
61 } | 173 } |
62 | 174 |
63 void SerialConnection::set_send_timeout(int send_timeout) { | 175 void SerialConnection::set_send_timeout(int send_timeout) { |
64 send_timeout_ = send_timeout; | 176 send_timeout_ = send_timeout; |
65 } | 177 } |
66 | 178 |
67 void SerialConnection::set_paused(bool paused) { | 179 void SerialConnection::set_paused(bool paused) { |
68 paused_ = paused; | 180 paused_ = paused; |
69 if (paused) { | 181 if (paused) { |
70 io_handler_->CancelRead(api::serial::RECEIVE_ERROR_NONE); | 182 io_handler_->CancelRead(device::serial::RECEIVE_ERROR_NONE); |
71 } | 183 } |
72 } | 184 } |
73 | 185 |
74 void SerialConnection::Open(const OpenCompleteCallback& callback) { | 186 void SerialConnection::Open(const OpenCompleteCallback& callback) { |
75 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 187 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
76 io_handler_->Open(port_, callback); | 188 io_handler_->Open(port_, callback); |
77 } | 189 } |
78 | 190 |
79 bool SerialConnection::Receive(const ReceiveCompleteCallback& callback) { | 191 bool SerialConnection::Receive(const ReceiveCompleteCallback& callback) { |
80 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 192 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 if (options.persistent.get()) | 225 if (options.persistent.get()) |
114 set_persistent(*options.persistent); | 226 set_persistent(*options.persistent); |
115 if (options.name.get()) | 227 if (options.name.get()) |
116 set_name(*options.name); | 228 set_name(*options.name); |
117 if (options.buffer_size.get()) | 229 if (options.buffer_size.get()) |
118 set_buffer_size(*options.buffer_size); | 230 set_buffer_size(*options.buffer_size); |
119 if (options.receive_timeout.get()) | 231 if (options.receive_timeout.get()) |
120 set_receive_timeout(*options.receive_timeout); | 232 set_receive_timeout(*options.receive_timeout); |
121 if (options.send_timeout.get()) | 233 if (options.send_timeout.get()) |
122 set_send_timeout(*options.send_timeout); | 234 set_send_timeout(*options.send_timeout); |
123 bool success = io_handler_->ConfigurePort(options); | 235 bool success = io_handler_->ConfigurePort( |
124 io_handler_->CancelRead(api::serial::RECEIVE_ERROR_NONE); | 236 *device::serial::ConnectionOptions::From(options)); |
| 237 io_handler_->CancelRead(device::serial::RECEIVE_ERROR_NONE); |
125 return success; | 238 return success; |
126 } | 239 } |
127 | 240 |
128 void SerialConnection::SetIoHandlerForTest( | 241 void SerialConnection::SetIoHandlerForTest( |
129 scoped_refptr<SerialIoHandler> handler) { | 242 scoped_refptr<SerialIoHandler> handler) { |
130 io_handler_ = handler; | 243 io_handler_ = handler; |
131 io_handler_->Initialize( | 244 io_handler_->Initialize( |
132 base::Bind(&SerialConnection::OnAsyncReadComplete, AsWeakPtr()), | 245 base::Bind(&SerialConnection::OnAsyncReadComplete, AsWeakPtr()), |
133 base::Bind(&SerialConnection::OnAsyncWriteComplete, AsWeakPtr())); | 246 base::Bind(&SerialConnection::OnAsyncWriteComplete, AsWeakPtr())); |
134 } | 247 } |
135 | 248 |
136 bool SerialConnection::GetInfo(api::serial::ConnectionInfo* info) const { | 249 bool SerialConnection::GetInfo(api::serial::ConnectionInfo* info) const { |
137 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 250 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
138 info->paused = paused_; | 251 info->paused = paused_; |
139 info->persistent = persistent_; | 252 info->persistent = persistent_; |
140 info->name = name_; | 253 info->name = name_; |
141 info->buffer_size = buffer_size_; | 254 info->buffer_size = buffer_size_; |
142 info->receive_timeout = receive_timeout_; | 255 info->receive_timeout = receive_timeout_; |
143 info->send_timeout = send_timeout_; | 256 info->send_timeout = send_timeout_; |
144 return io_handler_->GetPortInfo(info); | 257 device::serial::ConnectionInfoPtr port_info = io_handler_->GetPortInfo(); |
| 258 if (!port_info) |
| 259 return false; |
| 260 |
| 261 info->bitrate.reset(new int(port_info->bitrate)); |
| 262 info->data_bits = ConvertDataBitsFromMojo(port_info->data_bits); |
| 263 info->parity_bit = ConvertParityBitFromMojo(port_info->parity_bit); |
| 264 info->stop_bits = ConvertStopBitsFromMojo(port_info->stop_bits); |
| 265 info->cts_flow_control.reset(new bool(port_info->cts_flow_control)); |
| 266 return true; |
145 } | 267 } |
146 | 268 |
147 bool SerialConnection::Flush() const { | 269 bool SerialConnection::Flush() const { |
148 return io_handler_->Flush(); | 270 return io_handler_->Flush(); |
149 } | 271 } |
150 | 272 |
151 bool SerialConnection::GetControlSignals( | 273 bool SerialConnection::GetControlSignals( |
152 api::serial::DeviceControlSignals* control_signals) const { | 274 api::serial::DeviceControlSignals* control_signals) const { |
153 return io_handler_->GetControlSignals(control_signals); | 275 device::serial::DeviceControlSignalsPtr signals = |
| 276 io_handler_->GetControlSignals(); |
| 277 if (!signals) |
| 278 return false; |
| 279 |
| 280 control_signals->dcd = signals->dcd; |
| 281 control_signals->cts = signals->cts; |
| 282 control_signals->ri = signals->ri; |
| 283 control_signals->dsr = signals->dsr; |
| 284 return true; |
154 } | 285 } |
155 | 286 |
156 bool SerialConnection::SetControlSignals( | 287 bool SerialConnection::SetControlSignals( |
157 const api::serial::HostControlSignals& control_signals) { | 288 const api::serial::HostControlSignals& control_signals) { |
158 return io_handler_->SetControlSignals(control_signals); | 289 return io_handler_->SetControlSignals( |
| 290 *device::serial::HostControlSignals::From(control_signals)); |
159 } | 291 } |
160 | 292 |
161 void SerialConnection::OnReceiveTimeout() { | 293 void SerialConnection::OnReceiveTimeout() { |
162 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 294 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
163 io_handler_->CancelRead(api::serial::RECEIVE_ERROR_TIMEOUT); | 295 io_handler_->CancelRead(device::serial::RECEIVE_ERROR_TIMEOUT); |
164 } | 296 } |
165 | 297 |
166 void SerialConnection::OnSendTimeout() { | 298 void SerialConnection::OnSendTimeout() { |
167 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 299 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
168 io_handler_->CancelWrite(api::serial::SEND_ERROR_TIMEOUT); | 300 io_handler_->CancelWrite(device::serial::SEND_ERROR_TIMEOUT); |
169 } | 301 } |
170 | 302 |
171 void SerialConnection::OnAsyncReadComplete(const std::string& data, | 303 void SerialConnection::OnAsyncReadComplete(const std::string& data, |
172 api::serial::ReceiveError error) { | 304 device::serial::ReceiveError error) { |
173 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 305 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
174 DCHECK(!receive_complete_.is_null()); | 306 DCHECK(!receive_complete_.is_null()); |
175 ReceiveCompleteCallback callback = receive_complete_; | 307 ReceiveCompleteCallback callback = receive_complete_; |
176 receive_complete_.Reset(); | 308 receive_complete_.Reset(); |
177 receive_timeout_task_.reset(); | 309 receive_timeout_task_.reset(); |
178 callback.Run(data, error); | 310 callback.Run(data, ConvertReceiveErrorFromMojo(error)); |
179 } | 311 } |
180 | 312 |
181 void SerialConnection::OnAsyncWriteComplete(int bytes_sent, | 313 void SerialConnection::OnAsyncWriteComplete(int bytes_sent, |
182 api::serial::SendError error) { | 314 device::serial::SendError error) { |
183 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 315 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
184 DCHECK(!send_complete_.is_null()); | 316 DCHECK(!send_complete_.is_null()); |
185 SendCompleteCallback callback = send_complete_; | 317 SendCompleteCallback callback = send_complete_; |
186 send_complete_.Reset(); | 318 send_complete_.Reset(); |
187 send_timeout_task_.reset(); | 319 send_timeout_task_.reset(); |
188 callback.Run(bytes_sent, error); | 320 callback.Run(bytes_sent, ConvertSendErrorFromMojo(error)); |
189 } | 321 } |
190 | 322 |
191 SerialConnection::TimeoutTask::TimeoutTask(const base::Closure& closure, | 323 SerialConnection::TimeoutTask::TimeoutTask(const base::Closure& closure, |
192 const base::TimeDelta& delay) | 324 const base::TimeDelta& delay) |
193 : weak_factory_(this), closure_(closure), delay_(delay) { | 325 : weak_factory_(this), closure_(closure), delay_(delay) { |
194 base::MessageLoop::current()->PostDelayedTask( | 326 base::MessageLoop::current()->PostDelayedTask( |
195 FROM_HERE, | 327 FROM_HERE, |
196 base::Bind(&TimeoutTask::Run, weak_factory_.GetWeakPtr()), | 328 base::Bind(&TimeoutTask::Run, weak_factory_.GetWeakPtr()), |
197 delay_); | 329 delay_); |
198 } | 330 } |
199 | 331 |
200 SerialConnection::TimeoutTask::~TimeoutTask() {} | 332 SerialConnection::TimeoutTask::~TimeoutTask() {} |
201 | 333 |
202 void SerialConnection::TimeoutTask::Run() const { closure_.Run(); } | 334 void SerialConnection::TimeoutTask::Run() const { closure_.Run(); } |
203 | 335 |
204 } // namespace extensions | 336 } // namespace extensions |
| 337 |
| 338 namespace mojo { |
| 339 |
| 340 // static |
| 341 device::serial::HostControlSignalsPtr |
| 342 TypeConverter<device::serial::HostControlSignalsPtr, |
| 343 extensions::api::serial::HostControlSignals>:: |
| 344 ConvertFrom(const extensions::api::serial::HostControlSignals& input) { |
| 345 device::serial::HostControlSignalsPtr output( |
| 346 device::serial::HostControlSignals::New()); |
| 347 if (input.dtr.get()) { |
| 348 output->has_dtr = true; |
| 349 output->dtr = *input.dtr; |
| 350 } |
| 351 if (input.rts.get()) { |
| 352 output->has_rts = true; |
| 353 output->rts = *input.rts; |
| 354 } |
| 355 return output.Pass(); |
| 356 } |
| 357 |
| 358 // static |
| 359 device::serial::ConnectionOptionsPtr |
| 360 TypeConverter<device::serial::ConnectionOptionsPtr, |
| 361 extensions::api::serial::ConnectionOptions>:: |
| 362 ConvertFrom(const extensions::api::serial::ConnectionOptions& input) { |
| 363 device::serial::ConnectionOptionsPtr output( |
| 364 device::serial::ConnectionOptions::New()); |
| 365 if (input.bitrate.get() && *input.bitrate > 0) |
| 366 output->bitrate = *input.bitrate; |
| 367 output->data_bits = extensions::ConvertDataBitsToMojo(input.data_bits); |
| 368 output->parity_bit = extensions::ConvertParityBitToMojo(input.parity_bit); |
| 369 output->stop_bits = extensions::ConvertStopBitsToMojo(input.stop_bits); |
| 370 if (input.cts_flow_control.get()) { |
| 371 output->has_cts_flow_control = true; |
| 372 output->cts_flow_control = *input.cts_flow_control; |
| 373 } |
| 374 return output.Pass(); |
| 375 } |
| 376 |
| 377 } // namespace mojo |
OLD | NEW |