update encoding for read/subscribe/write request (#11856)
diff --git a/src/app/MessageDef/ReadRequestMessage.cpp b/src/app/MessageDef/ReadRequestMessage.cpp
index efe0693..4fbec50 100644
--- a/src/app/MessageDef/ReadRequestMessage.cpp
+++ b/src/app/MessageDef/ReadRequestMessage.cpp
@@ -13,11 +13,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/**
- * @file
- * This file defines ReadRequestMessage parser and builder in CHIP interaction model
- *
- */
#include "ReadRequestMessage.h"
#include "MessageDefHelper.h"
@@ -28,20 +23,15 @@
#include <app/AppBuildConfig.h>
-using namespace chip;
-using namespace chip::TLV;
-
namespace chip {
namespace app {
#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
CHIP_ERROR ReadRequestMessage::Parser::CheckSchemaValidity() const
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- uint16_t TagPresenceMask = 0;
- chip::TLV::TLVReader reader;
- AttributePathIBs::Parser AttributePathIBs;
- EventPaths::Parser eventPathList;
- AttributeDataVersionList::Parser attributeDataVersionList;
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ int TagPresenceMask = 0;
+ TLV::TLVReader reader;
+
PRETTY_PRINT("ReadRequestMessage =");
PRETTY_PRINT("{");
@@ -50,206 +40,151 @@
while (CHIP_NO_ERROR == (err = reader.Next()))
{
- const Tag tag = reader.GetTag();
-
- if (chip::TLV::ContextTag(kCsTag_AttributePathList) == tag)
+ VerifyOrReturnError(TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG);
+ uint32_t tagNum = TLV::TagNumFromTag(reader.GetTag());
+ switch (tagNum)
{
- VerifyOrExit(!(TagPresenceMask & (1 << kCsTag_AttributePathList)), err = CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_AttributePathList);
- VerifyOrExit(chip::TLV::kTLVType_Array == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
+ case to_underlying(Tag::kAttributeRequests):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kAttributeRequests))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kAttributeRequests));
+ {
+ AttributePathIBs::Parser attributeRequests;
+ ReturnErrorOnFailure(attributeRequests.Init(reader));
- AttributePathIBs.Init(reader);
+ PRETTY_PRINT_INCDEPTH();
+ ReturnErrorOnFailure(attributeRequests.CheckSchemaValidity());
+ PRETTY_PRINT_DECDEPTH();
+ }
+ break;
+ case to_underlying(Tag::kEventRequests):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kEventRequests))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kEventRequests));
+ {
+ EventPaths::Parser eventRequests;
+ ReturnErrorOnFailure(eventRequests.Init(reader));
- PRETTY_PRINT_INCDEPTH();
+ PRETTY_PRINT_INCDEPTH();
+ ReturnErrorOnFailure(eventRequests.CheckSchemaValidity());
+ PRETTY_PRINT_DECDEPTH();
+ }
+ break;
+ case to_underlying(Tag::kEventFilters):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kEventFilters))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kEventFilters));
+ {
+ EventFilters::Parser eventFilters;
+ ReturnErrorOnFailure(eventFilters.Init(reader));
- err = AttributePathIBs.CheckSchemaValidity();
- SuccessOrExit(err);
-
- PRETTY_PRINT_DECDEPTH();
- }
- else if (chip::TLV::ContextTag(kCsTag_EventPaths) == tag)
- {
- VerifyOrExit(!(TagPresenceMask & (1 << kCsTag_EventPaths)), err = CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_EventPaths);
- VerifyOrExit(chip::TLV::kTLVType_Array == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
-
- eventPathList.Init(reader);
-
- PRETTY_PRINT_INCDEPTH();
-
- err = eventPathList.CheckSchemaValidity();
- SuccessOrExit(err);
-
- PRETTY_PRINT_DECDEPTH();
- }
- else if (chip::TLV::ContextTag(kCsTag_AttributeDataVersionList) == tag)
- {
- VerifyOrExit(!(TagPresenceMask & (1 << kCsTag_AttributeDataVersionList)), err = CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_AttributeDataVersionList);
- VerifyOrExit(chip::TLV::kTLVType_Array == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
-
- attributeDataVersionList.Init(reader);
-
- PRETTY_PRINT_INCDEPTH();
-
- err = attributeDataVersionList.CheckSchemaValidity();
- SuccessOrExit(err);
-
- PRETTY_PRINT_DECDEPTH();
- }
- else if (chip::TLV::ContextTag(kCsTag_AttributePathList) == tag)
- {
- VerifyOrExit(!(TagPresenceMask & (1 << kCsTag_AttributePathList)), err = CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_AttributePathList);
- VerifyOrExit(chip::TLV::kTLVType_Array == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
-
- AttributePathIBs.Init(reader);
-
- PRETTY_PRINT_INCDEPTH();
-
- err = AttributePathIBs.CheckSchemaValidity();
- SuccessOrExit(err);
-
- PRETTY_PRINT_DECDEPTH();
- }
- else if (chip::TLV::ContextTag(kCsTag_EventNumber) == tag)
- {
- VerifyOrExit(!(TagPresenceMask & (1 << kCsTag_EventNumber)), err = CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_EventNumber);
- VerifyOrExit(chip::TLV::kTLVType_UnsignedInteger == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
+ PRETTY_PRINT_INCDEPTH();
+ ReturnErrorOnFailure(eventFilters.CheckSchemaValidity());
+ PRETTY_PRINT_DECDEPTH();
+ }
+ break;
+ case to_underlying(Tag::kIsFabricFiltered):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kIsFabricFiltered))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kIsFabricFiltered));
#if CHIP_DETAIL_LOGGING
{
- uint64_t eventNumber;
- err = reader.Get(eventNumber);
- SuccessOrExit(err);
- PRETTY_PRINT("\tEventNumber = 0x%" PRIx64 ",", eventNumber);
+ bool isFabricFiltered;
+ ReturnErrorOnFailure(reader.Get(isFabricFiltered));
+ PRETTY_PRINT("\tisFabricFiltered = %s, ", isFabricFiltered ? "true" : "false");
}
#endif // CHIP_DETAIL_LOGGING
+ break;
+ default:
+ PRETTY_PRINT("Unknown tag num %" PRIu32, tagNum);
+ break;
}
}
- PRETTY_PRINT("}");
+ PRETTY_PRINT("},");
PRETTY_PRINT("");
- // if we have exhausted this container
if (CHIP_END_OF_TLV == err)
{
- err = CHIP_NO_ERROR;
+ const int RequiredFields = (1 << to_underlying(Tag::kIsFabricFiltered));
+
+ if ((TagPresenceMask & RequiredFields) == RequiredFields)
+ {
+ err = CHIP_NO_ERROR;
+ }
+ else
+ {
+ err = CHIP_ERROR_IM_MALFORMED_READ_REQUEST_MESSAGE;
+ }
}
- SuccessOrExit(err);
- err = reader.ExitContainer(mOuterContainerType);
-exit:
-
- return err;
+ ReturnErrorOnFailure(err);
+ return reader.ExitContainer(mOuterContainerType);
}
#endif // CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
-CHIP_ERROR ReadRequestMessage::Parser::GetPathList(AttributePathIBs::Parser * const apAttributePathList) const
+CHIP_ERROR ReadRequestMessage::Parser::GetAttributeRequests(AttributePathIBs::Parser * const apAttributeRequests) const
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- chip::TLV::TLVReader reader;
-
- err = mReader.FindElementWithTag(chip::TLV::ContextTag(kCsTag_AttributePathList), reader);
- SuccessOrExit(err);
-
- VerifyOrExit(chip::TLV::kTLVType_Array == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
-
- err = apAttributePathList->Init(reader);
- SuccessOrExit(err);
-
-exit:
- ChipLogIfFalse((CHIP_NO_ERROR == err) || (CHIP_END_OF_TLV == err));
-
- return err;
+ TLV::TLVReader reader;
+ ReturnErrorOnFailure(mReader.FindElementWithTag(TLV::ContextTag(to_underlying(Tag::kAttributeRequests)), reader));
+ return apAttributeRequests->Init(reader);
}
-CHIP_ERROR ReadRequestMessage::Parser::GetEventPaths(EventPaths::Parser * const apEventPaths) const
+CHIP_ERROR ReadRequestMessage::Parser::GetEventRequests(EventPaths::Parser * const apEventRequests) const
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- chip::TLV::TLVReader reader;
-
- err = mReader.FindElementWithTag(chip::TLV::ContextTag(kCsTag_EventPaths), reader);
- SuccessOrExit(err);
-
- VerifyOrExit(chip::TLV::kTLVType_Array == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
-
- err = apEventPaths->Init(reader);
- SuccessOrExit(err);
-
-exit:
- ChipLogIfFalse((CHIP_NO_ERROR == err) || (CHIP_END_OF_TLV == err));
-
- return err;
+ TLV::TLVReader reader;
+ ReturnErrorOnFailure(mReader.FindElementWithTag(TLV::ContextTag(to_underlying(Tag::kEventRequests)), reader));
+ return apEventRequests->Init(reader);
}
-CHIP_ERROR
-ReadRequestMessage::Parser::GetAttributeDataVersionList(AttributeDataVersionList::Parser * const apAttributeDataVersionList) const
+CHIP_ERROR ReadRequestMessage::Parser::GetEventFilters(EventFilters::Parser * const apEventFilters) const
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- chip::TLV::TLVReader reader;
-
- err = mReader.FindElementWithTag(chip::TLV::ContextTag(kCsTag_AttributeDataVersionList), reader);
- SuccessOrExit(err);
-
- VerifyOrExit(chip::TLV::kTLVType_Array == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
-
- err = apAttributeDataVersionList->Init(reader);
- SuccessOrExit(err);
-
-exit:
- ChipLogIfFalse((CHIP_NO_ERROR == err) || (CHIP_END_OF_TLV == err));
-
- return err;
+ TLV::TLVReader reader;
+ ReturnErrorOnFailure(mReader.FindElementWithTag(TLV::ContextTag(to_underlying(Tag::kEventFilters)), reader));
+ return apEventFilters->Init(reader);
}
-CHIP_ERROR ReadRequestMessage::Parser::GetEventNumber(uint64_t * const apEventNumber) const
+CHIP_ERROR ReadRequestMessage::Parser::GetIsFabricFiltered(bool * const apIsFabricFiltered) const
{
- return GetUnsignedInteger(kCsTag_EventNumber, apEventNumber);
+ return GetSimpleValue(to_underlying(Tag::kIsFabricFiltered), TLV::kTLVType_Boolean, apIsFabricFiltered);
}
-AttributePathIBs::Builder & ReadRequestMessage::Builder::CreateAttributePathListBuilder()
-{
- // skip if error has already been set
- VerifyOrExit(CHIP_NO_ERROR == mError, mAttributePathListBuilder.ResetError(mError));
-
- mError = mAttributePathListBuilder.Init(mpWriter, kCsTag_AttributePathList);
-
-exit:
- // on error, mAttributePathListBuilder would be un-/partial initialized and cannot be used to write anything
- return mAttributePathListBuilder;
-}
-
-EventPaths::Builder & ReadRequestMessage::Builder::CreateEventPathsBuilder()
-{
- // skip if error has already been set
- VerifyOrExit(CHIP_NO_ERROR == mError, mEventPathsBuilder.ResetError(mError));
-
- mError = mEventPathsBuilder.Init(mpWriter, kCsTag_EventPaths);
-
-exit:
- // on error, mEventPathsBuilder would be un-/partial initialized and cannot be used to write anything
- return mEventPathsBuilder;
-}
-
-AttributeDataVersionList::Builder & ReadRequestMessage::Builder::CreateAttributeDataVersionListBuilder()
-{
- // skip if error has already been set
- VerifyOrExit(CHIP_NO_ERROR == mError, mAttributeDataVersionListBuilder.ResetError(mError));
-
- mError = mAttributeDataVersionListBuilder.Init(mpWriter, kCsTag_AttributeDataVersionList);
-
-exit:
- // on error, mAttributeDataVersionListBuilder would be un-/partial initialized and cannot be used to write anything
- return mAttributeDataVersionListBuilder;
-}
-
-ReadRequestMessage::Builder & ReadRequestMessage::Builder::EventNumber(const uint64_t aEventNumber)
+AttributePathIBs::Builder & ReadRequestMessage::Builder::CreateAttributeRequests()
{
// skip if error has already been set
if (mError == CHIP_NO_ERROR)
{
- mError = mpWriter->Put(chip::TLV::ContextTag(kCsTag_EventNumber), aEventNumber);
+ mError = mAttributeRequests.Init(mpWriter, to_underlying(Tag::kAttributeRequests));
+ }
+ return mAttributeRequests;
+}
+
+EventPaths::Builder & ReadRequestMessage::Builder::CreateEventRequests()
+{
+ // skip if error has already been set
+ if (mError == CHIP_NO_ERROR)
+ {
+ mError = mEventRequests.Init(mpWriter, to_underlying(Tag::kEventRequests));
+ }
+ return mEventRequests;
+}
+
+EventFilters::Builder & ReadRequestMessage::Builder::CreateEventFilters()
+{
+ // skip if error has already been set
+ if (mError == CHIP_NO_ERROR)
+ {
+ mError = mEventFilters.Init(mpWriter, to_underlying(Tag::kEventFilters));
+ }
+ return mEventFilters;
+}
+
+ReadRequestMessage::Builder & ReadRequestMessage::Builder::IsFabricFiltered(const bool aIsFabricFiltered)
+{
+ // skip if error has already been set
+ if (mError == CHIP_NO_ERROR)
+ {
+ mError = mpWriter->PutBoolean(TLV::ContextTag(to_underlying(Tag::kIsFabricFiltered)), aIsFabricFiltered);
}
return *this;
}
@@ -259,5 +194,5 @@
EndOfContainer();
return *this;
}
-}; // namespace app
-}; // namespace chip
+} // namespace app
+} // namespace chip
diff --git a/src/app/MessageDef/ReadRequestMessage.h b/src/app/MessageDef/ReadRequestMessage.h
index b065ce4..b3fe54d 100644
--- a/src/app/MessageDef/ReadRequestMessage.h
+++ b/src/app/MessageDef/ReadRequestMessage.h
@@ -15,21 +15,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-/**
- * @file
- * This file defines ReadRequestMessage parser and builder in CHIP interaction model
- *
- */
#pragma once
-#include "AttributeDataVersionList.h"
#include "AttributePathIBs.h"
-#include "Builder.h"
+#include "EventFilters.h"
#include "EventPaths.h"
-#include "Parser.h"
-
#include <app/AppBuildConfig.h>
#include <app/util/basic-types.h>
#include <lib/core/CHIPCore.h>
@@ -40,12 +32,13 @@
namespace chip {
namespace app {
namespace ReadRequestMessage {
-enum
+enum class Tag : uint8_t
{
- kCsTag_AttributePathList = 0,
- kCsTag_AttributeDataVersionList = 1,
- kCsTag_EventPaths = 2,
- kCsTag_EventNumber = 3,
+ kAttributeRequests = 0,
+ kEventRequests = 1,
+ kDataVersionFilters = 2,
+ kEventFilters = 3,
+ kIsFabricFiltered = 4,
};
class Parser : public StructParser
@@ -71,42 +64,40 @@
/**
* @brief Get a TLVReader for the AttributePathIBs. Next() must be called before accessing them.
*
- * @param [in] apAttributePathList A pointer to an attribute path list parser.
+ * @param [in] apAttributeRequests A pointer to an attribute path list parser.
*
* @return #CHIP_NO_ERROR on success
* #CHIP_END_OF_TLV if there is no such element
*/
- CHIP_ERROR GetPathList(AttributePathIBs::Parser * const apAttributePathList) const;
+ CHIP_ERROR GetAttributeRequests(AttributePathIBs::Parser * const apAttributeRequests) const;
/**
- * @brief Get a TLVReader for the EventPaths. Next() must be called before accessing them.
+ * @brief Get a TLVReader for the EventRequests. Next() must be called before accessing them.
*
* @param [in] apEventPaths A pointer to apEventPaths
*
* @return #CHIP_NO_ERROR on success
* #CHIP_END_OF_TLV if there is no such element
*/
- CHIP_ERROR GetEventPaths(EventPaths::Parser * const apEventPaths) const;
+ CHIP_ERROR GetEventRequests(EventPaths::Parser * const apEventRequests) const;
/**
- * @brief Get a parser for the AttributeDataVersionList. Next() must be called before accessing them.
- *
- * @param [in] apAttributeDataVersionList A pointer to apAttributeDataVersionList
+ * @brief Get a TLVReader for the EventFilters. Next() must be called before accessing them.
*
* @return #CHIP_NO_ERROR on success
* #CHIP_END_OF_TLV if there is no such element
*/
- CHIP_ERROR GetAttributeDataVersionList(AttributeDataVersionList::Parser * const apAttributeDataVersionList) const;
+ CHIP_ERROR GetEventFilters(EventFilters::Parser * const apEventFilters) const;
/**
- * @brief Get Event Number. Next() must be called before accessing them.
+ * @brief Get IsFabricFiltered boolean
*
- * @param [in] apEventNumber A pointer to apEventNumber
+ * @param [in] apIsFabricFiltered A pointer to apIsFabricFiltered
*
* @return #CHIP_NO_ERROR on success
* #CHIP_END_OF_TLV if there is no such element
*/
- CHIP_ERROR GetEventNumber(uint64_t * const apEventNumber) const;
+ CHIP_ERROR GetIsFabricFiltered(bool * const apIsFabricFiltered) const;
};
class Builder : public StructBuilder
@@ -117,29 +108,28 @@
*
* @return A reference to AttributePathIBs::Builder
*/
- AttributePathIBs::Builder & CreateAttributePathListBuilder();
+ AttributePathIBs::Builder & CreateAttributeRequests();
/**
* @brief Initialize a EventPaths::Builder for writing into the TLV stream
*
* @return A reference to EventPaths::Builder
*/
- EventPaths::Builder & CreateEventPathsBuilder();
+ EventPaths::Builder & CreateEventRequests();
/**
- * @brief Initialize a AttributeDataVersionList::Builder for writing into the TLV stream
+ * @brief Initialize a EventFilters::Builder for writing into the TLV stream
*
- * @return A reference to AttributeDataVersionList::Builder
+ * @return A reference to EventFilters::Builder
*/
- AttributeDataVersionList::Builder & CreateAttributeDataVersionListBuilder();
+ EventFilters::Builder & CreateEventFilters();
/**
- * @brief An initiator can optionally specify an EventNumber it has already to limit the
- * set of retrieved events on the server for optimization purposes.
- * @param [in] aEventNumber The event number
+ * @brief limits the data written within fabric-scoped lists to the accessing fabric
* @return A reference to *this
*/
- ReadRequestMessage::Builder & EventNumber(const uint64_t aEventNumber);
+ ReadRequestMessage::Builder & IsFabricFiltered(const bool aIsFabricFiltered);
+
/**
* @brief Mark the end of this ReadRequestMessage
*
@@ -148,10 +138,10 @@
ReadRequestMessage::Builder & EndOfReadRequestMessage();
private:
- AttributePathIBs::Builder mAttributePathListBuilder;
- EventPaths::Builder mEventPathsBuilder;
- AttributeDataVersionList::Builder mAttributeDataVersionListBuilder;
+ AttributePathIBs::Builder mAttributeRequests;
+ EventPaths::Builder mEventRequests;
+ EventFilters::Builder mEventFilters;
};
-}; // namespace ReadRequestMessage
-}; // namespace app
-}; // namespace chip
+} // namespace ReadRequestMessage
+} // namespace app
+} // namespace chip
diff --git a/src/app/MessageDef/SubscribeRequestMessage.cpp b/src/app/MessageDef/SubscribeRequestMessage.cpp
index d529ab6..6ba07ea 100644
--- a/src/app/MessageDef/SubscribeRequestMessage.cpp
+++ b/src/app/MessageDef/SubscribeRequestMessage.cpp
@@ -22,12 +22,10 @@
#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
CHIP_ERROR SubscribeRequestMessage::Parser::CheckSchemaValidity() const
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- uint16_t TagPresenceMask = 0;
- chip::TLV::TLVReader reader;
- AttributePathIBs::Parser AttributePathIBs;
- EventPaths::Parser eventPathList;
- AttributeDataVersionList::Parser attributeDataVersionList;
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ int TagPresenceMask = 0;
+ TLV::TLVReader reader;
+
PRETTY_PRINT("SubscribeRequestMessage =");
PRETTY_PRINT("{");
@@ -36,84 +34,14 @@
while (CHIP_NO_ERROR == (err = reader.Next()))
{
- VerifyOrReturnError(chip::TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG);
- switch (chip::TLV::TagNumFromTag(reader.GetTag()))
+ VerifyOrReturnError(TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG);
+ uint32_t tagNum = TLV::TagNumFromTag(reader.GetTag());
+ switch (tagNum)
{
- case kCsTag_AttributePathList:
- VerifyOrReturnError(!(TagPresenceMask & (1 << kCsTag_AttributePathList)), CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_AttributePathList);
- VerifyOrReturnError(chip::TLV::kTLVType_Array == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
-
- AttributePathIBs.Init(reader);
-
- PRETTY_PRINT_INCDEPTH();
- ReturnErrorOnFailure(AttributePathIBs.CheckSchemaValidity());
- PRETTY_PRINT_DECDEPTH();
- break;
- case kCsTag_EventPaths:
- VerifyOrReturnError(!(TagPresenceMask & (1 << kCsTag_EventPaths)), CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_EventPaths);
- VerifyOrReturnError(chip::TLV::kTLVType_Array == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
-
- eventPathList.Init(reader);
-
- PRETTY_PRINT_INCDEPTH();
-
- ReturnErrorOnFailure(eventPathList.CheckSchemaValidity());
-
- PRETTY_PRINT_DECDEPTH();
- break;
- case kCsTag_AttributeDataVersionList:
- VerifyOrReturnError(!(TagPresenceMask & (1 << kCsTag_AttributeDataVersionList)), CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_AttributeDataVersionList);
- VerifyOrReturnError(chip::TLV::kTLVType_Array == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
-
- attributeDataVersionList.Init(reader);
-
- PRETTY_PRINT_INCDEPTH();
- ReturnErrorOnFailure(attributeDataVersionList.CheckSchemaValidity());
- PRETTY_PRINT_DECDEPTH();
- break;
- case kCsTag_EventNumber:
- VerifyOrReturnError(!(TagPresenceMask & (1 << kCsTag_EventNumber)), CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_EventNumber);
- VerifyOrReturnError(chip::TLV::kTLVType_UnsignedInteger == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
-#if CHIP_DETAIL_LOGGING
- {
- uint64_t eventNumber;
- ReturnErrorOnFailure(reader.Get(eventNumber));
- PRETTY_PRINT("\tEventNumber = 0x%" PRIx64 ",", eventNumber);
- }
-#endif // CHIP_DETAIL_LOGGING
- break;
- case kCsTag_MinIntervalSeconds:
- VerifyOrReturnError(!(TagPresenceMask & (1 << kCsTag_MinIntervalSeconds)), CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_MinIntervalSeconds);
- VerifyOrReturnError(chip::TLV::kTLVType_UnsignedInteger == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
-#if CHIP_DETAIL_LOGGING
- {
- uint16_t minIntervalSeconds;
- ReturnErrorOnFailure(reader.Get(minIntervalSeconds));
- PRETTY_PRINT("\tMinIntervalSeconds = 0x%" PRIx16 ",", minIntervalSeconds);
- }
-#endif // CHIP_DETAIL_LOGGING
- break;
- case kCsTag_MaxIntervalSeconds:
- VerifyOrReturnError(!(TagPresenceMask & (1 << kCsTag_MaxIntervalSeconds)), CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_MaxIntervalSeconds);
- VerifyOrReturnError(chip::TLV::kTLVType_UnsignedInteger == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
-#if CHIP_DETAIL_LOGGING
- {
- uint16_t maxIntervalSeconds;
- ReturnErrorOnFailure(reader.Get(maxIntervalSeconds));
- PRETTY_PRINT("\tkMaxInterval = 0x%" PRIx16 ",", maxIntervalSeconds);
- }
-#endif // CHIP_DETAIL_LOGGING
- break;
- case kCsTag_KeepSubscriptions:
- VerifyOrReturnError(!(TagPresenceMask & (1 << kCsTag_KeepSubscriptions)), CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_KeepSubscriptions);
- VerifyOrReturnError(chip::TLV::kTLVType_Boolean == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
+ case to_underlying(Tag::kKeepSubscriptions):
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kKeepSubscriptions))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kKeepSubscriptions));
+ VerifyOrReturnError(TLV::kTLVType_Boolean == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
#if CHIP_DETAIL_LOGGING
{
bool keepSubscriptions;
@@ -122,10 +50,75 @@
}
#endif // CHIP_DETAIL_LOGGING
break;
- case kCsTag_IsProxy:
- VerifyOrReturnError(!(TagPresenceMask & (1 << kCsTag_IsProxy)), CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_IsProxy);
- VerifyOrReturnError(chip::TLV::kTLVType_Boolean == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
+ case to_underlying(Tag::kMinIntervalFloorSeconds):
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kMinIntervalFloorSeconds))),
+ CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kMinIntervalFloorSeconds));
+ VerifyOrReturnError(TLV::kTLVType_UnsignedInteger == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
+#if CHIP_DETAIL_LOGGING
+ {
+ uint16_t MinIntervalFloorSeconds;
+ ReturnErrorOnFailure(reader.Get(MinIntervalFloorSeconds));
+ PRETTY_PRINT("\tMinIntervalFloorSeconds = 0x%" PRIx16 ",", MinIntervalFloorSeconds);
+ }
+#endif // CHIP_DETAIL_LOGGING
+ break;
+ case to_underlying(Tag::kMaxIntervalCeilingSeconds):
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kMaxIntervalCeilingSeconds))),
+ CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kMaxIntervalCeilingSeconds));
+ VerifyOrReturnError(TLV::kTLVType_UnsignedInteger == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
+#if CHIP_DETAIL_LOGGING
+ {
+ uint16_t MaxIntervalCeilingSeconds;
+ ReturnErrorOnFailure(reader.Get(MaxIntervalCeilingSeconds));
+ PRETTY_PRINT("\tMaxIntervalCeilingSeconds = 0x%" PRIx16 ",", MaxIntervalCeilingSeconds);
+ }
+#endif // CHIP_DETAIL_LOGGING
+ break;
+ case to_underlying(Tag::kAttributeRequests):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kAttributeRequests))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kAttributeRequests));
+ {
+ AttributePathIBs::Parser attributeRequests;
+ ReturnErrorOnFailure(attributeRequests.Init(reader));
+
+ PRETTY_PRINT_INCDEPTH();
+ ReturnErrorOnFailure(attributeRequests.CheckSchemaValidity());
+ PRETTY_PRINT_DECDEPTH();
+ }
+ break;
+ case to_underlying(Tag::kEventRequests):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kEventRequests))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kEventRequests));
+ {
+ EventPaths::Parser eventRequests;
+ ReturnErrorOnFailure(eventRequests.Init(reader));
+
+ PRETTY_PRINT_INCDEPTH();
+ ReturnErrorOnFailure(eventRequests.CheckSchemaValidity());
+ PRETTY_PRINT_DECDEPTH();
+ }
+ break;
+ case to_underlying(Tag::kEventFilters):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kEventFilters))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kEventFilters));
+ {
+ EventFilters::Parser eventFilters;
+ ReturnErrorOnFailure(eventFilters.Init(reader));
+
+ PRETTY_PRINT_INCDEPTH();
+ ReturnErrorOnFailure(eventFilters.CheckSchemaValidity());
+ PRETTY_PRINT_DECDEPTH();
+ }
+ break;
+ case to_underlying(Tag::kIsProxy):
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kIsProxy))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kIsProxy));
+ VerifyOrReturnError(TLV::kTLVType_Boolean == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
#if CHIP_DETAIL_LOGGING
{
bool isProxy;
@@ -134,149 +127,164 @@
}
#endif // CHIP_DETAIL_LOGGING
break;
+ case to_underlying(Tag::kIsFabricFiltered):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kIsFabricFiltered))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kIsFabricFiltered));
+#if CHIP_DETAIL_LOGGING
+ {
+ bool isFabricFiltered;
+ ReturnErrorOnFailure(reader.Get(isFabricFiltered));
+ PRETTY_PRINT("\tisFabricFiltered = %s, ", isFabricFiltered ? "true" : "false");
+ }
+#endif // CHIP_DETAIL_LOGGING
+ break;
default:
- ReturnErrorOnFailure(CHIP_ERROR_INVALID_TLV_TAG);
+ PRETTY_PRINT("Unknown tag num %" PRIu32, tagNum);
+ break;
}
}
- PRETTY_PRINT("}");
+ PRETTY_PRINT("},");
PRETTY_PRINT("");
+
if (CHIP_END_OF_TLV == err)
{
- const uint16_t RequiredFields = (1 << kCsTag_MinIntervalSeconds) | (1 << kCsTag_MaxIntervalSeconds);
+ const int RequiredFields = (1 << to_underlying(Tag::kIsFabricFiltered)) |
+ (1 << to_underlying(Tag::kMinIntervalFloorSeconds)) | (1 << to_underlying(Tag::kMaxIntervalCeilingSeconds));
if ((TagPresenceMask & RequiredFields) == RequiredFields)
{
err = CHIP_NO_ERROR;
}
+ else
+ {
+ err = CHIP_ERROR_IM_MALFORMED_SUBSCRIBE_REQUEST_MESSAGE;
+ }
}
+
ReturnErrorOnFailure(err);
return reader.ExitContainer(mOuterContainerType);
}
#endif // CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
-CHIP_ERROR SubscribeRequestMessage::Parser::GetPathList(AttributePathIBs::Parser * const apAttributePathList) const
-{
- TLV::TLVReader reader;
- ReturnErrorOnFailure(mReader.FindElementWithTag(chip::TLV::ContextTag(kCsTag_AttributePathList), reader));
- VerifyOrReturnError(chip::TLV::kTLVType_Array == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
- return apAttributePathList->Init(reader);
-}
-
-CHIP_ERROR SubscribeRequestMessage::Parser::GetEventPaths(EventPaths::Parser * const apEventPaths) const
-{
- TLV::TLVReader reader;
- ReturnErrorOnFailure(mReader.FindElementWithTag(chip::TLV::ContextTag(kCsTag_EventPaths), reader));
- VerifyOrReturnError(chip::TLV::kTLVType_Array == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
- return apEventPaths->Init(reader);
-}
-
-CHIP_ERROR
-SubscribeRequestMessage::Parser::GetAttributeDataVersionList(
- AttributeDataVersionList::Parser * const apAttributeDataVersionList) const
-{
- TLV::TLVReader reader;
- ReturnErrorOnFailure(mReader.FindElementWithTag(chip::TLV::ContextTag(kCsTag_AttributeDataVersionList), reader));
- VerifyOrReturnError(TLV::kTLVType_Array == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
- return apAttributeDataVersionList->Init(reader);
-}
-
-CHIP_ERROR SubscribeRequestMessage::Parser::GetEventNumber(uint64_t * const apEventNumber) const
-{
- return GetUnsignedInteger(kCsTag_EventNumber, apEventNumber);
-}
-
-CHIP_ERROR SubscribeRequestMessage::Parser::GetMinIntervalSeconds(uint16_t * const apMinIntervalSeconds) const
-{
- return GetUnsignedInteger(kCsTag_MinIntervalSeconds, apMinIntervalSeconds);
-}
-
-CHIP_ERROR SubscribeRequestMessage::Parser::GetMaxIntervalSeconds(uint16_t * const apMaxIntervalSeconds) const
-{
- return GetUnsignedInteger(kCsTag_MaxIntervalSeconds, apMaxIntervalSeconds);
-}
-
CHIP_ERROR SubscribeRequestMessage::Parser::GetKeepSubscriptions(bool * const apKeepExistingSubscription) const
{
- return GetSimpleValue(kCsTag_KeepSubscriptions, chip::TLV::kTLVType_Boolean, apKeepExistingSubscription);
+ return GetSimpleValue(to_underlying(Tag::kKeepSubscriptions), TLV::kTLVType_Boolean, apKeepExistingSubscription);
+}
+
+CHIP_ERROR SubscribeRequestMessage::Parser::GetMinIntervalFloorSeconds(uint16_t * const apMinIntervalFloorSeconds) const
+{
+ return GetUnsignedInteger(to_underlying(Tag::kMinIntervalFloorSeconds), apMinIntervalFloorSeconds);
+}
+
+CHIP_ERROR SubscribeRequestMessage::Parser::GetMaxIntervalCeilingSeconds(uint16_t * const apMaxIntervalCeilingSeconds) const
+{
+ return GetUnsignedInteger(to_underlying(Tag::kMaxIntervalCeilingSeconds), apMaxIntervalCeilingSeconds);
+}
+
+CHIP_ERROR SubscribeRequestMessage::Parser::GetAttributeRequests(AttributePathIBs::Parser * const apAttributeRequests) const
+{
+ TLV::TLVReader reader;
+ ReturnErrorOnFailure(mReader.FindElementWithTag(TLV::ContextTag(to_underlying(Tag::kAttributeRequests)), reader));
+ return apAttributeRequests->Init(reader);
+}
+
+CHIP_ERROR SubscribeRequestMessage::Parser::GetEventRequests(EventPaths::Parser * const apEventRequests) const
+{
+ TLV::TLVReader reader;
+ ReturnErrorOnFailure(mReader.FindElementWithTag(TLV::ContextTag(to_underlying(Tag::kEventRequests)), reader));
+ return apEventRequests->Init(reader);
+}
+
+CHIP_ERROR SubscribeRequestMessage::Parser::GetEventFilters(EventFilters::Parser * const apEventFilters) const
+{
+ TLV::TLVReader reader;
+ ReturnErrorOnFailure(mReader.FindElementWithTag(TLV::ContextTag(to_underlying(Tag::kEventFilters)), reader));
+ return apEventFilters->Init(reader);
}
CHIP_ERROR SubscribeRequestMessage::Parser::GetIsProxy(bool * const apIsProxy) const
{
- return GetSimpleValue(kCsTag_IsProxy, chip::TLV::kTLVType_Boolean, apIsProxy);
+ return GetSimpleValue(to_underlying(Tag::kIsProxy), TLV::kTLVType_Boolean, apIsProxy);
}
-AttributePathIBs::Builder & SubscribeRequestMessage::Builder::CreateAttributePathListBuilder()
+CHIP_ERROR SubscribeRequestMessage::Parser::GetIsFabricFiltered(bool * const apIsFabricFiltered) const
{
- if (mError == CHIP_NO_ERROR)
- {
- mError = mAttributePathListBuilder.Init(mpWriter, kCsTag_AttributePathList);
- }
-
- return mAttributePathListBuilder;
-}
-
-EventPaths::Builder & SubscribeRequestMessage::Builder::CreateEventPathsBuilder()
-{
- if (mError == CHIP_NO_ERROR)
- {
- mError = mEventPathsBuilder.Init(mpWriter, kCsTag_EventPaths);
- }
-
- return mEventPathsBuilder;
-}
-
-AttributeDataVersionList::Builder & SubscribeRequestMessage::Builder::CreateAttributeDataVersionListBuilder()
-{
- if (mError == CHIP_NO_ERROR)
- {
- mError = mAttributeDataVersionListBuilder.Init(mpWriter, kCsTag_AttributeDataVersionList);
- }
-
- return mAttributeDataVersionListBuilder;
-}
-
-SubscribeRequestMessage::Builder & SubscribeRequestMessage::Builder::EventNumber(const uint64_t aEventNumber)
-{
- if (mError == CHIP_NO_ERROR)
- {
- mError = mpWriter->Put(chip::TLV::ContextTag(kCsTag_EventNumber), aEventNumber);
- }
- return *this;
-}
-
-SubscribeRequestMessage::Builder & SubscribeRequestMessage::Builder::MinIntervalSeconds(const uint16_t aMinIntervalSeconds)
-{
- if (mError == CHIP_NO_ERROR)
- {
- mError = mpWriter->Put(chip::TLV::ContextTag(kCsTag_MinIntervalSeconds), aMinIntervalSeconds);
- }
- return *this;
-}
-
-SubscribeRequestMessage::Builder & SubscribeRequestMessage::Builder::MaxIntervalSeconds(const uint16_t aMaxIntervalSeconds)
-{
- if (mError == CHIP_NO_ERROR)
- {
- mError = mpWriter->Put(chip::TLV::ContextTag(kCsTag_MaxIntervalSeconds), aMaxIntervalSeconds);
- }
- return *this;
+ return GetSimpleValue(to_underlying(Tag::kIsFabricFiltered), TLV::kTLVType_Boolean, apIsFabricFiltered);
}
SubscribeRequestMessage::Builder & SubscribeRequestMessage::Builder::KeepSubscriptions(const bool aKeepSubscriptions)
{
if (mError == CHIP_NO_ERROR)
{
- mError = mpWriter->PutBoolean(chip::TLV::ContextTag(kCsTag_KeepSubscriptions), aKeepSubscriptions);
+ mError = mpWriter->PutBoolean(TLV::ContextTag(to_underlying(Tag::kKeepSubscriptions)), aKeepSubscriptions);
}
return *this;
}
+SubscribeRequestMessage::Builder &
+SubscribeRequestMessage::Builder::MinIntervalFloorSeconds(const uint16_t aMinIntervalFloorSeconds)
+{
+ if (mError == CHIP_NO_ERROR)
+ {
+ mError = mpWriter->Put(TLV::ContextTag(to_underlying(Tag::kMinIntervalFloorSeconds)), aMinIntervalFloorSeconds);
+ }
+ return *this;
+}
+
+SubscribeRequestMessage::Builder &
+SubscribeRequestMessage::Builder::MaxIntervalCeilingSeconds(const uint16_t aMaxIntervalCeilingSeconds)
+{
+ if (mError == CHIP_NO_ERROR)
+ {
+ mError = mpWriter->Put(TLV::ContextTag(to_underlying(Tag::kMaxIntervalCeilingSeconds)), aMaxIntervalCeilingSeconds);
+ }
+ return *this;
+}
+
+AttributePathIBs::Builder & SubscribeRequestMessage::Builder::CreateAttributeRequests()
+{
+ if (mError == CHIP_NO_ERROR)
+ {
+ mError = mAttributeRequests.Init(mpWriter, to_underlying(Tag::kAttributeRequests));
+ }
+ return mAttributeRequests;
+}
+
+EventPaths::Builder & SubscribeRequestMessage::Builder::CreateEventRequests()
+{
+ if (mError == CHIP_NO_ERROR)
+ {
+ mError = mEventRequests.Init(mpWriter, to_underlying(Tag::kEventRequests));
+ }
+ return mEventRequests;
+}
+
+EventFilters::Builder & SubscribeRequestMessage::Builder::CreateEventFilters()
+{
+ if (mError == CHIP_NO_ERROR)
+ {
+ mError = mEventFilters.Init(mpWriter, to_underlying(Tag::kEventFilters));
+ }
+ return mEventFilters;
+}
+
SubscribeRequestMessage::Builder & SubscribeRequestMessage::Builder::IsProxy(const bool aIsProxy)
{
if (mError == CHIP_NO_ERROR)
{
- mError = mpWriter->PutBoolean(chip::TLV::ContextTag(kCsTag_IsProxy), aIsProxy);
+ mError = mpWriter->PutBoolean(TLV::ContextTag(to_underlying(Tag::kIsProxy)), aIsProxy);
+ }
+ return *this;
+}
+
+SubscribeRequestMessage::Builder & SubscribeRequestMessage::Builder::IsFabricFiltered(const bool aIsFabricFiltered)
+{
+ // skip if error has already been set
+ if (mError == CHIP_NO_ERROR)
+ {
+ mError = mpWriter->PutBoolean(TLV::ContextTag(to_underlying(Tag::kIsFabricFiltered)), aIsFabricFiltered);
}
return *this;
}
diff --git a/src/app/MessageDef/SubscribeRequestMessage.h b/src/app/MessageDef/SubscribeRequestMessage.h
index ea1802c..924060e 100644
--- a/src/app/MessageDef/SubscribeRequestMessage.h
+++ b/src/app/MessageDef/SubscribeRequestMessage.h
@@ -19,6 +19,7 @@
#include "AttributeDataVersionList.h"
#include "AttributePathIBs.h"
+#include "EventFilters.h"
#include "EventPaths.h"
#include "StructBuilder.h"
#include "StructParser.h"
@@ -32,16 +33,17 @@
namespace chip {
namespace app {
namespace SubscribeRequestMessage {
-enum
+enum class Tag : uint8_t
{
- kCsTag_AttributePathList = 0,
- kCsTag_EventPaths = 1,
- kCsTag_AttributeDataVersionList = 2,
- kCsTag_EventNumber = 3,
- kCsTag_MinIntervalSeconds = 4,
- kCsTag_MaxIntervalSeconds = 5,
- kCsTag_KeepSubscriptions = 6,
- kCsTag_IsProxy = 7,
+ kKeepSubscriptions = 0,
+ kMinIntervalFloorSeconds = 1,
+ kMaxIntervalCeilingSeconds = 2,
+ kAttributeRequests = 3,
+ kDataVersionFilters = 4,
+ kEventRequests = 5,
+ kEventFilters = 6,
+ kIsProxy = 7,
+ kIsFabricFiltered = 8,
};
class Parser : public StructParser
@@ -63,12 +65,34 @@
#endif
/**
+ * @brief Check if subscription is kept.
+ * @return #CHIP_NO_ERROR on success
+ * #CHIP_END_OF_TLV if there is no such element
+ */
+ CHIP_ERROR GetKeepSubscriptions(bool * const apKeepExistingSubscription) const;
+
+ /**
+ * @brief Get MinIntervalFloorSeconds. Next() must be called before accessing them.
+ *
+ * @return #CHIP_NO_ERROR on success
+ * #CHIP_END_OF_TLV if there is no such element
+ */
+ CHIP_ERROR GetMinIntervalFloorSeconds(uint16_t * const apMinIntervalFloorSeconds) const;
+
+ /**
+ * @brief Get MaxIntervalCeilingSeconds. Next() must be called before accessing them.
+ * @return #CHIP_NO_ERROR on success
+ * #CHIP_END_OF_TLV if there is no such element
+ */
+ CHIP_ERROR GetMaxIntervalCeilingSeconds(uint16_t * const apMaxIntervalCeilingSeconds) const;
+
+ /**
* @brief Get a TLVReader for the AttributePathIBs. Next() must be called before accessing them.
*
* @return #CHIP_NO_ERROR on success
* #CHIP_END_OF_TLV if there is no such element
*/
- CHIP_ERROR GetPathList(AttributePathIBs::Parser * const apAttributePathList) const;
+ CHIP_ERROR GetAttributeRequests(AttributePathIBs::Parser * const apAttributeRequests) const;
/**
* @brief Get a TLVReader for the EventPaths. Next() must be called before accessing them.
@@ -76,84 +100,47 @@
* @return #CHIP_NO_ERROR on success
* #CHIP_END_OF_TLV if there is no such element
*/
- CHIP_ERROR GetEventPaths(EventPaths::Parser * const apEventPaths) const;
+ CHIP_ERROR GetEventRequests(EventPaths::Parser * const apEventRequests) const;
/**
- * @brief Get a parser for the AttributeDataVersionList. Next() must be called before accessing them.
+ * @brief Get a TLVReader for the EventFilters. Next() must be called before accessing them.
*
* @return #CHIP_NO_ERROR on success
* #CHIP_END_OF_TLV if there is no such element
*/
- CHIP_ERROR GetAttributeDataVersionList(AttributeDataVersionList::Parser * const apAttributeDataVersionList) const;
+ CHIP_ERROR GetEventFilters(EventFilters::Parser * const apEventFilters) const;
/**
- * @brief Get Event Number. Next() must be called before accessing them.
- *
- * @return #CHIP_NO_ERROR on success
- * #CHIP_END_OF_TLV if there is no such element
- */
- CHIP_ERROR GetEventNumber(uint64_t * const apEventNumber) const;
-
- /**
- * @brief Get MinIntervalSeconds. Next() must be called before accessing them.
- *
- * @return #CHIP_NO_ERROR on success
- * #CHIP_END_OF_TLV if there is no such element
- */
- CHIP_ERROR GetMinIntervalSeconds(uint16_t * const apMinIntervalSeconds) const;
-
- /**
- * @brief Get MaxIntervalSeconds. Next() must be called before accessing them.
- * @return #CHIP_NO_ERROR on success
- * #CHIP_END_OF_TLV if there is no such element
- */
- CHIP_ERROR GetMaxIntervalSeconds(uint16_t * const apMaxIntervalSeconds) const;
-
- /**
- * @brief Check if subscription is kept. Next() must be called before accessing them.
- * @return #CHIP_NO_ERROR on success
- * #CHIP_END_OF_TLV if there is no such element
- */
- CHIP_ERROR GetKeepSubscriptions(bool * const apKeepExistingSubscription) const;
-
- /**
- * @brief Check if subscription is kept. Next() must be called before accessing them.
+ * @brief Get GetIsProxy boolean .
* @return #CHIP_NO_ERROR on success
* #CHIP_END_OF_TLV if there is no such element
*/
CHIP_ERROR GetIsProxy(bool * const apIsProxy) const;
+
+ /**
+ * @brief Get IsFabricFiltered boolean
+ *
+ * @param [in] apIsFabricFiltered A pointer to apIsFabricFiltered
+ *
+ * @return #CHIP_NO_ERROR on success
+ * #CHIP_END_OF_TLV if there is no such element
+ */
+ CHIP_ERROR GetIsFabricFiltered(bool * const apIsFabricFiltered) const;
};
class Builder : public StructBuilder
{
public:
- AttributePathIBs::Builder & CreateAttributePathListBuilder();
-
- /**
- * @brief Initialize a EventPaths::Builder for writing into the TLV stream
- */
- EventPaths::Builder & CreateEventPathsBuilder();
-
- /**
- * @brief Initialize a AttributeDataVersionList::Builder for writing into the TLV stream
- */
- AttributeDataVersionList::Builder & CreateAttributeDataVersionListBuilder();
-
- /**
- * @brief An initiator can optionally specify an EventNumber it has already to limit the
- * set of retrieved events on the server for optimization purposes.
- */
- SubscribeRequestMessage::Builder & EventNumber(const uint64_t aEventNumber);
-
- SubscribeRequestMessage::Builder & MinIntervalSeconds(const uint16_t aMinIntervalSeconds);
-
- SubscribeRequestMessage::Builder & MaxIntervalSeconds(const uint16_t aMinIntervalSeconds);
-
/**
* @brief This is set to 'true' by the subscriber to indicate preservation of previous subscriptions. If omitted, it implies
* 'false' as a value.
*/
SubscribeRequestMessage::Builder & KeepSubscriptions(const bool aKeepSubscriptions);
+ SubscribeRequestMessage::Builder & MinIntervalFloorSeconds(const uint16_t aMinIntervalFloorSeconds);
+ SubscribeRequestMessage::Builder & MaxIntervalCeilingSeconds(const uint16_t aMinIntervalFloorSeconds);
+ AttributePathIBs::Builder & CreateAttributeRequests();
+ EventPaths::Builder & CreateEventRequests();
+ EventFilters::Builder & CreateEventFilters();
/**
* @brief This is set to true by the subscriber if it is a proxy-type device proxying for another client. This
@@ -163,14 +150,20 @@
SubscribeRequestMessage::Builder & IsProxy(const bool aIsProxy);
/**
+ * @brief limits the data written within fabric-scoped lists to the accessing fabric
+ * @return A reference to *this
+ */
+ SubscribeRequestMessage::Builder & IsFabricFiltered(const bool aIsFabricFiltered);
+
+ /**
* @brief Mark the end of this SubscribeRequestMessage
*/
SubscribeRequestMessage::Builder & EndOfSubscribeRequestMessage();
private:
- AttributePathIBs::Builder mAttributePathListBuilder;
- EventPaths::Builder mEventPathsBuilder;
- AttributeDataVersionList::Builder mAttributeDataVersionListBuilder;
+ AttributePathIBs::Builder mAttributeRequests;
+ EventPaths::Builder mEventRequests;
+ EventFilters::Builder mEventFilters;
};
} // namespace SubscribeRequestMessage
} // namespace app
diff --git a/src/app/MessageDef/SubscribeResponseMessage.cpp b/src/app/MessageDef/SubscribeResponseMessage.cpp
index 41684d5..6236e87 100644
--- a/src/app/MessageDef/SubscribeResponseMessage.cpp
+++ b/src/app/MessageDef/SubscribeResponseMessage.cpp
@@ -88,6 +88,10 @@
{
err = CHIP_NO_ERROR;
}
+ else
+ {
+ err = CHIP_ERROR_IM_MALFORMED_SUBSCRIBE_RESPONSE_MESSAGE;
+ }
}
ReturnErrorOnFailure(err);
return reader.ExitContainer(mOuterContainerType);
diff --git a/src/app/MessageDef/WriteRequestMessage.cpp b/src/app/MessageDef/WriteRequestMessage.cpp
index e55db72..ace36b4 100644
--- a/src/app/MessageDef/WriteRequestMessage.cpp
+++ b/src/app/MessageDef/WriteRequestMessage.cpp
@@ -28,19 +28,15 @@
#include <app/AppBuildConfig.h>
-using namespace chip;
-using namespace chip::TLV;
-
namespace chip {
namespace app {
#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
CHIP_ERROR WriteRequestMessage::Parser::CheckSchemaValidity() const
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- uint16_t TagPresenceMask = 0;
- chip::TLV::TLVReader reader;
- AttributeDataIBs::Parser AttributeDataIBs;
- AttributeDataVersionList::Parser attributeDataVersionList;
+ CHIP_ERROR err = CHIP_NO_ERROR;
+ int TagPresenceMask = 0;
+ TLV::TLVReader reader;
+
PRETTY_PRINT("WriteRequestMessage =");
PRETTY_PRINT("{");
@@ -49,130 +45,126 @@
while (CHIP_NO_ERROR == (err = reader.Next()))
{
- VerifyOrExit(chip::TLV::IsContextTag(reader.GetTag()), err = CHIP_ERROR_INVALID_TLV_TAG);
- switch (chip::TLV::TagNumFromTag(reader.GetTag()))
+ VerifyOrReturnError(TLV::IsContextTag(reader.GetTag()), CHIP_ERROR_INVALID_TLV_TAG);
+ uint32_t tagNum = TLV::TagNumFromTag(reader.GetTag());
+ switch (tagNum)
{
- case kCsTag_SuppressResponse:
- VerifyOrExit(!(TagPresenceMask & (1 << kCsTag_SuppressResponse)), err = CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_SuppressResponse);
- VerifyOrExit(chip::TLV::kTLVType_Boolean == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
+ case to_underlying(Tag::kSuppressResponse):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kSuppressResponse))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kSuppressResponse));
#if CHIP_DETAIL_LOGGING
{
- bool SuppressResponse;
- err = reader.Get(SuppressResponse);
- SuccessOrExit(err);
- PRETTY_PRINT("\tSuppressResponse = %s, ", SuppressResponse ? "true" : "false");
+ bool suppressResponse;
+ ReturnErrorOnFailure(reader.Get(suppressResponse));
+ PRETTY_PRINT("\tsuppressResponse = %s, ", suppressResponse ? "true" : "false");
}
#endif // CHIP_DETAIL_LOGGING
break;
- case kCsTag_AttributeDataIBs:
- VerifyOrExit(!(TagPresenceMask & (1 << kCsTag_AttributeDataIBs)), err = CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_AttributeDataIBs);
- VerifyOrExit(chip::TLV::kTLVType_Array == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
- AttributeDataIBs.Init(reader);
-
- PRETTY_PRINT_INCDEPTH();
-
- err = AttributeDataIBs.CheckSchemaValidity();
- SuccessOrExit(err);
-
- PRETTY_PRINT_DECDEPTH();
+ case to_underlying(Tag::kTimedRequest):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kTimedRequest))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kTimedRequest));
+#if CHIP_DETAIL_LOGGING
+ {
+ bool timedRequest;
+ ReturnErrorOnFailure(reader.Get(timedRequest));
+ PRETTY_PRINT("\ttimedRequest = %s, ", timedRequest ? "true" : "false");
+ }
+#endif // CHIP_DETAIL_LOGGING
break;
- case kCsTag_AttributeDataVersionList:
- VerifyOrExit(!(TagPresenceMask & (1 << kCsTag_AttributeDataVersionList)), err = CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_AttributeDataVersionList);
- VerifyOrExit(chip::TLV::kTLVType_Array == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
+ case to_underlying(Tag::kWriteRequests):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kWriteRequests))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kWriteRequests));
+ {
+ AttributeDataIBs::Parser writeRequests;
+ ReturnErrorOnFailure(writeRequests.Init(reader));
- attributeDataVersionList.Init(reader);
-
- PRETTY_PRINT_INCDEPTH();
-
- err = attributeDataVersionList.CheckSchemaValidity();
- SuccessOrExit(err);
-
- PRETTY_PRINT_DECDEPTH();
+ PRETTY_PRINT_INCDEPTH();
+ ReturnErrorOnFailure(writeRequests.CheckSchemaValidity());
+ PRETTY_PRINT_DECDEPTH();
+ }
break;
- case kCsTag_MoreChunkedMessages:
- VerifyOrExit(!(TagPresenceMask & (1 << kCsTag_MoreChunkedMessages)), err = CHIP_ERROR_INVALID_TLV_TAG);
- TagPresenceMask |= (1 << kCsTag_MoreChunkedMessages);
- VerifyOrExit(chip::TLV::kTLVType_Boolean == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
+ case to_underlying(Tag::kMoreChunkedMessages):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kMoreChunkedMessages))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kMoreChunkedMessages));
#if CHIP_DETAIL_LOGGING
{
bool moreChunkedMessages;
- err = reader.Get(moreChunkedMessages);
- SuccessOrExit(err);
- PRETTY_PRINT("\tMoreChunkedMessages = %s, ", moreChunkedMessages ? "true" : "false");
+ ReturnErrorOnFailure(reader.Get(moreChunkedMessages));
+ PRETTY_PRINT("\tmoreChunkedMessages = %s, ", moreChunkedMessages ? "true" : "false");
+ }
+#endif // CHIP_DETAIL_LOGGING
+ break;
+ case to_underlying(Tag::kIsFabricFiltered):
+ // check if this tag has appeared before
+ VerifyOrReturnError(!(TagPresenceMask & (1 << to_underlying(Tag::kIsFabricFiltered))), CHIP_ERROR_INVALID_TLV_TAG);
+ TagPresenceMask |= (1 << to_underlying(Tag::kIsFabricFiltered));
+#if CHIP_DETAIL_LOGGING
+ {
+ bool isFabricFiltered;
+ ReturnErrorOnFailure(reader.Get(isFabricFiltered));
+ PRETTY_PRINT("\tisFabricFiltered = %s, ", isFabricFiltered ? "true" : "false");
}
#endif // CHIP_DETAIL_LOGGING
break;
default:
- ExitNow(err = CHIP_ERROR_INVALID_TLV_TAG);
+ PRETTY_PRINT("Unknown tag num %" PRIu32, tagNum);
+ break;
}
}
- PRETTY_PRINT("}");
+
+ PRETTY_PRINT("},");
PRETTY_PRINT("");
- // if we have exhausted this container
if (CHIP_END_OF_TLV == err)
{
- err = CHIP_NO_ERROR;
- }
- SuccessOrExit(err);
- err = reader.ExitContainer(mOuterContainerType);
+ const int RequiredFields = (1 << to_underlying(Tag::kIsFabricFiltered)) | (1 << to_underlying(Tag::kTimedRequest)) |
+ (1 << to_underlying(Tag::kWriteRequests));
-exit:
- return err;
+ if ((TagPresenceMask & RequiredFields) == RequiredFields)
+ {
+ err = CHIP_NO_ERROR;
+ }
+ else
+ {
+ err = CHIP_ERROR_IM_MALFORMED_WRITE_REQUEST_MESSAGE;
+ }
+ }
+
+ ReturnErrorOnFailure(err);
+ return reader.ExitContainer(mOuterContainerType);
}
#endif // CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
CHIP_ERROR WriteRequestMessage::Parser::GetSuppressResponse(bool * const apSuppressResponse) const
{
- return GetSimpleValue(kCsTag_SuppressResponse, chip::TLV::kTLVType_Boolean, apSuppressResponse);
+ return GetSimpleValue(to_underlying(Tag::kSuppressResponse), TLV::kTLVType_Boolean, apSuppressResponse);
}
-CHIP_ERROR WriteRequestMessage::Parser::GetAttributeReportIBs(AttributeDataIBs::Parser * const apAttributeDataIBs) const
+CHIP_ERROR WriteRequestMessage::Parser::GetTimedRequest(bool * const apTimedRequest) const
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- chip::TLV::TLVReader reader;
-
- err = mReader.FindElementWithTag(chip::TLV::ContextTag(kCsTag_AttributeDataIBs), reader);
- SuccessOrExit(err);
-
- VerifyOrExit(chip::TLV::kTLVType_Array == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
-
- err = apAttributeDataIBs->Init(reader);
- SuccessOrExit(err);
-
-exit:
- ChipLogIfFalse((CHIP_NO_ERROR == err) || (CHIP_END_OF_TLV == err));
-
- return err;
+ return GetSimpleValue(to_underlying(Tag::kTimedRequest), TLV::kTLVType_Boolean, apTimedRequest);
}
-CHIP_ERROR
-WriteRequestMessage::Parser::GetAttributeDataVersionList(AttributeDataVersionList::Parser * const apAttributeDataVersionList) const
+CHIP_ERROR WriteRequestMessage::Parser::GetWriteRequests(AttributeDataIBs::Parser * const apAttributeDataIBs) const
{
- CHIP_ERROR err = CHIP_NO_ERROR;
- chip::TLV::TLVReader reader;
-
- err = mReader.FindElementWithTag(chip::TLV::ContextTag(kCsTag_AttributeDataVersionList), reader);
- SuccessOrExit(err);
-
- VerifyOrExit(chip::TLV::kTLVType_Array == reader.GetType(), err = CHIP_ERROR_WRONG_TLV_TYPE);
-
- err = apAttributeDataVersionList->Init(reader);
- SuccessOrExit(err);
-
-exit:
- ChipLogIfFalse((CHIP_NO_ERROR == err) || (CHIP_END_OF_TLV == err));
-
- return err;
+ TLV::TLVReader reader;
+ ReturnErrorOnFailure(mReader.FindElementWithTag(TLV::ContextTag(to_underlying(Tag::kWriteRequests)), reader));
+ return apAttributeDataIBs->Init(reader);
}
CHIP_ERROR WriteRequestMessage::Parser::GetMoreChunkedMessages(bool * const apMoreChunkedMessages) const
{
- return GetSimpleValue(kCsTag_MoreChunkedMessages, chip::TLV::kTLVType_Boolean, apMoreChunkedMessages);
+ return GetSimpleValue(to_underlying(Tag::kMoreChunkedMessages), TLV::kTLVType_Boolean, apMoreChunkedMessages);
+}
+
+CHIP_ERROR WriteRequestMessage::Parser::GetIsFabricFiltered(bool * const apIsFabricFiltered) const
+{
+ return GetSimpleValue(to_underlying(Tag::kIsFabricFiltered), TLV::kTLVType_Boolean, apIsFabricFiltered);
}
WriteRequestMessage::Builder & WriteRequestMessage::Builder::SuppressResponse(const bool aSuppressResponse)
@@ -180,38 +172,29 @@
// skip if error has already been set
if (mError == CHIP_NO_ERROR)
{
- mError = mpWriter->PutBoolean(chip::TLV::ContextTag(kCsTag_SuppressResponse), aSuppressResponse);
+ mError = mpWriter->PutBoolean(TLV::ContextTag(to_underlying(Tag::kSuppressResponse)), aSuppressResponse);
}
return *this;
}
-AttributeDataIBs::Builder & WriteRequestMessage::Builder::CreateAttributeDataIBsBuilder()
+WriteRequestMessage::Builder & WriteRequestMessage::Builder::TimedRequest(const bool aTimedRequest)
{
// skip if error has already been set
if (mError == CHIP_NO_ERROR)
{
- mError = mAttributeDataIBsBuilder.Init(mpWriter, kCsTag_AttributeDataIBs);
+ mError = mpWriter->PutBoolean(TLV::ContextTag(to_underlying(Tag::kTimedRequest)), aTimedRequest);
}
- else
- {
- mAttributeDataIBsBuilder.ResetError(mError);
- }
-
- return mAttributeDataIBsBuilder;
+ return *this;
}
-AttributeDataVersionList::Builder & WriteRequestMessage::Builder::CreateAttributeDataVersionListBuilder()
+AttributeDataIBs::Builder & WriteRequestMessage::Builder::CreateWriteRequests()
{
// skip if error has already been set
if (mError == CHIP_NO_ERROR)
{
- mError = mAttributeDataVersionListBuilder.Init(mpWriter, kCsTag_AttributeDataVersionList);
+ mError = mWriteRequests.Init(mpWriter, to_underlying(Tag::kWriteRequests));
}
- else
- {
- mAttributeDataVersionListBuilder.ResetError(mError);
- }
- return mAttributeDataVersionListBuilder;
+ return mWriteRequests;
}
WriteRequestMessage::Builder & WriteRequestMessage::Builder::MoreChunkedMessages(const bool aMoreChunkedMessages)
@@ -219,14 +202,19 @@
// skip if error has already been set
if (mError == CHIP_NO_ERROR)
{
- mError = mpWriter->PutBoolean(chip::TLV::ContextTag(kCsTag_MoreChunkedMessages), aMoreChunkedMessages);
+ mError = mpWriter->PutBoolean(TLV::ContextTag(to_underlying(Tag::kMoreChunkedMessages)), aMoreChunkedMessages);
}
return *this;
}
-AttributeDataIBs::Builder & WriteRequestMessage::Builder::GetAttributeReportIBsBuilder()
+WriteRequestMessage::Builder & WriteRequestMessage::Builder::IsFabricFiltered(const bool aIsFabricFiltered)
{
- return mAttributeDataIBsBuilder;
+ // skip if error has already been set
+ if (mError == CHIP_NO_ERROR)
+ {
+ mError = mpWriter->PutBoolean(TLV::ContextTag(to_underlying(Tag::kIsFabricFiltered)), aIsFabricFiltered);
+ }
+ return *this;
}
WriteRequestMessage::Builder & WriteRequestMessage::Builder::EndOfWriteRequestMessage()
@@ -234,5 +222,5 @@
EndOfContainer();
return *this;
}
-}; // namespace app
-}; // namespace chip
+} // namespace app
+} // namespace chip
diff --git a/src/app/MessageDef/WriteRequestMessage.h b/src/app/MessageDef/WriteRequestMessage.h
index 62abd14..53b4b2d 100644
--- a/src/app/MessageDef/WriteRequestMessage.h
+++ b/src/app/MessageDef/WriteRequestMessage.h
@@ -35,12 +35,13 @@
namespace chip {
namespace app {
namespace WriteRequestMessage {
-enum
+enum class Tag : uint8_t
{
- kCsTag_SuppressResponse = 0,
- kCsTag_AttributeDataIBs = 1,
- kCsTag_AttributeDataVersionList = 2,
- kCsTag_MoreChunkedMessages = 3,
+ kSuppressResponse = 0,
+ kTimedRequest = 1,
+ kWriteRequests = 2,
+ kMoreChunkedMessages = 3,
+ kIsFabricFiltered = 4,
};
class Parser : public StructParser
@@ -60,7 +61,7 @@
CHIP_ERROR CheckSchemaValidity() const;
/**
- * @brief Get GetSuppressResponse Next() must be called before accessing them.
+ * @brief Get SuppressResponse boolean
*
* @param [in] apSuppressResponse A pointer to apSuppressResponse
*
@@ -70,6 +71,16 @@
CHIP_ERROR GetSuppressResponse(bool * const apSuppressResponse) const;
/**
+ * @brief Get TimedRequest boolean
+ *
+ * @param [in] apTimedRequest A pointer to apTimedRequest
+ *
+ * @return #CHIP_NO_ERROR on success
+ * #CHIP_END_OF_TLV if there is no such element
+ */
+ CHIP_ERROR GetTimedRequest(bool * const apTimedRequest) const;
+
+ /**
* @brief Get a TLVReader for the AttributePathIBs. Next() must be called before accessing them.
*
* @param [in] apAttributeDataIBs A pointer to apAttributeDataIBs
@@ -77,20 +88,10 @@
* @return #CHIP_NO_ERROR on success
* #CHIP_END_OF_TLV if there is no such element
*/
- CHIP_ERROR GetAttributeReportIBs(AttributeDataIBs::Parser * const apAttributeDataIBs) const;
+ CHIP_ERROR GetWriteRequests(AttributeDataIBs::Parser * const apAttributeDataIBs) const;
/**
- * @brief Get a TLVReader for the AttributeDataVersionList. Next() must be called before accessing them.
- *
- * @param [in] apAttributeDataVersionList A pointer to apAttributeDataVersionList
- *
- * @return #CHIP_NO_ERROR on success
- * #CHIP_END_OF_TLV if there is no such element
- */
- CHIP_ERROR GetAttributeDataVersionList(AttributeDataVersionList::Parser * const apAttributeDataVersionList) const;
-
- /**
- * @brief Get MoreChunkedMessages message. Next() must be called before accessing them.
+ * @brief Get MoreChunkedMessages boolean
*
* @param [in] apMoreChunkedMessages A pointer to apMoreChunkedMessages
*
@@ -98,6 +99,16 @@
* #CHIP_END_OF_TLV if there is no such element
*/
CHIP_ERROR GetMoreChunkedMessages(bool * const apMoreChunkedMessages) const;
+
+ /**
+ * @brief Get IsFabricFiltered boolean
+ *
+ * @param [in] apIsFabricFiltered A pointer to apIsFabricFiltered
+ *
+ * @return #CHIP_NO_ERROR on success
+ * #CHIP_END_OF_TLV if there is no such element
+ */
+ CHIP_ERROR GetIsFabricFiltered(bool * const apIsFabricFiltered) const;
};
class Builder : public StructBuilder
@@ -111,18 +122,18 @@
WriteRequestMessage::Builder & SuppressResponse(const bool aSuppressResponse);
/**
+ * @brief flag action as part of a timed write transaction
+ * @param [in] aSuppressResponse true if client need to signal suppress response
+ * @return A reference to *this
+ */
+ WriteRequestMessage::Builder & TimedRequest(const bool aTimedRequest);
+
+ /**
* @brief Initialize a AttributeDataIBs::Builder for writing into the TLV stream
*
* @return A reference to AttributeDataIBs::Builder
*/
- AttributeDataIBs::Builder & CreateAttributeDataIBsBuilder();
-
- /**
- * @brief Initialize a AttributeDataVersionList::Builder for writing into the TLV stream
- *
- * @return A reference to EventPaths::Builder
- */
- AttributeDataVersionList::Builder & CreateAttributeDataVersionListBuilder();
+ AttributeDataIBs::Builder & CreateWriteRequests();
/**
* @brief Set True if the set of AttributeDataIBs have to be sent across multiple packets in a single transaction
@@ -131,7 +142,13 @@
*/
WriteRequestMessage::Builder & MoreChunkedMessages(const bool aMoreChunkedMessages);
- AttributeDataIBs::Builder & GetAttributeReportIBsBuilder();
+ AttributeDataIBs::Builder & GetWriteRequests() { return mWriteRequests; };
+
+ /**
+ * @brief limits the data written within fabric-scoped lists to the accessing fabric
+ * @return A reference to *this
+ */
+ WriteRequestMessage::Builder & IsFabricFiltered(const bool aIsFabricFiltered);
/**
* @brief Mark the end of this WriteRequestMessage
@@ -141,9 +158,8 @@
WriteRequestMessage::Builder & EndOfWriteRequestMessage();
private:
- AttributeDataIBs::Builder mAttributeDataIBsBuilder;
- AttributeDataVersionList::Builder mAttributeDataVersionListBuilder;
+ AttributeDataIBs::Builder mWriteRequests;
};
-}; // namespace WriteRequestMessage
-}; // namespace app
-}; // namespace chip
+} // namespace WriteRequestMessage
+} // namespace app
+} // namespace chip
diff --git a/src/app/MessageDef/WriteResponseMessage.cpp b/src/app/MessageDef/WriteResponseMessage.cpp
index 00e51a3..a616783 100644
--- a/src/app/MessageDef/WriteResponseMessage.cpp
+++ b/src/app/MessageDef/WriteResponseMessage.cpp
@@ -71,11 +71,14 @@
{
err = CHIP_NO_ERROR;
}
+ else
+ {
+ err = CHIP_ERROR_IM_MALFORMED_WRITE_RESPONSE_MESSAGE;
+ }
}
ReturnErrorOnFailure(err);
- ReturnErrorOnFailure(reader.ExitContainer(mOuterContainerType));
- return CHIP_NO_ERROR;
+ return reader.ExitContainer(mOuterContainerType);
}
#endif // CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
@@ -83,8 +86,7 @@
{
TLV::TLVReader reader;
ReturnErrorOnFailure(mReader.FindElementWithTag(TLV::ContextTag(to_underlying(Tag::kWriteResponses)), reader));
- ReturnErrorOnFailure(apWriteResponses->Init(reader));
- return CHIP_NO_ERROR;
+ return apWriteResponses->Init(reader);
}
AttributeStatuses::Builder & WriteResponseMessage::Builder::CreateWriteResponses()
diff --git a/src/app/ReadClient.cpp b/src/app/ReadClient.cpp
index 46e90dc..39011bc 100644
--- a/src/app/ReadClient.cpp
+++ b/src/app/ReadClient.cpp
@@ -139,28 +139,34 @@
if (aReadPrepareParams.mEventPathParamsListSize != 0 && aReadPrepareParams.mpEventPathParamsList != nullptr)
{
- EventPaths::Builder & eventPathListBuilder = request.CreateEventPathsBuilder();
+ EventPaths::Builder & eventPathListBuilder = request.CreateEventRequests();
SuccessOrExit(err = eventPathListBuilder.GetError());
err = GenerateEventPaths(eventPathListBuilder, aReadPrepareParams.mpEventPathParamsList,
aReadPrepareParams.mEventPathParamsListSize);
SuccessOrExit(err);
if (aReadPrepareParams.mEventNumber != 0)
{
- // EventNumber is optional
- request.EventNumber(aReadPrepareParams.mEventNumber);
+ // EventFilter is optional
+ EventFilters::Builder eventFilters = request.CreateEventFilters();
+ SuccessOrExit(err = request.GetError());
+ EventFilterIB::Builder eventFilter = eventFilters.CreateEventFilter();
+ eventFilter.EventMin(aReadPrepareParams.mEventNumber).EndOfEventFilterIB();
+ SuccessOrExit(err = eventFilter.GetError());
+ eventFilters.EndOfEventFilters();
+ SuccessOrExit(err = eventFilters.GetError());
}
}
if (aReadPrepareParams.mAttributePathParamsListSize != 0 && aReadPrepareParams.mpAttributePathParamsList != nullptr)
{
- AttributePathIBs::Builder attributePathListBuilder = request.CreateAttributePathListBuilder();
+ AttributePathIBs::Builder attributePathListBuilder = request.CreateAttributeRequests();
SuccessOrExit(err = attributePathListBuilder.GetError());
err = GenerateAttributePathList(attributePathListBuilder, aReadPrepareParams.mpAttributePathParamsList,
aReadPrepareParams.mAttributePathParamsListSize);
SuccessOrExit(err);
}
- request.EndOfReadRequestMessage();
+ request.IsFabricFiltered(false).EndOfReadRequestMessage();
SuccessOrExit(err = request.GetError());
err = writer.Finalize(&msgBuf);
@@ -585,7 +591,7 @@
if (aReadPrepareParams.mEventPathParamsListSize != 0 && aReadPrepareParams.mpEventPathParamsList != nullptr)
{
- EventPaths::Builder & eventPathListBuilder = request.CreateEventPathsBuilder();
+ EventPaths::Builder & eventPathListBuilder = request.CreateEventRequests();
SuccessOrExit(err = eventPathListBuilder.GetError());
err = GenerateEventPaths(eventPathListBuilder, aReadPrepareParams.mpEventPathParamsList,
aReadPrepareParams.mEventPathParamsListSize);
@@ -594,13 +600,19 @@
if (aReadPrepareParams.mEventNumber != 0)
{
// EventNumber is optional
- request.EventNumber(aReadPrepareParams.mEventNumber);
+ EventFilters::Builder eventFilters = request.CreateEventFilters();
+ SuccessOrExit(err = request.GetError());
+ EventFilterIB::Builder eventFilter = eventFilters.CreateEventFilter();
+ eventFilter.EventMin(aReadPrepareParams.mEventNumber).EndOfEventFilterIB();
+ SuccessOrExit(err = eventFilter.GetError());
+ eventFilters.EndOfEventFilters();
+ SuccessOrExit(err = eventFilters.GetError());
}
}
if (aReadPrepareParams.mAttributePathParamsListSize != 0 && aReadPrepareParams.mpAttributePathParamsList != nullptr)
{
- AttributePathIBs::Builder & attributePathListBuilder = request.CreateAttributePathListBuilder();
+ AttributePathIBs::Builder & attributePathListBuilder = request.CreateAttributeRequests();
SuccessOrExit(err = attributePathListBuilder.GetError());
err = GenerateAttributePathList(attributePathListBuilder, aReadPrepareParams.mpAttributePathParamsList,
aReadPrepareParams.mAttributePathParamsListSize);
@@ -609,9 +621,10 @@
VerifyOrExit(aReadPrepareParams.mMinIntervalFloorSeconds < aReadPrepareParams.mMaxIntervalCeilingSeconds,
err = CHIP_ERROR_INVALID_ARGUMENT);
- request.MinIntervalSeconds(aReadPrepareParams.mMinIntervalFloorSeconds)
- .MaxIntervalSeconds(aReadPrepareParams.mMaxIntervalCeilingSeconds)
+ request.MinIntervalFloorSeconds(aReadPrepareParams.mMinIntervalFloorSeconds)
+ .MaxIntervalCeilingSeconds(aReadPrepareParams.mMaxIntervalCeilingSeconds)
.KeepSubscriptions(aReadPrepareParams.mKeepSubscriptions)
+ .IsFabricFiltered(false)
.EndOfSubscribeRequestMessage();
SuccessOrExit(err = request.GetError());
diff --git a/src/app/ReadHandler.cpp b/src/app/ReadHandler.cpp
index 48f6c1c..94e868d 100644
--- a/src/app/ReadHandler.cpp
+++ b/src/app/ReadHandler.cpp
@@ -274,7 +274,7 @@
SuccessOrExit(err);
#endif
- err = readRequestParser.GetPathList(&attributePathListParser);
+ err = readRequestParser.GetAttributeRequests(&attributePathListParser);
if (err == CHIP_END_OF_TLV)
{
err = CHIP_NO_ERROR;
@@ -285,7 +285,7 @@
err = ProcessAttributePathList(attributePathListParser);
}
SuccessOrExit(err);
- err = readRequestParser.GetEventPaths(&eventPathListParser);
+ err = readRequestParser.GetEventRequests(&eventPathListParser);
if (err == CHIP_END_OF_TLV)
{
err = CHIP_NO_ERROR;
@@ -549,7 +549,7 @@
#endif
AttributePathIBs::Parser attributePathListParser;
- CHIP_ERROR err = subscribeRequestParser.GetPathList(&attributePathListParser);
+ CHIP_ERROR err = subscribeRequestParser.GetAttributeRequests(&attributePathListParser);
if (err == CHIP_END_OF_TLV)
{
err = CHIP_NO_ERROR;
@@ -561,7 +561,7 @@
ReturnErrorOnFailure(err);
EventPaths::Parser eventPathListParser;
- err = subscribeRequestParser.GetEventPaths(&eventPathListParser);
+ err = subscribeRequestParser.GetEventRequests(&eventPathListParser);
if (err == CHIP_END_OF_TLV)
{
err = CHIP_NO_ERROR;
@@ -572,9 +572,10 @@
}
ReturnErrorOnFailure(err);
- ReturnErrorOnFailure(subscribeRequestParser.GetMinIntervalSeconds(&mMinIntervalFloorSeconds));
- ReturnErrorOnFailure(subscribeRequestParser.GetMaxIntervalSeconds(&mMaxIntervalCeilingSeconds));
+ ReturnErrorOnFailure(subscribeRequestParser.GetMinIntervalFloorSeconds(&mMinIntervalFloorSeconds));
+ ReturnErrorOnFailure(subscribeRequestParser.GetMaxIntervalCeilingSeconds(&mMaxIntervalCeilingSeconds));
VerifyOrReturnError(mMinIntervalFloorSeconds < mMaxIntervalCeilingSeconds, CHIP_ERROR_INVALID_ARGUMENT);
+ ReturnErrorOnFailure(subscribeRequestParser.GetIsFabricFiltered(&mIsFabricFiltered));
ReturnErrorOnFailure(Crypto::DRBG_get_bytes(reinterpret_cast<uint8_t *>(&mSubscriptionId), sizeof(mSubscriptionId)));
MoveToState(HandlerState::GeneratingReports);
diff --git a/src/app/ReadHandler.h b/src/app/ReadHandler.h
index 7f1e644..fd1aa04 100644
--- a/src/app/ReadHandler.h
+++ b/src/app/ReadHandler.h
@@ -208,6 +208,7 @@
NodeId mInitiatorNodeId = kUndefinedNodeId;
FabricIndex mFabricIndex = 0;
AttributePathExpandIterator mAttributePathExpandIterator = AttributePathExpandIterator(nullptr);
+ bool mIsFabricFiltered = false;
};
} // namespace app
} // namespace chip
diff --git a/src/app/WriteClient.cpp b/src/app/WriteClient.cpp
index 60d56a7..f540ac7 100644
--- a/src/app/WriteClient.cpp
+++ b/src/app/WriteClient.cpp
@@ -36,16 +36,17 @@
VerifyOrReturnError(mpExchangeMgr == nullptr, CHIP_ERROR_INCORRECT_STATE);
VerifyOrReturnError(mpExchangeCtx == nullptr, CHIP_ERROR_INCORRECT_STATE);
- AttributeDataIBs::Builder AttributeDataIBsBuilder;
+ AttributeDataIBs::Builder attributeDataIBsBuilder;
System::PacketBufferHandle packet = System::PacketBufferHandle::New(chip::app::kMaxSecureSduLengthBytes);
VerifyOrReturnError(!packet.IsNull(), CHIP_ERROR_NO_MEMORY);
mMessageWriter.Init(std::move(packet));
ReturnErrorOnFailure(mWriteRequestBuilder.Init(&mMessageWriter));
-
- AttributeDataIBsBuilder = mWriteRequestBuilder.CreateAttributeDataIBsBuilder();
- ReturnErrorOnFailure(AttributeDataIBsBuilder.GetError());
+ mWriteRequestBuilder.TimedRequest(false).IsFabricFiltered(false);
+ ReturnErrorOnFailure(mWriteRequestBuilder.GetError());
+ attributeDataIBsBuilder = mWriteRequestBuilder.CreateWriteRequests();
+ ReturnErrorOnFailure(attributeDataIBsBuilder.GetError());
ClearExistingExchangeContext();
mpExchangeMgr = apExchangeMgr;
@@ -137,7 +138,7 @@
{
CHIP_ERROR err = CHIP_NO_ERROR;
- AttributeDataIB::Builder AttributeDataIB = mWriteRequestBuilder.GetAttributeReportIBsBuilder().CreateAttributeDataIBBuilder();
+ AttributeDataIB::Builder AttributeDataIB = mWriteRequestBuilder.GetWriteRequests().CreateAttributeDataIBBuilder();
SuccessOrExit(AttributeDataIB.GetError());
err = ConstructAttributePath(attributePathParams, AttributeDataIB);
@@ -149,7 +150,7 @@
{
CHIP_ERROR err = CHIP_NO_ERROR;
- AttributeDataIB::Builder AttributeDataIB = mWriteRequestBuilder.GetAttributeReportIBsBuilder().GetAttributeDataIBBuilder();
+ AttributeDataIB::Builder AttributeDataIB = mWriteRequestBuilder.GetWriteRequests().GetAttributeDataIBBuilder();
// TODO: Add attribute version support
AttributeDataIB.DataVersion(0);
@@ -163,7 +164,7 @@
TLV::TLVWriter * WriteClient::GetAttributeDataIBTLVWriter()
{
- return mWriteRequestBuilder.GetAttributeReportIBsBuilder().GetAttributeDataIBBuilder().GetWriter();
+ return mWriteRequestBuilder.GetWriteRequests().GetAttributeDataIBBuilder().GetWriter();
}
CHIP_ERROR WriteClient::ConstructAttributePath(const AttributePathParams & aAttributePathParams,
@@ -180,7 +181,7 @@
CHIP_ERROR err = CHIP_NO_ERROR;
AttributeDataIBs::Builder AttributeDataIBsBuilder;
VerifyOrExit(mState == State::AddAttribute, err = CHIP_ERROR_INCORRECT_STATE);
- AttributeDataIBsBuilder = mWriteRequestBuilder.GetAttributeReportIBsBuilder().EndOfAttributeDataIBs();
+ AttributeDataIBsBuilder = mWriteRequestBuilder.GetWriteRequests().EndOfAttributeDataIBs();
err = AttributeDataIBsBuilder.GetError();
SuccessOrExit(err);
diff --git a/src/app/WriteHandler.cpp b/src/app/WriteHandler.cpp
index c6533f2..ea3ac08 100644
--- a/src/app/WriteHandler.cpp
+++ b/src/app/WriteHandler.cpp
@@ -202,7 +202,13 @@
}
SuccessOrExit(err);
- err = writeRequestParser.GetAttributeReportIBs(&AttributeDataIBsParser);
+ err = writeRequestParser.GetTimedRequest(&mIsTimedRequest);
+ SuccessOrExit(err);
+
+ err = writeRequestParser.GetIsFabricFiltered(&mIsFabricFiltered);
+ SuccessOrExit(err);
+
+ err = writeRequestParser.GetWriteRequests(&AttributeDataIBsParser);
SuccessOrExit(err);
AttributeDataIBsParser.GetReader(&AttributeDataIBsReader);
err = ProcessAttributeDataIBs(AttributeDataIBsReader);
diff --git a/src/app/WriteHandler.h b/src/app/WriteHandler.h
index 7d0edd1..46ff424 100644
--- a/src/app/WriteHandler.h
+++ b/src/app/WriteHandler.h
@@ -109,7 +109,9 @@
Messaging::ExchangeContext * mpExchangeCtx = nullptr;
WriteResponseMessage::Builder mWriteResponseBuilder;
System::PacketBufferTLVWriter mMessageWriter;
- State mState = State::Uninitialized;
+ State mState = State::Uninitialized;
+ bool mIsTimedRequest = false;
+ bool mIsFabricFiltered = false;
};
} // namespace app
} // namespace chip
diff --git a/src/app/tests/TestMessageDef.cpp b/src/app/tests/TestMessageDef.cpp
index 7c4d94e..b83bf07 100644
--- a/src/app/tests/TestMessageDef.cpp
+++ b/src/app/tests/TestMessageDef.cpp
@@ -139,11 +139,9 @@
{
CHIP_ERROR err = CHIP_NO_ERROR;
EventFilters::Parser eventFiltersParser;
- AttributePathIB::Parser attributePathParser;
err = eventFiltersParser.Init(aReader);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
-
#if CHIP_CONFIG_IM_ENABLE_SCHEMA_CHECK
err = eventFiltersParser.CheckSchemaValidity();
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
@@ -1028,19 +1026,19 @@
err = readRequestBuilder.Init(&aWriter);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- AttributePathIBs::Builder AttributePathIBs = readRequestBuilder.CreateAttributePathListBuilder();
+ AttributePathIBs::Builder AttributePathIBs = readRequestBuilder.CreateAttributeRequests();
NL_TEST_ASSERT(apSuite, readRequestBuilder.GetError() == CHIP_NO_ERROR);
BuildAttributePathList(apSuite, AttributePathIBs);
- EventPaths::Builder eventPathList = readRequestBuilder.CreateEventPathsBuilder();
+ EventPaths::Builder eventPathList = readRequestBuilder.CreateEventRequests();
NL_TEST_ASSERT(apSuite, readRequestBuilder.GetError() == CHIP_NO_ERROR);
BuildEventPaths(apSuite, eventPathList);
- AttributeDataVersionList::Builder attributeDataVersionList = readRequestBuilder.CreateAttributeDataVersionListBuilder();
+ EventFilters::Builder eventFilters = readRequestBuilder.CreateEventFilters();
NL_TEST_ASSERT(apSuite, readRequestBuilder.GetError() == CHIP_NO_ERROR);
- BuildAttributeDataVersionList(apSuite, attributeDataVersionList);
+ BuildEventFilters(apSuite, eventFilters);
- readRequestBuilder.EventNumber(1);
+ readRequestBuilder.IsFabricFiltered(true);
NL_TEST_ASSERT(apSuite, readRequestBuilder.GetError() == CHIP_NO_ERROR);
readRequestBuilder.EndOfReadRequestMessage();
@@ -1054,8 +1052,8 @@
ReadRequestMessage::Parser readRequestParser;
AttributePathIBs::Parser attributePathListParser;
EventPaths::Parser eventPathListParser;
- AttributeDataVersionList::Parser attributeDataVersionListParser;
- uint64_t eventNumber;
+ EventFilters::Parser eventFiltersParser;
+ bool isFabricFiltered = false;
err = readRequestParser.Init(aReader);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
@@ -1063,17 +1061,17 @@
err = readRequestParser.CheckSchemaValidity();
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
#endif
- err = readRequestParser.GetPathList(&attributePathListParser);
+ err = readRequestParser.GetAttributeRequests(&attributePathListParser);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- err = readRequestParser.GetEventPaths(&eventPathListParser);
+ err = readRequestParser.GetEventRequests(&eventPathListParser);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- err = readRequestParser.GetAttributeDataVersionList(&attributeDataVersionListParser);
+ err = readRequestParser.GetEventFilters(&eventFiltersParser);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- err = readRequestParser.GetEventNumber(&eventNumber);
- NL_TEST_ASSERT(apSuite, eventNumber == 1 && err == CHIP_NO_ERROR);
+ err = readRequestParser.GetIsFabricFiltered(&isFabricFiltered);
+ NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR && isFabricFiltered);
}
void BuildWriteRequestMessage(nlTestSuite * apSuite, chip::TLV::TLVWriter & aWriter)
@@ -1087,17 +1085,19 @@
writeRequestBuilder.SuppressResponse(true);
NL_TEST_ASSERT(apSuite, writeRequestBuilder.GetError() == CHIP_NO_ERROR);
- AttributeDataIBs::Builder AttributeDataIBs = writeRequestBuilder.CreateAttributeDataIBsBuilder();
+ writeRequestBuilder.TimedRequest(true);
+ NL_TEST_ASSERT(apSuite, writeRequestBuilder.GetError() == CHIP_NO_ERROR);
+
+ AttributeDataIBs::Builder AttributeDataIBs = writeRequestBuilder.CreateWriteRequests();
NL_TEST_ASSERT(apSuite, writeRequestBuilder.GetError() == CHIP_NO_ERROR);
BuildAttributeDataIBs(apSuite, AttributeDataIBs);
- AttributeDataVersionList::Builder attributeDataVersionList = writeRequestBuilder.CreateAttributeDataVersionListBuilder();
- NL_TEST_ASSERT(apSuite, writeRequestBuilder.GetError() == CHIP_NO_ERROR);
- BuildAttributeDataVersionList(apSuite, attributeDataVersionList);
-
writeRequestBuilder.MoreChunkedMessages(true);
NL_TEST_ASSERT(apSuite, writeRequestBuilder.GetError() == CHIP_NO_ERROR);
+ writeRequestBuilder.IsFabricFiltered(true);
+ NL_TEST_ASSERT(apSuite, writeRequestBuilder.GetError() == CHIP_NO_ERROR);
+
writeRequestBuilder.EndOfWriteRequestMessage();
NL_TEST_ASSERT(apSuite, writeRequestBuilder.GetError() == CHIP_NO_ERROR);
}
@@ -1108,9 +1108,10 @@
WriteRequestMessage::Parser writeRequestParser;
bool suppressResponse = false;
- AttributeDataIBs::Parser AttributeDataIBs;
- AttributeDataVersionList::Parser attributeDataVersionList;
+ bool timeRequest = false;
+ AttributeDataIBs::Parser writeRequests;
bool moreChunkedMessages = false;
+ bool isFabricFiltered = false;
err = writeRequestParser.Init(aReader);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
@@ -1121,14 +1122,17 @@
err = writeRequestParser.GetSuppressResponse(&suppressResponse);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR && suppressResponse);
- err = writeRequestParser.GetAttributeReportIBs(&AttributeDataIBs);
- NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+ err = writeRequestParser.GetTimedRequest(&timeRequest);
+ NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR && timeRequest);
- err = writeRequestParser.GetAttributeDataVersionList(&attributeDataVersionList);
+ err = writeRequestParser.GetWriteRequests(&writeRequests);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
err = writeRequestParser.GetMoreChunkedMessages(&moreChunkedMessages);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR && moreChunkedMessages);
+
+ err = writeRequestParser.GetIsFabricFiltered(&isFabricFiltered);
+ NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR && isFabricFiltered);
}
void BuildWriteResponseMessage(nlTestSuite * apSuite, chip::TLV::TLVWriter & aWriter)
@@ -1171,25 +1175,22 @@
err = subscribeRequestBuilder.Init(&aWriter);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- AttributePathIBs::Builder AttributePathIBs = subscribeRequestBuilder.CreateAttributePathListBuilder();
+ AttributePathIBs::Builder attributePathIBs = subscribeRequestBuilder.CreateAttributeRequests();
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
- BuildAttributePathList(apSuite, AttributePathIBs);
+ BuildAttributePathList(apSuite, attributePathIBs);
- EventPaths::Builder eventPathList = subscribeRequestBuilder.CreateEventPathsBuilder();
+ EventPaths::Builder eventPathList = subscribeRequestBuilder.CreateEventRequests();
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
BuildEventPaths(apSuite, eventPathList);
- AttributeDataVersionList::Builder attributeDataVersionList = subscribeRequestBuilder.CreateAttributeDataVersionListBuilder();
+ EventFilters::Builder eventFilters = subscribeRequestBuilder.CreateEventFilters();
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
- BuildAttributeDataVersionList(apSuite, attributeDataVersionList);
+ BuildEventFilters(apSuite, eventFilters);
- subscribeRequestBuilder.EventNumber(1);
+ subscribeRequestBuilder.MinIntervalFloorSeconds(2);
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
- subscribeRequestBuilder.MinIntervalSeconds(2);
- NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
-
- subscribeRequestBuilder.MaxIntervalSeconds(3);
+ subscribeRequestBuilder.MaxIntervalCeilingSeconds(3);
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
subscribeRequestBuilder.KeepSubscriptions(true);
@@ -1198,6 +1199,9 @@
subscribeRequestBuilder.IsProxy(true);
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
+ subscribeRequestBuilder.IsFabricFiltered(true);
+ NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
+
subscribeRequestBuilder.EndOfSubscribeRequestMessage();
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
}
@@ -1209,12 +1213,12 @@
SubscribeRequestMessage::Parser subscribeRequestParser;
AttributePathIBs::Parser attributePathListParser;
EventPaths::Parser eventPathListParser;
- AttributeDataVersionList::Parser attributeDataVersionListParser;
- uint64_t eventNumber = 0;
- uint16_t minIntervalSeconds = 0;
- uint16_t maxIntervalSeconds = 0;
- bool keepExistingSubscription = false;
- bool isProxy = false;
+ EventFilters::Parser eventFiltersParser;
+ uint16_t MinIntervalFloorSeconds = 0;
+ uint16_t MaxIntervalCeilingSeconds = 0;
+ bool keepExistingSubscription = false;
+ bool isProxy = false;
+ bool isFabricFiltered = false;
err = subscribeRequestParser.Init(aReader);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
@@ -1222,29 +1226,29 @@
err = subscribeRequestParser.CheckSchemaValidity();
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
#endif
- err = subscribeRequestParser.GetPathList(&attributePathListParser);
+ err = subscribeRequestParser.GetAttributeRequests(&attributePathListParser);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- err = subscribeRequestParser.GetEventPaths(&eventPathListParser);
+ err = subscribeRequestParser.GetEventRequests(&eventPathListParser);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- err = subscribeRequestParser.GetAttributeDataVersionList(&attributeDataVersionListParser);
+ err = subscribeRequestParser.GetEventFilters(&eventFiltersParser);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- err = subscribeRequestParser.GetEventNumber(&eventNumber);
- NL_TEST_ASSERT(apSuite, eventNumber == 1 && err == CHIP_NO_ERROR);
+ err = subscribeRequestParser.GetMinIntervalFloorSeconds(&MinIntervalFloorSeconds);
+ NL_TEST_ASSERT(apSuite, MinIntervalFloorSeconds == 2 && err == CHIP_NO_ERROR);
- err = subscribeRequestParser.GetMinIntervalSeconds(&minIntervalSeconds);
- NL_TEST_ASSERT(apSuite, minIntervalSeconds == 2 && err == CHIP_NO_ERROR);
-
- err = subscribeRequestParser.GetMaxIntervalSeconds(&maxIntervalSeconds);
- NL_TEST_ASSERT(apSuite, maxIntervalSeconds == 3 && err == CHIP_NO_ERROR);
+ err = subscribeRequestParser.GetMaxIntervalCeilingSeconds(&MaxIntervalCeilingSeconds);
+ NL_TEST_ASSERT(apSuite, MaxIntervalCeilingSeconds == 3 && err == CHIP_NO_ERROR);
err = subscribeRequestParser.GetKeepSubscriptions(&keepExistingSubscription);
NL_TEST_ASSERT(apSuite, keepExistingSubscription && err == CHIP_NO_ERROR);
err = subscribeRequestParser.GetIsProxy(&isProxy);
NL_TEST_ASSERT(apSuite, isProxy && err == CHIP_NO_ERROR);
+
+ err = subscribeRequestParser.GetIsFabricFiltered(&isFabricFiltered);
+ NL_TEST_ASSERT(apSuite, isFabricFiltered && err == CHIP_NO_ERROR);
}
void BuildSubscribeResponseMessage(nlTestSuite * apSuite, chip::TLV::TLVWriter & aWriter)
@@ -1339,7 +1343,6 @@
reader.Init(std::move(buf));
err = reader.Next();
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
-
ParseEventFilterIB(apSuite, reader);
}
@@ -1349,7 +1352,7 @@
chip::System::PacketBufferTLVWriter writer;
chip::System::PacketBufferTLVReader reader;
EventFilters::Builder eventFiltersBuilder;
-
+ EventFilters::Parser eventFiltersParser;
writer.Init(chip::System::PacketBufferHandle::New(chip::System::PacketBuffer::kMaxSize));
err = eventFiltersBuilder.Init(&writer);
diff --git a/src/app/tests/TestReadInteraction.cpp b/src/app/tests/TestReadInteraction.cpp
index 2e9fc4b..1650980 100644
--- a/src/app/tests/TestReadInteraction.cpp
+++ b/src/app/tests/TestReadInteraction.cpp
@@ -417,7 +417,7 @@
err = readRequestBuilder.Init(&writer);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- AttributePathIBs::Builder attributePathListBuilder = readRequestBuilder.CreateAttributePathListBuilder();
+ AttributePathIBs::Builder attributePathListBuilder = readRequestBuilder.CreateAttributeRequests();
NL_TEST_ASSERT(apSuite, attributePathListBuilder.GetError() == CHIP_NO_ERROR);
AttributePathIB::Builder attributePathBuilder = attributePathListBuilder.CreateAttributePath();
@@ -432,7 +432,7 @@
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
NL_TEST_ASSERT(apSuite, readRequestBuilder.GetError() == CHIP_NO_ERROR);
- readRequestBuilder.EndOfReadRequestMessage();
+ readRequestBuilder.IsFabricFiltered(false).EndOfReadRequestMessage();
NL_TEST_ASSERT(apSuite, readRequestBuilder.GetError() == CHIP_NO_ERROR);
err = writer.Finalize(&readRequestbuf);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
@@ -466,7 +466,7 @@
attributePathParams[0].mAttributeId = 0;
attributePathParams[1].mAttributeId = 0;
attributePathParams[1].mListIndex = 0;
- AttributePathIBs::Builder & attributePathListBuilder = request.CreateAttributePathListBuilder();
+ AttributePathIBs::Builder & attributePathListBuilder = request.CreateAttributeRequests();
err = readClient.GenerateAttributePathList(attributePathListBuilder, attributePathParams, 2 /*aAttributePathParamsListSize*/);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
}
@@ -492,7 +492,7 @@
AttributePathParams attributePathParams[2];
attributePathParams[0].mAttributeId = 0;
attributePathParams[1].mListIndex = 0;
- AttributePathIBs::Builder & attributePathListBuilder = request.CreateAttributePathListBuilder();
+ AttributePathIBs::Builder & attributePathListBuilder = request.CreateAttributeRequests();
err = readClient.GenerateAttributePathList(attributePathListBuilder, attributePathParams, 2 /*aAttributePathParamsListSize*/);
NL_TEST_ASSERT(apSuite, err == CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_PATH);
}
@@ -546,7 +546,7 @@
err = readRequestBuilder.Init(&writer);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- AttributePathIBs::Builder attributePathListBuilder = readRequestBuilder.CreateAttributePathListBuilder();
+ AttributePathIBs::Builder attributePathListBuilder = readRequestBuilder.CreateAttributeRequests();
NL_TEST_ASSERT(apSuite, attributePathListBuilder.GetError() == CHIP_NO_ERROR);
AttributePathIB::Builder attributePathBuilder = attributePathListBuilder.CreateAttributePath();
@@ -556,8 +556,9 @@
err = attributePathBuilder.GetError();
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- NL_TEST_ASSERT(apSuite, readRequestBuilder.GetError() == CHIP_NO_ERROR);
- readRequestBuilder.EndOfReadRequestMessage();
+ attributePathListBuilder.EndOfAttributePathIBs();
+ NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
+ readRequestBuilder.IsFabricFiltered(false).EndOfReadRequestMessage();
NL_TEST_ASSERT(apSuite, readRequestBuilder.GetError() == CHIP_NO_ERROR);
err = writer.Finalize(&readRequestbuf);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
@@ -593,11 +594,11 @@
eventPathParams[0].mClusterId = 3;
eventPathParams[0].mEventId = 4;
- EventPaths::Builder & eventPathListBuilder = request.CreateEventPathsBuilder();
+ EventPaths::Builder & eventPathListBuilder = request.CreateEventRequests();
err = readClient.GenerateEventPaths(eventPathListBuilder, eventPathParams, 1 /*aEventPathParamsListSize*/);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- request.EndOfReadRequestMessage();
+ request.IsFabricFiltered(false).EndOfReadRequestMessage();
NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == request.GetError());
err = writer.Finalize(&msgBuf);
@@ -647,11 +648,11 @@
eventPathParams[1].mClusterId = 3;
eventPathParams[1].mEventId = 5;
- EventPaths::Builder & eventPathListBuilder = request.CreateEventPathsBuilder();
+ EventPaths::Builder & eventPathListBuilder = request.CreateEventRequests();
err = readClient.GenerateEventPaths(eventPathListBuilder, eventPathParams, 2 /*aEventPathParamsListSize*/);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- request.EndOfReadRequestMessage();
+ request.IsFabricFiltered(false).EndOfReadRequestMessage();
NL_TEST_ASSERT(apSuite, CHIP_NO_ERROR == request.GetError());
err = writer.Finalize(&msgBuf);
@@ -948,7 +949,7 @@
err = subscribeRequestBuilder.Init(&writer);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- AttributePathIBs::Builder attributePathListBuilder = subscribeRequestBuilder.CreateAttributePathListBuilder();
+ AttributePathIBs::Builder attributePathListBuilder = subscribeRequestBuilder.CreateAttributeRequests();
NL_TEST_ASSERT(apSuite, attributePathListBuilder.GetError() == CHIP_NO_ERROR);
AttributePathIB::Builder attributePathBuilder = attributePathListBuilder.CreateAttributePath();
@@ -962,10 +963,10 @@
err = attributePathListBuilder.GetError();
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- subscribeRequestBuilder.MinIntervalSeconds(2);
+ subscribeRequestBuilder.MinIntervalFloorSeconds(2);
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
- subscribeRequestBuilder.MaxIntervalSeconds(3);
+ subscribeRequestBuilder.MaxIntervalCeilingSeconds(3);
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
subscribeRequestBuilder.KeepSubscriptions(true);
@@ -974,7 +975,7 @@
subscribeRequestBuilder.IsProxy(true);
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
- subscribeRequestBuilder.EndOfSubscribeRequestMessage();
+ subscribeRequestBuilder.IsFabricFiltered(false).EndOfSubscribeRequestMessage();
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
NL_TEST_ASSERT(apSuite, subscribeRequestBuilder.GetError() == CHIP_NO_ERROR);
diff --git a/src/app/tests/TestReportingEngine.cpp b/src/app/tests/TestReportingEngine.cpp
index a3b935f..c3776b5 100644
--- a/src/app/tests/TestReportingEngine.cpp
+++ b/src/app/tests/TestReportingEngine.cpp
@@ -85,7 +85,7 @@
writer.Init(std::move(readRequestbuf));
err = readRequestBuilder.Init(&writer);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- attributePathListBuilder = readRequestBuilder.CreateAttributePathListBuilder();
+ attributePathListBuilder = readRequestBuilder.CreateAttributeRequests();
NL_TEST_ASSERT(apSuite, readRequestBuilder.GetError() == CHIP_NO_ERROR);
attributePathBuilder = attributePathListBuilder.CreateAttributePath();
NL_TEST_ASSERT(apSuite, attributePathListBuilder.GetError() == CHIP_NO_ERROR);
@@ -107,7 +107,7 @@
attributePathListBuilder.EndOfAttributePathIBs();
NL_TEST_ASSERT(apSuite, readRequestBuilder.GetError() == CHIP_NO_ERROR);
- readRequestBuilder.EndOfReadRequestMessage();
+ readRequestBuilder.IsFabricFiltered(false).EndOfReadRequestMessage();
NL_TEST_ASSERT(apSuite, readRequestBuilder.GetError() == CHIP_NO_ERROR);
err = writer.Finalize(&readRequestbuf);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
diff --git a/src/app/tests/TestWriteInteraction.cpp b/src/app/tests/TestWriteInteraction.cpp
index fd83dd2..24c6ee8 100644
--- a/src/app/tests/TestWriteInteraction.cpp
+++ b/src/app/tests/TestWriteInteraction.cpp
@@ -124,7 +124,7 @@
WriteRequestMessage::Builder writeRequestBuilder;
err = writeRequestBuilder.Init(&writer);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
- AttributeDataIBs::Builder attributeDataIBsBuilder = writeRequestBuilder.CreateAttributeDataIBsBuilder();
+ AttributeDataIBs::Builder attributeDataIBsBuilder = writeRequestBuilder.CreateWriteRequests();
NL_TEST_ASSERT(apSuite, writeRequestBuilder.GetError() == CHIP_NO_ERROR);
AttributeDataIB::Builder attributeDataIBBuilder = attributeDataIBsBuilder.CreateAttributeDataIBBuilder();
NL_TEST_ASSERT(apSuite, attributeDataIBsBuilder.GetError() == CHIP_NO_ERROR);
@@ -155,7 +155,7 @@
attributeDataIBsBuilder.EndOfAttributeDataIBs();
NL_TEST_ASSERT(apSuite, attributeDataIBsBuilder.GetError() == CHIP_NO_ERROR);
- writeRequestBuilder.EndOfWriteRequestMessage();
+ writeRequestBuilder.TimedRequest(false).IsFabricFiltered(false).EndOfWriteRequestMessage();
NL_TEST_ASSERT(apSuite, writeRequestBuilder.GetError() == CHIP_NO_ERROR);
err = writer.Finalize(&aPayload);
diff --git a/src/lib/core/CHIPError.cpp b/src/lib/core/CHIPError.cpp
index edec041..9e41fa8 100644
--- a/src/lib/core/CHIPError.cpp
+++ b/src/lib/core/CHIPError.cpp
@@ -663,10 +663,25 @@
desc = "Malformed Interaction Model Invoke Response Message";
break;
case CHIP_ERROR_IM_MALFORMED_INVOKE_RESPONSE_MESSAGE.AsInteger():
- desc = "Malformed Interaction Model Invoke Response MESSAGE";
+ desc = "Malformed Interaction Model Invoke Response Message";
break;
case CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_REPORT_MESSAGE.AsInteger():
- desc = "Malformed Interaction Model Attribute Report MESSAGE";
+ desc = "Malformed Interaction Model Attribute Report Message";
+ break;
+ case CHIP_ERROR_IM_MALFORMED_WRITE_REQUEST_MESSAGE.AsInteger():
+ desc = "Malformed Interaction Model Write Request Message";
+ break;
+ case CHIP_ERROR_IM_MALFORMED_WRITE_RESPONSE_MESSAGE.AsInteger():
+ desc = "Malformed Interaction Model Write Response Message";
+ break;
+ case CHIP_ERROR_IM_MALFORMED_READ_REQUEST_MESSAGE.AsInteger():
+ desc = "Malformed Interaction Model Read Request Message";
+ break;
+ case CHIP_ERROR_IM_MALFORMED_SUBSCRIBE_REQUEST_MESSAGE.AsInteger():
+ desc = "Malformed Interaction Model Subscribe Request Message";
+ break;
+ case CHIP_ERROR_IM_MALFORMED_SUBSCRIBE_RESPONSE_MESSAGE.AsInteger():
+ desc = "Malformed Interaction Model Subscribe Response Message";
break;
}
#endif // !CHIP_CONFIG_SHORT_ERROR_STR
diff --git a/src/lib/core/CHIPError.h b/src/lib/core/CHIPError.h
index f101c24..b2f7bc5 100644
--- a/src/lib/core/CHIPError.h
+++ b/src/lib/core/CHIPError.h
@@ -2262,6 +2262,50 @@
#define CHIP_ERROR_IM_MALFORMED_ATTRIBUTE_REPORT_MESSAGE CHIP_CORE_ERROR(0xcf)
/**
+ * @def CHIP_ERROR_IM_MALFORMED_WRITE_REQUEST_MESSAGE
+ *
+ * @brief
+ * The WriteRequestMessage is malformed: it either does not contain
+ * the required elements
+ */
+#define CHIP_ERROR_IM_MALFORMED_WRITE_REQUEST_MESSAGE CHIP_CORE_ERROR(0xd0)
+
+/**
+ * @def CHIP_ERROR_IM_MALFORMED_WRITE_RESPONSE_MESSAGE
+ *
+ * @brief
+ * The WriteResponseMessage is malformed: it either does not contain
+ * the required elements
+ */
+#define CHIP_ERROR_IM_MALFORMED_WRITE_RESPONSE_MESSAGE CHIP_CORE_ERROR(0xd1)
+
+/**
+ * @def CHIP_ERROR_IM_MALFORMED_READ_REQUEST_MESSAGE
+ *
+ * @brief
+ * The ReadRequestMessage is malformed: it either does not contain
+ * the required elements
+ */
+#define CHIP_ERROR_IM_MALFORMED_READ_REQUEST_MESSAGE CHIP_CORE_ERROR(0xd2)
+
+/**
+ * @def CHIP_ERROR_IM_MALFORMED_SUBSCRIBE_REQUEST_MESSAGE
+ *
+ * @brief
+ * The SubscribeRequestMessage is malformed: it either does not contain
+ * the required elements
+ */
+#define CHIP_ERROR_IM_MALFORMED_SUBSCRIBE_REQUEST_MESSAGE CHIP_CORE_ERROR(0xd3)
+
+/**
+ * @def CHIP_ERROR_IM_MALFORMED_SUBSCRIBE_RESPONSE_MESSAGE
+ *
+ * @brief
+ * The SubscribeResponseMessage is malformed: it either does not contain
+ * the required elements
+ */
+#define CHIP_ERROR_IM_MALFORMED_SUBSCRIBE_RESPONSE_MESSAGE CHIP_CORE_ERROR(0xd4)
+/**
* @}
*/