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)