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 29, 2024
1 parent fef41bd commit 44484ae
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 22 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
3 changes: 1 addition & 2 deletions src/app/ReadClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -868,8 +868,7 @@ CHIP_ERROR ReadClient::ProcessAttributeReportIBs(TLV::TLVReader & aAttributeRepo
{
err = CHIP_NO_ERROR;
}

return err;
return mpCallback.GetLastError();
}

CHIP_ERROR ReadClient::ProcessEventReportIBs(TLV::TLVReader & aEventReportIBsReader)
Expand Down
5 changes: 5 additions & 0 deletions src/app/ReadClient.h
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,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 44484ae

Please sign in to comment.