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 DEVICE_SERIAL_DATA_SENDER_H_
6 #define DEVICE_SERIAL_DATA_SENDER_H_
10 #include "base/callback.h"
11 #include "base/memory/linked_ptr.h"
12 #include "base/strings/string_piece.h"
13 #include "device/serial/buffer.h"
14 #include "device/serial/data_stream.mojom.h"
15 #include "third_party/mojo/src/mojo/public/cpp/system/data_pipe.h"
19 // A DataSender sends data to a DataSink.
20 class DataSender
: public mojo::ErrorHandler
{
22 typedef base::Callback
<void(uint32_t bytes_sent
)> DataSentCallback
;
23 typedef base::Callback
<void(uint32_t bytes_sent
, int32_t error
)>
25 typedef base::Callback
<void()> CancelCallback
;
27 // Constructs a DataSender to send data to |sink|, using a buffer size of
28 // |buffer_size|, with connection errors reported as |fatal_error_value|.
29 DataSender(mojo::InterfacePtr
<serial::DataSink
> sink
,
31 int32_t fatal_error_value
);
33 ~DataSender() override
;
35 // Starts an asynchronous send of |data|. If the send completes successfully,
36 // |callback| will be called. Otherwise, |error_callback| will be called with
37 // the error. If there is a cancel in progress or there has been a connection
38 // error, this will not start a send and returns false. It is the caller's
39 // responsibility to ensure |data| remains valid until one of |callback| and
40 // |error_callback| is called.
41 bool Send(const base::StringPiece
& data
,
42 const DataSentCallback
& callback
,
43 const SendErrorCallback
& error_callback
);
45 // Requests the cancellation of any in-progress sends. Calls to Send() will
46 // fail until |callback| is called.
47 bool Cancel(int32_t error
, const CancelCallback
& callback
);
52 // Invoked when a PendingSend completes.
55 // Invoked when a PendingSend fails with |error|.
56 void SendFailed(int32_t error
);
58 // mojo::ErrorHandler override.
59 void OnConnectionError() override
;
61 // Dispatches a cancel callback if one is pending.
62 void RunCancelCallback();
64 // Shuts down this DataSender and dispatches fatal errors to all pending
68 // The control connection to the data sink.
69 mojo::InterfacePtr
<serial::DataSink
> sink_
;
71 // The error value to report in the event of a fatal error.
72 const int32_t fatal_error_value_
;
74 // A queue of PendingSend that have been sent to |sink_|, but have not yet
75 // been acked by the DataSink.
76 std::queue
<linked_ptr
<PendingSend
>> sends_awaiting_ack_
;
78 // The callback to report cancel completion if a cancel operation is in
80 CancelCallback pending_cancel_
;
82 // Whether we have encountered a fatal error and shut down.
85 DISALLOW_COPY_AND_ASSIGN(DataSender
);
90 #endif // DEVICE_SERIAL_DATA_SENDER_H_