Skip to content

Commit

Permalink
Handle internal fatal error in BufferReadCallback
Browse files Browse the repository at this point in the history
  • Loading branch information
yunhanw-google committed Nov 14, 2024
1 parent fef41bd commit b24d465
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 20 deletions.
24 changes: 7 additions & 17 deletions src/app/BufferedReadCallback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,8 @@ void BufferedReadCallback::OnReportBegin()
void BufferedReadCallback::OnReportEnd()
{
CHIP_ERROR err = DispatchBufferedData(mBufferedPath, StatusIB(), true);
if (err != CHIP_NO_ERROR)
{
mCallback.OnError(err);
return;
}

SetFatalReportError(err);
ReturnOnFailure(err);
mCallback.OnReportEnd();
}

Expand Down Expand Up @@ -230,21 +226,21 @@ CHIP_ERROR BufferedReadCallback::DispatchBufferedData(const ConcreteAttributePat
void BufferedReadCallback::OnAttributeData(const ConcreteDataAttributePath & aPath, TLV::TLVReader * apData,
const StatusIB & aStatus)
{
CHIP_ERROR err;

//
// First, let's dispatch to our registered callback any buffered up list data from previous calls.
//
err = DispatchBufferedData(aPath, aStatus);
SuccessOrExit(err);
CHIP_ERROR err = DispatchBufferedData(aPath, aStatus);
SetFatalReportError(err);
ReturnOnFailure(err);

//
// We buffer up list data (only if the status was successful)
//
if (aPath.IsListOperation() && aStatus.mStatus == Protocols::InteractionModel::Status::Success)
{
err = BufferData(aPath, apData);
SuccessOrExit(err);
SetFatalReportError(err);
ReturnOnFailure(err);
}
else
{
Expand All @@ -255,12 +251,6 @@ void BufferedReadCallback::OnAttributeData(const ConcreteDataAttributePath & aPa
// Update our latched buffered path.
//
mBufferedPath = aPath;

exit:
if (err != CHIP_NO_ERROR)
{
mCallback.OnError(err);
}
}

} // namespace app
Expand Down
2 changes: 1 addition & 1 deletion src/app/BufferedReadCallback.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class BufferedReadCallback : public ReadClient::Callback

private:
/*
* Generates the reconsistuted TLV array from the stored individual list elements
* Generates the reconstituted TLV array from the stored individual list elements
*/
CHIP_ERROR GenerateListTLV(TLV::ScopedBufferTLVReader & reader);

Expand Down
7 changes: 5 additions & 2 deletions src/app/ReadClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ void ReadClient::Close(CHIP_ERROR aError, bool allowResubscription)
}

mExchange.Release();

mpCallback.ClearFatalReportError();
mpCallback.OnDone(this);
}

Expand Down Expand Up @@ -805,6 +805,7 @@ CHIP_ERROR ReadClient::ProcessAttributeReportIBs(TLV::TLVReader & aAttributeRepo
ReturnErrorOnFailure(errorStatus.DecodeStatusIB(statusIB));
NoteReportingData();
mpCallback.OnAttributeData(attributePath, nullptr, statusIB);
ReturnErrorOnFailure(mpCallback.GetLastFatalReportError());
}
else if (CHIP_END_OF_TLV == err)
{
Expand Down Expand Up @@ -861,14 +862,14 @@ CHIP_ERROR ReadClient::ProcessAttributeReportIBs(TLV::TLVReader & aAttributeRepo

NoteReportingData();
mpCallback.OnAttributeData(attributePath, &dataReader, statusIB);
ReturnErrorOnFailure(mpCallback.GetLastFatalReportError());
}
}

if (CHIP_END_OF_TLV == err)
{
err = CHIP_NO_ERROR;
}

return err;
}

Expand Down Expand Up @@ -905,6 +906,7 @@ CHIP_ERROR ReadClient::ProcessEventReportIBs(TLV::TLVReader & aEventReportIBsRea

NoteReportingData();
mpCallback.OnEventData(header, &dataReader, nullptr);
ReturnErrorOnFailure(mpCallback.GetLastFatalReportError());
}
else if (err == CHIP_END_OF_TLV)
{
Expand All @@ -919,6 +921,7 @@ CHIP_ERROR ReadClient::ProcessEventReportIBs(TLV::TLVReader & aEventReportIBsRea

NoteReportingData();
mpCallback.OnEventData(header, nullptr, &statusIB);
ReturnErrorOnFailure(mpCallback.GetLastFatalReportError());
}
}

Expand Down
21 changes: 21 additions & 0 deletions src/app/ReadClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,8 @@ class ReadClient : public Messaging::ExchangeDelegate
* This object MUST continue to exist after this call is completed. The application shall wait until it
* receives an OnDone call to destroy the object.
*
* This callback is expected to be called inside the ReadClient.
*
* @param[in] aError A system error code that conveys the overall error code.
*/
virtual void OnError(CHIP_ERROR aError) {}
Expand Down Expand Up @@ -284,6 +286,25 @@ class ReadClient : public Messaging::ExchangeDelegate
* things like min/max intervals based on the session parameters).
*/
virtual void OnCASESessionEstablished(const SessionHandle & aSession, ReadPrepareParams & aSubscriptionParams) {}

/*
* Get the last internal fatal error in callback
*/
CHIP_ERROR GetLastFatalReportError() const { return mLastFatalReportError; }

protected:
/*
* Set the fatal report fatal error in callback which would lead to ReadClient::Close()
*/
void SetFatalReportError(CHIP_ERROR aError) { mLastFatalReportError = aError; }

/*
* Clear the fatal report fatal error
*/
void ClearFatalReportError() { mLastFatalReportError = CHIP_NO_ERROR; }

private:
CHIP_ERROR mLastFatalReportError = CHIP_NO_ERROR;
};

enum class InteractionType : uint8_t
Expand Down

0 comments on commit b24d465

Please sign in to comment.