LibQuicR
subscribe_namespace_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/errors.h"
8 #include "quicr/track_name.h"
9 
10 #include <map>
11 #include <memory>
12 
13 namespace quicr {
14 
15  class Session;
16 
25  {
26  public:
28  enum class Mode
29  {
30  kNamespaces,
31  kTracks
32  };
33 
37  enum class Status : uint8_t
38  {
39  kOk = 0,
41  kError,
42  };
43 
44  protected:
52  Mode mode,
53  const messages::Filter& filter = std::monostate{});
54 
55  public:
63  static auto Create(const TrackNamespace& prefix,
64  const Mode mode,
65  const messages::Filter& filter = std::monostate{})
66  {
67  return std::shared_ptr<SubscribeNamespaceHandler>(new SubscribeNamespaceHandler(prefix, mode, filter));
68  }
69 
72 
81  virtual void StatusChanged(Status status);
82 
84  const TrackNamespace& GetPrefix() const noexcept { return prefix_; }
85 
87  messages::FilterType GetFilterType() const noexcept { return messages::GetFilterType(filter_); }
88 
90  constexpr const messages::Filter& GetFilter() const noexcept { return filter_; }
91 
97  constexpr Status GetStatus() const noexcept { return status_; }
98 
103  std::optional<Error<ErrorCode>> GetError() const noexcept { return error_; }
104 
109  constexpr Mode GetMode() const noexcept { return mode_; }
110 
117 
118  protected:
124  virtual void NamespaceReceived([[maybe_unused]] const TrackNamespace& name_space) {}
125 
131  virtual void NamespaceDoneReceived([[maybe_unused]] const TrackNamespace& name_space) {}
132 
139  void SetStatus(const Status status) noexcept
140  {
141  status_ = status;
142  if (status == Status::kError && !error_.has_value()) {
143  error_ = Error<ErrorCode>{ ErrorCode::kInternalError, "Unknown error" };
144  }
145  StatusChanged(status);
146  }
147 
152  void SetError(const Error<ErrorCode>& error)
153  {
154  error_ = error;
156  }
157 
163  void RequestOkReceived(const messages::Parameters& params) override;
164 
172 
178  void RequestError(ErrorCode error_code, std::string reason) override
179  {
180  SetError(Error<ErrorCode>{ error_code, std::move(reason) });
181  }
182 
183  private:
184  const Mode mode_;
185 
186  const TrackNamespace prefix_;
187 
188  messages::Filter filter_;
189 
190  Status status_{ Status::kNotSubscribed };
191 
192  std::optional<Error<ErrorCode>> error_{};
193 
194  friend class Session;
195  };
196 }
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
Receives namespace or track publication notifications below a prefix.
Definition: subscribe_namespace_handler.h:25
Mode
Selects which notification family the peer sends for the prefix.
Definition: subscribe_namespace_handler.h:29
@ kNamespaces
Receive NAMESPACE notifications for matching namespaces.
@ kTracks
Receive PUBLISH notifications for matching tracks.
virtual void StatusChanged(Status status)
Notification of subscribe status.
static auto Create(const TrackNamespace &prefix, const Mode mode, const messages::Filter &filter=std::monostate{})
Creates a namespace subscription with shared ownership.
Definition: subscribe_namespace_handler.h:63
std::optional< Error< ErrorCode > > GetError() const noexcept
Get the error code and reason for the subscribe namespace, if any.
Definition: subscribe_namespace_handler.h:103
virtual void NamespaceReceived([[maybe_unused]] const TrackNamespace &name_space)
Reports a NAMESPACE notification in kNamespaces mode.
Definition: subscribe_namespace_handler.h:124
messages::FilterType GetFilterType() const noexcept
Definition: subscribe_namespace_handler.h:87
void RequestError(ErrorCode error_code, std::string reason) override
Stores a request error and enters kError.
Definition: subscribe_namespace_handler.h:178
constexpr const messages::Filter & GetFilter() const noexcept
Definition: subscribe_namespace_handler.h:90
Reply< messages::Parameters, ErrorCode > RequestUpdateReceived(const messages::Parameters &params) override
Rejects updates to a namespace subscription.
void SetStatus(const Status status) noexcept
Set the subscribe status.
Definition: subscribe_namespace_handler.h:139
void SetError(const Error< ErrorCode > &error)
Stores an error and transitions to kError.
Definition: subscribe_namespace_handler.h:152
virtual void NamespaceDoneReceived([[maybe_unused]] const TrackNamespace &name_space)
Reports a NAMESPACE_DONE notification in kNamespaces mode.
Definition: subscribe_namespace_handler.h:131
Status
Status codes for the subscribe track.
Definition: subscribe_namespace_handler.h:38
@ kNotSubscribed
Initial state; no active namespace subscription.
@ kError
The peer or library rejected the request; inspect GetError().
@ kOk
The peer accepted the subscription.
const TrackNamespace & GetPrefix() const noexcept
Definition: subscribe_namespace_handler.h:84
void RequestOkReceived(const messages::Parameters &params) override
Handles acceptance by validating empty parameters and entering kOk.
constexpr Mode GetMode() const noexcept
Get the mode this handler is operating in.
Definition: subscribe_namespace_handler.h:109
constexpr Status GetStatus() const noexcept
Get the status of the subscribe.
Definition: subscribe_namespace_handler.h:97
SubscribeNamespaceHandler(const TrackNamespace &prefix, Mode mode, const messages::Filter &filter=std::monostate{})
Constructs a namespace subscription.
TrackNamespace ExpandSuffix(const TrackNamespace &suffix) const
Fully qualifies a NAMESPACE suffix relative to the subscribed prefix.
virtual ~SubscribeNamespaceHandler()
Destroys the handler; destruction currently sends no protocol message.
Common request state for track-related handlers.
Definition: track_handler.h:36
An N-tuple representation of a MOQ namespace.
Definition: track_name.h:22
Definition: parameters.h:185
FilterType GetFilterType(const Filter &filter)
Definition: ctrl_message_types.h:681
std::variant< std::monostate, SubscriptionFilter, TrackFilter > Filter
Any supported filter representation; monostate means no/unsupported filter.
Definition: ctrl_message_types.h:677
FilterType
In-memory filter discriminator.
Definition: ctrl_message_types.h:546
Definition: attributes.h:13
ErrorCode
MOQT error code, as carried by REQUEST_ERROR.
Definition: errors.h:33
@ kInternalError
The endpoint encountered an unspecified internal failure.
A rejected result, holding why the request was rejected.
Definition: errors.h:21