LCOV - code coverage report
Current view: top level - app/MessageDef - CommandPathIB.cpp (source / functions) Hit Total Coverage
Test: lcov_final.info Lines: 69 73 94.5 %
Date: 2024-02-15 08:20:41 Functions: 12 12 100.0 %

          Line data    Source code
       1             : /**
       2             :  *
       3             :  *    Copyright (c) 2020 Project CHIP Authors
       4             :  *    Copyright (c) 2018 Google LLC.
       5             :  *    Copyright (c) 2016-2017 Nest Labs, Inc.
       6             :  *    Licensed under the Apache License, Version 2.0 (the "License");
       7             :  *    you may not use this file except in compliance with the License.
       8             :  *    You may obtain a copy of the License at
       9             :  *
      10             :  *        http://www.apache.org/licenses/LICENSE-2.0
      11             :  *
      12             :  *    Unless required by applicable law or agreed to in writing, software
      13             :  *    distributed under the License is distributed on an "AS IS" BASIS,
      14             :  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      15             :  *    See the License for the specific language governing permissions and
      16             :  *    limitations under the License.
      17             :  */
      18             : 
      19             : #include "CommandPathIB.h"
      20             : 
      21             : #include "MessageDefHelper.h"
      22             : 
      23             : #include <inttypes.h>
      24             : #include <stdarg.h>
      25             : #include <stdio.h>
      26             : 
      27             : #include <app/AppConfig.h>
      28             : 
      29             : #include <protocols/interaction_model/Constants.h>
      30             : 
      31             : using namespace chip;
      32             : using namespace chip::TLV;
      33             : 
      34             : namespace chip {
      35             : namespace app {
      36             : #if CHIP_CONFIG_IM_PRETTY_PRINT
      37          82 : CHIP_ERROR CommandPathIB::Parser::PrettyPrint() const
      38             : {
      39          82 :     CHIP_ERROR err = CHIP_NO_ERROR;
      40             :     TLV::TLVReader reader;
      41          82 :     PRETTY_PRINT("CommandPathIB =");
      42          82 :     PRETTY_PRINT("{");
      43             : 
      44             :     // make a copy of the Path reader
      45          82 :     reader.Init(mReader);
      46             : 
      47         328 :     while (CHIP_NO_ERROR == (err = reader.Next()))
      48             :     {
      49         246 :         if (!TLV::IsContextTag(reader.GetTag()))
      50             :         {
      51           0 :             continue;
      52             :         }
      53         246 :         uint32_t tagNum = TLV::TagNumFromTag(reader.GetTag());
      54         246 :         switch (tagNum)
      55             :         {
      56          82 :         case to_underlying(Tag::kEndpointId):
      57          82 :             VerifyOrReturnError(TLV::kTLVType_UnsignedInteger == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
      58             : 
      59             : #if CHIP_DETAIL_LOGGING
      60             :             {
      61             :                 uint16_t endpointId;
      62          82 :                 ReturnErrorOnFailure(reader.Get(endpointId));
      63          82 :                 PRETTY_PRINT("\tEndpointId = 0x%x,", endpointId);
      64             :             }
      65             : #endif // CHIP_DETAIL_LOGGING
      66          82 :             break;
      67          82 :         case to_underlying(Tag::kClusterId):
      68          82 :             VerifyOrReturnError(TLV::kTLVType_UnsignedInteger == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
      69             : #if CHIP_DETAIL_LOGGING
      70             :             {
      71             :                 chip::ClusterId clusterId;
      72          82 :                 ReturnErrorOnFailure(reader.Get(clusterId));
      73          82 :                 PRETTY_PRINT("\tClusterId = 0x%" PRIx32 ",", clusterId);
      74             :             }
      75             : #endif // CHIP_DETAIL_LOGGING
      76          82 :             break;
      77          82 :         case to_underlying(Tag::kCommandId):
      78          82 :             VerifyOrReturnError(chip::TLV::kTLVType_UnsignedInteger == reader.GetType(), CHIP_ERROR_WRONG_TLV_TYPE);
      79             : #if CHIP_DETAIL_LOGGING
      80             :             {
      81             :                 chip::CommandId commandId;
      82          82 :                 ReturnErrorOnFailure(reader.Get(commandId));
      83          82 :                 PRETTY_PRINT("\tCommandId = 0x%" PRIx32 ",", commandId);
      84             :             }
      85             : #endif // CHIP_DETAIL_LOGGING
      86          82 :             break;
      87           0 :         default:
      88           0 :             PRETTY_PRINT("Unknown tag num %" PRIu32, tagNum);
      89           0 :             break;
      90             :         }
      91             :     }
      92          82 :     PRETTY_PRINT("},");
      93          82 :     PRETTY_PRINT_BLANK_LINE();
      94             :     // if we have exhausted this container
      95          82 :     if (CHIP_END_OF_TLV == err)
      96             :     {
      97          82 :         err = CHIP_NO_ERROR;
      98             :     }
      99          82 :     ReturnErrorOnFailure(err);
     100          82 :     return reader.ExitContainer(mOuterContainerType);
     101             : }
     102             : #endif // CHIP_CONFIG_IM_PRETTY_PRINT
     103             : 
     104         101 : CHIP_ERROR CommandPathIB::Parser::GetEndpointId(chip::EndpointId * const apEndpointID) const
     105             : {
     106         101 :     return GetUnsignedInteger(to_underlying(Tag::kEndpointId), apEndpointID);
     107             : }
     108             : 
     109         102 : CHIP_ERROR CommandPathIB::Parser::GetClusterId(chip::ClusterId * const apClusterId) const
     110             : {
     111         102 :     return GetUnsignedInteger(to_underlying(Tag::kClusterId), apClusterId);
     112             : }
     113             : 
     114         101 : CHIP_ERROR CommandPathIB::Parser::GetCommandId(chip::CommandId * const apCommandId) const
     115             : {
     116         101 :     return GetUnsignedInteger(to_underlying(Tag::kCommandId), apCommandId);
     117             : }
     118             : 
     119          70 : CHIP_ERROR CommandPathIB::Parser::GetConcreteCommandPath(ConcreteCommandPath & aCommandPath) const
     120             : {
     121          70 :     ReturnErrorOnFailure(GetGroupCommandPath(&aCommandPath.mClusterId, &aCommandPath.mCommandId));
     122             : 
     123          69 :     return GetEndpointId(&aCommandPath.mEndpointId);
     124             : }
     125             : 
     126          70 : CHIP_ERROR CommandPathIB::Parser::GetGroupCommandPath(ClusterId * apClusterId, CommandId * apCommandId) const
     127             : {
     128          70 :     ReturnErrorOnFailure(GetClusterId(apClusterId));
     129          70 :     VerifyOrReturnError(IsValidClusterId(*apClusterId), CHIP_IM_GLOBAL_STATUS(InvalidAction));
     130             : 
     131          69 :     ReturnErrorOnFailure(GetCommandId(apCommandId));
     132          69 :     VerifyOrReturnError(IsValidCommandId(*apCommandId), CHIP_IM_GLOBAL_STATUS(InvalidAction));
     133             : 
     134          69 :     return CHIP_NO_ERROR;
     135             : }
     136             : 
     137         111 : CommandPathIB::Builder & CommandPathIB::Builder::EndpointId(const chip::EndpointId aEndpointId)
     138             : {
     139             :     // skip if error has already been set
     140         111 :     if (mError == CHIP_NO_ERROR)
     141             :     {
     142         111 :         mError = mpWriter->Put(TLV::ContextTag(Tag::kEndpointId), aEndpointId);
     143             :     }
     144         111 :     return *this;
     145             : }
     146             : 
     147         111 : CommandPathIB::Builder & CommandPathIB::Builder::ClusterId(const chip::ClusterId aClusterId)
     148             : {
     149             :     // skip if error has already been set
     150         111 :     if (mError == CHIP_NO_ERROR)
     151             :     {
     152         111 :         mError = mpWriter->Put(TLV::ContextTag(Tag::kClusterId), aClusterId);
     153             :     }
     154         111 :     return *this;
     155             : }
     156             : 
     157         111 : CommandPathIB::Builder & CommandPathIB::Builder::CommandId(const chip::CommandId aCommandId)
     158             : {
     159             :     // skip if error has already been set
     160         111 :     if (mError == CHIP_NO_ERROR)
     161             :     {
     162         111 :         mError = mpWriter->Put(TLV::ContextTag(Tag::kCommandId), aCommandId);
     163             :     }
     164         111 :     return *this;
     165             : }
     166             : 
     167         111 : CHIP_ERROR CommandPathIB::Builder::EndOfCommandPathIB()
     168             : {
     169         111 :     EndOfContainer();
     170         111 :     return GetError();
     171             : }
     172             : 
     173          40 : CHIP_ERROR CommandPathIB::Builder::Encode(const CommandPathParams & aCommandPathParams)
     174             : {
     175          40 :     if (aCommandPathParams.mFlags.Has(CommandPathFlags::kEndpointIdValid))
     176             :     {
     177          40 :         EndpointId(aCommandPathParams.mEndpointId);
     178             :     }
     179             : 
     180          40 :     return ClusterId(aCommandPathParams.mClusterId).CommandId(aCommandPathParams.mCommandId).EndOfCommandPathIB();
     181             : }
     182             : 
     183          55 : CHIP_ERROR CommandPathIB::Builder::Encode(const ConcreteCommandPath & aConcreteCommandPath)
     184             : {
     185          55 :     return EndpointId(aConcreteCommandPath.mEndpointId)
     186          55 :         .ClusterId(aConcreteCommandPath.mClusterId)
     187          55 :         .CommandId(aConcreteCommandPath.mCommandId)
     188          55 :         .EndOfCommandPathIB();
     189             : }
     190             : 
     191             : }; // namespace app
     192             : }; // namespace chip

Generated by: LCOV version 1.14