diff options
Diffstat (limited to 'chrome')
8 files changed, 55 insertions, 13 deletions
diff --git a/chrome/browser/extensions/api/serial/serial_api.cc b/chrome/browser/extensions/api/serial/serial_api.cc index c99c456..93c4acc 100644 --- a/chrome/browser/extensions/api/serial/serial_api.cc +++ b/chrome/browser/extensions/api/serial/serial_api.cc @@ -101,9 +101,31 @@ bool SerialReadFunction::Respond() { return true; } +SerialWriteFunction::SerialWriteFunction() + : connection_id_(-1), io_buffer_(NULL) { +} + +SerialWriteFunction::~SerialWriteFunction() { +} + bool SerialWriteFunction::Prepare() { EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &connection_id_)); - EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &data_)); + base::ListValue* data_list_value = NULL; + EXTENSION_FUNCTION_VALIDATE(args_->GetList(1, &data_list_value)); + size_t size = data_list_value->GetSize(); + if (size != 0) { + io_buffer_ = new net::IOBufferWithSize(size); + uint8* data_buffer = + reinterpret_cast<uint8*>(io_buffer_->data()); + for (size_t i = 0; i < size; ++i) { + int int_value = -1; + data_list_value->GetInteger(i, &int_value); + DCHECK(int_value < 256); + DCHECK(int_value >= 0); + uint8 truncated_int = static_cast<uint8>(int_value); + *data_buffer++ = truncated_int; + } + } return true; } @@ -112,7 +134,10 @@ void SerialWriteFunction::Work() { SerialConnection* serial_connection = controller()->GetSerialConnection(connection_id_); if (serial_connection) - bytes_written = serial_connection->Write(data_); + bytes_written = serial_connection->Write(io_buffer_, io_buffer_->size()); + else + error_ = kSerialConnectionNotFoundError; + DictionaryValue* result = new DictionaryValue(); result->SetInteger(kBytesWrittenKey, bytes_written); result_.reset(result); diff --git a/chrome/browser/extensions/api/serial/serial_api.h b/chrome/browser/extensions/api/serial/serial_api.h index f81ad90..a70527f 100644 --- a/chrome/browser/extensions/api/serial/serial_api.h +++ b/chrome/browser/extensions/api/serial/serial_api.h @@ -8,7 +8,9 @@ #include <string> +#include "base/memory/ref_counted.h" #include "chrome/browser/extensions/api/api_function.h" +#include "net/base/io_buffer.h" namespace extensions { @@ -55,6 +57,10 @@ class SerialReadFunction : public AsyncIOAPIFunction { }; class SerialWriteFunction : public AsyncIOAPIFunction { + public: + SerialWriteFunction(); + virtual ~SerialWriteFunction(); + protected: virtual bool Prepare() OVERRIDE; virtual void Work() OVERRIDE; @@ -62,7 +68,7 @@ class SerialWriteFunction : public AsyncIOAPIFunction { private: int connection_id_; - std::string data_; + scoped_refptr<net::IOBufferWithSize> io_buffer_; DECLARE_EXTENSION_FUNCTION_NAME("experimental.serial.write") }; diff --git a/chrome/browser/extensions/api/serial/serial_connection.cc b/chrome/browser/extensions/api/serial/serial_connection.cc index 141d2a0..ed9314b 100644 --- a/chrome/browser/extensions/api/serial/serial_connection.cc +++ b/chrome/browser/extensions/api/serial/serial_connection.cc @@ -8,6 +8,8 @@ namespace extensions { +const char kSerialConnectionNotFoundError[] = "Serial conenction not found"; + // static bool SerialConnection::DoesPortExist(const StringSet& name_set, const std::string& port_name) { diff --git a/chrome/browser/extensions/api/serial/serial_connection.h b/chrome/browser/extensions/api/serial/serial_connection.h index 0f2686b..d62189d 100644 --- a/chrome/browser/extensions/api/serial/serial_connection.h +++ b/chrome/browser/extensions/api/serial/serial_connection.h @@ -10,13 +10,17 @@ #include <string> #include "base/gtest_prod_util.h" +#include "base/memory/ref_counted.h" #include "chrome/browser/extensions/api/api_resource.h" +#include "net/base/io_buffer.h" FORWARD_DECLARE_TEST(SerialConnectionTest, ValidPortNamePatterns); FORWARD_DECLARE_TEST(SerialConnectionTest, InvalidPortNamePatterns); namespace extensions { +extern const char kSerialConnectionNotFoundError[]; + class APIResourceEventNotifier; // Encapsulates an open serial port. Platform-specific implementations are in @@ -30,8 +34,8 @@ class SerialConnection : public APIResource { bool Open(); void Close(); - int Read(unsigned char* byte); - int Write(const std::string& data); + int Read(uint8* byte); + int Write(scoped_refptr<net::IOBuffer> io_buffer, int byte_count); typedef std::set<std::string> StringSet; diff --git a/chrome/browser/extensions/api/serial/serial_connection_posix.cc b/chrome/browser/extensions/api/serial/serial_connection_posix.cc index be06687..4e1fa5d 100644 --- a/chrome/browser/extensions/api/serial/serial_connection_posix.cc +++ b/chrome/browser/extensions/api/serial/serial_connection_posix.cc @@ -42,12 +42,13 @@ void SerialConnection::Close() { } } -int SerialConnection::Read(unsigned char* byte) { +int SerialConnection::Read(uint8* byte) { return read(fd_, byte, 1); } -int SerialConnection::Write(const std::string& data) { - return write(fd_, data.c_str(), data.length()); +int SerialConnection::Write(scoped_refptr<net::IOBuffer> io_buffer, + int byte_count) { + return write(fd_, io_buffer.get(), byte_count); } // static diff --git a/chrome/browser/extensions/api/serial/serial_connection_win.cc b/chrome/browser/extensions/api/serial/serial_connection_win.cc index ddee0a6..406c6aa1 100644 --- a/chrome/browser/extensions/api/serial/serial_connection_win.cc +++ b/chrome/browser/extensions/api/serial/serial_connection_win.cc @@ -26,12 +26,13 @@ void SerialConnection::Close() { // TODO(miket): implement } -int SerialConnection::Read(unsigned char* byte) { +int SerialConnection::Read(uint8* byte) { // TODO(miket): implement return -1; } -int SerialConnection::Write(const std::string& data) { +int SerialConnection::Write(scoped_refptr<net::IOBuffer> io_buffer, + int byte_count) { // TODO(miket): implement return -1; } diff --git a/chrome/browser/extensions/api/socket/socket_api.cc b/chrome/browser/extensions/api/socket/socket_api.cc index 08e17c9..9e741b6 100644 --- a/chrome/browser/extensions/api/socket/socket_api.cc +++ b/chrome/browser/extensions/api/socket/socket_api.cc @@ -165,7 +165,7 @@ SocketWriteFunction::~SocketWriteFunction() { bool SocketWriteFunction::Prepare() { EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &socket_id_)); - base::ListValue *data_list_value; + base::ListValue* data_list_value = NULL; EXTENSION_FUNCTION_VALIDATE(args_->GetList(1, &data_list_value)); size_t size = data_list_value->GetSize(); diff --git a/chrome/common/extensions/api/experimental.serial.idl b/chrome/common/extensions/api/experimental.serial.idl index 49c564d..ebc6c06 100644 --- a/chrome/common/extensions/api/experimental.serial.idl +++ b/chrome/common/extensions/api/experimental.serial.idl @@ -21,7 +21,8 @@ // The data received. Warning: will probably become a blob or other // appropriate binary-friendly type. - DOMString message; + // TODO(miket): [instanceOf=ArrayBuffer]object data; + long[] data; }; callback ReadCallback = void (ReadInfo readInfo); @@ -56,8 +57,10 @@ // |connectionId| : The id of the connection. // |data| : The string to write. // |callback| : Called when the string has been written. + // + // TODO(miket): [instanceOf=ArrayBuffer]object data; static void write(long connectionId, - DOMString data, + long[] data, WriteCallback callback); }; |