/* * 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 "BridgedAdministratorCommissioning.h" #include "BridgedDevice.h" #include "BridgedDeviceManager.h" #include using namespace chip; using namespace chip::app; using namespace chip::app::Clusters; using namespace chip::app::Clusters::AdministratorCommissioning; CHIP_ERROR BridgedAdministratorCommissioning::Init() { // We expect initialization after emberAfInit(). This allows us to unregister the existing // AccessAttributeInterface for AdministratorCommissioning and register ourselves, ensuring we // get the callback for reading attribute. If the read is not intended for a bridged device we will // forward it to the original attribute interface that we are unregistering. mOriginalAttributeInterface = AttributeAccessInterfaceRegistry::Instance().Get(kRootEndpointId, AdministratorCommissioning::Id); VerifyOrReturnError(mOriginalAttributeInterface, CHIP_ERROR_INTERNAL); AttributeAccessInterfaceRegistry::Instance().Unregister(mOriginalAttributeInterface); VerifyOrDie(AttributeAccessInterfaceRegistry::Instance().Register(this)); return CHIP_NO_ERROR; } CHIP_ERROR BridgedAdministratorCommissioning::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) { VerifyOrDie(aPath.mClusterId == Clusters::AdministratorCommissioning::Id); EndpointId endpointId = aPath.mEndpointId; BridgedDevice * device = BridgeDeviceMgr().GetDevice(endpointId); if (!device) { VerifyOrDie(mOriginalAttributeInterface); return mOriginalAttributeInterface->Read(aPath, aEncoder); } auto attr = device->GetAdminCommissioningAttributes(); switch (aPath.mAttributeId) { case Attributes::WindowStatus::Id: { return aEncoder.Encode(attr.commissioningWindowStatus); } case Attributes::AdminFabricIndex::Id: { DataModel::Nullable encodeableFabricIndex = DataModel::NullNullable; if (attr.openerFabricIndex.has_value()) { encodeableFabricIndex.SetNonNull(attr.openerFabricIndex.value()); } return aEncoder.Encode(encodeableFabricIndex); } case Attributes::AdminVendorId::Id: { DataModel::Nullable encodeableVendorId = DataModel::NullNullable; if (attr.openerVendorId.has_value()) { encodeableVendorId.SetNonNull(attr.openerVendorId.value()); } return aEncoder.Encode(encodeableVendorId); } default: break; } return CHIP_NO_ERROR; }