Commit 75ef0cd2 authored by sammc@chromium.org's avatar sammc@chromium.org

Convert SerialDeviceInfo to a Mojo struct.

Review URL: https://codereview.chromium.org/311313002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@277921 0039d316-1c4b-4281-b951-d872f2087c98
parent 21e4e625
...@@ -85,27 +85,11 @@ bool SerialGetDevicesFunction::Prepare() { ...@@ -85,27 +85,11 @@ bool SerialGetDevicesFunction::Prepare() {
void SerialGetDevicesFunction::Work() { void SerialGetDevicesFunction::Work() {
DCHECK_CURRENTLY_ON(BrowserThread::FILE); DCHECK_CURRENTLY_ON(BrowserThread::FILE);
device::SerialDeviceInfoList devices;
scoped_ptr<device::SerialDeviceEnumerator> enumerator = scoped_ptr<device::SerialDeviceEnumerator> enumerator =
device::SerialDeviceEnumerator::Create(); device::SerialDeviceEnumerator::Create();
enumerator->GetDevices(&devices); mojo::Array<device::SerialDeviceInfoPtr> devices = enumerator->GetDevices();
results_ = serial::GetDevices::Results::Create(
std::vector<linked_ptr<serial::DeviceInfo> > out_devices; devices.To<std::vector<linked_ptr<serial::DeviceInfo> > >());
for (device::SerialDeviceInfoList::const_iterator iter = devices.begin();
iter != devices.end();
++iter) {
linked_ptr<device::SerialDeviceInfo> device = *iter;
linked_ptr<serial::DeviceInfo> info(new serial::DeviceInfo);
info->path = device->path;
if (device->vendor_id)
info->vendor_id.reset(new int(static_cast<int>(*device->vendor_id)));
if (device->product_id)
info->product_id.reset(new int(static_cast<int>(*device->product_id)));
info->display_name.reset(device->display_name.release());
out_devices.push_back(info);
}
results_ = serial::GetDevices::Results::Create(out_devices);
} }
SerialConnectFunction::SerialConnectFunction() {} SerialConnectFunction::SerialConnectFunction() {}
...@@ -425,3 +409,24 @@ void SerialSetControlSignalsFunction::Work() { ...@@ -425,3 +409,24 @@ void SerialSetControlSignalsFunction::Work() {
} // namespace api } // namespace api
} // namespace extensions } // namespace extensions
namespace mojo {
// static
linked_ptr<extensions::api::serial::DeviceInfo>
TypeConverter<device::SerialDeviceInfoPtr,
linked_ptr<extensions::api::serial::DeviceInfo> >::
ConvertTo(const device::SerialDeviceInfoPtr& device) {
linked_ptr<extensions::api::serial::DeviceInfo> info(
new extensions::api::serial::DeviceInfo);
info->path = device->path;
if (device->has_vendor_id)
info->vendor_id.reset(new int(static_cast<int>(device->vendor_id)));
if (device->has_product_id)
info->product_id.reset(new int(static_cast<int>(device->product_id)));
if (device->display_name)
info->display_name.reset(new std::string(device->display_name));
return info;
}
} // namespace mojo
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "chrome/common/extensions/api/serial.h" #include "chrome/common/extensions/api/serial.h"
#include "device/serial/serial.mojom.h"
#include "extensions/browser/api/api_resource_manager.h" #include "extensions/browser/api/api_resource_manager.h"
#include "extensions/browser/api/async_api_function.h" #include "extensions/browser/api/async_api_function.h"
...@@ -243,4 +244,16 @@ class SerialSetControlSignalsFunction : public SerialAsyncApiFunction { ...@@ -243,4 +244,16 @@ class SerialSetControlSignalsFunction : public SerialAsyncApiFunction {
} // namespace extensions } // namespace extensions
namespace mojo {
template <>
class TypeConverter<device::SerialDeviceInfoPtr,
linked_ptr<extensions::api::serial::DeviceInfo> > {
public:
static linked_ptr<extensions::api::serial::DeviceInfo> ConvertTo(
const device::SerialDeviceInfoPtr& input);
};
} // namespace mojo
#endif // CHROME_BROWSER_EXTENSIONS_API_SERIAL_SERIAL_API_H_ #endif // CHROME_BROWSER_EXTENSIONS_API_SERIAL_SERIAL_API_H_
include_rules = [ include_rules = [
"+chromeos", "+chromeos",
"+mojo/public",
] ]
...@@ -20,7 +20,14 @@ ...@@ -20,7 +20,14 @@
], ],
}], }],
], ],
'variables': {
'mojom_base_output_dir': 'device/serial',
},
'includes': [
'../../mojo/public/tools/bindings/mojom_bindings_generator.gypi',
],
'sources': [ 'sources': [
'serial.mojom',
'serial_device_enumerator.cc', 'serial_device_enumerator.cc',
'serial_device_enumerator.h', 'serial_device_enumerator.h',
'serial_device_enumerator_linux.cc', 'serial_device_enumerator_linux.cc',
...@@ -29,8 +36,6 @@ ...@@ -29,8 +36,6 @@
'serial_device_enumerator_mac.h', 'serial_device_enumerator_mac.h',
'serial_device_enumerator_win.cc', 'serial_device_enumerator_win.cc',
'serial_device_enumerator_win.h', 'serial_device_enumerator_win.h',
'serial_device_info.cc',
'serial_device_info.h',
], ],
}, },
], ],
......
...@@ -2,12 +2,15 @@ ...@@ -2,12 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "device/serial/serial_device_info.h" module device {
namespace device { struct SerialDeviceInfo {
string path;
uint16 vendor_id;
bool has_vendor_id = false;
uint16 product_id;
bool has_product_id = false;
string display_name;
};
SerialDeviceInfo::SerialDeviceInfo() {} }
SerialDeviceInfo::~SerialDeviceInfo() {}
} // namespace device
...@@ -5,10 +5,9 @@ ...@@ -5,10 +5,9 @@
#ifndef DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_ #ifndef DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_
#define DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_ #define DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_
#include <vector>
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "device/serial/serial_device_info.h" #include "device/serial/serial.mojom.h"
#include "mojo/public/cpp/bindings/array.h"
namespace device { namespace device {
...@@ -20,7 +19,7 @@ class SerialDeviceEnumerator { ...@@ -20,7 +19,7 @@ class SerialDeviceEnumerator {
SerialDeviceEnumerator(); SerialDeviceEnumerator();
virtual ~SerialDeviceEnumerator(); virtual ~SerialDeviceEnumerator();
virtual void GetDevices(SerialDeviceInfoList* devices) = 0; virtual mojo::Array<SerialDeviceInfoPtr> GetDevices() = 0;
}; };
} // namespace device } // namespace device
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
#include "device/serial/serial_device_enumerator_linux.h" #include "device/serial/serial_device_enumerator_linux.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/memory/linked_ptr.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
namespace device { namespace device {
...@@ -45,21 +44,20 @@ SerialDeviceEnumeratorLinux::SerialDeviceEnumeratorLinux() { ...@@ -45,21 +44,20 @@ SerialDeviceEnumeratorLinux::SerialDeviceEnumeratorLinux() {
SerialDeviceEnumeratorLinux::~SerialDeviceEnumeratorLinux() {} SerialDeviceEnumeratorLinux::~SerialDeviceEnumeratorLinux() {}
void SerialDeviceEnumeratorLinux::GetDevices(SerialDeviceInfoList* devices) { mojo::Array<SerialDeviceInfoPtr> SerialDeviceEnumeratorLinux::GetDevices() {
devices->clear(); mojo::Array<SerialDeviceInfoPtr> devices;
ScopedUdevEnumeratePtr enumerate(udev_enumerate_new(udev_.get())); ScopedUdevEnumeratePtr enumerate(udev_enumerate_new(udev_.get()));
if (!enumerate) { if (!enumerate) {
LOG(ERROR) << "Serial device enumeration failed."; LOG(ERROR) << "Serial device enumeration failed.";
return; return devices.Pass();
} }
if (udev_enumerate_add_match_subsystem(enumerate.get(), kSerialSubsystem)) { if (udev_enumerate_add_match_subsystem(enumerate.get(), kSerialSubsystem)) {
LOG(ERROR) << "Serial device enumeration failed."; LOG(ERROR) << "Serial device enumeration failed.";
return; return devices.Pass();
} }
if (udev_enumerate_scan_devices(enumerate.get())) { if (udev_enumerate_scan_devices(enumerate.get())) {
LOG(ERROR) << "Serial device enumeration failed."; LOG(ERROR) << "Serial device enumeration failed.";
return; return devices.Pass();
} }
udev_list_entry* entry = udev_enumerate_get_list_entry(enumerate.get()); udev_list_entry* entry = udev_enumerate_get_list_entry(enumerate.get());
...@@ -75,8 +73,8 @@ void SerialDeviceEnumeratorLinux::GetDevices(SerialDeviceInfoList* devices) { ...@@ -75,8 +73,8 @@ void SerialDeviceEnumeratorLinux::GetDevices(SerialDeviceInfoList* devices) {
udev_device_get_property_value(device.get(), kHostPathKey); udev_device_get_property_value(device.get(), kHostPathKey);
const char* bus = udev_device_get_property_value(device.get(), kHostBusKey); const char* bus = udev_device_get_property_value(device.get(), kHostBusKey);
if (path != NULL && bus != NULL) { if (path != NULL && bus != NULL) {
linked_ptr<SerialDeviceInfo> info(new SerialDeviceInfo()); SerialDeviceInfoPtr info(SerialDeviceInfo::New());
info->path = std::string(path); info->path = path;
const char* vendor_id = const char* vendor_id =
udev_device_get_property_value(device.get(), kVendorIDKey); udev_device_get_property_value(device.get(), kVendorIDKey);
...@@ -86,16 +84,20 @@ void SerialDeviceEnumeratorLinux::GetDevices(SerialDeviceInfoList* devices) { ...@@ -86,16 +84,20 @@ void SerialDeviceEnumeratorLinux::GetDevices(SerialDeviceInfoList* devices) {
udev_device_get_property_value(device.get(), kProductNameKey); udev_device_get_property_value(device.get(), kProductNameKey);
uint32 int_value; uint32 int_value;
if (vendor_id && base::HexStringToUInt(vendor_id, &int_value)) if (vendor_id && base::HexStringToUInt(vendor_id, &int_value)) {
info->vendor_id.reset(new uint16(int_value)); info->vendor_id = int_value;
if (product_id && base::HexStringToUInt(product_id, &int_value)) info->has_vendor_id = true;
info->product_id.reset(new uint16(int_value)); }
if (product_id && base::HexStringToUInt(product_id, &int_value)) {
info->product_id = int_value;
info->has_product_id = true;
}
if (product_name) if (product_name)
info->display_name.reset(new std::string(product_name)); info->display_name = product_name;
devices.push_back(info.Pass());
devices->push_back(info);
} }
} }
return devices.Pass();
} }
void SerialDeviceEnumeratorLinux::UdevDeleter::operator()(udev* handle) { void SerialDeviceEnumeratorLinux::UdevDeleter::operator()(udev* handle) {
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "device/serial/serial_device_enumerator.h" #include "device/serial/serial_device_enumerator.h"
#include "device/serial/serial_device_info.h"
namespace device { namespace device {
...@@ -20,7 +19,7 @@ class SerialDeviceEnumeratorLinux : public SerialDeviceEnumerator { ...@@ -20,7 +19,7 @@ class SerialDeviceEnumeratorLinux : public SerialDeviceEnumerator {
virtual ~SerialDeviceEnumeratorLinux(); virtual ~SerialDeviceEnumeratorLinux();
// Implementation for SerialDeviceEnumerator. // Implementation for SerialDeviceEnumerator.
virtual void GetDevices(SerialDeviceInfoList* devices) OVERRIDE; virtual mojo::Array<SerialDeviceInfoPtr> GetDevices() OVERRIDE;
private: private:
struct UdevDeleter { struct UdevDeleter {
...@@ -34,4 +33,4 @@ class SerialDeviceEnumeratorLinux : public SerialDeviceEnumerator { ...@@ -34,4 +33,4 @@ class SerialDeviceEnumeratorLinux : public SerialDeviceEnumerator {
} // namespace device } // namespace device
#endif // DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_ #endif // DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_LINUX_H_
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include "base/file_util.h" #include "base/file_util.h"
#include "base/files/file_enumerator.h" #include "base/files/file_enumerator.h"
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/memory/linked_ptr.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
...@@ -23,7 +22,7 @@ SerialDeviceEnumeratorMac::SerialDeviceEnumeratorMac() {} ...@@ -23,7 +22,7 @@ SerialDeviceEnumeratorMac::SerialDeviceEnumeratorMac() {}
SerialDeviceEnumeratorMac::~SerialDeviceEnumeratorMac() {} SerialDeviceEnumeratorMac::~SerialDeviceEnumeratorMac() {}
// TODO(rockot): Use IOKit to enumerate serial interfaces. // TODO(rockot): Use IOKit to enumerate serial interfaces.
void SerialDeviceEnumeratorMac::GetDevices(SerialDeviceInfoList* devices) { mojo::Array<SerialDeviceInfoPtr> SerialDeviceEnumeratorMac::GetDevices() {
const base::FilePath kDevRoot("/dev"); const base::FilePath kDevRoot("/dev");
const int kFilesAndSymLinks = const int kFilesAndSymLinks =
base::FileEnumerator::FILES | base::FileEnumerator::SHOW_SYM_LINKS; base::FileEnumerator::FILES | base::FileEnumerator::SHOW_SYM_LINKS;
...@@ -37,7 +36,7 @@ void SerialDeviceEnumeratorMac::GetDevices(SerialDeviceInfoList* devices) { ...@@ -37,7 +36,7 @@ void SerialDeviceEnumeratorMac::GetDevices(SerialDeviceInfoList* devices) {
valid_patterns.insert("/dev/tty.*"); valid_patterns.insert("/dev/tty.*");
valid_patterns.insert("/dev/cu.*"); valid_patterns.insert("/dev/cu.*");
devices->clear(); mojo::Array<SerialDeviceInfoPtr> devices;
base::FileEnumerator enumerator(kDevRoot, false, kFilesAndSymLinks); base::FileEnumerator enumerator(kDevRoot, false, kFilesAndSymLinks);
do { do {
const base::FilePath next_device_path(enumerator.Next()); const base::FilePath next_device_path(enumerator.Next());
...@@ -48,13 +47,14 @@ void SerialDeviceEnumeratorMac::GetDevices(SerialDeviceInfoList* devices) { ...@@ -48,13 +47,14 @@ void SerialDeviceEnumeratorMac::GetDevices(SerialDeviceInfoList* devices) {
std::set<std::string>::const_iterator i = valid_patterns.begin(); std::set<std::string>::const_iterator i = valid_patterns.begin();
for (; i != valid_patterns.end(); ++i) { for (; i != valid_patterns.end(); ++i) {
if (MatchPattern(next_device, *i)) { if (MatchPattern(next_device, *i)) {
linked_ptr<SerialDeviceInfo> info(new SerialDeviceInfo); SerialDeviceInfoPtr info(SerialDeviceInfo::New());
info->path = next_device; info->path = next_device;
devices->push_back(info); devices.push_back(info.Pass());
break; break;
} }
} }
} while (true); } while (true);
return devices.Pass();
} }
} // namespace device } // namespace device
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#define DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_MAC_H_ #define DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_MAC_H_
#include "device/serial/serial_device_enumerator.h" #include "device/serial/serial_device_enumerator.h"
#include "device/serial/serial_device_info.h"
namespace device { namespace device {
...@@ -17,7 +16,7 @@ class SerialDeviceEnumeratorMac : public SerialDeviceEnumerator { ...@@ -17,7 +16,7 @@ class SerialDeviceEnumeratorMac : public SerialDeviceEnumerator {
virtual ~SerialDeviceEnumeratorMac(); virtual ~SerialDeviceEnumeratorMac();
// Implementation for SerialDeviceEnumerator. // Implementation for SerialDeviceEnumerator.
virtual void GetDevices(SerialDeviceInfoList* devices) OVERRIDE; virtual mojo::Array<SerialDeviceInfoPtr> GetDevices() OVERRIDE;
private: private:
DISALLOW_COPY_AND_ASSIGN(SerialDeviceEnumeratorMac); DISALLOW_COPY_AND_ASSIGN(SerialDeviceEnumeratorMac);
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#include <windows.h> #include <windows.h>
#include "base/memory/linked_ptr.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
...@@ -27,17 +26,16 @@ SerialDeviceEnumeratorWin::~SerialDeviceEnumeratorWin() {} ...@@ -27,17 +26,16 @@ SerialDeviceEnumeratorWin::~SerialDeviceEnumeratorWin() {}
// TODO(rockot): Query the system for more information than just device paths. // TODO(rockot): Query the system for more information than just device paths.
// This may or may not require using a different strategy than scanning the // This may or may not require using a different strategy than scanning the
// registry location below. // registry location below.
void SerialDeviceEnumeratorWin::GetDevices(SerialDeviceInfoList* devices) { mojo::Array<SerialDeviceInfoPtr> SerialDeviceEnumeratorWin::GetDevices() {
devices->clear();
base::win::RegistryValueIterator iter_key( base::win::RegistryValueIterator iter_key(
HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM\\"); HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM\\");
mojo::Array<SerialDeviceInfoPtr> devices;
for (; iter_key.Valid(); ++iter_key) { for (; iter_key.Valid(); ++iter_key) {
base::string16 value(iter_key.Value()); SerialDeviceInfoPtr info(SerialDeviceInfo::New());
linked_ptr<SerialDeviceInfo> info(new SerialDeviceInfo); info->path = base::UTF16ToASCII(iter_key.Value());
info->path = base::UTF16ToASCII(value); devices.push_back(info.Pass());
devices->push_back(info);
} }
return devices.Pass();
} }
} // namespace device } // namespace device
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#define DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_WIN_H_ #define DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_WIN_H_
#include "device/serial/serial_device_enumerator.h" #include "device/serial/serial_device_enumerator.h"
#include "device/serial/serial_device_info.h"
namespace device { namespace device {
...@@ -17,7 +16,7 @@ class SerialDeviceEnumeratorWin : public SerialDeviceEnumerator { ...@@ -17,7 +16,7 @@ class SerialDeviceEnumeratorWin : public SerialDeviceEnumerator {
virtual ~SerialDeviceEnumeratorWin(); virtual ~SerialDeviceEnumeratorWin();
// Implementation for SerialDeviceEnumerator. // Implementation for SerialDeviceEnumerator.
virtual void GetDevices(SerialDeviceInfoList* devices) OVERRIDE; virtual mojo::Array<SerialDeviceInfoPtr> GetDevices() OVERRIDE;
private: private:
DISALLOW_COPY_AND_ASSIGN(SerialDeviceEnumeratorWin); DISALLOW_COPY_AND_ASSIGN(SerialDeviceEnumeratorWin);
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef DEVICE_SERIAL_SERIAL_DEVICE_INFO_H_
#define DEVICE_SERIAL_SERIAL_DEVICE_INFO_H_
#include <string>
#include <vector>
#include "base/basictypes.h"
#include "base/memory/linked_ptr.h"
#include "base/memory/scoped_ptr.h"
namespace device {
struct SerialDeviceInfo {
SerialDeviceInfo();
~SerialDeviceInfo();
std::string path;
scoped_ptr<uint16> vendor_id;
scoped_ptr<uint16> product_id;
scoped_ptr<std::string> display_name;
private:
DISALLOW_COPY_AND_ASSIGN(SerialDeviceInfo);
};
typedef std::vector<linked_ptr<SerialDeviceInfo> > SerialDeviceInfoList;
} // namespace device
#endif // DEVICE_SERIAL_SERIAL_DEVICE_INFO_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment