Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(224)

Side by Side Diff: chrome/browser/extensions/api/serial/serial_connection.h

Issue 369893008: Move the serial API to extensions/. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add missing dependency from usb_service to chromeos Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2012 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.
4
5 #ifndef CHROME_BROWSER_EXTENSIONS_API_SERIAL_SERIAL_CONNECTION_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_SERIAL_SERIAL_CONNECTION_H_
7
8 #include <set>
9 #include <string>
10
11 #include "base/callback.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/message_loop/message_loop.h"
15 #include "base/time/time.h"
16 #include "chrome/common/extensions/api/serial.h"
17 #include "content/public/browser/browser_thread.h"
18 #include "device/serial/serial_io_handler.h"
19 #include "extensions/browser/api/api_resource.h"
20 #include "extensions/browser/api/api_resource_manager.h"
21
22 using content::BrowserThread;
23
24 namespace extensions {
25
26 // Encapsulates an open serial port.
27 // NOTE: Instances of this object should only be constructed on the IO thread,
28 // and all methods should only be called on the IO thread unless otherwise
29 // noted.
30 class SerialConnection : public ApiResource,
31 public base::SupportsWeakPtr<SerialConnection> {
32 public:
33 typedef device::SerialIoHandler::OpenCompleteCallback OpenCompleteCallback;
34
35 // This is the callback type expected by Receive. Note that an error result
36 // does not necessarily imply an empty |data| string, since a receive may
37 // complete partially before being interrupted by an error condition.
38 typedef base::Callback<
39 void(const std::string& data, api::serial::ReceiveError error)>
40 ReceiveCompleteCallback;
41
42 // This is the callback type expected by Send. Note that an error result
43 // does not necessarily imply 0 bytes sent, since a send may complete
44 // partially before being interrupted by an error condition.
45 typedef base::Callback<void(int bytes_sent, api::serial::SendError error)>
46 SendCompleteCallback;
47
48 SerialConnection(const std::string& port,
49 const std::string& owner_extension_id);
50 virtual ~SerialConnection();
51
52 // ApiResource override.
53 virtual bool IsPersistent() const OVERRIDE;
54
55 void set_persistent(bool persistent) { persistent_ = persistent; }
56 bool persistent() const { return persistent_; }
57
58 void set_name(const std::string& name) { name_ = name; }
59 const std::string& name() const { return name_; }
60
61 void set_buffer_size(int buffer_size);
62 int buffer_size() const { return buffer_size_; }
63
64 void set_receive_timeout(int receive_timeout);
65 int receive_timeout() const { return receive_timeout_; }
66
67 void set_send_timeout(int send_timeout);
68 int send_timeout() const { return send_timeout_; }
69
70 void set_paused(bool paused);
71 bool paused() const { return paused_; }
72
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 OpenCompleteCallback& callback);
77
78 // Begins an asynchronous receive operation. Calling this while a Receive
79 // is already pending is a no-op and returns |false| without calling
80 // |callback|.
81 bool Receive(const ReceiveCompleteCallback& callback);
82
83 // Begins an asynchronous send operation. Calling this while a Send
84 // is already pending is a no-op and returns |false| without calling
85 // |callback|.
86 bool Send(const std::string& data, const SendCompleteCallback& callback);
87
88 // Flushes input and output buffers.
89 bool Flush() const;
90
91 // Configures some subset of port options for this connection.
92 // Omitted options are unchanged. Returns |true| iff the configuration
93 // changes were successful.
94 bool Configure(const api::serial::ConnectionOptions& options);
95
96 // Connection configuration query. Fills values in an existing
97 // ConnectionInfo. Returns |true| iff the connection's information
98 // was successfully retrieved.
99 bool GetInfo(api::serial::ConnectionInfo* info) const;
100
101 // Reads current control signals (DCD, CTS, etc.) into an existing
102 // DeviceControlSignals structure. Returns |true| iff the signals were
103 // successfully read.
104 bool GetControlSignals(
105 api::serial::DeviceControlSignals* control_signals) const;
106
107 // Sets one or more control signals (DTR and/or RTS). Returns |true| iff
108 // the signals were successfully set. Unininitialized flags in the
109 // HostControlSignals structure are left unchanged.
110 bool SetControlSignals(
111 const api::serial::HostControlSignals& control_signals);
112
113 // Overrides |io_handler_| for testing.
114 void SetIoHandlerForTest(scoped_refptr<device::SerialIoHandler> handler);
115
116 static const BrowserThread::ID kThreadId = BrowserThread::IO;
117
118 private:
119 friend class ApiResourceManager<SerialConnection>;
120 static const char* service_name() { return "SerialConnectionManager"; }
121
122 // Encapsulates a cancelable, delayed timeout task. Posts a delayed
123 // task upon construction and implicitly cancels the task upon
124 // destruction if it hasn't run yet.
125 class TimeoutTask {
126 public:
127 TimeoutTask(const base::Closure& closure, const base::TimeDelta& delay);
128 ~TimeoutTask();
129
130 private:
131 void Run() const;
132
133 base::WeakPtrFactory<TimeoutTask> weak_factory_;
134 base::Closure closure_;
135 base::TimeDelta delay_;
136 };
137
138 // Handles a receive timeout.
139 void OnReceiveTimeout();
140
141 // Handles a send timeout.
142 void OnSendTimeout();
143
144 // Receives read completion notification from the |io_handler_|.
145 void OnAsyncReadComplete(const std::string& data,
146 device::serial::ReceiveError error);
147
148 // Receives write completion notification from the |io_handler_|.
149 void OnAsyncWriteComplete(int bytes_sent, device::serial::SendError error);
150
151 // The pathname of the serial device.
152 std::string port_;
153
154 // Flag indicating whether or not the connection should persist when
155 // its host app is suspended.
156 bool persistent_;
157
158 // User-specified connection name.
159 std::string name_;
160
161 // Size of the receive buffer.
162 int buffer_size_;
163
164 // Amount of time (in ms) to wait for a Read to succeed before triggering a
165 // timeout response via onReceiveError.
166 int receive_timeout_;
167
168 // Amount of time (in ms) to wait for a Write to succeed before triggering
169 // a timeout response.
170 int send_timeout_;
171
172 // Flag indicating that the connection is paused. A paused connection will not
173 // raise new onReceive events.
174 bool paused_;
175
176 // Callback to handle the completion of a pending Receive() request.
177 ReceiveCompleteCallback receive_complete_;
178
179 // Callback to handle the completion of a pending Send() request.
180 SendCompleteCallback send_complete_;
181
182 // Closure which will trigger a receive timeout unless cancelled. Reset on
183 // initialization and after every successful Receive().
184 scoped_ptr<TimeoutTask> receive_timeout_task_;
185
186 // Write timeout closure. Reset on initialization and after every successful
187 // Send().
188 scoped_ptr<TimeoutTask> send_timeout_task_;
189
190 // Asynchronous I/O handler.
191 scoped_refptr<device::SerialIoHandler> io_handler_;
192 };
193
194 } // namespace extensions
195
196 namespace mojo {
197
198 template <>
199 class TypeConverter<device::serial::HostControlSignalsPtr,
200 extensions::api::serial::HostControlSignals> {
201 public:
202 static device::serial::HostControlSignalsPtr ConvertFrom(
203 const extensions::api::serial::HostControlSignals& input);
204 };
205
206 template <>
207 class TypeConverter<device::serial::ConnectionOptionsPtr,
208 extensions::api::serial::ConnectionOptions> {
209 public:
210 static device::serial::ConnectionOptionsPtr ConvertFrom(
211 const extensions::api::serial::ConnectionOptions& input);
212 };
213
214 } // namespace mojo
215
216 #endif // CHROME_BROWSER_EXTENSIONS_API_SERIAL_SERIAL_CONNECTION_H_
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/serial/serial_apitest.cc ('k') | chrome/browser/extensions/api/serial/serial_connection.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698