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