1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef PLATFORM_BASE_UDP_PACKET_H_ 6*3f982cf4SFabien Sanglard #define PLATFORM_BASE_UDP_PACKET_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <stdint.h> 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglard #include <string> 11*3f982cf4SFabien Sanglard #include <utility> 12*3f982cf4SFabien Sanglard #include <vector> 13*3f982cf4SFabien Sanglard 14*3f982cf4SFabien Sanglard #include "platform/base/ip_address.h" 15*3f982cf4SFabien Sanglard 16*3f982cf4SFabien Sanglard namespace openscreen { 17*3f982cf4SFabien Sanglard 18*3f982cf4SFabien Sanglard class UdpSocket; 19*3f982cf4SFabien Sanglard 20*3f982cf4SFabien Sanglard // A move-only std::vector of bytes that may not exceed the maximum possible 21*3f982cf4SFabien Sanglard // size of a UDP packet. Implicit copy construction/assignment is disabled to 22*3f982cf4SFabien Sanglard // prevent hidden copies (i.e., those not explicitly coded). 23*3f982cf4SFabien Sanglard class UdpPacket : public std::vector<uint8_t> { 24*3f982cf4SFabien Sanglard public: 25*3f982cf4SFabien Sanglard // C++14 vector constructors, sans Allocator foo, and no copy ctor. 26*3f982cf4SFabien Sanglard UdpPacket(); 27*3f982cf4SFabien Sanglard explicit UdpPacket(size_type size, uint8_t fill_value = {}); 28*3f982cf4SFabien Sanglard template <typename InputIt> UdpPacket(InputIt first,InputIt last)29*3f982cf4SFabien Sanglard UdpPacket(InputIt first, InputIt last) : std::vector<uint8_t>(first, last) {} 30*3f982cf4SFabien Sanglard UdpPacket(UdpPacket&& other) noexcept; 31*3f982cf4SFabien Sanglard UdpPacket(std::initializer_list<uint8_t> init); 32*3f982cf4SFabien Sanglard 33*3f982cf4SFabien Sanglard ~UdpPacket(); 34*3f982cf4SFabien Sanglard 35*3f982cf4SFabien Sanglard UdpPacket& operator=(UdpPacket&& other); 36*3f982cf4SFabien Sanglard source()37*3f982cf4SFabien Sanglard const IPEndpoint& source() const { return source_; } set_source(IPEndpoint endpoint)38*3f982cf4SFabien Sanglard void set_source(IPEndpoint endpoint) { source_ = std::move(endpoint); } 39*3f982cf4SFabien Sanglard destination()40*3f982cf4SFabien Sanglard const IPEndpoint& destination() const { return destination_; } set_destination(IPEndpoint endpoint)41*3f982cf4SFabien Sanglard void set_destination(IPEndpoint endpoint) { 42*3f982cf4SFabien Sanglard destination_ = std::move(endpoint); 43*3f982cf4SFabien Sanglard } 44*3f982cf4SFabien Sanglard socket()45*3f982cf4SFabien Sanglard UdpSocket* socket() const { return socket_; } set_socket(UdpSocket * socket)46*3f982cf4SFabien Sanglard void set_socket(UdpSocket* socket) { socket_ = socket; } 47*3f982cf4SFabien Sanglard 48*3f982cf4SFabien Sanglard std::string ToString() const; 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglard static const size_type kUdpMaxPacketSize; 51*3f982cf4SFabien Sanglard 52*3f982cf4SFabien Sanglard private: 53*3f982cf4SFabien Sanglard IPEndpoint source_ = {}; 54*3f982cf4SFabien Sanglard IPEndpoint destination_ = {}; 55*3f982cf4SFabien Sanglard UdpSocket* socket_ = nullptr; 56*3f982cf4SFabien Sanglard 57*3f982cf4SFabien Sanglard OSP_DISALLOW_COPY_AND_ASSIGN(UdpPacket); 58*3f982cf4SFabien Sanglard }; 59*3f982cf4SFabien Sanglard 60*3f982cf4SFabien Sanglard } // namespace openscreen 61*3f982cf4SFabien Sanglard 62*3f982cf4SFabien Sanglard #endif // PLATFORM_BASE_UDP_PACKET_H_ 63