@@ -205,34 +205,50 @@ CHIP_ERROR InteractionModelEngine::OnInvokeCommandRequest(Messaging::ExchangeCon
205
205
return CHIP_NO_ERROR;
206
206
}
207
207
208
- CHIP_ERROR InteractionModelEngine::OnReadInitialRequest (Messaging::ExchangeContext * apExchangeContext,
209
- const PayloadHeader & aPayloadHeader,
210
- System::PacketBufferHandle && aPayload,
211
- ReadHandler::InteractionType aInteractionType,
212
- Protocols::InteractionModel::Status & aStatus)
208
+ CHIP_ERROR InteractionModelEngine::ShutdownExistingSubscriptionsIfNeeded (Messaging::ExchangeContext * apExchangeContext,
209
+ System::PacketBufferHandle && aPayload)
213
210
{
214
- ChipLogDetail (InteractionModel, " Received %s request" ,
215
- aInteractionType == ReadHandler::InteractionType::Subscribe ? " Subscribe" : " Read" );
211
+ bool keepSubscriptions = true ;
212
+ System::PacketBufferTLVReader reader;
213
+ reader.Init (std::move (aPayload));
214
+ ReturnErrorOnFailure (reader.Next ());
215
+ SubscribeRequestMessage::Parser subscribeRequestParser;
216
+ ReturnErrorOnFailure (subscribeRequestParser.Init (reader));
217
+ CHIP_ERROR err = subscribeRequestParser.GetKeepSubscriptions (&keepSubscriptions);
218
+ if (CHIP_END_OF_TLV == err)
219
+ {
220
+ return CHIP_NO_ERROR;
221
+ }
222
+ else if (CHIP_NO_ERROR != err)
223
+ {
224
+ return err;
225
+ }
226
+
227
+ if (keepSubscriptions)
228
+ {
229
+ return CHIP_NO_ERROR;
230
+ }
216
231
217
232
for (auto & readHandler : mReadHandlers )
218
233
{
219
234
if (!readHandler.IsFree () && readHandler.IsSubscriptionType () &&
220
235
readHandler.GetInitiatorNodeId () == apExchangeContext->GetSessionHandle ()->AsSecureSession ()->GetPeerNodeId () &&
221
236
readHandler.GetAccessingFabricIndex () == apExchangeContext->GetSessionHandle ()->AsSecureSession ()->GetFabricIndex ())
222
237
{
223
- bool keepSubscriptions = true ;
224
- System::PacketBufferTLVReader reader;
225
- reader.Init (aPayload.Retain ());
226
- ReturnErrorOnFailure (reader.Next ());
227
- SubscribeRequestMessage::Parser subscribeRequestParser;
228
- ReturnErrorOnFailure (subscribeRequestParser.Init (reader));
229
- CHIP_ERROR err = subscribeRequestParser.GetKeepSubscriptions (&keepSubscriptions);
230
- if (err == CHIP_NO_ERROR && !keepSubscriptions)
231
- {
232
- readHandler.Shutdown (ReadHandler::ShutdownOptions::AbortCurrentExchange);
233
- }
238
+ readHandler.Shutdown (ReadHandler::ShutdownOptions::AbortCurrentExchange);
234
239
}
235
240
}
241
+ return CHIP_NO_ERROR;
242
+ }
243
+
244
+ CHIP_ERROR InteractionModelEngine::OnReadInitialRequest (Messaging::ExchangeContext * apExchangeContext,
245
+ const PayloadHeader & aPayloadHeader,
246
+ System::PacketBufferHandle && aPayload,
247
+ ReadHandler::InteractionType aInteractionType,
248
+ Protocols::InteractionModel::Status & aStatus)
249
+ {
250
+ ChipLogDetail (InteractionModel, " Received %s request" ,
251
+ aInteractionType == ReadHandler::InteractionType::Subscribe ? " Subscribe" : " Read" );
236
252
237
253
// Reserve the last ReadHandler for ReadInteraction
238
254
if (aInteractionType == ReadHandler::InteractionType::Subscribe &&
@@ -355,7 +371,9 @@ CHIP_ERROR InteractionModelEngine::OnMessageReceived(Messaging::ExchangeContext
355
371
}
356
372
else if (aPayloadHeader.HasMessageType (Protocols::InteractionModel::MsgType::SubscribeRequest))
357
373
{
358
- SuccessOrExit (OnReadInitialRequest (apExchangeContext, aPayloadHeader, std::move (aPayload),
374
+ System::PacketBufferHandle payload = aPayload.Retain ();
375
+ SuccessOrExit (ShutdownExistingSubscriptionsIfNeeded (apExchangeContext, std::move (aPayload)));
376
+ SuccessOrExit (OnReadInitialRequest (apExchangeContext, aPayloadHeader, std::move (payload),
359
377
ReadHandler::InteractionType::Subscribe, status));
360
378
}
361
379
else if (aPayloadHeader.HasMessageType (Protocols::InteractionModel::MsgType::ReportData))
0 commit comments