1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef EXTENSIONS_BROWSER_API_SERIAL_SERIAL_CONNECTION_H_
6 #define EXTENSIONS_BROWSER_API_SERIAL_SERIAL_CONNECTION_H_
11 #include "base/callback.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/time/time.h"
14 #include "content/public/browser/browser_thread.h"
15 #include "device/serial/serial_io_handler.h"
16 #include "extensions/browser/api/api_resource.h"
17 #include "extensions/browser/api/api_resource_manager.h"
18 #include "extensions/common/api/serial.h"
19 #include "net/base/io_buffer.h"
21 using content::BrowserThread
;
23 namespace extensions
{
25 // Encapsulates an open serial port.
26 // NOTE: Instances of this object should only be constructed on the IO thread,
27 // and all methods should only be called on the IO thread unless otherwise
29 class SerialConnection
: public ApiResource
,
30 public base::SupportsWeakPtr
<SerialConnection
> {
32 typedef device::SerialIoHandler::OpenCompleteCallback OpenCompleteCallback
;
34 // This is the callback type expected by Receive. Note that an error result
35 // does not necessarily imply an empty |data| string, since a receive may
36 // complete partially before being interrupted by an error condition.
37 typedef base::Callback
<void(const std::vector
<char>& data
,
38 core_api::serial::ReceiveError error
)>
39 ReceiveCompleteCallback
;
41 // This is the callback type expected by Send. Note that an error result
42 // does not necessarily imply 0 bytes sent, since a send may complete
43 // partially before being interrupted by an error condition.
44 typedef base::Callback
<
45 void(int bytes_sent
, core_api::serial::SendError error
)>
48 SerialConnection(const std::string
& port
,
49 const std::string
& owner_extension_id
);
50 ~SerialConnection() override
;
52 // ApiResource override.
53 bool IsPersistent() const override
;
55 void set_persistent(bool persistent
) { persistent_
= persistent
; }
56 bool persistent() const { return persistent_
; }
58 void set_name(const std::string
& name
) { name_
= name
; }
59 const std::string
& name() const { return name_
; }
61 void set_buffer_size(int buffer_size
);
62 int buffer_size() const { return buffer_size_
; }
64 void set_receive_timeout(int receive_timeout
);
65 int receive_timeout() const { return receive_timeout_
; }
67 void set_send_timeout(int send_timeout
);
68 int send_timeout() const { return send_timeout_
; }
70 void set_paused(bool paused
);
71 bool paused() const { return paused_
; }
73 // Initiates an asynchronous Open of the device. It is the caller's
74 // responsibility to ensure that this SerialConnection stays alive
75 // until |callback| is run.
76 void Open(const core_api::serial::ConnectionOptions
& options
,
77 const OpenCompleteCallback
& callback
);
79 // Begins an asynchronous receive operation. Calling this while a Receive
80 // is already pending is a no-op and returns |false| without calling
82 bool Receive(const ReceiveCompleteCallback
& callback
);
84 // Begins an asynchronous send operation. Calling this while a Send
85 // is already pending is a no-op and returns |false| without calling
87 bool Send(const std::vector
<char>& data
,
88 const SendCompleteCallback
& callback
);
90 // Flushes input and output buffers.
93 // Configures some subset of port options for this connection.
94 // Omitted options are unchanged. Returns |true| iff the configuration
95 // changes were successful.
96 bool Configure(const core_api::serial::ConnectionOptions
& options
);
98 // Connection configuration query. Fills values in an existing
99 // ConnectionInfo. Returns |true| iff the connection's information
100 // was successfully retrieved.
101 bool GetInfo(core_api::serial::ConnectionInfo
* info
) const;
103 // Reads current control signals (DCD, CTS, etc.) into an existing
104 // DeviceControlSignals structure. Returns |true| iff the signals were
105 // successfully read.
106 bool GetControlSignals(
107 core_api::serial::DeviceControlSignals
* control_signals
) const;
109 // Sets one or more control signals (DTR and/or RTS). Returns |true| iff
110 // the signals were successfully set. Unininitialized flags in the
111 // HostControlSignals structure are left unchanged.
112 bool SetControlSignals(
113 const core_api::serial::HostControlSignals
& control_signals
);
115 // Overrides |io_handler_| for testing.
116 void SetIoHandlerForTest(scoped_refptr
<device::SerialIoHandler
> handler
);
118 static const BrowserThread::ID kThreadId
= BrowserThread::IO
;
121 friend class ApiResourceManager
<SerialConnection
>;
122 static const char* service_name() { return "SerialConnectionManager"; }
124 // Encapsulates a cancelable, delayed timeout task. Posts a delayed
125 // task upon construction and implicitly cancels the task upon
126 // destruction if it hasn't run yet.
129 TimeoutTask(const base::Closure
& closure
, const base::TimeDelta
& delay
);
135 base::Closure closure_
;
136 base::TimeDelta delay_
;
137 base::WeakPtrFactory
<TimeoutTask
> weak_factory_
;
140 // Handles a receive timeout.
141 void OnReceiveTimeout();
143 // Handles a send timeout.
144 void OnSendTimeout();
146 // Receives read completion notification from the |io_handler_|.
147 void OnAsyncReadComplete(int bytes_read
, device::serial::ReceiveError error
);
149 // Receives write completion notification from the |io_handler_|.
150 void OnAsyncWriteComplete(int bytes_sent
, device::serial::SendError error
);
152 // The pathname of the serial device.
155 // Flag indicating whether or not the connection should persist when
156 // its host app is suspended.
159 // User-specified connection name.
162 // Size of the receive buffer.
165 // Amount of time (in ms) to wait for a Read to succeed before triggering a
166 // timeout response via onReceiveError.
167 int receive_timeout_
;
169 // Amount of time (in ms) to wait for a Write to succeed before triggering
170 // a timeout response.
173 // Flag indicating that the connection is paused. A paused connection will not
174 // raise new onReceive events.
177 // Callback to handle the completion of a pending Receive() request.
178 ReceiveCompleteCallback receive_complete_
;
180 // Callback to handle the completion of a pending Send() request.
181 SendCompleteCallback send_complete_
;
183 // Closure which will trigger a receive timeout unless cancelled. Reset on
184 // initialization and after every successful Receive().
185 scoped_ptr
<TimeoutTask
> receive_timeout_task_
;
187 // Write timeout closure. Reset on initialization and after every successful
189 scoped_ptr
<TimeoutTask
> send_timeout_task_
;
191 scoped_refptr
<net::IOBuffer
> receive_buffer_
;
193 // Asynchronous I/O handler.
194 scoped_refptr
<device::SerialIoHandler
> io_handler_
;
197 } // namespace extensions
202 struct TypeConverter
<device::serial::HostControlSignalsPtr
,
203 extensions::core_api::serial::HostControlSignals
> {
204 static device::serial::HostControlSignalsPtr
Convert(
205 const extensions::core_api::serial::HostControlSignals
& input
);
209 struct TypeConverter
<device::serial::ConnectionOptionsPtr
,
210 extensions::core_api::serial::ConnectionOptions
> {
211 static device::serial::ConnectionOptionsPtr
Convert(
212 const extensions::core_api::serial::ConnectionOptions
& input
);
217 #endif // EXTENSIONS_BROWSER_API_SERIAL_SERIAL_CONNECTION_H_