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() {
void SerialGetDevicesFunction::Work() {
DCHECK_CURRENTLY_ON(BrowserThread::FILE);
device::SerialDeviceInfoList devices;
scoped_ptr<device::SerialDeviceEnumerator> enumerator =
device::SerialDeviceEnumerator::Create();
enumerator->GetDevices(&devices);
std::vector<linked_ptr<serial::DeviceInfo> > out_devices;
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);
mojo::Array<device::SerialDeviceInfoPtr> devices = enumerator->GetDevices();
results_ = serial::GetDevices::Results::Create(
devices.To<std::vector<linked_ptr<serial::DeviceInfo> > >());
}
SerialConnectFunction::SerialConnectFunction() {}
......@@ -425,3 +409,24 @@ void SerialSetControlSignalsFunction::Work() {
} // namespace api
} // 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 @@
#include "base/memory/ref_counted.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/async_api_function.h"
......@@ -243,4 +244,16 @@ class SerialSetControlSignalsFunction : public SerialAsyncApiFunction {
} // 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_
include_rules = [
"+chromeos",
"+mojo/public",
]
......@@ -20,7 +20,14 @@
],
}],
],
'variables': {
'mojom_base_output_dir': 'device/serial',
},
'includes': [
'../../mojo/public/tools/bindings/mojom_bindings_generator.gypi',
],
'sources': [
'serial.mojom',
'serial_device_enumerator.cc',
'serial_device_enumerator.h',
'serial_device_enumerator_linux.cc',
......@@ -29,8 +36,6 @@
'serial_device_enumerator_mac.h',
'serial_device_enumerator_win.cc',
'serial_device_enumerator_win.h',
'serial_device_info.cc',
'serial_device_info.h',
],
},
],
......
......@@ -2,12 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be
// 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 @@
#ifndef DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_
#define DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_
#include <vector>
#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 {
......@@ -20,7 +19,7 @@ class SerialDeviceEnumerator {
SerialDeviceEnumerator();
virtual ~SerialDeviceEnumerator();
virtual void GetDevices(SerialDeviceInfoList* devices) = 0;
virtual mojo::Array<SerialDeviceInfoPtr> GetDevices() = 0;
};
} // namespace device
......
......@@ -5,7 +5,6 @@
#include "device/serial/serial_device_enumerator_linux.h"
#include "base/logging.h"
#include "base/memory/linked_ptr.h"
#include "base/strings/string_number_conversions.h"
namespace device {
......@@ -45,21 +44,20 @@ SerialDeviceEnumeratorLinux::SerialDeviceEnumeratorLinux() {
SerialDeviceEnumeratorLinux::~SerialDeviceEnumeratorLinux() {}
void SerialDeviceEnumeratorLinux::GetDevices(SerialDeviceInfoList* devices) {
devices->clear();
mojo::Array<SerialDeviceInfoPtr> SerialDeviceEnumeratorLinux::GetDevices() {
mojo::Array<SerialDeviceInfoPtr> devices;
ScopedUdevEnumeratePtr enumerate(udev_enumerate_new(udev_.get()));
if (!enumerate) {
LOG(ERROR) << "Serial device enumeration failed.";
return;
return devices.Pass();
}
if (udev_enumerate_add_match_subsystem(enumerate.get(), kSerialSubsystem)) {
LOG(ERROR) << "Serial device enumeration failed.";
return;
return devices.Pass();
}
if (udev_enumerate_scan_devices(enumerate.get())) {
LOG(ERROR) << "Serial device enumeration failed.";
return;
return devices.Pass();
}
udev_list_entry* entry = udev_enumerate_get_list_entry(enumerate.get());
......@@ -75,8 +73,8 @@ void SerialDeviceEnumeratorLinux::GetDevices(SerialDeviceInfoList* devices) {
udev_device_get_property_value(device.get(), kHostPathKey);
const char* bus = udev_device_get_property_value(device.get(), kHostBusKey);
if (path != NULL && bus != NULL) {
linked_ptr<SerialDeviceInfo> info(new SerialDeviceInfo());
info->path = std::string(path);
SerialDeviceInfoPtr info(SerialDeviceInfo::New());
info->path = path;
const char* vendor_id =
udev_device_get_property_value(device.get(), kVendorIDKey);
......@@ -86,16 +84,20 @@ void SerialDeviceEnumeratorLinux::GetDevices(SerialDeviceInfoList* devices) {
udev_device_get_property_value(device.get(), kProductNameKey);
uint32 int_value;
if (vendor_id && base::HexStringToUInt(vendor_id, &int_value))
info->vendor_id.reset(new uint16(int_value));
if (product_id && base::HexStringToUInt(product_id, &int_value))
info->product_id.reset(new uint16(int_value));
if (vendor_id && base::HexStringToUInt(vendor_id, &int_value)) {
info->vendor_id = int_value;
info->has_vendor_id = true;
}
if (product_id && base::HexStringToUInt(product_id, &int_value)) {
info->product_id = int_value;
info->has_product_id = true;
}
if (product_name)
info->display_name.reset(new std::string(product_name));
devices->push_back(info);
info->display_name = product_name;
devices.push_back(info.Pass());
}
}
return devices.Pass();
}
void SerialDeviceEnumeratorLinux::UdevDeleter::operator()(udev* handle) {
......
......@@ -9,7 +9,6 @@
#include "base/memory/scoped_ptr.h"
#include "device/serial/serial_device_enumerator.h"
#include "device/serial/serial_device_info.h"
namespace device {
......@@ -20,7 +19,7 @@ class SerialDeviceEnumeratorLinux : public SerialDeviceEnumerator {
virtual ~SerialDeviceEnumeratorLinux();
// Implementation for SerialDeviceEnumerator.
virtual void GetDevices(SerialDeviceInfoList* devices) OVERRIDE;
virtual mojo::Array<SerialDeviceInfoPtr> GetDevices() OVERRIDE;
private:
struct UdevDeleter {
......@@ -34,4 +33,4 @@ class SerialDeviceEnumeratorLinux : public SerialDeviceEnumerator {
} // namespace device
#endif // DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_H_
#endif // DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_LINUX_H_
......@@ -7,7 +7,6 @@
#include "base/file_util.h"
#include "base/files/file_enumerator.h"
#include "base/files/file_path.h"
#include "base/memory/linked_ptr.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_util.h"
......@@ -23,7 +22,7 @@ SerialDeviceEnumeratorMac::SerialDeviceEnumeratorMac() {}
SerialDeviceEnumeratorMac::~SerialDeviceEnumeratorMac() {}
// TODO(rockot): Use IOKit to enumerate serial interfaces.
void SerialDeviceEnumeratorMac::GetDevices(SerialDeviceInfoList* devices) {
mojo::Array<SerialDeviceInfoPtr> SerialDeviceEnumeratorMac::GetDevices() {
const base::FilePath kDevRoot("/dev");
const int kFilesAndSymLinks =
base::FileEnumerator::FILES | base::FileEnumerator::SHOW_SYM_LINKS;
......@@ -37,7 +36,7 @@ void SerialDeviceEnumeratorMac::GetDevices(SerialDeviceInfoList* devices) {
valid_patterns.insert("/dev/tty.*");
valid_patterns.insert("/dev/cu.*");
devices->clear();
mojo::Array<SerialDeviceInfoPtr> devices;
base::FileEnumerator enumerator(kDevRoot, false, kFilesAndSymLinks);
do {
const base::FilePath next_device_path(enumerator.Next());
......@@ -48,13 +47,14 @@ void SerialDeviceEnumeratorMac::GetDevices(SerialDeviceInfoList* devices) {
std::set<std::string>::const_iterator i = valid_patterns.begin();
for (; i != valid_patterns.end(); ++i) {
if (MatchPattern(next_device, *i)) {
linked_ptr<SerialDeviceInfo> info(new SerialDeviceInfo);
SerialDeviceInfoPtr info(SerialDeviceInfo::New());
info->path = next_device;
devices->push_back(info);
devices.push_back(info.Pass());
break;
}
}
} while (true);
return devices.Pass();
}
} // namespace device
......@@ -6,7 +6,6 @@
#define DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_MAC_H_
#include "device/serial/serial_device_enumerator.h"
#include "device/serial/serial_device_info.h"
namespace device {
......@@ -17,7 +16,7 @@ class SerialDeviceEnumeratorMac : public SerialDeviceEnumerator {
virtual ~SerialDeviceEnumeratorMac();
// Implementation for SerialDeviceEnumerator.
virtual void GetDevices(SerialDeviceInfoList* devices) OVERRIDE;
virtual mojo::Array<SerialDeviceInfoPtr> GetDevices() OVERRIDE;
private:
DISALLOW_COPY_AND_ASSIGN(SerialDeviceEnumeratorMac);
......
......@@ -6,7 +6,6 @@
#include <windows.h>
#include "base/memory/linked_ptr.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
......@@ -27,17 +26,16 @@ SerialDeviceEnumeratorWin::~SerialDeviceEnumeratorWin() {}
// 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
// registry location below.
void SerialDeviceEnumeratorWin::GetDevices(SerialDeviceInfoList* devices) {
devices->clear();
mojo::Array<SerialDeviceInfoPtr> SerialDeviceEnumeratorWin::GetDevices() {
base::win::RegistryValueIterator iter_key(
HKEY_LOCAL_MACHINE, L"HARDWARE\\DEVICEMAP\\SERIALCOMM\\");
mojo::Array<SerialDeviceInfoPtr> devices;
for (; iter_key.Valid(); ++iter_key) {
base::string16 value(iter_key.Value());
linked_ptr<SerialDeviceInfo> info(new SerialDeviceInfo);
info->path = base::UTF16ToASCII(value);
devices->push_back(info);
SerialDeviceInfoPtr info(SerialDeviceInfo::New());
info->path = base::UTF16ToASCII(iter_key.Value());
devices.push_back(info.Pass());
}
return devices.Pass();
}
} // namespace device
......@@ -6,7 +6,6 @@
#define DEVICE_SERIAL_SERIAL_DEVICE_ENUMERATOR_WIN_H_
#include "device/serial/serial_device_enumerator.h"
#include "device/serial/serial_device_info.h"
namespace device {
......@@ -17,7 +16,7 @@ class SerialDeviceEnumeratorWin : public SerialDeviceEnumerator {
virtual ~SerialDeviceEnumeratorWin();
// Implementation for SerialDeviceEnumerator.
virtual void GetDevices(SerialDeviceInfoList* devices) OVERRIDE;
virtual mojo::Array<SerialDeviceInfoPtr> GetDevices() OVERRIDE;
private:
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