LibQuicR
track_handler.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) 2024 Cisco Systems
2 // SPDX-License-Identifier: BSD-2-Clause
3 
4 #pragma once
5 
6 #include "quicr/attributes.h"
7 #include "quicr/errors.h"
10 #include "quicr/reply.h"
11 #include "quicr/track_name.h"
13 
14 #include <cstdint>
15 #include <memory>
16 #include <mutex>
17 #include <optional>
18 #include <span>
19 #include <vector>
20 
21 namespace quicr {
22  class Connection;
23  class Session;
24 
26  class Stream;
27 
35  class TrackHandler : public std::enable_shared_from_this<TrackHandler>
36  {
37  public:
38  struct Binding
39  {
40  std::uint64_t connection_id{ 0 };
41  std::optional<std::uint64_t> request_id;
42  std::shared_ptr<Stream> request_stream;
43  };
44 
45  friend class Session;
46 
49  friend class SubscribeTrackHandler;
50 
52  virtual ~TrackHandler() = default;
53 
54  // --------------------------------------------------------------------------
55  // Public API methods that normally should not be overridden
56  // --------------------------------------------------------------------------
57 
59  TrackHandler() = delete;
60 
61  protected:
66  TrackHandler(const FullTrackName& full_track_name)
67  : full_track_name_(full_track_name)
68  {
69  }
70 
73 
74  // --------------------------------------------------------------------------
75  // Public Virtual API callback event methods to be overridden
76  // --------------------------------------------------------------------------
77  public:
84  template<typename T>
85  requires std::is_base_of_v<TrackHandler, T>
86  std::shared_ptr<T> Get()
87  {
88  return std::dynamic_pointer_cast<T>(shared_from_this());
89  }
90 
96  void SetRequestId(std::optional<uint64_t> request_id)
97  {
98  std::lock_guard lock(request_stream_mutex_);
99  request_id_ = request_id;
100  }
101 
107  std::optional<uint64_t> GetRequestId() const noexcept
108  {
109  std::lock_guard lock(request_stream_mutex_);
110  return request_id_;
111  }
112 
118  std::optional<uint64_t> GetRequestStreamId() const;
119 
125  FullTrackName GetFullTrackName() const noexcept { return { full_track_name_ }; }
126 
131  uint64_t GetConnectionId() const noexcept
132  {
133  std::lock_guard lock(request_stream_mutex_);
134  return connection_id_;
135  }
136 
137  std::shared_ptr<Connection> GetConnection() const;
138 
140  {
141  std::lock_guard lock(request_stream_mutex_);
142  return { connection_id_, request_id_, request_stream_ };
143  }
144 
159 
166  virtual void RequestError(ErrorCode error_code, std::string reason);
167 
168  protected:
174  virtual void RequestOkReceived(const messages::Parameters& params) = 0;
175 
181  void SetTransport(std::shared_ptr<Session> transport);
182 
188  const std::weak_ptr<Session>& GetSession() const noexcept;
189 
191 
192  // --------------------------------------------------------------------------
193  // Internal
194  // --------------------------------------------------------------------------
195  private:
201  void SetConnectionId(uint64_t connection_id)
202  {
203  std::lock_guard lock(request_stream_mutex_);
204  connection_id_ = connection_id;
205  };
206 
207  void SetBinding(Binding binding)
208  {
209  std::lock_guard lock(request_stream_mutex_);
210  connection_id_ = binding.connection_id;
211  request_id_ = binding.request_id;
212  request_stream_ = std::move(binding.request_stream);
213  }
214 
219  void SetRequestStream(const std::shared_ptr<Stream>& request_stream)
220  {
221  std::lock_guard lock(request_stream_mutex_);
222  request_stream_ = request_stream;
223  }
224 
234  std::shared_ptr<Stream> GetRequestStream() const
235  {
236  std::lock_guard lock(request_stream_mutex_);
237  return request_stream_;
238  }
239 
240  // --------------------------------------------------------------------------
241  // Member variables
242  // --------------------------------------------------------------------------
243  std::uint64_t connection_id_{ 0 }; // QUIC transport connection ID
244 
251  std::optional<uint64_t> request_id_;
252 
264  std::shared_ptr<Stream> request_stream_ QUICR_GUARDED_BY(request_stream_mutex_);
265 
266  mutable std::mutex request_stream_mutex_;
267 
268  std::weak_ptr<Session> session_;
269  };
270 
271 } // namespace moq
The reply to a callback, which may be answered immediately or deferred.
Definition: reply.h:31
MoQ Session endpoint supporting connection-explicit operations.
Definition: session.h:68
MOQ track handler for subscribed track.
Definition: subscribe_track_handler.h:25
Common request state for track-related handlers.
Definition: track_handler.h:36
void SetTransport(std::shared_ptr< Session > transport)
Sets the session used for control and data operations.
std::shared_ptr< Connection > GetConnection() const
Binding GetBinding() const
Definition: track_handler.h:139
const std::weak_ptr< Session > & GetSession() const noexcept
Gets the non-owning session handle.
std::optional< uint64_t > GetRequestStreamId() const
Get the stream ID of the request control stream.
std::optional< uint64_t > GetRequestId() const noexcept
Get the request ID.
Definition: track_handler.h:107
virtual void RequestOkReceived(const messages::Parameters &params)=0
Handles REQUEST_OK for this handler's request.
virtual void RequestError(ErrorCode error_code, std::string reason)
Handles a REQUEST_ERROR for this handler.
std::mutex binding_operation_mutex_
Definition: track_handler.h:190
TrackHandler()=delete
A track identity is mandatory.
FullTrackName full_track_name_
Full track identity retained for the handler's lifetime.
Definition: track_handler.h:72
virtual Reply< messages::Parameters, ErrorCode > RequestUpdateReceived(const messages::Parameters &params)=0
Received an update for this handler's request.
FullTrackName GetFullTrackName() const noexcept
Get the full track name.
Definition: track_handler.h:125
requires std::is_base_of_v< TrackHandler, T > std::shared_ptr< T > Get()
Get the derived type of the track handler.
Definition: track_handler.h:86
void SetRequestId(std::optional< uint64_t > request_id)
Sets or clears the connection-scoped request ID.
Definition: track_handler.h:96
virtual ~TrackHandler()=default
Releases this handler; shared stream/session handles are released automatically.
uint64_t GetConnectionId() const noexcept
Gets the transport connection identifier assigned by the session.
Definition: track_handler.h:131
TrackHandler(const FullTrackName &full_track_name)
Constructs a handler for one full track name.
Definition: track_handler.h:66
Definition: parameters.h:185
Definition: attributes.h:13
ErrorCode
MOQT error code, as carried by REQUEST_ERROR.
Definition: errors.h:33
Full track name struct.
Definition: track_name.h:436
Definition: track_handler.h:39
std::uint64_t connection_id
Definition: track_handler.h:40
std::shared_ptr< Stream > request_stream
Definition: track_handler.h:42
std::optional< std::uint64_t > request_id
Definition: track_handler.h:41
Portable wrappers for Clang thread-safety analysis attributes.
#define QUICR_GUARDED_BY(...)
No-op guarded-field annotation when thread-safety annotations are disabled.
Definition: thread_safety.h:64