-
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.
Some interface cleanup and make AttributeValueEncoder/Decoder more si…
…milar (#33028) * Uniform API: provide subject descriptor only for both value encode and decode * Split out AttributeEncodeState and decouple things to use less friend classes * Fix tests * Slight move around based on pahole results, to try to make size differences a bit smaller * Fix typo ... amazingly enough tests still pass, so test read is maybe broken * Two more replacements for state compare logic * Restyle * Fix logic error in Descripto creation for test * Update argument name * Remove useless comments * move AttributeEncodeState to a separate file * Make the copy from a pointer logic cleaner * Fix value passing * Fix const correctness * Fix one more compile * Put back AccessingFabricIndex * Updated back the comments and file layout --------- Co-authored-by: Andrei Litvin <[email protected]>
- Loading branch information
1 parent
745c17c
commit a30b439
Showing
20 changed files
with
201 additions
and
108 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,103 @@ | ||
/* | ||
* Copyright (c) 2021-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 <lib/core/DataModelTypes.h> | ||
|
||
namespace chip { | ||
namespace app { | ||
|
||
/// Maintains the internal state of list encoding | ||
/// | ||
/// List encoding is generally assumed incremental and chunkable (i.e. | ||
/// partial encoding is ok.). For this purpose the class maintains two | ||
/// pieces of data: | ||
/// - AllowPartialData tracks if partial encoding is acceptable in the | ||
/// current encoding state (to be used for atomic/non-atomic list item writes) | ||
/// - CurrentEncodingListIndex representing the list index that is next | ||
/// to be encoded in the output. kInvalidListIndex means that a new list | ||
/// encoding has been started. | ||
class AttributeEncodeState | ||
{ | ||
public: | ||
AttributeEncodeState() = default; | ||
|
||
/// Allows the encode state to be initialized from an OPTIONAL | ||
/// other encoding state | ||
/// | ||
/// if other is nullptr, this is the same as the default initializer. | ||
AttributeEncodeState(const AttributeEncodeState * other) | ||
{ | ||
if (other != nullptr) | ||
{ | ||
*this = *other; | ||
} | ||
else | ||
{ | ||
mCurrentEncodingListIndex = kInvalidListIndex; | ||
mAllowPartialData = false; | ||
} | ||
} | ||
|
||
bool AllowPartialData() const { return mAllowPartialData; } | ||
ListIndex CurrentEncodingListIndex() const { return mCurrentEncodingListIndex; } | ||
|
||
AttributeEncodeState & SetAllowPartialData(bool allow) | ||
{ | ||
mAllowPartialData = allow; | ||
return *this; | ||
} | ||
|
||
AttributeEncodeState & SetCurrentEncodingListIndex(ListIndex idx) | ||
{ | ||
mCurrentEncodingListIndex = idx; | ||
return *this; | ||
} | ||
|
||
void Reset() | ||
{ | ||
mCurrentEncodingListIndex = kInvalidListIndex; | ||
mAllowPartialData = false; | ||
} | ||
|
||
private: | ||
/** | ||
* If set to kInvalidListIndex, indicates that we have not encoded any data for the list yet and | ||
* need to start by encoding an empty list before we start encoding any list items. | ||
* | ||
* When set to a valid ListIndex value, indicates the index of the next list item that needs to be | ||
* encoded (i.e. the count of items encoded so far). | ||
*/ | ||
ListIndex mCurrentEncodingListIndex = kInvalidListIndex; | ||
|
||
/** | ||
* When an attempt to encode an attribute returns an error, the buffer may contain tailing dirty data | ||
* (since the put was aborted). The report engine normally rolls back the buffer to right before encoding | ||
* of the attribute started on errors. | ||
* | ||
* When chunking a list, EncodeListItem will atomically encode list items, ensuring that the | ||
* state of the buffer is valid to send (i.e. contains no trailing garbage), and return an error | ||
* if the list doesn't entirely fit. In this situation, mAllowPartialData is set to communicate to the | ||
* report engine that it should not roll back the list items. | ||
* | ||
* TODO: There might be a better name for this variable. | ||
*/ | ||
bool mAllowPartialData = false; | ||
}; | ||
|
||
} // 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
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.