blob: 181b25df25b893565e918acb7e4b591ec7b0206a [file] [log] [blame]
#include "GroupcastCluster.h"
#include <app/server-cluster/AttributeListBuilder.h>
#include <clusters/Groupcast/AttributeIds.h>
#include <clusters/Groupcast/Attributes.h>
#include <clusters/Groupcast/Metadata.h>
using chip::Protocols::InteractionModel::Status;
namespace chip {
namespace app {
namespace Clusters {
namespace {
constexpr DataModel::AcceptedCommandEntry kAcceptedCommands[] = {
Groupcast::Commands::JoinGroup::kMetadataEntry,
Groupcast::Commands::LeaveGroup::kMetadataEntry,
Groupcast::Commands::UpdateGroupKey::kMetadataEntry,
Groupcast::Commands::ExpireGracePeriod::kMetadataEntry,
Groupcast::Commands::ConfigureAuxiliaryACL::kMetadataEntry,
};
} // namespace
GroupcastCluster::GroupcastCluster(BitFlags<Groupcast::Feature> features) :
DefaultServerCluster({ kRootEndpointId, Groupcast::Id }), mLogic(features)
{}
DataModel::ActionReturnStatus GroupcastCluster::ReadAttribute(const DataModel::ReadAttributeRequest & request,
AttributeValueEncoder & encoder)
{
switch (request.path.mAttributeId)
{
case Groupcast::Attributes::FeatureMap::Id:
return encoder.Encode(mLogic.Features());
case Groupcast::Attributes::ClusterRevision::Id:
return encoder.Encode(Groupcast::kRevision);
case Groupcast::Attributes::Membership::Id:
return mLogic.ReadMembership(request.path.mEndpointId, encoder);
case Groupcast::Attributes::MaxMembershipCount::Id:
return mLogic.ReadMaxMembershipCount(request.path.mEndpointId, encoder);
}
return Protocols::InteractionModel::Status::UnsupportedAttribute;
}
CHIP_ERROR GroupcastCluster::Attributes(const ConcreteClusterPath & path,
ReadOnlyBufferBuilder<DataModel::AttributeEntry> & builder)
{
AttributeListBuilder listBuilder(builder);
return listBuilder.Append(Span(Groupcast::Attributes::kMandatoryMetadata), {});
}
std::optional<DataModel::ActionReturnStatus> GroupcastCluster::InvokeCommand(const DataModel::InvokeRequest & request,
chip::TLV::TLVReader & arguments,
CommandHandler * handler)
{
VerifyOrReturnValue(nullptr != handler, Protocols::InteractionModel::Status::InvalidAction);
FabricIndex fabric_index = handler->GetAccessingFabricIndex();
switch (request.path.mCommandId)
{
case Groupcast::Commands::JoinGroup::Id: {
Groupcast::Commands::JoinGroup::DecodableType data;
ReturnErrorOnFailure(data.Decode(arguments, fabric_index));
return mLogic.JoinGroup(fabric_index, data);
}
case Groupcast::Commands::LeaveGroup::Id: {
Groupcast::Commands::LeaveGroup::DecodableType data;
Groupcast::Commands::LeaveGroupResponse::Type response;
ReturnErrorOnFailure(data.Decode(arguments, fabric_index));
TEMPORARY_RETURN_IGNORED mLogic.LeaveGroup(fabric_index, data, response);
handler->AddResponse(request.path, response);
return std::nullopt;
}
case Groupcast::Commands::UpdateGroupKey::Id: {
Groupcast::Commands::UpdateGroupKey::DecodableType data;
ReturnErrorOnFailure(data.Decode(arguments, fabric_index));
return mLogic.UpdateGroupKey(fabric_index, data);
}
case Groupcast::Commands::ExpireGracePeriod::Id: {
Groupcast::Commands::ExpireGracePeriod::DecodableType data;
ReturnErrorOnFailure(data.Decode(arguments, fabric_index));
return mLogic.ExpireGracePeriod(fabric_index, data);
}
case Groupcast::Commands::ConfigureAuxiliaryACL::Id: {
Groupcast::Commands::ConfigureAuxiliaryACL::DecodableType data;
ReturnErrorOnFailure(data.Decode(arguments, fabric_index));
return mLogic.ConfigureAuxiliaryACL(fabric_index, data);
}
}
return Protocols::InteractionModel::Status::UnsupportedCommand;
}
CHIP_ERROR GroupcastCluster::AcceptedCommands(const ConcreteClusterPath & path,
ReadOnlyBufferBuilder<DataModel::AcceptedCommandEntry> & builder)
{
return builder.ReferenceExisting(kAcceptedCommands);
}
} // namespace Clusters
} // namespace app
} // namespace chip