1919#include < app/server/Server.h>
2020#include < clusters/UserLabel/Metadata.h>
2121
22+ #include < array>
23+
2224namespace chip ::app::Clusters {
2325
2426using namespace UserLabel ;
@@ -73,19 +75,6 @@ bool IsValidLabelEntry(const Structs::LabelStruct::Type & entry)
7375 return (entry.label .size () <= kMaxLabelSize ) && (entry.value .size () <= kMaxValueSize );
7476}
7577
76- bool IsValidLabelEntryList (const LabelList::TypeInfo::DecodableType & list)
77- {
78- auto iter = list.begin ();
79- while (iter.Next ())
80- {
81- if (!IsValidLabelEntry (iter.GetValue ()))
82- {
83- return false ;
84- }
85- }
86- return true ;
87- }
88-
8978CHIP_ERROR WriteLabelList (const ConcreteDataAttributePath & path, AttributeValueDecoder & decoder)
9079{
9180 DeviceLayer::DeviceInfoProvider * provider = DeviceLayer::GetDeviceInfoProvider ();
@@ -96,20 +85,22 @@ CHIP_ERROR WriteLabelList(const ConcreteDataAttributePath & path, AttributeValue
9685
9786 if (!path.IsListItemOperation ())
9887 {
99- DeviceLayer::AttributeList<Structs::LabelStruct::Type, DeviceLayer::kMaxUserLabelListLength > labelList;
88+ size_t numLabels = 0 ;
89+ std::array<Structs::LabelStruct::Type, DeviceLayer::kMaxUserLabelListLength > labels;
10090 LabelList::TypeInfo::DecodableType decodablelist;
10191
10292 ReturnErrorOnFailure (decoder.Decode (decodablelist));
103- VerifyOrReturnError (IsValidLabelEntryList (decodablelist), CHIP_IM_GLOBAL_STATUS (ConstraintError));
104-
10593 auto iter = decodablelist.begin ();
10694 while (iter.Next ())
10795 {
108- ReturnErrorOnFailure (labelList.add (iter.GetValue ()));
96+ auto & label = iter.GetValue ();
97+ VerifyOrReturnError (IsValidLabelEntry (label), CHIP_IM_GLOBAL_STATUS (ConstraintError));
98+ VerifyOrReturnError (numLabels < labels.size (), CHIP_ERROR_NO_MEMORY);
99+ labels[numLabels++] = label;
109100 }
110101 ReturnErrorOnFailure (iter.GetStatus ());
111102
112- return provider->SetUserLabelList (endpoint, labelList );
103+ return provider->SetUserLabelList (endpoint, Span (labels. data (), numLabels) );
113104 }
114105
115106 if (path.mListOp == ConcreteDataAttributePath::ListOperation::AppendItem)
0 commit comments