serial_service_impl.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// found in the LICENSE file.
409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "device/serial/serial_service_impl.h"
609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "base/bind.h"
809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "base/location.h"
909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "device/serial/serial_io_handler.h"
1009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)namespace device {
1209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)SerialServiceImpl::SerialServiceImpl(
1409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    scoped_refptr<SerialConnectionFactory> connection_factory)
1509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    : connection_factory_(connection_factory) {
1609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
1709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)SerialServiceImpl::SerialServiceImpl(
1909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    scoped_refptr<SerialConnectionFactory> connection_factory,
2009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    scoped_ptr<SerialDeviceEnumerator> device_enumerator)
2109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    : device_enumerator_(device_enumerator.Pass()),
2209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)      connection_factory_(connection_factory) {
2309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
2409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)SerialServiceImpl::~SerialServiceImpl() {
2609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
2709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// static
2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void SerialServiceImpl::Create(
3009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> io_message_loop,
3109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    mojo::InterfaceRequest<serial::SerialService> request) {
3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  mojo::BindToRequest(new SerialServiceImpl(new SerialConnectionFactory(
3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                          base::Bind(SerialIoHandler::Create,
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                                     base::MessageLoopProxy::current()),
3507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch                          io_message_loop)),
3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                      &request);
3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
3809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch// static
4009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void SerialServiceImpl::CreateOnMessageLoop(
415d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> message_loop,
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> io_message_loop,
4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    mojo::InterfaceRequest<serial::SerialService> request) {
4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  message_loop->PostTask(
4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)      FROM_HERE,
4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)      base::Bind(
4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)          &SerialServiceImpl::Create, io_message_loop, base::Passed(&request)));
4809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void SerialServiceImpl::GetDevices(
51d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const mojo::Callback<void(mojo::Array<serial::DeviceInfoPtr>)>& callback) {
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  callback.Run(GetDeviceEnumerator()->GetDevices());
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void SerialServiceImpl::Connect(
5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    const mojo::String& path,
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    serial::ConnectionOptionsPtr options,
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    mojo::InterfaceRequest<serial::Connection> connection_request) {
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  if (!IsValidPath(path))
6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return;
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  connection_factory_->CreateConnection(
6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)      path, options.Pass(), connection_request.Pass());
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)SerialDeviceEnumerator* SerialServiceImpl::GetDeviceEnumerator() {
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  if (!device_enumerator_)
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    device_enumerator_ = SerialDeviceEnumerator::Create();
6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  return device_enumerator_.get();
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool SerialServiceImpl::IsValidPath(const mojo::String& path) {
7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  mojo::Array<serial::DeviceInfoPtr> devices(
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)      GetDeviceEnumerator()->GetDevices());
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  for (size_t i = 0; i < devices.size(); i++) {
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (path == devices[i]->path)
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)      return true;
7709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  }
7809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  return false;
7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void SerialServiceImpl::OnConnected(
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    const mojo::Callback<void(serial::ConnectionInfoPtr)>& callback,
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    serial::ConnectionInfoPtr result) {
8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)  callback.Run(result.Pass());
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}  // namespace device
8809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)