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 OSP_PUBLIC_ENDPOINT_REQUEST_IDS_H_ 6*3f982cf4SFabien Sanglard #define OSP_PUBLIC_ENDPOINT_REQUEST_IDS_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <cstdint> 9*3f982cf4SFabien Sanglard #include <map> 10*3f982cf4SFabien Sanglard 11*3f982cf4SFabien Sanglard #include "platform/base/macros.h" 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglard namespace openscreen { 14*3f982cf4SFabien Sanglard namespace osp { 15*3f982cf4SFabien Sanglard 16*3f982cf4SFabien Sanglard // Tracks the next available message request ID per endpoint by its endpoint ID. 17*3f982cf4SFabien Sanglard // These can only be incremented while an endpoint is connected but can be reset 18*3f982cf4SFabien Sanglard // on disconnection. This is necessary because all APIs that use CBOR messages 19*3f982cf4SFabien Sanglard // across a QUIC stream share the |request_id| field, which must be unique 20*3f982cf4SFabien Sanglard // within a pair of endpoints. 21*3f982cf4SFabien Sanglard class EndpointRequestIds { 22*3f982cf4SFabien Sanglard public: 23*3f982cf4SFabien Sanglard enum class Role { 24*3f982cf4SFabien Sanglard kClient, 25*3f982cf4SFabien Sanglard kServer, 26*3f982cf4SFabien Sanglard }; 27*3f982cf4SFabien Sanglard 28*3f982cf4SFabien Sanglard explicit EndpointRequestIds(Role role); 29*3f982cf4SFabien Sanglard ~EndpointRequestIds(); 30*3f982cf4SFabien Sanglard 31*3f982cf4SFabien Sanglard uint64_t GetNextRequestId(uint64_t endpoint_id); 32*3f982cf4SFabien Sanglard void ResetRequestId(uint64_t endpoint_id); 33*3f982cf4SFabien Sanglard void Reset(); 34*3f982cf4SFabien Sanglard 35*3f982cf4SFabien Sanglard private: 36*3f982cf4SFabien Sanglard const Role role_; 37*3f982cf4SFabien Sanglard std::map<uint64_t, uint64_t> request_ids_by_endpoint_id_; 38*3f982cf4SFabien Sanglard 39*3f982cf4SFabien Sanglard OSP_DISALLOW_COPY_AND_ASSIGN(EndpointRequestIds); 40*3f982cf4SFabien Sanglard }; 41*3f982cf4SFabien Sanglard 42*3f982cf4SFabien Sanglard } // namespace osp 43*3f982cf4SFabien Sanglard } // namespace openscreen 44*3f982cf4SFabien Sanglard 45*3f982cf4SFabien Sanglard #endif // OSP_PUBLIC_ENDPOINT_REQUEST_IDS_H_ 46