RTC Toolkit 6.0.0-pre2
Loading...
Searching...
No Matches
repositorySubscriberIf.ipp
Go to the documentation of this file.
1
12
13// Note this is a template implementation file and should not be included directly.
14// The typical header protection macro is not added to avoid it showing up in Doxygen API
15// documentation.
16#pragma once
17
18#include <exception>
19#include <functional>
20#include <memory>
21#include <type_traits>
22
24
25namespace detail {
26
33
40
44
45} // namespace detail
46
47template <typename T, typename F>
50 const F& cb_value,
51 const ErrorCallbackType& cb_error) const {
52 NotifyCallbackType cb_val;
53 if constexpr (std::is_convertible_v<F, NotifyCallbackType>) {
54 cb_val = cb_value;
55 } else {
56 static_assert(std::is_convertible_v<F, ValueCallbackType<T>>,
57 "The cb_value callback must have a signature compatible with"
58 " void(const DataPointPath&, T&, const MetaData&).");
59 cb_val = [buf = std::make_shared<T>(), cb_value, cb_error, this](const DataPointPath& path2,
60 const MetaData& md) {
61 MetaData mdr;
62 BatchRequest req;
63 req.ReadDataPoint(path2, *buf, mdr);
64 SendRequest(req).Wait();
65 if (md.Contains("sequence_id")) {
66 // If backend supports sequence_id, then check for sequence id missmatch.
67 RtcUInt64 sequence_id_expected = md["sequence_id"].Cast<RtcUInt64>();
68 RtcUInt64 sequence_id_actual = mdr["sequence_id"].Cast<RtcUInt64>();
69 if (sequence_id_expected == sequence_id_actual) {
70 cb_value(path2, *buf, md);
71 } else {
72 auto eptr = std::make_exception_ptr(CII_MAKE_EXCEPTION(
73 SequenceIdMissmatch, path2, sequence_id_expected, sequence_id_actual));
74 cb_error(eptr);
75 }
76 } else {
77 // If backend does not support sequence_id, then just invoke cb_value without check.
78 cb_value(path2, *buf, md);
79 }
80 };
81 }
82 BatchRequest req;
83 auto id = req.Subscribe(path, cb_val, cb_error);
84 SendRequest(req).Wait();
85 Subscription subscription([this, id]() {
86 BatchRequest req;
87 req.Unsubscribe(id);
88 SendRequest(req).Wait();
89 });
90 return subscription;
91}
92
93} // namespace rtctk::componentFramework
This class provides a wrapper for a data point path.
Definition dataPointPath.hpp:77
void ReadDataPoint(const DataPointPath &path, T &buffer, std::optional< std::reference_wrapper< MetaData > > metadata=std::nullopt, const CallbackType &callback=nullptr) const
Definition repositoryIf.ipp:1444
void Wait()
Definition repositoryIf.cpp:645
Class for passing/receiving metadata to/from the repository.
Definition repositoryIf.hpp:146
BatchResponse SendRequest(const BatchRequest &request)
Definition repositoryIf.cpp:669
std::function< void(const DataPointPath &)> CallbackType
Signature of the callback functions that can be registered with the repository requests.
Definition repositoryIf.hpp:61
void Unsubscribe(SubscriptionId) const
Definition repositorySubscriberIf.cpp:53
SubscriptionId Subscribe(const DataPointPath &, NotifyCallbackType, ErrorCallbackType) const
Definition repositorySubscriberIf.cpp:30
RAII wrapper class used to manage the life-time of individual subscriptions.
Definition repositorySubscriberIf.hpp:64
std::function< void(std::exception_ptr)> ErrorCallbackType
Definition repositorySubscriberIf.hpp:49
Subscription Subscribe(const DataPointPath &path, const F &cb_value, const ErrorCallbackType &cb_error) const
Subscribes to datapoint values change events by registering callbacks.
Definition repositorySubscriberIf.ipp:49
std::function< void(const DataPointPath &, const MetaData &)> NotifyCallbackType
Definition repositorySubscriberIf.hpp:48
size_t SubscriptionId
Definition repositorySubscriberIf.hpp:51
Definition measurable.hpp:26
Definition commandReplier.cpp:22
std::uint64_t RtcUInt64
Definition basicTypes.hpp:45
RepositorySubscriberIf::CallbackType cb_created
Definition repositorySubscriberIf.ipp:36
RepositorySubscriberIf::SubscriptionId id
Definition repositorySubscriberIf.ipp:35
RepositorySubscriberIf::ErrorCallbackType cb_error
Definition repositorySubscriberIf.ipp:38
RepositorySubscriberIf::CallbackType cb_deleted
Definition repositorySubscriberIf.ipp:37
Definition repositorySubscriberIf.ipp:41
RepositorySubscriberIf::SubscriptionId id
Definition repositorySubscriberIf.ipp:42
Definition repositorySubscriberIf.ipp:27
RepositorySubscriberIf::ErrorCallbackType cb_error
Definition repositorySubscriberIf.ipp:31
RepositorySubscriberIf::SubscriptionId id
Definition repositorySubscriberIf.ipp:28
RepositorySubscriberIf::NotifyCallbackType cb_value
Definition repositorySubscriberIf.ipp:30
DataPointPath path
Definition repositorySubscriberIf.ipp:29