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 "InvokeRequests.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 42 : CHIP_ERROR InvokeRequests::Parser::PrettyPrint() const
31 : {
32 42 : CHIP_ERROR err = CHIP_NO_ERROR;
33 42 : size_t numCommandDatas = 0;
34 42 : TLV::TLVReader reader;
35 :
36 42 : PRETTY_PRINT("InvokeRequests =");
37 42 : PRETTY_PRINT("[");
38 :
39 : // make a copy of the reader
40 42 : reader.Init(mReader);
41 :
42 88 : while (CHIP_NO_ERROR == (err = reader.Next()))
43 : {
44 46 : VerifyOrReturnError(TLV::AnonymousTag() == reader.GetTag(), CHIP_ERROR_INVALID_TLV_TAG);
45 : {
46 46 : CommandDataIB::Parser commandData;
47 46 : ReturnErrorOnFailure(commandData.Init(reader));
48 46 : PRETTY_PRINT_INCDEPTH();
49 46 : ReturnErrorOnFailure(commandData.PrettyPrint());
50 46 : PRETTY_PRINT_DECDEPTH();
51 : }
52 :
53 46 : ++numCommandDatas;
54 : }
55 :
56 42 : PRETTY_PRINT("],");
57 42 : PRETTY_PRINT_BLANK_LINE();
58 :
59 : // if we have exhausted this container
60 42 : if (CHIP_END_OF_TLV == err)
61 : {
62 : // if we have at least one data element
63 42 : if (numCommandDatas > 0)
64 : {
65 42 : err = CHIP_NO_ERROR;
66 : }
67 : }
68 42 : ReturnErrorOnFailure(err);
69 42 : return reader.ExitContainer(mOuterContainerType);
70 : }
71 : #endif // CHIP_CONFIG_IM_PRETTY_PRINT
72 :
73 39 : CHIP_ERROR InvokeRequests::Builder::InitWithEndBufferReserved(TLV::TLVWriter * const apWriter, const uint8_t aContextTagToUse)
74 : {
75 39 : ReturnErrorOnFailure(Init(apWriter, aContextTagToUse));
76 39 : ReturnErrorOnFailure(GetWriter()->ReserveBuffer(GetSizeToEndInvokeRequests()));
77 39 : mIsEndBufferReserved = true;
78 39 : return CHIP_NO_ERROR;
79 : }
80 :
81 51 : CommandDataIB::Builder & InvokeRequests::Builder::CreateCommandData()
82 : {
83 51 : if (mError == CHIP_NO_ERROR)
84 : {
85 51 : mError = mCommandData.Init(mpWriter);
86 : }
87 51 : return mCommandData;
88 : }
89 :
90 43 : CHIP_ERROR InvokeRequests::Builder::EndOfInvokeRequests()
91 : {
92 : // If any changes are made to how we end the invoke requests that involves how many bytes are
93 : // needed, a corresponding change to GetSizeToEndInvokeRequests indicating the new size that
94 : // will be required.
95 43 : if (mIsEndBufferReserved)
96 : {
97 36 : ReturnErrorOnFailure(GetWriter()->UnreserveBuffer(GetSizeToEndInvokeRequests()));
98 36 : mIsEndBufferReserved = false;
99 : }
100 43 : EndOfContainer();
101 43 : return GetError();
102 : }
103 :
104 75 : uint32_t InvokeRequests::Builder::GetSizeToEndInvokeRequests()
105 : {
106 75 : uint32_t kEndOfContainerSize = 1;
107 75 : return kEndOfContainerSize;
108 : }
109 : } // namespace app
110 : } // namespace chip
|