Line data Source code
1 : /**
2 : *
3 : * Copyright (c) 2021 Project CHIP Authors
4 : * Licensed under the Apache License, Version 2.0 (the "License");
5 : * you may not use this file except in compliance with the License.
6 : * You may obtain a copy of the License at
7 : *
8 : * http://www.apache.org/licenses/LICENSE-2.0
9 : *
10 : * Unless required by applicable law or agreed to in writing, software
11 : * distributed under the License is distributed on an "AS IS" BASIS,
12 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 : * See the License for the specific language governing permissions and
14 : * limitations under the License.
15 : */
16 :
17 : #include "InvokeResponseIBs.h"
18 :
19 : #include "MessageDefHelper.h"
20 :
21 : #include <inttypes.h>
22 : #include <stdarg.h>
23 : #include <stdio.h>
24 :
25 : #include <app/AppConfig.h>
26 :
27 : namespace chip {
28 : namespace app {
29 : #if CHIP_CONFIG_IM_PRETTY_PRINT
30 29 : CHIP_ERROR InvokeResponseIBs::Parser::PrettyPrint() const
31 : {
32 29 : CHIP_ERROR err = CHIP_NO_ERROR;
33 29 : size_t numInvokeResponses = 0;
34 29 : TLV::TLVReader reader;
35 :
36 29 : PRETTY_PRINT("InvokeResponseIBs =");
37 29 : PRETTY_PRINT("[");
38 :
39 : // make a copy of the reader
40 29 : reader.Init(mReader);
41 :
42 65 : while (CHIP_NO_ERROR == (err = reader.Next()))
43 : {
44 36 : VerifyOrReturnError(TLV::AnonymousTag() == reader.GetTag(), CHIP_ERROR_INVALID_TLV_TAG);
45 : {
46 36 : InvokeResponseIB::Parser invokeResponse;
47 36 : ReturnErrorOnFailure(invokeResponse.Init(reader));
48 36 : PRETTY_PRINT_INCDEPTH();
49 36 : ReturnErrorOnFailure(invokeResponse.PrettyPrint());
50 36 : PRETTY_PRINT_DECDEPTH();
51 : }
52 :
53 36 : ++numInvokeResponses;
54 : }
55 :
56 29 : PRETTY_PRINT("],");
57 29 : PRETTY_PRINT_BLANK_LINE();
58 :
59 : // if we have exhausted this container
60 29 : if (CHIP_END_OF_TLV == err)
61 : {
62 : // if we have at least one response
63 29 : if (numInvokeResponses > 0)
64 : {
65 29 : err = CHIP_NO_ERROR;
66 : }
67 : }
68 29 : ReturnErrorOnFailure(err);
69 29 : return reader.ExitContainer(mOuterContainerType);
70 : }
71 : #endif // CHIP_CONFIG_IM_PRETTY_PRINT
72 :
73 49 : CHIP_ERROR InvokeResponseIBs::Builder::InitWithEndBufferReserved(TLV::TLVWriter * const apWriter, const uint8_t aContextTagToUse)
74 : {
75 49 : ReturnErrorOnFailure(Init(apWriter, aContextTagToUse));
76 49 : ReturnErrorOnFailure(GetWriter()->ReserveBuffer(GetSizeToEndInvokeResponses()));
77 49 : mIsEndBufferReserved = true;
78 49 : return CHIP_NO_ERROR;
79 : }
80 :
81 67 : InvokeResponseIB::Builder & InvokeResponseIBs::Builder::CreateInvokeResponse()
82 : {
83 67 : if (mError == CHIP_NO_ERROR)
84 : {
85 67 : mError = mInvokeResponse.Init(mpWriter);
86 : }
87 67 : return mInvokeResponse;
88 : }
89 :
90 47 : CHIP_ERROR InvokeResponseIBs::Builder::EndOfInvokeResponses()
91 : {
92 : // If any changes are made to how we end the invoke responses that involves how many bytes are
93 : // needed, a corresponding change to GetSizeToEndInvokeResponses indicating the new size that
94 : // will be required.
95 47 : if (mIsEndBufferReserved)
96 : {
97 41 : ReturnErrorOnFailure(GetWriter()->UnreserveBuffer(GetSizeToEndInvokeResponses()));
98 41 : mIsEndBufferReserved = false;
99 : }
100 47 : EndOfContainer();
101 47 : return GetError();
102 : }
103 :
104 90 : uint32_t InvokeResponseIBs::Builder::GetSizeToEndInvokeResponses()
105 : {
106 90 : uint32_t kEndOfContainerSize = 1;
107 90 : return kEndOfContainerSize;
108 : }
109 : } // namespace app
110 : } // namespace chip
|