Skip to content

Commit ec11920

Browse files
andy31415andreilitvinbzbarsky-apple
authored and
w8floosh
committed
Define an ActionReturnStatus for DataModel::Provider action returns (project-chip#34708)
* In progress * ActionReturnStatus implementation * Start making use of ActionReturnStatus * Things seem to compile (but not yet passing) * nice log formatting * Propper formatting and comparisons in tests. Mock tests pass * Restyle * Restyle * Fix typo * Add missing files * Added some unit tests that pass * More tests * Restyle * Update src/app/codegen-data-model-provider/EmberMetadata.cpp Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Update src/app/data-model-provider/ActionReturnStatus.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Update src/app/data-model-provider/ActionReturnStatus.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Update src/app/data-model-provider/ActionReturnStatus.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Update src/lib/core/CHIPError.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Rename IsOutOfSpaceError and do not document specifics * Document invoke return codes * Use the new out of space method in checked * Restyle * Allow ClusterStatusCode to be constructed from a CHIP_ERROR * Format action statuses as c_str. HOWEVER this wastes 32 bytes of BSS * Fix error formatting * Restyle * Fix includes to be system paths * Update src/app/data-model-provider/Provider.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Update src/app/data-model-provider/Provider.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Fix status success and chip_no_error equivalence and add unit tests * Added more tests --------- Co-authored-by: Andrei Litvin <andreilitvin@google.com> Co-authored-by: Boris Zbarsky <bzbarsky@apple.com>
1 parent ec239e5 commit ec11920

30 files changed

+729
-152
lines changed

src/app/codegen-data-model-provider/CodegenDataModelProvider.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -229,8 +229,8 @@ bool CodegenDataModelProvider::EmberCommandListIterator::Exists(const CommandId
229229
return (*mCurrentHint == toCheck);
230230
}
231231

232-
CHIP_ERROR CodegenDataModelProvider::Invoke(const DataModel::InvokeRequest & request, TLV::TLVReader & input_arguments,
233-
CommandHandler * handler)
232+
DataModel::ActionReturnStatus CodegenDataModelProvider::Invoke(const DataModel::InvokeRequest & request,
233+
TLV::TLVReader & input_arguments, CommandHandler * handler)
234234
{
235235
// TODO: CommandHandlerInterface support is currently
236236
// residing in InteractionModelEngine itself. We may want to separate this out

src/app/codegen-data-model-provider/CodegenDataModelProvider.h

+7-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
*/
1717
#pragma once
1818

19+
#include "app/data-model-provider/ActionReturnStatus.h"
1920
#include <app/data-model-provider/Provider.h>
2021

2122
#include <app/util/af-types.h>
@@ -68,10 +69,12 @@ class CodegenDataModelProvider : public chip::app::DataModel::Provider
6869
/// Generic model implementations
6970
CHIP_ERROR Shutdown() override { return CHIP_NO_ERROR; }
7071

71-
CHIP_ERROR ReadAttribute(const DataModel::ReadAttributeRequest & request, AttributeValueEncoder & encoder) override;
72-
CHIP_ERROR WriteAttribute(const DataModel::WriteAttributeRequest & request, AttributeValueDecoder & decoder) override;
73-
CHIP_ERROR Invoke(const DataModel::InvokeRequest & request, chip::TLV::TLVReader & input_arguments,
74-
CommandHandler * handler) override;
72+
DataModel::ActionReturnStatus ReadAttribute(const DataModel::ReadAttributeRequest & request,
73+
AttributeValueEncoder & encoder) override;
74+
DataModel::ActionReturnStatus WriteAttribute(const DataModel::WriteAttributeRequest & request,
75+
AttributeValueDecoder & decoder) override;
76+
DataModel::ActionReturnStatus Invoke(const DataModel::InvokeRequest & request, chip::TLV::TLVReader & input_arguments,
77+
CommandHandler * handler) override;
7578

7679
/// attribute tree iteration
7780
EndpointId FirstEndpoint() override;

src/app/codegen-data-model-provider/CodegenDataModelProvider_Read.cpp

+9-6
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@
4747
namespace chip {
4848
namespace app {
4949
namespace {
50+
5051
using namespace chip::app::Compatibility::Internal;
52+
using Protocols::InteractionModel::Status;
5153

5254
/// Attempts to read via an attribute access interface (AAI)
5355
///
@@ -258,7 +260,8 @@ CHIP_ERROR EncodeEmberValue(ByteSpan data, const EmberAfAttributeMetadata * meta
258260
/// - validate ACL (only for non-internal requests)
259261
/// - Try to read attribute via the AttributeAccessInterface
260262
/// - Try to read the value from ember RAM storage
261-
CHIP_ERROR CodegenDataModelProvider::ReadAttribute(const DataModel::ReadAttributeRequest & request, AttributeValueEncoder & encoder)
263+
DataModel::ActionReturnStatus CodegenDataModelProvider::ReadAttribute(const DataModel::ReadAttributeRequest & request,
264+
AttributeValueEncoder & encoder)
262265
{
263266
ChipLogDetail(DataManagement,
264267
"Reading attribute: Cluster=" ChipLogFormatMEI " Endpoint=0x%x AttributeId=" ChipLogFormatMEI " (expanded=%d)",
@@ -290,12 +293,12 @@ CHIP_ERROR CodegenDataModelProvider::ReadAttribute(const DataModel::ReadAttribut
290293
auto metadata = Ember::FindAttributeMetadata(request.path);
291294

292295
// Explicit failure in finding a suitable metadata
293-
if (const CHIP_ERROR * err = std::get_if<CHIP_ERROR>(&metadata))
296+
if (const Status * status = std::get_if<Status>(&metadata))
294297
{
295-
VerifyOrDie((*err == CHIP_IM_GLOBAL_STATUS(UnsupportedEndpoint)) || //
296-
(*err == CHIP_IM_GLOBAL_STATUS(UnsupportedCluster)) || //
297-
(*err == CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)));
298-
return *err;
298+
VerifyOrDie((*status == Status::UnsupportedEndpoint) || //
299+
(*status == Status::UnsupportedCluster) || //
300+
(*status == Status::UnsupportedAttribute));
301+
return *status;
299302
}
300303

301304
// Read via AAI

src/app/codegen-data-model-provider/CodegenDataModelProvider_Write.cpp

+18-16
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ namespace app {
4343
namespace {
4444

4545
using namespace chip::app::Compatibility::Internal;
46+
using Protocols::InteractionModel::Status;
4647

4748
/// Attempts to write via an attribute access interface (AAI)
4849
///
@@ -266,16 +267,16 @@ CHIP_ERROR DecodeValueIntoEmberBuffer(AttributeValueDecoder & decoder, const Emb
266267

267268
} // namespace
268269

269-
CHIP_ERROR CodegenDataModelProvider::WriteAttribute(const DataModel::WriteAttributeRequest & request,
270-
AttributeValueDecoder & decoder)
270+
DataModel::ActionReturnStatus CodegenDataModelProvider::WriteAttribute(const DataModel::WriteAttributeRequest & request,
271+
AttributeValueDecoder & decoder)
271272
{
272273
ChipLogDetail(DataManagement, "Writing attribute: Cluster=" ChipLogFormatMEI " Endpoint=0x%x AttributeId=" ChipLogFormatMEI,
273274
ChipLogValueMEI(request.path.mClusterId), request.path.mEndpointId, ChipLogValueMEI(request.path.mAttributeId));
274275

275276
// ACL check for non-internal requests
276277
if (!request.operationFlags.Has(DataModel::OperationFlags::kInternal))
277278
{
278-
ReturnErrorCodeIf(!request.subjectDescriptor.has_value(), CHIP_IM_GLOBAL_STATUS(UnsupportedAccess));
279+
ReturnErrorCodeIf(!request.subjectDescriptor.has_value(), Status::UnsupportedAccess);
279280

280281
Access::RequestPath requestPath{ .cluster = request.path.mClusterId, .endpoint = request.path.mEndpointId };
281282
CHIP_ERROR err = Access::GetAccessControl().Check(*request.subjectDescriptor, requestPath,
@@ -286,18 +287,19 @@ CHIP_ERROR CodegenDataModelProvider::WriteAttribute(const DataModel::WriteAttrib
286287
ReturnErrorCodeIf(err != CHIP_ERROR_ACCESS_DENIED, err);
287288

288289
// TODO: when wildcard/group writes are supported, handle them to discard rather than fail with status
289-
return CHIP_IM_GLOBAL_STATUS(UnsupportedAccess);
290+
return Status::UnsupportedAccess;
290291
}
291292
}
292293

293294
auto metadata = Ember::FindAttributeMetadata(request.path);
294295

295-
if (const CHIP_ERROR * err = std::get_if<CHIP_ERROR>(&metadata))
296+
// Explicit failure in finding a suitable metadata
297+
if (const Status * status = std::get_if<Status>(&metadata))
296298
{
297-
VerifyOrDie((*err == CHIP_IM_GLOBAL_STATUS(UnsupportedEndpoint)) || //
298-
(*err == CHIP_IM_GLOBAL_STATUS(UnsupportedCluster)) || //
299-
(*err == CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute)));
300-
return *err;
299+
VerifyOrDie((*status == Status::UnsupportedEndpoint) || //
300+
(*status == Status::UnsupportedCluster) || //
301+
(*status == Status::UnsupportedAttribute));
302+
return *status;
301303
}
302304

303305
const EmberAfAttributeMetadata ** attributeMetadata = std::get_if<const EmberAfAttributeMetadata *>(&metadata);
@@ -316,15 +318,15 @@ CHIP_ERROR CodegenDataModelProvider::WriteAttribute(const DataModel::WriteAttrib
316318
// Internal is allowed to bypass timed writes and read-only.
317319
if (!request.operationFlags.Has(DataModel::OperationFlags::kInternal))
318320
{
319-
VerifyOrReturnError(!isReadOnly, CHIP_IM_GLOBAL_STATUS(UnsupportedWrite));
321+
VerifyOrReturnError(!isReadOnly, Status::UnsupportedWrite);
320322

321323
VerifyOrReturnError(!(*attributeMetadata)->MustUseTimedWrite() || request.writeFlags.Has(DataModel::WriteFlags::kTimed),
322-
CHIP_IM_GLOBAL_STATUS(NeedsTimedInteraction));
324+
Status::NeedsTimedInteraction);
323325
}
324326

325327
// Extra check: internal requests can bypass the read only check, however global attributes
326328
// have no underlying storage, so write still cannot be done
327-
VerifyOrReturnError(attributeMetadata != nullptr, CHIP_IM_GLOBAL_STATUS(UnsupportedWrite));
329+
VerifyOrReturnError(attributeMetadata != nullptr, Status::UnsupportedWrite);
328330

329331
if (request.path.mDataVersion.HasValue())
330332
{
@@ -333,14 +335,14 @@ CHIP_ERROR CodegenDataModelProvider::WriteAttribute(const DataModel::WriteAttrib
333335
{
334336
ChipLogError(DataManagement, "Unable to get cluster info for Endpoint 0x%x, Cluster " ChipLogFormatMEI,
335337
request.path.mEndpointId, ChipLogValueMEI(request.path.mClusterId));
336-
return CHIP_IM_GLOBAL_STATUS(DataVersionMismatch);
338+
return Status::DataVersionMismatch;
337339
}
338340

339341
if (request.path.mDataVersion.Value() != clusterInfo->dataVersion)
340342
{
341343
ChipLogError(DataManagement, "Write Version mismatch for Endpoint 0x%x, Cluster " ChipLogFormatMEI,
342344
request.path.mEndpointId, ChipLogValueMEI(request.path.mClusterId));
343-
return CHIP_IM_GLOBAL_STATUS(DataVersionMismatch);
345+
return Status::DataVersionMismatch;
344346
}
345347
}
346348

@@ -367,7 +369,7 @@ CHIP_ERROR CodegenDataModelProvider::WriteAttribute(const DataModel::WriteAttrib
367369
if (dataBuffer.size() > (*attributeMetadata)->size)
368370
{
369371
ChipLogDetail(Zcl, "Data to write exceeds the attribute size claimed.");
370-
return CHIP_IM_GLOBAL_STATUS(InvalidValue);
372+
return Status::InvalidValue;
371373
}
372374

373375
if (request.operationFlags.Has(DataModel::OperationFlags::kInternal))
@@ -386,7 +388,7 @@ CHIP_ERROR CodegenDataModelProvider::WriteAttribute(const DataModel::WriteAttrib
386388

387389
if (status != Protocols::InteractionModel::Status::Success)
388390
{
389-
return CHIP_ERROR_IM_GLOBAL_STATUS_VALUE(status);
391+
return status;
390392
}
391393

392394
// TODO: this WILL requre updates

src/app/codegen-data-model-provider/EmberMetadata.cpp

+8-6
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ namespace chip {
2424
namespace app {
2525
namespace Ember {
2626

27+
using Protocols::InteractionModel::Status;
28+
2729
std::variant<const EmberAfCluster *, // global attribute, data from a cluster
2830
const EmberAfAttributeMetadata *, // a specific attribute stored by ember
29-
CHIP_ERROR // error, this will NEVER be CHIP_NO_ERROR
31+
Status // one of Status::Unsupported*
3032
>
3133
FindAttributeMetadata(const ConcreteAttributePath & aPath)
3234
{
@@ -41,8 +43,8 @@ FindAttributeMetadata(const ConcreteAttributePath & aPath)
4143
const EmberAfCluster * cluster = emberAfFindServerCluster(aPath.mEndpointId, aPath.mClusterId);
4244
if (cluster == nullptr)
4345
{
44-
return (emberAfFindEndpointType(aPath.mEndpointId) == nullptr) ? CHIP_IM_GLOBAL_STATUS(UnsupportedEndpoint)
45-
: CHIP_IM_GLOBAL_STATUS(UnsupportedCluster);
46+
return (emberAfFindEndpointType(aPath.mEndpointId) == nullptr) ? Status::UnsupportedEndpoint
47+
: Status::UnsupportedCluster;
4648
}
4749

4850
return cluster;
@@ -57,18 +59,18 @@ FindAttributeMetadata(const ConcreteAttributePath & aPath)
5759
const EmberAfEndpointType * type = emberAfFindEndpointType(aPath.mEndpointId);
5860
if (type == nullptr)
5961
{
60-
return CHIP_IM_GLOBAL_STATUS(UnsupportedEndpoint);
62+
return Status::UnsupportedEndpoint;
6163
}
6264

6365
const EmberAfCluster * cluster = emberAfFindClusterInType(type, aPath.mClusterId, CLUSTER_MASK_SERVER);
6466
if (cluster == nullptr)
6567
{
66-
return CHIP_IM_GLOBAL_STATUS(UnsupportedCluster);
68+
return Status::UnsupportedCluster;
6769
}
6870

6971
// Since we know the attribute is unsupported and the endpoint/cluster are
7072
// OK, this is the only option left.
71-
return CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute);
73+
return Status::UnsupportedAttribute;
7274
}
7375

7476
return metadata;

src/app/codegen-data-model-provider/EmberMetadata.h

+8-7
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include <app/util/af-types.h>
2020
#include <lib/core/CHIPError.h>
21+
#include <protocols/interaction_model/StatusCode.h>
2122

2223
#include <variant>
2324

@@ -31,13 +32,13 @@ namespace Ember {
3132
/// Possible return values:
3233
/// - EmberAfCluster (NEVER null) - Only for GlobalAttributesNotInMetaData
3334
/// - EmberAfAttributeMetadata (NEVER null) - if the attribute is known to ember datastore
34-
/// - CHIP_ERROR, only specifically for unknown attributes, may only be one of:
35-
/// - CHIP_IM_GLOBAL_STATUS(UnsupportedEndpoint);
36-
/// - CHIP_IM_GLOBAL_STATUS(UnsupportedCluster);
37-
/// - CHIP_IM_GLOBAL_STATUS(UnsupportedAttribute);
38-
std::variant<const EmberAfCluster *, // global attribute, data from a cluster
39-
const EmberAfAttributeMetadata *, // a specific attribute stored by ember
40-
CHIP_ERROR // error, (CHIP_IM_GLOBAL_STATUS(Unsupported*))
35+
/// - Status, only specifically for unknown attributes, may only be one of:
36+
/// - Status::UnsupportedEndpoint
37+
/// - Status::UnsupportedCluster
38+
/// - Status::UnsupportedAttribute
39+
std::variant<const EmberAfCluster *, // global attribute, data from a cluster
40+
const EmberAfAttributeMetadata *, // a specific attribute stored by ember
41+
Protocols::InteractionModel::Status // one of Status::Unsupported*
4142
>
4243
FindAttributeMetadata(const ConcreteAttributePath & aPath);
4344

src/app/codegen-data-model-provider/tests/BUILD.gn

+4-1
Original file line numberDiff line numberDiff line change
@@ -57,5 +57,8 @@ chip_test_suite("tests") {
5757

5858
cflags = [ "-Wconversion" ]
5959

60-
public_deps = [ ":mock_model" ]
60+
public_deps = [
61+
":mock_model",
62+
"${chip_root}/src/app/data-model-provider:string-builder-adapters",
63+
]
6164
}

0 commit comments

Comments
 (0)