// 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 COMPONENTS_OPENSCREEN_PLATFORM_UDP_SOCKET_H_ #define COMPONENTS_OPENSCREEN_PLATFORM_UDP_SOCKET_H_ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "services/network/public/mojom/udp_socket.mojom.h" #include "third_party/openscreen/src/platform/api/udp_socket.h" #include "third_party/openscreen/src/platform/base/error.h" #include "third_party/openscreen/src/platform/base/interface_info.h" #include "third_party/openscreen/src/platform/base/ip_address.h" namespace net { class IPEndPoint; } namespace openscreen_platform { class UdpSocket final : public openscreen::UdpSocket, network::mojom::UDPSocketListener { public: UdpSocket(Client* client, const openscreen::IPEndpoint& local_endpoint, mojo::Remote udp_socket, mojo::PendingReceiver pending_listener); ~UdpSocket() final; // Implementations of openscreen::UdpSocket methods. bool IsIPv4() const final; bool IsIPv6() const final; openscreen::IPEndpoint GetLocalEndpoint() const final; void Bind() final; void SetMulticastOutboundInterface( openscreen::NetworkInterfaceIndex ifindex) final; void JoinMulticastGroup(const openscreen::IPAddress& address, openscreen::NetworkInterfaceIndex ifindex) final; void SendMessage(const void* data, size_t length, const openscreen::IPEndpoint& dest) final; void SetDscp(openscreen::UdpSocket::DscpMode state) final; // network::mojom::UDPSocketListener overrides: void OnReceived(int32_t net_result, const absl::optional& source_endpoint, absl::optional> data) override; private: void BindCallback(int32_t result, const absl::optional& address); void JoinGroupCallback(int32_t result); void SendCallback(int32_t result); const raw_ptr client_ = nullptr; // The local endpoint can change as a result of bind calls. openscreen::IPEndpoint local_endpoint_; mojo::Remote udp_socket_; // The pending listener gets converted to a proper Receiver when this socket // gets bound. mojo::PendingReceiver pending_listener_; mojo::Receiver listener_{this}; base::WeakPtrFactory weak_ptr_factory_{this}; }; } // namespace openscreen_platform #endif // COMPONENTS_OPENSCREEN_PLATFORM_UDP_SOCKET_H_