Skip to content

Commit 9891361

Browse files
yunhanw-googlepull[bot]
authored andcommitted
apply keepSubscription logic for subscription only (#13807)
1 parent 8d8b494 commit 9891361

File tree

2 files changed

+40
-19
lines changed

2 files changed

+40
-19
lines changed

src/app/InteractionModelEngine.cpp

+37-19
Original file line numberDiff line numberDiff line change
@@ -205,34 +205,50 @@ CHIP_ERROR InteractionModelEngine::OnInvokeCommandRequest(Messaging::ExchangeCon
205205
return CHIP_NO_ERROR;
206206
}
207207

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)
213210
{
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+
}
216231

217232
for (auto & readHandler : mReadHandlers)
218233
{
219234
if (!readHandler.IsFree() && readHandler.IsSubscriptionType() &&
220235
readHandler.GetInitiatorNodeId() == apExchangeContext->GetSessionHandle()->AsSecureSession()->GetPeerNodeId() &&
221236
readHandler.GetAccessingFabricIndex() == apExchangeContext->GetSessionHandle()->AsSecureSession()->GetFabricIndex())
222237
{
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);
234239
}
235240
}
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");
236252

237253
// Reserve the last ReadHandler for ReadInteraction
238254
if (aInteractionType == ReadHandler::InteractionType::Subscribe &&
@@ -355,7 +371,9 @@ CHIP_ERROR InteractionModelEngine::OnMessageReceived(Messaging::ExchangeContext
355371
}
356372
else if (aPayloadHeader.HasMessageType(Protocols::InteractionModel::MsgType::SubscribeRequest))
357373
{
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),
359377
ReadHandler::InteractionType::Subscribe, status));
360378
}
361379
else if (aPayloadHeader.HasMessageType(Protocols::InteractionModel::MsgType::ReportData))

src/app/InteractionModelEngine.h

+3
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,9 @@ class InteractionModelEngine : public Messaging::ExchangeDelegate, public Comman
232232

233233
bool HasActiveRead();
234234

235+
CHIP_ERROR ShutdownExistingSubscriptionsIfNeeded(Messaging::ExchangeContext * apExchangeContext,
236+
System::PacketBufferHandle && aPayload);
237+
235238
Messaging::ExchangeManager * mpExchangeMgr = nullptr;
236239
InteractionModelDelegate * mpDelegate = nullptr;
237240

0 commit comments

Comments
 (0)