123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- // Copyright (c) 2012 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.
- #ifndef REMOTING_BASE_BUFFERED_SOCKET_WRITER_H_
- #define REMOTING_BASE_BUFFERED_SOCKET_WRITER_H_
- #include <list>
- #include <memory>
- #include "base/callback.h"
- #include "base/memory/weak_ptr.h"
- #include "base/synchronization/lock.h"
- #include "base/threading/thread_checker.h"
- #include "net/base/completion_once_callback.h"
- #include "net/base/io_buffer.h"
- #include "net/traffic_annotation/network_traffic_annotation.h"
- namespace net {
- class Socket;
- } // namespace net
- namespace remoting {
- // BufferedSocketWriter implement write data queue for stream sockets.
- class BufferedSocketWriter {
- public:
- typedef base::RepeatingCallback<int(
- const scoped_refptr<net::IOBuffer>& buf,
- int buf_len,
- net::CompletionOnceCallback callback,
- const net::NetworkTrafficAnnotationTag& traffic_annotation)>
- WriteCallback;
- typedef base::OnceCallback<void(int)> WriteFailedCallback;
- static std::unique_ptr<BufferedSocketWriter> CreateForSocket(
- net::Socket* socket,
- WriteFailedCallback write_failed_callback);
- BufferedSocketWriter();
- virtual ~BufferedSocketWriter();
- // Starts the writer. |write_callback| is called to write data to the
- // socket. |write_failed_callback| is called when write operation fails.
- // Writing stops after the first failed write.
- void Start(const WriteCallback& write_callback,
- WriteFailedCallback write_failed_callback);
- // Puts a new data chunk in the buffer. If called before Start() then all data
- // is buffered until Start().
- void Write(scoped_refptr<net::IOBufferWithSize> buffer,
- base::OnceClosure done_task,
- const net::NetworkTrafficAnnotationTag& traffic_annotation);
- // Returns true when there is data waiting to be written.
- bool has_data_pending() { return !queue_.empty(); }
- private:
- struct PendingPacket;
- void DoWrite();
- void HandleWriteResult(int result);
- void OnWritten(int result);
- base::ThreadChecker thread_checker_;
- WriteCallback write_callback_;
- WriteFailedCallback write_failed_callback_;
- bool closed_ = false;
- std::list<std::unique_ptr<PendingPacket>> queue_;
- bool write_pending_ = false;
- base::WeakPtrFactory<BufferedSocketWriter> weak_factory_{this};
- };
- } // namespace remoting
- #endif // REMOTING_BASE_BUFFERED_SOCKET_WRITER_H_
|