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 4, 2024
1 parent fef41bd commit 8940d43
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 21 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;
}

mLastError = DispatchBufferedData(mBufferedPath, StatusIB(), true);
ReturnOnFailure(mLastError);
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);
mLastError = DispatchBufferedData(aPath, aStatus);
ReturnOnFailure(mLastError);

//
// 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);
mLastError = BufferData(aPath, apData);
ReturnOnFailure(mLastError);
}
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
16 changes: 15 additions & 1 deletion src/app/BufferedReadCallback.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,19 @@ class BufferedReadCallback : public ReadClient::Callback

private:
/*
* Generates the reconsistuted TLV array from the stored individual list elements
* Get the last internal fatal error in BufferedReadCallback
* @retval #CHIP_NO_ERROR If the method succeeded.
* @retval #CHIP_ERROR_INVALID_TLV_ELEMENT
* If bufferred list data is not TLV Array
* @retval #CHIP_ERROR_NO_MEMORY
* If an attempt to allocate an buffer failed due to lack of
* memory.
* @retval other Other CHIP or platform-specific errors.
*/
CHIP_ERROR GetLastError() const override { return mLastError; }

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

Expand Down Expand Up @@ -74,6 +86,7 @@ class BufferedReadCallback : public ReadClient::Callback
void OnError(CHIP_ERROR aError) override
{
mBufferedList.clear();
mLastError = CHIP_NO_ERROR;
return mCallback.OnError(aError);
}

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

} // namespace app
Expand Down
5 changes: 4 additions & 1 deletion 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.GetLastError());
}
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.GetLastError());
}
}

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.GetLastError());
}
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.GetLastError());
}
}

Expand Down
7 changes: 7 additions & 0 deletions src/app/ReadClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,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.
*/
Expand Down Expand Up @@ -284,6 +286,11 @@ 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
*/
virtual CHIP_ERROR GetLastError() const { return CHIP_NO_ERROR; }
};

enum class InteractionType : uint8_t
Expand Down

0 comments on commit 8940d43

Please sign in to comment.