-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for pre-encoded things in AttributeAccessInterface. (#31639)
* Add support for pre-encoded things in AttributeAccessInterface. * Address review comments.
- Loading branch information
1 parent
0dac8e3
commit 3843491
Showing
6 changed files
with
551 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/* | ||
* Copyright (c) 2024 Project CHIP Authors | ||
* All rights reserved. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
#include "FabricScopedPreEncodedValue.h" | ||
#include <lib/core/TLVReader.h> | ||
#include <lib/support/CodeUtils.h> | ||
|
||
#include <optional> | ||
|
||
namespace chip { | ||
namespace app { | ||
namespace DataModel { | ||
|
||
FabricScopedPreEncodedValue::FabricScopedPreEncodedValue(const ByteSpan & aData) : mData(aData) {} | ||
|
||
CHIP_ERROR FabricScopedPreEncodedValue::EncodeForRead(TLV::TLVWriter & aWriter, TLV::Tag aTag, FabricIndex aFabricIndex) const | ||
{ | ||
TLV::TLVReader reader; | ||
reader.Init(mData); | ||
|
||
ReturnErrorOnFailure(reader.Next()); | ||
|
||
return aWriter.CopyElement(aTag, reader); | ||
} | ||
|
||
FabricIndex FabricScopedPreEncodedValue::GetFabricIndex() const | ||
{ | ||
TLV::TLVReader reader; | ||
reader.Init(mData); | ||
CHIP_ERROR err = reader.Next(); | ||
if (err != CHIP_NO_ERROR) | ||
{ | ||
return kUndefinedFabricIndex; | ||
} | ||
|
||
// We must have a struct here. | ||
if (reader.GetType() != TLV::kTLVType_Structure) | ||
{ | ||
return kUndefinedFabricIndex; | ||
} | ||
|
||
TLV::TLVType structType; | ||
err = reader.EnterContainer(structType); | ||
if (err != CHIP_NO_ERROR) | ||
{ | ||
return kUndefinedFabricIndex; | ||
} | ||
|
||
// Now look for a single field with the right tag. | ||
std::optional<FabricIndex> foundFabricIndex; | ||
constexpr TLV::Tag kFabricIndexTag = TLV::ContextTag(254); | ||
while ((err = reader.Next()) == CHIP_NO_ERROR) | ||
{ | ||
if (reader.GetTag() != kFabricIndexTag) | ||
{ | ||
continue; | ||
} | ||
|
||
if (foundFabricIndex.has_value()) | ||
{ | ||
// Two fabric indices? Just give up. Note that this will lead to | ||
// errors encoding our value. | ||
return kUndefinedFabricIndex; | ||
} | ||
|
||
err = reader.Get(foundFabricIndex.emplace()); | ||
if (err != CHIP_NO_ERROR) | ||
{ | ||
return kUndefinedFabricIndex; | ||
} | ||
} | ||
|
||
if (err != CHIP_ERROR_END_OF_TLV) | ||
{ | ||
return kUndefinedFabricIndex; | ||
} | ||
|
||
err = reader.ExitContainer(structType); | ||
if (err != CHIP_NO_ERROR) | ||
{ | ||
return kUndefinedFabricIndex; | ||
} | ||
|
||
return foundFabricIndex.value_or(kUndefinedFabricIndex); | ||
} | ||
|
||
} // namespace DataModel | ||
} // namespace app | ||
} // namespace chip |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
/* | ||
* Copyright (c) 2024 Project CHIP Authors | ||
* All rights reserved. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
#include <lib/core/CHIPError.h> | ||
#include <lib/core/DataModelTypes.h> | ||
#include <lib/core/TLVTags.h> | ||
#include <lib/core/TLVWriter.h> | ||
|
||
namespace chip { | ||
namespace app { | ||
namespace DataModel { | ||
|
||
/** | ||
* FabridScopedPreEncodedValue represents the value of a single item in a list | ||
* of fabric-scoped structs that has already been encoded as TLV. To enable | ||
* reading these values successfully, the struct must have the fabric index it | ||
* corresponds to encoded with the right tag. | ||
* | ||
* Note: Fabric-sensitive fields are currently not supported; there is no way to | ||
* specify which fields are fabric-sensitive. | ||
*/ | ||
class FabricScopedPreEncodedValue | ||
{ | ||
public: | ||
/** | ||
* The data buffer backing the ByteSpan must outlive the | ||
* FabricScopedPreEncodedValue instance. | ||
*/ | ||
FabricScopedPreEncodedValue(const ByteSpan & aData); | ||
|
||
/** | ||
* Encodable object API implementation. | ||
*/ | ||
static constexpr bool kIsFabricScoped = true; | ||
CHIP_ERROR EncodeForRead(TLV::TLVWriter & aWriter, TLV::Tag aTag, FabricIndex aFabricIndex) const; | ||
FabricIndex GetFabricIndex() const; | ||
|
||
private: | ||
const ByteSpan mData; | ||
}; | ||
|
||
} // namespace DataModel | ||
} // namespace app | ||
} // namespace chip |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/* | ||
* Copyright (c) 2024 Project CHIP Authors | ||
* All rights reserved. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
#include "PreEncodedValue.h" | ||
#include <lib/core/TLVReader.h> | ||
#include <lib/support/CodeUtils.h> | ||
|
||
namespace chip { | ||
namespace app { | ||
namespace DataModel { | ||
|
||
PreEncodedValue::PreEncodedValue(const ByteSpan & aData) : mData(aData) {} | ||
|
||
CHIP_ERROR PreEncodedValue::Encode(TLV::TLVWriter & aWriter, TLV::Tag aTag) const | ||
{ | ||
TLV::TLVReader reader; | ||
reader.Init(mData); | ||
|
||
ReturnErrorOnFailure(reader.Next()); | ||
|
||
return aWriter.CopyElement(aTag, reader); | ||
} | ||
|
||
} // namespace DataModel | ||
} // namespace app | ||
} // namespace chip |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
/* | ||
* Copyright (c) 2024 Project CHIP Authors | ||
* All rights reserved. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
#include <lib/core/CHIPError.h> | ||
#include <lib/core/TLVTags.h> | ||
#include <lib/core/TLVWriter.h> | ||
|
||
namespace chip { | ||
namespace app { | ||
namespace DataModel { | ||
|
||
/** | ||
* PreEncodedValue represents the value of an attribute or the value of a single | ||
* item in a list of non-fabric-scoped structs that has already been | ||
* encoded as TLV. | ||
*/ | ||
class PreEncodedValue | ||
{ | ||
public: | ||
/** | ||
* The data buffer backing the ByteSpan must outlive the PreEncodedValue | ||
* instance. | ||
*/ | ||
PreEncodedValue(const ByteSpan & aData); | ||
|
||
/** | ||
* Encodable object API implementation. | ||
*/ | ||
static constexpr bool kIsFabricScoped = false; | ||
CHIP_ERROR Encode(TLV::TLVWriter & aWriter, TLV::Tag aTag) const; | ||
|
||
private: | ||
const ByteSpan mData; | ||
}; | ||
|
||
} // namespace DataModel | ||
} // namespace app | ||
} // namespace chip |
Oops, something went wrong.