forked from sanyaade-mobiledev/chromium.src
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserial_connection_factory.cc
114 lines (96 loc) · 3.59 KB
/
serial_connection_factory.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// 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.
#include "device/serial/serial_connection_factory.h"
#include "base/bind.h"
#include "base/location.h"
#include "device/serial/serial_connection.h"
#include "device/serial/serial_io_handler.h"
namespace device {
namespace {
void FillDefaultConnectionOptions(serial::ConnectionOptions* options) {
if (!options->bitrate)
options->bitrate = 9600;
if (options->data_bits == serial::DATA_BITS_NONE)
options->data_bits = serial::DATA_BITS_EIGHT;
if (options->stop_bits == serial::STOP_BITS_NONE)
options->stop_bits = serial::STOP_BITS_ONE;
if (options->parity_bit == serial::PARITY_BIT_NONE)
options->parity_bit = serial::PARITY_BIT_NO;
if (!options->has_cts_flow_control) {
options->has_cts_flow_control = true;
options->cts_flow_control = false;
}
}
} // namespace
class SerialConnectionFactory::ConnectTask
: public base::RefCountedThreadSafe<SerialConnectionFactory::ConnectTask> {
public:
ConnectTask(scoped_refptr<SerialConnectionFactory> factory,
const std::string& path,
serial::ConnectionOptionsPtr options,
mojo::InterfaceRequest<serial::Connection> connection_request);
void Run();
private:
friend class base::RefCountedThreadSafe<SerialConnectionFactory::ConnectTask>;
virtual ~ConnectTask();
void Connect();
void OnConnected(bool success);
scoped_refptr<SerialConnectionFactory> factory_;
const std::string path_;
serial::ConnectionOptionsPtr options_;
mojo::InterfaceRequest<serial::Connection> connection_request_;
scoped_refptr<SerialIoHandler> io_handler_;
DISALLOW_COPY_AND_ASSIGN(ConnectTask);
};
SerialConnectionFactory::SerialConnectionFactory(
const IoHandlerFactory& io_handler_factory,
scoped_refptr<base::MessageLoopProxy> connect_message_loop)
: io_handler_factory_(io_handler_factory),
connect_message_loop_(connect_message_loop) {
}
void SerialConnectionFactory::CreateConnection(
const std::string& path,
serial::ConnectionOptionsPtr options,
mojo::InterfaceRequest<serial::Connection> connection_request) {
scoped_refptr<ConnectTask> task(
new ConnectTask(this, path, options.Pass(), connection_request.Pass()));
task->Run();
}
SerialConnectionFactory::~SerialConnectionFactory() {
}
SerialConnectionFactory::ConnectTask::ConnectTask(
scoped_refptr<SerialConnectionFactory> factory,
const std::string& path,
serial::ConnectionOptionsPtr options,
mojo::InterfaceRequest<serial::Connection> connection_request)
: factory_(factory),
path_(path),
options_(options.Pass()),
connection_request_(connection_request.Pass()) {
}
void SerialConnectionFactory::ConnectTask::Run() {
factory_->connect_message_loop_->PostTask(
FROM_HERE,
base::Bind(&SerialConnectionFactory::ConnectTask::Connect, this));
}
SerialConnectionFactory::ConnectTask::~ConnectTask() {
}
void SerialConnectionFactory::ConnectTask::Connect() {
io_handler_ = factory_->io_handler_factory_.Run();
io_handler_->Open(
path_,
base::Bind(&SerialConnectionFactory::ConnectTask::OnConnected, this));
}
void SerialConnectionFactory::ConnectTask::OnConnected(bool success) {
DCHECK(io_handler_);
if (!success)
return;
if (!options_)
options_ = serial::ConnectionOptions::New();
FillDefaultConnectionOptions(options_.get());
if (!io_handler_->ConfigurePort(*options_))
return;
mojo::BindToRequest(new SerialConnection(io_handler_), &connection_request_);
}
} // namespace device