-
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.
A first pass at decoupling the AttributeAccessOverride
- Loading branch information
Showing
20 changed files
with
248 additions
and
24 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
/** | ||
* Copyright (c) 2024 Project CHIP Authors | ||
* | ||
* 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 <app/AttributeAccessInterfaceRegistry.h> | ||
|
||
#include <app/AttributeAccessInterfaceCache.h> | ||
|
||
using namespace chip::app; | ||
|
||
namespace { | ||
|
||
AttributeAccessInterface * gAttributeAccessOverrides = nullptr; | ||
AttributeAccessInterfaceCache gAttributeAccessInterfaceCache; | ||
|
||
// shouldUnregister returns true if the given AttributeAccessInterface should be | ||
// unregistered. | ||
template <typename F> | ||
void UnregisterMatchingAttributeAccessInterfaces(F shouldUnregister) | ||
{ | ||
AttributeAccessInterface * prev = nullptr; | ||
AttributeAccessInterface * cur = gAttributeAccessOverrides; | ||
while (cur) | ||
{ | ||
AttributeAccessInterface * next = cur->GetNext(); | ||
if (shouldUnregister(cur)) | ||
{ | ||
// Remove it from the list | ||
if (prev) | ||
{ | ||
prev->SetNext(next); | ||
} | ||
else | ||
{ | ||
gAttributeAccessOverrides = next; | ||
} | ||
|
||
cur->SetNext(nullptr); | ||
|
||
// Do not change prev in this case. | ||
} | ||
else | ||
{ | ||
prev = cur; | ||
} | ||
cur = next; | ||
} | ||
} | ||
|
||
} // namespace | ||
|
||
void unregisterAttributeAccessOverride(AttributeAccessInterface * attrOverride) | ||
{ | ||
gAttributeAccessInterfaceCache.Invalidate(); | ||
UnregisterMatchingAttributeAccessInterfaces([attrOverride](AttributeAccessInterface * entry) { return entry == attrOverride; }); | ||
} | ||
|
||
void unregisterAttributeAccessOverrideForEndpoint(EmberAfDefinedEndpoint * definedEndpoint) | ||
{ | ||
UnregisterMatchingAttributeAccessInterfaces( | ||
[endpoint = definedEndpoint->endpoint](AttributeAccessInterface * entry) { return entry->MatchesEndpoint(endpoint); }); | ||
} | ||
|
||
bool registerAttributeAccessOverride(AttributeAccessInterface * attrOverride) | ||
{ | ||
gAttributeAccessInterfaceCache.Invalidate(); | ||
for (auto * cur = gAttributeAccessOverrides; cur; cur = cur->GetNext()) | ||
{ | ||
if (cur->Matches(*attrOverride)) | ||
{ | ||
ChipLogError(Zcl, "Duplicate attribute override registration failed"); | ||
return false; | ||
} | ||
} | ||
attrOverride->SetNext(gAttributeAccessOverrides); | ||
gAttributeAccessOverrides = attrOverride; | ||
return true; | ||
} | ||
|
||
namespace chip { | ||
namespace app { | ||
|
||
app::AttributeAccessInterface * GetAttributeAccessOverride(EndpointId endpointId, ClusterId clusterId) | ||
{ | ||
using CacheResult = AttributeAccessInterfaceCache::CacheResult; | ||
|
||
AttributeAccessInterface * cached = nullptr; | ||
CacheResult result = gAttributeAccessInterfaceCache.Get(endpointId, clusterId, &cached); | ||
switch (result) | ||
{ | ||
case CacheResult::kDefinitelyUnused: | ||
return nullptr; | ||
case CacheResult::kDefinitelyUsed: | ||
return cached; | ||
case CacheResult::kCacheMiss: | ||
default: | ||
// Did not cache yet, search set of AAI registered, and cache if found. | ||
for (app::AttributeAccessInterface * cur = gAttributeAccessOverrides; cur; cur = cur->GetNext()) | ||
{ | ||
if (cur->Matches(endpointId, clusterId)) | ||
{ | ||
gAttributeAccessInterfaceCache.MarkUsed(endpointId, clusterId, cur); | ||
return cur; | ||
} | ||
} | ||
|
||
// Did not find AAI registered: mark as definitely not using. | ||
gAttributeAccessInterfaceCache.MarkUnused(endpointId, clusterId); | ||
} | ||
|
||
return nullptr; | ||
} | ||
|
||
} // 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,54 @@ | ||
/** | ||
* Copyright (c) 2024 Project CHIP Authors | ||
* | ||
* 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. | ||
*/ | ||
#pragma once | ||
|
||
#include <app/util/af-types.h> | ||
#include <app/AttributeAccessInterface.h> | ||
|
||
/** | ||
* Register an attribute access override. It will remain registered until the | ||
* endpoint it's registered for is disabled (or until shutdown if it's | ||
* registered for all endpoints) or until it is explicitly unregistered. | ||
* Registration will fail if there is an already-registered override for the | ||
* same set of attributes. | ||
* | ||
* @return false if there is an existing override that the new one would | ||
* conflict with. In this case the override is not registered. | ||
* @return true if registration was successful. | ||
*/ | ||
bool registerAttributeAccessOverride(chip::app::AttributeAccessInterface * attrOverride); | ||
|
||
/** | ||
* Unregister an attribute access override (for example if the object | ||
* implementing AttributeAccessInterface is being destroyed). | ||
*/ | ||
void unregisterAttributeAccessOverride(chip::app::AttributeAccessInterface * attrOverride); | ||
|
||
/** | ||
* Unregister all attribute access interfaces that match this given endpoint. | ||
*/ | ||
void unregisterAttributeAccessOverrideForEndpoint(EmberAfDefinedEndpoint *definedEndpoint); | ||
|
||
namespace chip { | ||
namespace app { | ||
|
||
/** | ||
* Get the registered attribute access override. nullptr when attribute access override is not found. | ||
*/ | ||
AttributeAccessInterface * GetAttributeAccessOverride(EndpointId aEndpointId, ClusterId aClusterId); | ||
|
||
} // 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
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
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
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,38 @@ | ||
/* | ||
* 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. | ||
*/ | ||
#pragma once | ||
|
||
#include <app/CommandHandler.h> | ||
#include <app/ConcreteCommandPath.h> | ||
#include <lib/core/TLVReader.h> | ||
|
||
namespace chip { | ||
namespace app { | ||
|
||
/** | ||
* Dispatch is generally implemented in code-generated code in ember within | ||
* IMClusterCommandHandler.cpp | ||
* | ||
* aCommandPath - the path that is invoked | ||
* aReader - the input TLV data for this command | ||
* apCommandObj - how to send back the reply | ||
*/ | ||
void DispatchSingleClusterCommand(const ConcreteCommandPath & aCommandPath, chip::TLV::TLVReader & aReader, | ||
CommandHandler * apCommandObj); | ||
|
||
} // 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
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
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
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
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
Oops, something went wrong.