Skip to content

Commit 987060f

Browse files
Administrator Commissioning cluster: Use CommandHandlerInterface for handling commands (#37078)
* Add implementation of CommandHandlerInterface for Administrator Commissioning. Also remove it from the list of auto-generated Ember callbacks. * Combine the admin commissioning cluster's AAI and CHI. * Merge the old methods and the class member methods. * clang-format * Fix compile. * Unshadow the context variable. * Check failures during the bridge app's initialisation. Also change a word in the failing test so it doesn't mislead. * Change the fabric bridge example's custom command handler to expect the one I'm adding. * clang-format * Update the other fabric sync app to handle the existence of the new Admin Commissioning cluster's CHI. * clang-format * Add ifdef guards around the OpenBasicCommissioningWindow command. * Check for the existence of the constant for now.
1 parent 64fdf76 commit 987060f

File tree

8 files changed

+106
-182
lines changed

8 files changed

+106
-182
lines changed

examples/fabric-bridge-app/linux/main.cpp

+23-3
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,24 @@ class AdministratorCommissioningCommandHandler : public CommandHandlerInterface
122122
CommandHandlerInterface(Optional<EndpointId>::Missing(), AdministratorCommissioning::Id)
123123
{}
124124

125+
CHIP_ERROR Init();
126+
125127
void InvokeCommand(HandlerContext & handlerContext) override;
128+
129+
private:
130+
CommandHandlerInterface * mOriginalCommandHandlerInterface = nullptr;
126131
};
127132

133+
CHIP_ERROR AdministratorCommissioningCommandHandler::Init()
134+
{
135+
mOriginalCommandHandlerInterface =
136+
CommandHandlerInterfaceRegistry::Instance().GetCommandHandler(kRootEndpointId, AdministratorCommissioning::Id);
137+
VerifyOrReturnError(mOriginalCommandHandlerInterface, CHIP_ERROR_INTERNAL);
138+
ReturnErrorOnFailure(CommandHandlerInterfaceRegistry::Instance().UnregisterCommandHandler(mOriginalCommandHandlerInterface));
139+
ReturnErrorOnFailure(CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(this));
140+
return CHIP_NO_ERROR;
141+
}
142+
128143
void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & handlerContext)
129144
{
130145
using Protocols::InteractionModel::Status;
@@ -136,6 +151,7 @@ void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & ha
136151
endpointId == kRootEndpointId)
137152
{
138153
// Proceed with default handling in Administrator Commissioning Server
154+
mOriginalCommandHandlerInterface->InvokeCommand(handlerContext);
139155
return;
140156
}
141157

@@ -252,9 +268,11 @@ void ApplicationInit()
252268
ChipLogDetail(NotSpecified, "Fabric-Bridge: ApplicationInit()");
253269

254270
MatterEcosystemInformationPluginServerInitCallback();
255-
CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&bridge::gAdministratorCommissioningCommandHandler);
256-
CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&bridge::gBridgedDeviceInformationCommandHandler);
257-
AttributeAccessInterfaceRegistry::Instance().Register(&bridge::gBridgedDeviceBasicInformationAttributes);
271+
VerifyOrDieWithMsg(CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(
272+
&bridge::gBridgedDeviceInformationCommandHandler) == CHIP_NO_ERROR,
273+
NotSpecified, "Failed to register bridged device command handler");
274+
VerifyOrDieWithMsg(AttributeAccessInterfaceRegistry::Instance().Register(&bridge::gBridgedDeviceBasicInformationAttributes),
275+
NotSpecified, "Failed to register bridged device attribute access");
258276

259277
#if defined(PW_RPC_FABRIC_BRIDGE_SERVICE) && PW_RPC_FABRIC_BRIDGE_SERVICE
260278
bridge::SetRpcRemoteServerPort(gFabricAdminServerPort);
@@ -264,6 +282,8 @@ void ApplicationInit()
264282

265283
bridge::BridgedDeviceManager::Instance().Init();
266284
VerifyOrDie(bridge::gBridgedAdministratorCommissioning.Init() == CHIP_NO_ERROR);
285+
VerifyOrDieWithMsg(bridge::gAdministratorCommissioningCommandHandler.Init() == CHIP_NO_ERROR, NotSpecified,
286+
"Failed to initialize Commissioner command handler");
267287

268288
VerifyOrDieWithMsg(bridge::CommissionerControlInit() == CHIP_NO_ERROR, NotSpecified,
269289
"Failed to initialize Commissioner Control Server");

examples/fabric-sync/bridge/src/Bridge.cpp

+21-3
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,24 @@ class AdministratorCommissioningCommandHandler : public CommandHandlerInterface
5353
CommandHandlerInterface(Optional<EndpointId>::Missing(), AdministratorCommissioning::Id)
5454
{}
5555

56+
CHIP_ERROR Init();
57+
5658
void InvokeCommand(HandlerContext & handlerContext) override;
59+
60+
private:
61+
CommandHandlerInterface * mOriginalCommandHandlerInterface = nullptr;
5762
};
5863

64+
CHIP_ERROR AdministratorCommissioningCommandHandler::Init()
65+
{
66+
mOriginalCommandHandlerInterface =
67+
CommandHandlerInterfaceRegistry::Instance().GetCommandHandler(kRootEndpointId, AdministratorCommissioning::Id);
68+
VerifyOrReturnError(mOriginalCommandHandlerInterface, CHIP_ERROR_INTERNAL);
69+
ReturnErrorOnFailure(CommandHandlerInterfaceRegistry::Instance().UnregisterCommandHandler(mOriginalCommandHandlerInterface));
70+
ReturnErrorOnFailure(CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(this));
71+
return CHIP_NO_ERROR;
72+
}
73+
5974
void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & handlerContext)
6075
{
6176
using Protocols::InteractionModel::Status;
@@ -66,6 +81,7 @@ void AdministratorCommissioningCommandHandler::InvokeCommand(HandlerContext & ha
6681
endpointId == kRootEndpointId)
6782
{
6883
// Proceed with default handling in Administrator Commissioning Server
84+
mOriginalCommandHandlerInterface->InvokeCommand(handlerContext);
6985
return;
7086
}
7187

@@ -200,9 +216,11 @@ BridgedDeviceInformationCommandHandler gBridgedDeviceInformationCommandHandler;
200216
CHIP_ERROR BridgeInit(FabricAdminDelegate * delegate)
201217
{
202218
MatterEcosystemInformationPluginServerInitCallback();
203-
CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&gAdministratorCommissioningCommandHandler);
204-
CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&gBridgedDeviceInformationCommandHandler);
205-
AttributeAccessInterfaceRegistry::Instance().Register(&gBridgedDeviceBasicInformationAttributes);
219+
ReturnErrorOnFailure(gAdministratorCommissioningCommandHandler.Init());
220+
ReturnErrorOnFailure(
221+
CommandHandlerInterfaceRegistry::Instance().RegisterCommandHandler(&gBridgedDeviceInformationCommandHandler));
222+
VerifyOrReturnError(AttributeAccessInterfaceRegistry::Instance().Register(&gBridgedDeviceBasicInformationAttributes),
223+
CHIP_ERROR_INTERNAL);
206224

207225
BridgedDeviceManager::Instance().Init();
208226
FabricBridge::Instance().SetDelegate(delegate);

scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/IMClusterCommandHandler.cpp

-65
Original file line numberDiff line numberDiff line change
@@ -37,68 +37,6 @@ namespace app {
3737

3838
namespace Clusters {
3939

40-
namespace AdministratorCommissioning {
41-
42-
Protocols::InteractionModel::Status DispatchServerCommand(CommandHandler * apCommandObj, const ConcreteCommandPath & aCommandPath,
43-
TLV::TLVReader & aDataTlv)
44-
{
45-
CHIP_ERROR TLVError = CHIP_NO_ERROR;
46-
bool wasHandled = false;
47-
{
48-
switch (aCommandPath.mCommandId)
49-
{
50-
case Commands::OpenCommissioningWindow::Id: {
51-
Commands::OpenCommissioningWindow::DecodableType commandData;
52-
TLVError = DataModel::Decode(aDataTlv, commandData);
53-
if (TLVError == CHIP_NO_ERROR)
54-
{
55-
wasHandled = emberAfAdministratorCommissioningClusterOpenCommissioningWindowCallback(apCommandObj, aCommandPath,
56-
commandData);
57-
}
58-
break;
59-
}
60-
case Commands::OpenBasicCommissioningWindow::Id: {
61-
Commands::OpenBasicCommissioningWindow::DecodableType commandData;
62-
TLVError = DataModel::Decode(aDataTlv, commandData);
63-
if (TLVError == CHIP_NO_ERROR)
64-
{
65-
wasHandled = emberAfAdministratorCommissioningClusterOpenBasicCommissioningWindowCallback(
66-
apCommandObj, aCommandPath, commandData);
67-
}
68-
break;
69-
}
70-
case Commands::RevokeCommissioning::Id: {
71-
Commands::RevokeCommissioning::DecodableType commandData;
72-
TLVError = DataModel::Decode(aDataTlv, commandData);
73-
if (TLVError == CHIP_NO_ERROR)
74-
{
75-
wasHandled =
76-
emberAfAdministratorCommissioningClusterRevokeCommissioningCallback(apCommandObj, aCommandPath, commandData);
77-
}
78-
break;
79-
}
80-
default: {
81-
// Unrecognized command ID, error status will apply.
82-
ChipLogError(Zcl, "Unknown command " ChipLogFormatMEI " for cluster " ChipLogFormatMEI,
83-
ChipLogValueMEI(aCommandPath.mCommandId), ChipLogValueMEI(aCommandPath.mClusterId));
84-
return Protocols::InteractionModel::Status::UnsupportedCommand;
85-
}
86-
}
87-
}
88-
89-
if (CHIP_NO_ERROR != TLVError || !wasHandled)
90-
{
91-
ChipLogProgress(Zcl, "Failed to dispatch command, TLVError=%" CHIP_ERROR_FORMAT, TLVError.Format());
92-
return Protocols::InteractionModel::Status::InvalidCommand;
93-
}
94-
95-
// We use success as a marker that no special handling is required
96-
// This is to avoid having a std::optional which uses slightly more code.
97-
return Protocols::InteractionModel::Status::Success;
98-
}
99-
100-
} // namespace AdministratorCommissioning
101-
10240
namespace BooleanStateConfiguration {
10341

10442
Protocols::InteractionModel::Status DispatchServerCommand(CommandHandler * apCommandObj, const ConcreteCommandPath & aCommandPath,
@@ -1851,9 +1789,6 @@ void DispatchSingleClusterCommand(const ConcreteCommandPath & aCommandPath, TLV:
18511789

18521790
switch (aCommandPath.mClusterId)
18531791
{
1854-
case Clusters::AdministratorCommissioning::Id:
1855-
errorStatus = Clusters::AdministratorCommissioning::DispatchServerCommand(apCommandObj, aCommandPath, aReader);
1856-
break;
18571792
case Clusters::BooleanStateConfiguration::Id:
18581793
errorStatus = Clusters::BooleanStateConfiguration::DispatchServerCommand(apCommandObj, aCommandPath, aReader);
18591794
break;

scripts/tools/zap/tests/outputs/lighting-app/app-templates/IMClusterCommandHandler.cpp

-65
Original file line numberDiff line numberDiff line change
@@ -37,68 +37,6 @@ namespace app {
3737

3838
namespace Clusters {
3939

40-
namespace AdministratorCommissioning {
41-
42-
Protocols::InteractionModel::Status DispatchServerCommand(CommandHandler * apCommandObj, const ConcreteCommandPath & aCommandPath,
43-
TLV::TLVReader & aDataTlv)
44-
{
45-
CHIP_ERROR TLVError = CHIP_NO_ERROR;
46-
bool wasHandled = false;
47-
{
48-
switch (aCommandPath.mCommandId)
49-
{
50-
case Commands::OpenCommissioningWindow::Id: {
51-
Commands::OpenCommissioningWindow::DecodableType commandData;
52-
TLVError = DataModel::Decode(aDataTlv, commandData);
53-
if (TLVError == CHIP_NO_ERROR)
54-
{
55-
wasHandled = emberAfAdministratorCommissioningClusterOpenCommissioningWindowCallback(apCommandObj, aCommandPath,
56-
commandData);
57-
}
58-
break;
59-
}
60-
case Commands::OpenBasicCommissioningWindow::Id: {
61-
Commands::OpenBasicCommissioningWindow::DecodableType commandData;
62-
TLVError = DataModel::Decode(aDataTlv, commandData);
63-
if (TLVError == CHIP_NO_ERROR)
64-
{
65-
wasHandled = emberAfAdministratorCommissioningClusterOpenBasicCommissioningWindowCallback(
66-
apCommandObj, aCommandPath, commandData);
67-
}
68-
break;
69-
}
70-
case Commands::RevokeCommissioning::Id: {
71-
Commands::RevokeCommissioning::DecodableType commandData;
72-
TLVError = DataModel::Decode(aDataTlv, commandData);
73-
if (TLVError == CHIP_NO_ERROR)
74-
{
75-
wasHandled =
76-
emberAfAdministratorCommissioningClusterRevokeCommissioningCallback(apCommandObj, aCommandPath, commandData);
77-
}
78-
break;
79-
}
80-
default: {
81-
// Unrecognized command ID, error status will apply.
82-
ChipLogError(Zcl, "Unknown command " ChipLogFormatMEI " for cluster " ChipLogFormatMEI,
83-
ChipLogValueMEI(aCommandPath.mCommandId), ChipLogValueMEI(aCommandPath.mClusterId));
84-
return Protocols::InteractionModel::Status::UnsupportedCommand;
85-
}
86-
}
87-
}
88-
89-
if (CHIP_NO_ERROR != TLVError || !wasHandled)
90-
{
91-
ChipLogProgress(Zcl, "Failed to dispatch command, TLVError=%" CHIP_ERROR_FORMAT, TLVError.Format());
92-
return Protocols::InteractionModel::Status::InvalidCommand;
93-
}
94-
95-
// We use success as a marker that no special handling is required
96-
// This is to avoid having a std::optional which uses slightly more code.
97-
return Protocols::InteractionModel::Status::Success;
98-
}
99-
100-
} // namespace AdministratorCommissioning
101-
10240
namespace ColorControl {
10341

10442
Protocols::InteractionModel::Status DispatchServerCommand(CommandHandler * apCommandObj, const ConcreteCommandPath & aCommandPath,
@@ -977,9 +915,6 @@ void DispatchSingleClusterCommand(const ConcreteCommandPath & aCommandPath, TLV:
977915

978916
switch (aCommandPath.mClusterId)
979917
{
980-
case Clusters::AdministratorCommissioning::Id:
981-
errorStatus = Clusters::AdministratorCommissioning::DispatchServerCommand(apCommandObj, aCommandPath, aReader);
982-
break;
983918
case Clusters::ColorControl::Id:
984919
errorStatus = Clusters::ColorControl::DispatchServerCommand(apCommandObj, aCommandPath, aReader);
985920
break;

0 commit comments

Comments
 (0)