blob: 247cb4f2c48b9e09af7f79fa80e2e3b5a0a77537 [file] [log] [blame]
// 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_