-
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.
- Loading branch information
Showing
21 changed files
with
203 additions
and
119 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.