18
18
#include < lib/core/CHIPTLV.h>
19
19
#include < lib/support/CHIPMemString.h>
20
20
#include < lib/support/CodeUtils.h>
21
+ #include < lib/support/DefaultStorageKeyAllocator.h>
21
22
#include < platform/Linux/DeviceInfoProviderImpl.h>
22
23
#include < platform/internal/CHIPDeviceLayerInternal.h>
23
24
27
28
namespace chip {
28
29
namespace DeviceLayer {
29
30
31
+ namespace {
32
+ constexpr TLV::Tag kLabelNameTag = TLV::ContextTag(0 );
33
+ constexpr TLV::Tag kLabelValueTag = TLV::ContextTag(1 );
34
+ } // anonymous namespace
35
+
36
+ CHIP_ERROR DeviceInfoProviderImpl::Init ()
37
+ {
38
+ return mStorage .Init (CHIP_DEVICE_INFO_PATH);
39
+ }
40
+
30
41
DeviceInfoProviderImpl & DeviceInfoProviderImpl::GetDefaultInstance ()
31
42
{
32
43
static DeviceInfoProviderImpl sInstance ;
@@ -107,23 +118,33 @@ bool DeviceInfoProviderImpl::FixedLabelIteratorImpl::Next(FixedLabelType & outpu
107
118
108
119
CHIP_ERROR DeviceInfoProviderImpl::SetUserLabelLength (EndpointId endpoint, size_t val)
109
120
{
110
- // TODO:: store the user label count.
111
- return CHIP_ERROR_NOT_IMPLEMENTED;
121
+ DefaultStorageKeyAllocator keyAlloc;
122
+
123
+ return mStorage .WriteValue (keyAlloc.UserLabelLengthKey (endpoint), val);
112
124
}
113
125
114
126
CHIP_ERROR DeviceInfoProviderImpl::GetUserLabelLength (EndpointId endpoint, size_t & val)
115
127
{
116
- // TODO:: read the user label count. temporarily return the size of hardcoded labelList.
117
- val = 4 ;
128
+ DefaultStorageKeyAllocator keyAlloc;
118
129
119
- return CHIP_NO_ERROR ;
130
+ return mStorage . ReadValue (keyAlloc. UserLabelLengthKey (endpoint), val) ;
120
131
}
121
132
122
133
CHIP_ERROR DeviceInfoProviderImpl::SetUserLabelAt (EndpointId endpoint, size_t index, const UserLabelType & userLabel)
123
134
{
124
- // TODO:: store the user labelList, and read back stored user labelList if it has been set.
125
- // Add yaml test to verify this.
126
- return CHIP_ERROR_NOT_IMPLEMENTED;
135
+ DefaultStorageKeyAllocator keyAlloc;
136
+ uint8_t buf[UserLabelTLVMaxSize ()];
137
+ TLV::TLVWriter writer;
138
+ writer.Init (buf);
139
+
140
+ TLV::TLVType outerType;
141
+ ReturnErrorOnFailure (writer.StartContainer (TLV::AnonymousTag (), TLV::kTLVType_Structure , outerType));
142
+ ReturnErrorOnFailure (writer.PutString (kLabelNameTag , userLabel.label ));
143
+ ReturnErrorOnFailure (writer.PutString (kLabelValueTag , userLabel.value ));
144
+ ReturnErrorOnFailure (writer.EndContainer (outerType));
145
+ ReturnErrorOnFailure (mStorage .WriteValueBin (keyAlloc.UserLabelIndexKey (endpoint, index ), buf, writer.GetLengthWritten ()));
146
+
147
+ return mStorage .Commit ();
127
148
}
128
149
129
150
DeviceInfoProvider::UserLabelIterator * DeviceInfoProviderImpl::IterateUserLabel (EndpointId endpoint)
@@ -143,57 +164,45 @@ DeviceInfoProviderImpl::UserLabelIteratorImpl::UserLabelIteratorImpl(DeviceInfoP
143
164
144
165
bool DeviceInfoProviderImpl::UserLabelIteratorImpl::Next (UserLabelType & output)
145
166
{
146
- // TODO:: get the user labelList from persistent storage, temporarily, use the following
147
- // hardcoded labelList on all endpoints.
148
167
CHIP_ERROR err = CHIP_NO_ERROR;
149
168
150
- const char * labelPtr = nullptr ;
151
- const char * valuePtr = nullptr ;
152
-
153
169
VerifyOrReturnError (mIndex < mTotal , false );
154
170
155
- switch (mIndex )
156
- {
157
- case 0 :
158
- labelPtr = " room" ;
159
- valuePtr = " bedroom 2" ;
160
- break ;
161
- case 1 :
162
- labelPtr = " orientation" ;
163
- valuePtr = " North" ;
164
- break ;
165
- case 2 :
166
- labelPtr = " floor" ;
167
- valuePtr = " 2" ;
168
- break ;
169
- case 3 :
170
- labelPtr = " direction" ;
171
- valuePtr = " up" ;
172
- break ;
173
- default :
174
- err = CHIP_ERROR_PERSISTED_STORAGE_VALUE_NOT_FOUND;
175
- break ;
176
- }
171
+ DefaultStorageKeyAllocator keyAlloc;
172
+ uint8_t buf[UserLabelTLVMaxSize ()];
173
+ size_t outLen;
174
+ err = mProvider .mStorage .ReadValueBin (keyAlloc.UserLabelIndexKey (mEndpoint , mIndex ), buf, sizeof (buf), outLen);
175
+ VerifyOrReturnError (err == CHIP_NO_ERROR, false );
177
176
178
- if (err == CHIP_NO_ERROR)
179
- {
180
- VerifyOrReturnError ( std::strlen (labelPtr) <= kMaxLabelNameLength , false );
181
- VerifyOrReturnError (std::strlen (valuePtr) <= kMaxLabelValueLength , false );
177
+ TLV::ContiguousBufferTLVReader reader;
178
+ reader. Init (buf);
179
+ err = reader. Next (TLV:: kTLVType_Structure , TLV::AnonymousTag () );
180
+ VerifyOrReturnError (err == CHIP_NO_ERROR , false );
182
181
183
- Platform::CopyString ( mUserLabelNameBuf , kMaxLabelNameLength + 1 , labelPtr) ;
184
- Platform::CopyString ( mUserLabelValueBuf , kMaxLabelValueLength + 1 , valuePtr );
182
+ TLV::TLVType containerType ;
183
+ VerifyOrReturnError (reader. EnterContainer (containerType) == CHIP_NO_ERROR, false );
185
184
186
- output. label = CharSpan::fromCharString ( mUserLabelNameBuf ) ;
187
- output. value = CharSpan::fromCharString ( mUserLabelValueBuf ) ;
185
+ chip::CharSpan label ;
186
+ chip::CharSpan value ;
188
187
189
- mIndex ++;
188
+ VerifyOrReturnError (reader.Next (kLabelNameTag ) == CHIP_NO_ERROR, false );
189
+ VerifyOrReturnError (reader.Get (label) == CHIP_NO_ERROR, false );
190
190
191
- return true ;
192
- }
193
- else
194
- {
195
- return false ;
196
- }
191
+ VerifyOrReturnError (reader.Next (kLabelValueTag ) == CHIP_NO_ERROR, false );
192
+ VerifyOrReturnError (reader.Get (value) == CHIP_NO_ERROR, false );
193
+
194
+ VerifyOrReturnError (reader.VerifyEndOfContainer () == CHIP_NO_ERROR, false );
195
+ VerifyOrReturnError (reader.ExitContainer (containerType) == CHIP_NO_ERROR, false );
196
+
197
+ Platform::CopyString (mUserLabelNameBuf , label);
198
+ Platform::CopyString (mUserLabelValueBuf , value);
199
+
200
+ output.label = CharSpan::fromCharString (mUserLabelNameBuf );
201
+ output.value = CharSpan::fromCharString (mUserLabelValueBuf );
202
+
203
+ mIndex ++;
204
+
205
+ return true ;
197
206
}
198
207
199
208
DeviceInfoProvider::SupportedLocalesIterator * DeviceInfoProviderImpl::IterateSupportedLocales ()
0 commit comments