24
24
#include < lib/core/CHIPError.h>
25
25
#include < lib/support/logging/CHIPLogging.h>
26
26
27
+ #include < optional>
27
28
#include < type_traits>
28
29
29
30
namespace chip {
@@ -32,10 +33,10 @@ namespace InteractionModel {
32
33
33
34
namespace internal {
34
35
template <typename T>
35
- class SimpleEventLoggingDelegate : public EventLoggingDelegate
36
+ class SimpleEventPayloadWriter : public EventLoggingDelegate
36
37
{
37
38
public:
38
- SimpleEventLoggingDelegate (const T & aEventData) : mEventData (aEventData){};
39
+ SimpleEventPayloadWriter (const T & aEventData) : mEventData (aEventData){};
39
40
CHIP_ERROR WriteEvent (chip::TLV::TLVWriter & aWriter) final override
40
41
{
41
42
return DataModel::Encode (aWriter, TLV::ContextTag (EventDataIB::Tag::kData ), mEventData );
@@ -45,22 +46,22 @@ class SimpleEventLoggingDelegate : public EventLoggingDelegate
45
46
const T & mEventData ;
46
47
};
47
48
48
- template <typename E , typename T, std::enable_if_t <DataModel::IsFabricScoped<T>::value, bool > = true >
49
- EventNumber GenerateEvent (E & emittor , const T & aEventData, EndpointId aEndpoint)
49
+ template <typename G , typename T, std::enable_if_t <DataModel::IsFabricScoped<T>::value, bool > = true >
50
+ std::optional< EventNumber> GenerateEvent (G & generator , const T & aEventData, EndpointId aEndpoint)
50
51
{
51
- internal::SimpleEventLoggingDelegate <T> eventData (aEventData);
52
+ internal::SimpleEventPayloadWriter <T> eventPayloadWriter (aEventData);
52
53
ConcreteEventPath path (aEndpoint, aEventData.GetClusterId (), aEventData.GetEventId ());
53
54
EventOptions eventOptions;
54
55
eventOptions.mPath = path;
55
56
eventOptions.mPriority = aEventData.GetPriorityLevel ();
56
57
eventOptions.mFabricIndex = aEventData.GetFabricIndex ();
57
58
58
- // this skips logging the event if it's fabric-scoped but no fabric association exists yet.
59
-
59
+ // this skips generating the event if it is fabric-scoped but the provided event data is not
60
+ // associated with any fabric.
60
61
if (eventOptions.mFabricIndex == kUndefinedFabricIndex )
61
62
{
62
63
ChipLogError (EventLogging, " Event encode failure: no fabric index for fabric scoped event" );
63
- return kInvalidEventId ;
64
+ return std::nullopt ;
64
65
}
65
66
66
67
//
@@ -72,37 +73,41 @@ EventNumber GenerateEvent(E & emittor, const T & aEventData, EndpointId aEndpoin
72
73
// and used to match against the accessing fabric.
73
74
//
74
75
EventNumber eventNumber;
75
- CHIP_ERROR err = emittor .GenerateEvent (&eventData , eventOptions, eventNumber);
76
+ CHIP_ERROR err = generator .GenerateEvent (&eventPayloadWriter , eventOptions, eventNumber);
76
77
if (err != CHIP_NO_ERROR)
77
78
{
78
- ChipLogError (EventLogging, " Failed to log event: %" CHIP_ERROR_FORMAT, err.Format ());
79
- return kInvalidEventId ;
79
+ ChipLogError (EventLogging, " Failed to generate event: %" CHIP_ERROR_FORMAT, err.Format ());
80
+ return std::nullopt ;
80
81
}
81
82
82
83
return eventNumber;
83
84
}
84
85
85
- template <typename E , typename T, std::enable_if_t <!DataModel::IsFabricScoped<T>::value, bool > = true >
86
- EventNumber GenerateEvent (E & emittor , const T & aEventData, EndpointId endpointId)
86
+ template <typename G , typename T, std::enable_if_t <!DataModel::IsFabricScoped<T>::value, bool > = true >
87
+ std::optional< EventNumber> GenerateEvent (G & generator , const T & aEventData, EndpointId endpointId)
87
88
{
88
- internal::SimpleEventLoggingDelegate <T> eventData (aEventData);
89
+ internal::SimpleEventPayloadWriter <T> eventPayloadWriter (aEventData);
89
90
ConcreteEventPath path (endpointId, aEventData.GetClusterId (), aEventData.GetEventId ());
90
91
EventOptions eventOptions;
91
92
eventOptions.mPath = path;
92
93
eventOptions.mPriority = aEventData.GetPriorityLevel ();
93
94
EventNumber eventNumber;
94
- CHIP_ERROR err = emittor .GenerateEvent (&eventData , eventOptions, eventNumber);
95
+ CHIP_ERROR err = generator .GenerateEvent (&eventPayloadWriter , eventOptions, eventNumber);
95
96
if (err != CHIP_NO_ERROR)
96
97
{
97
- ChipLogError (EventLogging, " Failed to log event: %" CHIP_ERROR_FORMAT, err.Format ());
98
- return kInvalidEventId ;
98
+ ChipLogError (EventLogging, " Failed to generate event: %" CHIP_ERROR_FORMAT, err.Format ());
99
+ return std::nullopt ;
99
100
}
100
101
101
102
return eventNumber;
102
103
}
103
104
104
105
} // namespace internal
105
106
107
+ // / Exposes event access capabilities.
108
+ // /
109
+ // / Allows callers to "generate events" which effectively notifies of an event having
110
+ // / ocurred.
106
111
class Events
107
112
{
108
113
public:
@@ -113,13 +118,14 @@ class Events
113
118
// / Events are generally expected to be sent to subscribed clients and also
114
119
// / be available for read later until they get overwritten by new events
115
120
// / that are being generated.
116
- virtual CHIP_ERROR GenerateEvent (EventLoggingDelegate * eventContentWriter , const EventOptions & options,
121
+ virtual CHIP_ERROR GenerateEvent (EventLoggingDelegate * eventPayloadWriter , const EventOptions & options,
117
122
EventNumber & generatedEventNumber) = 0;
118
123
119
124
// Convenience methods for event logging using cluster-object structures
120
- // On error, these log and return kInvalidEventId
125
+ //
126
+ // On error, these log and return nullopt.
121
127
template <typename T>
122
- EventNumber GenerateEvent (const T & eventData, EndpointId endpointId)
128
+ std::optional< EventNumber> GenerateEvent (const T & eventData, EndpointId endpointId)
123
129
{
124
130
return internal::GenerateEvent (*this , eventData, endpointId);
125
131
}
0 commit comments