Chromium Code Reviews| Index: chrome/browser/extensions/api/serial/serial_connection.cc |
| diff --git a/chrome/browser/extensions/api/serial/serial_connection.cc b/chrome/browser/extensions/api/serial/serial_connection.cc |
| index 3d1006e45f3a0bff4ce6097fd2bea03cea6b6236..1c9d6e3fca403d2ca4fcaf4568563d54e7f6188a 100644 |
| --- a/chrome/browser/extensions/api/serial/serial_connection.cc |
| +++ b/chrome/browser/extensions/api/serial/serial_connection.cc |
| @@ -16,8 +16,118 @@ namespace extensions { |
| namespace { |
| const int kDefaultBufferSize = 4096; |
| + |
| +api::serial::SendError ConvertSendErrorFromMojo(device::SendError input) { |
| + switch (input) { |
| + case device::SEND_ERROR_NONE: |
| + default: |
|
raymes
2014/07/02 00:57:48
It's often good to get rid of the "default" case s
Sam McNally
2014/07/02 04:50:49
Done.
|
| + return api::serial::SEND_ERROR_NONE; |
| + case device::SEND_ERROR_DISCONNECTED: |
| + return api::serial::SEND_ERROR_DISCONNECTED; |
| + case device::SEND_ERROR_PENDING: |
| + return api::serial::SEND_ERROR_PENDING; |
| + case device::SEND_ERROR_TIMEOUT: |
| + return api::serial::SEND_ERROR_TIMEOUT; |
| + case device::SEND_ERROR_SYSTEM_ERROR: |
| + return api::serial::SEND_ERROR_SYSTEM_ERROR; |
| + } |
| +} |
| + |
| +api::serial::ReceiveError ConvertReceiveErrorFromMojo( |
| + device::ReceiveError input) { |
| + switch (input) { |
| + case device::RECEIVE_ERROR_NONE: |
| + default: |
| + return api::serial::RECEIVE_ERROR_NONE; |
| + case device::RECEIVE_ERROR_DISCONNECTED: |
| + return api::serial::RECEIVE_ERROR_DISCONNECTED; |
| + case device::RECEIVE_ERROR_TIMEOUT: |
| + return api::serial::RECEIVE_ERROR_TIMEOUT; |
| + case device::RECEIVE_ERROR_DEVICE_LOST: |
| + return api::serial::RECEIVE_ERROR_DEVICE_LOST; |
| + case device::RECEIVE_ERROR_SYSTEM_ERROR: |
| + return api::serial::RECEIVE_ERROR_SYSTEM_ERROR; |
| + } |
| +} |
| + |
| +api::serial::DataBits ConvertDataBitsFromMojo(device::DataBits input) { |
| + switch (input) { |
| + case device::DATA_BITS_NONE: |
| + default: |
| + return api::serial::DATA_BITS_NONE; |
| + case device::DATA_BITS_SEVEN: |
| + return api::serial::DATA_BITS_SEVEN; |
| + case device::DATA_BITS_EIGHT: |
| + return api::serial::DATA_BITS_EIGHT; |
| + } |
| +} |
| + |
| +device::DataBits ConvertDataBitsToMojo(api::serial::DataBits input) { |
| + switch (input) { |
| + case api::serial::DATA_BITS_NONE: |
| + default: |
| + return device::DATA_BITS_NONE; |
| + case api::serial::DATA_BITS_SEVEN: |
| + return device::DATA_BITS_SEVEN; |
| + case api::serial::DATA_BITS_EIGHT: |
| + return device::DATA_BITS_EIGHT; |
| + } |
| } |
| +api::serial::ParityBit ConvertParityBitFromMojo(device::ParityBit input) { |
| + switch (input) { |
| + case device::PARITY_BIT_NONE: |
| + default: |
| + return api::serial::PARITY_BIT_NONE; |
| + case device::PARITY_BIT_ODD: |
| + return api::serial::PARITY_BIT_ODD; |
| + case device::PARITY_BIT_NO: |
| + return api::serial::PARITY_BIT_NO; |
| + case device::PARITY_BIT_EVEN: |
| + return api::serial::PARITY_BIT_EVEN; |
| + } |
| +} |
| + |
| +device::ParityBit ConvertParityBitToMojo(api::serial::ParityBit input) { |
| + switch (input) { |
| + case api::serial::PARITY_BIT_NONE: |
| + default: |
| + return device::PARITY_BIT_NONE; |
| + case api::serial::PARITY_BIT_NO: |
| + return device::PARITY_BIT_NO; |
| + case api::serial::PARITY_BIT_ODD: |
| + return device::PARITY_BIT_ODD; |
| + case api::serial::PARITY_BIT_EVEN: |
| + return device::PARITY_BIT_EVEN; |
| + } |
| +} |
| + |
| +api::serial::StopBits ConvertStopBitsFromMojo(device::StopBits input) { |
| + switch (input) { |
| + case device::STOP_BITS_NONE: |
| + default: |
| + return api::serial::STOP_BITS_NONE; |
| + case device::STOP_BITS_ONE: |
| + return api::serial::STOP_BITS_ONE; |
| + case device::STOP_BITS_TWO: |
| + return api::serial::STOP_BITS_TWO; |
| + } |
| +} |
| + |
| +device::StopBits ConvertStopBitsToMojo(api::serial::StopBits input) { |
| + switch (input) { |
| + case api::serial::STOP_BITS_NONE: |
| + default: |
| + return device::STOP_BITS_NONE; |
| + case api::serial::STOP_BITS_ONE: |
| + return device::STOP_BITS_ONE; |
| + case api::serial::STOP_BITS_TWO: |
| + return device::STOP_BITS_TWO; |
| + } |
| +} |
| + |
| +} // namespace |
| + |
| static base::LazyInstance< |
| BrowserContextKeyedAPIFactory<ApiResourceManager<SerialConnection> > > |
| g_factory = LAZY_INSTANCE_INITIALIZER; |
| @@ -46,8 +156,8 @@ SerialConnection::SerialConnection(const std::string& port, |
| } |
| SerialConnection::~SerialConnection() { |
| - io_handler_->CancelRead(api::serial::RECEIVE_ERROR_DISCONNECTED); |
| - io_handler_->CancelWrite(api::serial::SEND_ERROR_DISCONNECTED); |
| + io_handler_->CancelRead(device::RECEIVE_ERROR_DISCONNECTED); |
| + io_handler_->CancelWrite(device::SEND_ERROR_DISCONNECTED); |
| } |
| bool SerialConnection::IsPersistent() const { return persistent(); } |
| @@ -67,7 +177,7 @@ void SerialConnection::set_send_timeout(int send_timeout) { |
| void SerialConnection::set_paused(bool paused) { |
| paused_ = paused; |
| if (paused) { |
| - io_handler_->CancelRead(api::serial::RECEIVE_ERROR_NONE); |
| + io_handler_->CancelRead(device::RECEIVE_ERROR_NONE); |
| } |
| } |
| @@ -120,8 +230,9 @@ bool SerialConnection::Configure( |
| set_receive_timeout(*options.receive_timeout); |
| if (options.send_timeout.get()) |
| set_send_timeout(*options.send_timeout); |
| - bool success = io_handler_->ConfigurePort(options); |
| - io_handler_->CancelRead(api::serial::RECEIVE_ERROR_NONE); |
| + bool success = |
| + io_handler_->ConfigurePort(*device::ConnectionOptions::From(options)); |
| + io_handler_->CancelRead(device::RECEIVE_ERROR_NONE); |
| return success; |
| } |
| @@ -141,7 +252,16 @@ bool SerialConnection::GetInfo(api::serial::ConnectionInfo* info) const { |
| info->buffer_size = buffer_size_; |
| info->receive_timeout = receive_timeout_; |
| info->send_timeout = send_timeout_; |
| - return io_handler_->GetPortInfo(info); |
| + device::ConnectionInfoPtr port_info = io_handler_->GetPortInfo(); |
| + if (!port_info) |
| + return false; |
| + |
| + info->bitrate.reset(new int(port_info->bitrate)); |
| + info->data_bits = ConvertDataBitsFromMojo(port_info->data_bits); |
| + info->parity_bit = ConvertParityBitFromMojo(port_info->parity_bit); |
| + info->stop_bits = ConvertStopBitsFromMojo(port_info->stop_bits); |
| + info->cts_flow_control.reset(new bool(port_info->cts_flow_control)); |
| + return true; |
| } |
| bool SerialConnection::Flush() const { |
| @@ -150,42 +270,51 @@ bool SerialConnection::Flush() const { |
| bool SerialConnection::GetControlSignals( |
| api::serial::DeviceControlSignals* control_signals) const { |
| - return io_handler_->GetControlSignals(control_signals); |
| + device::DeviceControlSignalsPtr signals = io_handler_->GetControlSignals(); |
| + if (!signals) |
| + return false; |
| + |
| + control_signals->dcd = signals->dcd; |
| + control_signals->cts = signals->cts; |
| + control_signals->ri = signals->ri; |
| + control_signals->dsr = signals->dsr; |
| + return true; |
| } |
| bool SerialConnection::SetControlSignals( |
| const api::serial::HostControlSignals& control_signals) { |
| - return io_handler_->SetControlSignals(control_signals); |
| + return io_handler_->SetControlSignals( |
| + *device::HostControlSignals::From(control_signals)); |
| } |
| void SerialConnection::OnReceiveTimeout() { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - io_handler_->CancelRead(api::serial::RECEIVE_ERROR_TIMEOUT); |
| + io_handler_->CancelRead(device::RECEIVE_ERROR_TIMEOUT); |
| } |
| void SerialConnection::OnSendTimeout() { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - io_handler_->CancelWrite(api::serial::SEND_ERROR_TIMEOUT); |
| + io_handler_->CancelWrite(device::SEND_ERROR_TIMEOUT); |
| } |
| void SerialConnection::OnAsyncReadComplete(const std::string& data, |
| - api::serial::ReceiveError error) { |
| + device::ReceiveError error) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| DCHECK(!receive_complete_.is_null()); |
| ReceiveCompleteCallback callback = receive_complete_; |
| receive_complete_.Reset(); |
| receive_timeout_task_.reset(); |
| - callback.Run(data, error); |
| + callback.Run(data, ConvertReceiveErrorFromMojo(error)); |
| } |
| void SerialConnection::OnAsyncWriteComplete(int bytes_sent, |
| - api::serial::SendError error) { |
| + device::SendError error) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| DCHECK(!send_complete_.is_null()); |
| SendCompleteCallback callback = send_complete_; |
| send_complete_.Reset(); |
| send_timeout_task_.reset(); |
| - callback.Run(bytes_sent, error); |
| + callback.Run(bytes_sent, ConvertSendErrorFromMojo(error)); |
| } |
| SerialConnection::TimeoutTask::TimeoutTask(const base::Closure& closure, |
| @@ -202,3 +331,42 @@ SerialConnection::TimeoutTask::~TimeoutTask() {} |
| void SerialConnection::TimeoutTask::Run() const { closure_.Run(); } |
| } // namespace extensions |
| + |
| +namespace mojo { |
| + |
| +// static |
| +device::HostControlSignalsPtr |
| +TypeConverter<device::HostControlSignalsPtr, |
| + extensions::api::serial::HostControlSignals>:: |
| + ConvertFrom(const extensions::api::serial::HostControlSignals& input) { |
| + device::HostControlSignalsPtr output(device::HostControlSignals::New()); |
| + if (input.dtr.get()) { |
| + output->has_dtr = true; |
| + output->dtr = *input.dtr; |
| + } |
| + if (input.rts.get()) { |
| + output->has_rts = true; |
| + output->rts = *input.rts; |
| + } |
| + return output.Pass(); |
| +} |
| + |
| +// static |
| +device::ConnectionOptionsPtr |
| +TypeConverter<device::ConnectionOptionsPtr, |
| + extensions::api::serial::ConnectionOptions>:: |
| + ConvertFrom(const extensions::api::serial::ConnectionOptions& input) { |
| + device::ConnectionOptionsPtr output(device::ConnectionOptions::New()); |
| + if (input.bitrate.get() && *input.bitrate > 0) |
| + output->bitrate = *input.bitrate; |
| + output->data_bits = extensions::ConvertDataBitsToMojo(input.data_bits); |
| + output->parity_bit = extensions::ConvertParityBitToMojo(input.parity_bit); |
| + output->stop_bits = extensions::ConvertStopBitsToMojo(input.stop_bits); |
| + if (input.cts_flow_control.get()) { |
| + output->has_cts_flow_control = true; |
| + output->cts_flow_control = *input.cts_flow_control; |
| + } |
| + return output.Pass(); |
| +} |
| + |
| +} // namespace mojo |