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 Oct 21, 2024
1 parent 9ee0499 commit a75bf72
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 19 deletions.
25 changes: 6 additions & 19 deletions src/app/BufferedReadCallback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,8 @@ void BufferedReadCallback::OnReportBegin()

void BufferedReadCallback::OnReportEnd()
{
CHIP_ERROR err = DispatchBufferedData(mBufferedPath, StatusIB(), true);
if (err != CHIP_NO_ERROR)
{
mCallback.OnError(err);
return;
}

mError = DispatchBufferedData(mBufferedPath, StatusIB(), true);
ReturnOnFailure(mError);
mCallback.OnReportEnd();
}

Expand Down Expand Up @@ -230,21 +225,19 @@ 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);
mError = DispatchBufferedData(aPath, aStatus);
ReturnOnFailure(mError);

//
// 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);
mError = BufferData(aPath, apData);
ReturnOnFailure(mError);
}
else
{
Expand All @@ -255,12 +248,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
11 changes: 11 additions & 0 deletions src/app/BufferedReadCallback.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,15 @@ class BufferedReadCallback : public ReadClient::Callback
BufferedReadCallback(Callback & callback) : mCallback(callback) {}

private:

/*
* Retrieve the internal error in BufferedReadCallback
*/
CHIP_ERROR CheckInternalError() override
{
return mError;
}

/*
* Generates the reconsistuted TLV array from the stored individual list elements
*/
Expand Down Expand Up @@ -74,6 +83,7 @@ class BufferedReadCallback : public ReadClient::Callback
void OnError(CHIP_ERROR aError) override
{
mBufferedList.clear();
mError = CHIP_NO_ERROR;
return mCallback.OnError(aError);
}

Expand Down Expand Up @@ -131,6 +141,7 @@ class BufferedReadCallback : public ReadClient::Callback
ConcreteDataAttributePath mBufferedPath;
std::vector<System::PacketBufferHandle> mBufferedList;
Callback & mCallback;
CHIP_ERROR mError = CHIP_NO_ERROR;
};

} // namespace app
Expand Down
1 change: 1 addition & 0 deletions src/app/ReadClient.cpp
Original file line number Diff line number Diff line change
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.CheckInternalError());
}
else if (CHIP_END_OF_TLV == err)
{
Expand Down
6 changes: 6 additions & 0 deletions src/app/ReadClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,12 @@ class ReadClient : public Messaging::ExchangeDelegate
* things like min/max intervals based on the session parameters).
*/
virtual void OnCASESessionEstablished(const SessionHandle & aSession, ReadPrepareParams & aSubscriptionParams) {}

/*
* return the internal fatal error in callback
*/
virtual CHIP_ERROR CheckInternalError() { return CHIP_NO_ERROR; }

};

enum class InteractionType : uint8_t
Expand Down

0 comments on commit a75bf72

Please sign in to comment.