16
16
* limitations under the License.
17
17
*/
18
18
19
- #include " messaging/ExchangeContext.h"
20
19
#include < app/AppConfig.h>
21
20
#include < app/AttributeAccessInterfaceRegistry.h>
22
21
#include < app/InteractionModelEngine.h>
28
27
#include < app/util/MatterCallbacks.h>
29
28
#include < app/util/ember-compatibility-functions.h>
30
29
#include < credentials/GroupDataProvider.h>
30
+ #include < lib/support/CodeUtils.h>
31
31
#include < lib/support/TypeTraits.h>
32
32
#include < protocols/interaction_model/StatusCode.h>
33
33
@@ -62,7 +62,7 @@ void WriteHandler::Close()
62
62
// successful.
63
63
DeliverFinalListWriteEnd (false /* wasSuccessful */ );
64
64
mExchangeCtx .Release ();
65
- mSuppressResponse = false ;
65
+ mStateFlags . Clear (StateBits:: kSuppressResponse ) ;
66
66
MoveToState (State::Uninitialized);
67
67
}
68
68
@@ -106,7 +106,7 @@ Status WriteHandler::OnWriteRequest(Messaging::ExchangeContext * apExchangeConte
106
106
Status status = HandleWriteRequestMessage (apExchangeContext, std::move (aPayload), aIsTimedWrite);
107
107
108
108
// The write transaction will be alive only when the message was handled successfully and there are more chunks.
109
- if (!(status == Status::Success && mHasMoreChunks ))
109
+ if (!(status == Status::Success && mStateFlags . Has (StateBits:: kHasMoreChunks ) ))
110
110
{
111
111
Close ();
112
112
}
@@ -142,7 +142,7 @@ CHIP_ERROR WriteHandler::OnMessageReceived(Messaging::ExchangeContext * apExchan
142
142
if (status == Status::Success)
143
143
{
144
144
// We have no more chunks, the write response has been sent in HandleWriteRequestMessage, so close directly.
145
- if (!mHasMoreChunks )
145
+ if (!mStateFlags . Has (StateBits:: kHasMoreChunks ) )
146
146
{
147
147
Close ();
148
148
}
@@ -184,8 +184,8 @@ CHIP_ERROR WriteHandler::SendWriteResponse(System::PacketBufferTLVWriter && aMes
184
184
VerifyOrExit (mExchangeCtx , err = CHIP_ERROR_INCORRECT_STATE);
185
185
mExchangeCtx ->UseSuggestedResponseTimeout (app::kExpectedIMProcessingTime );
186
186
err = mExchangeCtx ->SendMessage (Protocols::InteractionModel::MsgType::WriteResponse, std::move (packet),
187
- mHasMoreChunks ? Messaging::SendMessageFlags::kExpectResponse
188
- : Messaging::SendMessageFlags::kNone );
187
+ mStateFlags . Has (StateBits:: kHasMoreChunks ) ? Messaging::SendMessageFlags::kExpectResponse
188
+ : Messaging::SendMessageFlags::kNone );
189
189
SuccessOrExit (err);
190
190
191
191
MoveToState (State::Sending);
@@ -212,7 +212,7 @@ void WriteHandler::DeliverListWriteEnd(const ConcreteAttributePath & aPath, bool
212
212
213
213
void WriteHandler::DeliverFinalListWriteEnd (bool writeWasSuccessful)
214
214
{
215
- if (mProcessingAttributePath .HasValue () && mProcessingAttributeIsList )
215
+ if (mProcessingAttributePath .HasValue () && mStateFlags . Has (StateBits:: kProcessingAttributeIsList ) )
216
216
{
217
217
DeliverListWriteEnd (mProcessingAttributePath .Value (), writeWasSuccessful);
218
218
}
@@ -221,7 +221,8 @@ void WriteHandler::DeliverFinalListWriteEnd(bool writeWasSuccessful)
221
221
222
222
CHIP_ERROR WriteHandler::DeliverFinalListWriteEndForGroupWrite (bool writeWasSuccessful)
223
223
{
224
- VerifyOrReturnError (mProcessingAttributePath .HasValue () && mProcessingAttributeIsList , CHIP_NO_ERROR);
224
+ VerifyOrReturnError (mProcessingAttributePath .HasValue () && mStateFlags .Has (StateBits::kProcessingAttributeIsList ),
225
+ CHIP_NO_ERROR);
225
226
226
227
Credentials::GroupDataProvider::GroupEndpoint mapping;
227
228
Credentials::GroupDataProvider * groupDataProvider = Credentials::GetGroupDataProvider ();
@@ -321,18 +322,20 @@ CHIP_ERROR WriteHandler::ProcessAttributeDataIBs(TLV::TLVReader & aAttributeData
321
322
continue ;
322
323
}
323
324
324
- if (ShouldReportListWriteEnd (mProcessingAttributePath , mProcessingAttributeIsList , dataAttributePath))
325
+ if (ShouldReportListWriteEnd (mProcessingAttributePath , mStateFlags .Has (StateBits::kProcessingAttributeIsList ),
326
+ dataAttributePath))
325
327
{
326
- DeliverListWriteEnd (mProcessingAttributePath .Value (), mAttributeWriteSuccessful );
328
+ DeliverListWriteEnd (mProcessingAttributePath .Value (), mStateFlags . Has (StateBits:: kAttributeWriteSuccessful ) );
327
329
}
328
330
329
- if (ShouldReportListWriteBegin (mProcessingAttributePath , mProcessingAttributeIsList , dataAttributePath))
331
+ if (ShouldReportListWriteBegin (mProcessingAttributePath , mStateFlags .Has (StateBits::kProcessingAttributeIsList ),
332
+ dataAttributePath))
330
333
{
331
334
DeliverListWriteBegin (dataAttributePath);
332
- mAttributeWriteSuccessful = true ;
335
+ mStateFlags . Set (StateBits:: kAttributeWriteSuccessful ) ;
333
336
}
334
337
335
- mProcessingAttributeIsList = dataAttributePath.IsListOperation ();
338
+ mStateFlags . Set (StateBits:: kProcessingAttributeIsList , dataAttributePath.IsListOperation () );
336
339
mProcessingAttributePath .SetValue (dataAttributePath);
337
340
338
341
DataModelCallbacks::GetInstance ()->AttributeOperation (DataModelCallbacks::OperationType::Write,
@@ -370,9 +373,9 @@ CHIP_ERROR WriteHandler::ProcessAttributeDataIBs(TLV::TLVReader & aAttributeData
370
373
371
374
SuccessOrExit (err);
372
375
373
- if (!mHasMoreChunks )
376
+ if (!mStateFlags . Has (StateBits:: kHasMoreChunks ) )
374
377
{
375
- DeliverFinalListWriteEnd (mAttributeWriteSuccessful );
378
+ DeliverFinalListWriteEnd (mStateFlags . Has (StateBits:: kAttributeWriteSuccessful ) );
376
379
}
377
380
378
381
exit :
@@ -426,8 +429,8 @@ CHIP_ERROR WriteHandler::ProcessGroupAttributeDataIBs(TLV::TLVReader & aAttribut
426
429
iterator = groupDataProvider->IterateEndpoints (fabric);
427
430
VerifyOrExit (iterator != nullptr , err = CHIP_ERROR_NO_MEMORY);
428
431
429
- bool shouldReportListWriteEnd =
430
- ShouldReportListWriteEnd ( mProcessingAttributePath , mProcessingAttributeIsList , dataAttributePath);
432
+ bool shouldReportListWriteEnd = ShouldReportListWriteEnd (
433
+ mProcessingAttributePath , mStateFlags . Has (StateBits:: kProcessingAttributeIsList ) , dataAttributePath);
431
434
bool shouldReportListWriteBegin = false ; // This will be set below.
432
435
433
436
const EmberAfAttributeMetadata * attributeMetadata = nullptr ;
@@ -457,7 +460,8 @@ CHIP_ERROR WriteHandler::ProcessGroupAttributeDataIBs(TLV::TLVReader & aAttribut
457
460
dataAttributePath.mEndpointId , dataAttributePath.mListOp ,
458
461
dataAttributePath.mListIndex );
459
462
shouldReportListWriteBegin =
460
- ShouldReportListWriteBegin (mProcessingAttributePath , mProcessingAttributeIsList , pathForCheckingListWriteBegin);
463
+ ShouldReportListWriteBegin (mProcessingAttributePath , mStateFlags .Has (StateBits::kProcessingAttributeIsList ),
464
+ pathForCheckingListWriteBegin);
461
465
}
462
466
463
467
if (shouldReportListWriteEnd)
@@ -498,11 +502,10 @@ CHIP_ERROR WriteHandler::ProcessGroupAttributeDataIBs(TLV::TLVReader & aAttribut
498
502
DataModelCallbacks::GetInstance ()->AttributeOperation (DataModelCallbacks::OperationType::Write,
499
503
DataModelCallbacks::OperationOrder::Pre, dataAttributePath);
500
504
err = WriteSingleClusterData (subjectDescriptor, dataAttributePath, tmpDataReader, this );
501
-
502
505
if (err != CHIP_NO_ERROR)
503
506
{
504
507
ChipLogError (DataManagement,
505
- " WriteSingleClusterData Endpoint=%u Cluster=" ChipLogFormatMEI " Attribute =" ChipLogFormatMEI
508
+ " WriteClusterData Endpoint=%u Cluster=" ChipLogFormatMEI " Attribute =" ChipLogFormatMEI
506
509
" failed: %" CHIP_ERROR_FORMAT,
507
510
mapping.endpoint_id , ChipLogValueMEI (dataAttributePath.mClusterId ),
508
511
ChipLogValueMEI (dataAttributePath.mAttributeId ), err.Format ());
@@ -512,7 +515,7 @@ CHIP_ERROR WriteHandler::ProcessGroupAttributeDataIBs(TLV::TLVReader & aAttribut
512
515
}
513
516
514
517
dataAttributePath.mEndpointId = kInvalidEndpointId ;
515
- mProcessingAttributeIsList = dataAttributePath.IsListOperation ();
518
+ mStateFlags . Set (StateBits:: kProcessingAttributeIsList , dataAttributePath.IsListOperation () );
516
519
mProcessingAttributePath .SetValue (dataAttributePath);
517
520
iterator->Release ();
518
521
}
@@ -557,24 +560,33 @@ Status WriteHandler::ProcessWriteRequest(System::PacketBufferHandle && aPayload,
557
560
#if CHIP_CONFIG_IM_PRETTY_PRINT
558
561
writeRequestParser.PrettyPrint ();
559
562
#endif
560
- err = writeRequestParser.GetSuppressResponse (&mSuppressResponse );
563
+ bool boolValue;
564
+
565
+ boolValue = mStateFlags .Has (StateBits::kSuppressResponse );
566
+ err = writeRequestParser.GetSuppressResponse (&boolValue);
561
567
if (err == CHIP_END_OF_TLV)
562
568
{
563
569
err = CHIP_NO_ERROR;
564
570
}
565
571
SuccessOrExit (err);
572
+ mStateFlags .Set (StateBits::kSuppressResponse , boolValue);
566
573
567
- err = writeRequestParser.GetTimedRequest (&mIsTimedRequest );
574
+ boolValue = mStateFlags .Has (StateBits::kIsTimedRequest );
575
+ err = writeRequestParser.GetTimedRequest (&boolValue);
568
576
SuccessOrExit (err);
577
+ mStateFlags .Set (StateBits::kIsTimedRequest , boolValue);
569
578
570
- err = writeRequestParser.GetMoreChunkedMessages (&mHasMoreChunks );
579
+ boolValue = mStateFlags .Has (StateBits::kHasMoreChunks );
580
+ err = writeRequestParser.GetMoreChunkedMessages (&boolValue);
571
581
if (err == CHIP_ERROR_END_OF_TLV)
572
582
{
573
583
err = CHIP_NO_ERROR;
574
584
}
575
585
SuccessOrExit (err);
586
+ mStateFlags .Set (StateBits::kHasMoreChunks , boolValue);
576
587
577
- if (mHasMoreChunks && (mExchangeCtx ->IsGroupExchangeContext () || mIsTimedRequest ))
588
+ if (mStateFlags .Has (StateBits::kHasMoreChunks ) &&
589
+ (mExchangeCtx ->IsGroupExchangeContext () || mStateFlags .Has (StateBits::kIsTimedRequest )))
578
590
{
579
591
// Sanity check: group exchange context should only have one chunk.
580
592
// Also, timed requests should not have more than one chunk.
@@ -584,7 +596,7 @@ Status WriteHandler::ProcessWriteRequest(System::PacketBufferHandle && aPayload,
584
596
err = writeRequestParser.GetWriteRequests (&AttributeDataIBsParser);
585
597
SuccessOrExit (err);
586
598
587
- if (mIsTimedRequest != aIsTimedWrite)
599
+ if (mStateFlags . Has (StateBits:: kIsTimedRequest ) != aIsTimedWrite)
588
600
{
589
601
// The message thinks it should be part of a timed interaction but it's
590
602
// not, or vice versa.
@@ -641,7 +653,7 @@ CHIP_ERROR WriteHandler::AddStatusInternal(const ConcreteDataAttributePath & aPa
641
653
642
654
if (!aStatus.IsSuccess ())
643
655
{
644
- mAttributeWriteSuccessful = false ;
656
+ mStateFlags . Clear (StateBits:: kAttributeWriteSuccessful ) ;
645
657
}
646
658
647
659
ReturnErrorOnFailure (writeResponses.GetError ());
0 commit comments