| // Copyright 2019 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 PLATFORM_IMPL_STREAM_SOCKET_POSIX_H_ |
| #define PLATFORM_IMPL_STREAM_SOCKET_POSIX_H_ |
| |
| #include <atomic> |
| #include <memory> |
| #include <string> |
| |
| #include "absl/types/optional.h" |
| #include "platform/base/error.h" |
| #include "platform/base/ip_address.h" |
| #include "platform/impl/socket_address_posix.h" |
| #include "platform/impl/socket_handle_posix.h" |
| #include "platform/impl/stream_socket.h" |
| #include "util/weak_ptr.h" |
| |
| namespace openscreen { |
| |
| class StreamSocketPosix : public StreamSocket { |
| public: |
| explicit StreamSocketPosix(IPAddress::Version version); |
| explicit StreamSocketPosix(const IPEndpoint& local_endpoint); |
| StreamSocketPosix(SocketAddressPosix local_address, |
| IPEndpoint remote_address, |
| int file_descriptor); |
| |
| // StreamSocketPosix is non-copyable, due to directly managing the file |
| // descriptor. |
| StreamSocketPosix(const StreamSocketPosix& other) = delete; |
| StreamSocketPosix(StreamSocketPosix&& other) = default; |
| StreamSocketPosix& operator=(const StreamSocketPosix& other) = delete; |
| StreamSocketPosix& operator=(StreamSocketPosix&& other) = default; |
| virtual ~StreamSocketPosix(); |
| |
| WeakPtr<StreamSocketPosix> GetWeakPtr() const; |
| |
| // StreamSocket overrides. |
| ErrorOr<std::unique_ptr<StreamSocket>> Accept() override; |
| Error Bind() override; |
| Error Close() override; |
| Error Connect(const IPEndpoint& remote_endpoint) override; |
| Error Listen() override; |
| Error Listen(int max_backlog_size) override; |
| |
| // StreamSocket getter overrides. |
| const SocketHandle& socket_handle() const override { return handle_; } |
| absl::optional<IPEndpoint> remote_address() const override; |
| absl::optional<IPEndpoint> local_address() const override; |
| SocketState state() const override; |
| IPAddress::Version version() const override; |
| |
| private: |
| // StreamSocketPosix is lazy initialized on first usage. For simplicitly, |
| // the ensure method returns a boolean of whether or not the socket was |
| // initialized successfully. |
| bool EnsureInitializedAndOpen(); |
| Error Initialize(); |
| |
| Error CloseOnError(Error error); |
| Error ReportSocketClosedError(); |
| |
| constexpr static int kUnsetHandleFd = -1; |
| |
| // This SocketHandle object is expected to persist for the lieftime of this |
| // object. The internal fd may change, but the object may not be destroyed. |
| SocketHandle handle_{kUnsetHandleFd}; |
| |
| // last_error_code_ is an Error::Code instead of an Error so it meets |
| // atomic's (trivially) copyable and moveable requirements. |
| Error::Code last_error_code_ = Error::Code::kNone; |
| IPAddress::Version version_; |
| absl::optional<SocketAddressPosix> local_address_; |
| absl::optional<IPEndpoint> remote_address_; |
| |
| bool is_bound_ = false; |
| SocketState state_ = SocketState::kNotConnected; |
| |
| WeakPtrFactory<StreamSocketPosix> weak_factory_{this}; |
| }; |
| |
| } // namespace openscreen |
| |
| #endif // PLATFORM_IMPL_STREAM_SOCKET_POSIX_H_ |