Matter SDK Coverage Report
Current view: top level - app - SimpleSubscriptionResumptionStorage.h (source / functions) Coverage Total Hit
Test: SHA:b879ecb8e99e175eea0a293a888bda853da2b19c Lines: 100.0 % 8 8
Test Date: 2025-01-17 19:00:11 Functions: 100.0 % 3 3

            Line data    Source code
       1              : /*
       2              :  *    Copyright (c) 2023 Project CHIP Authors
       3              :  *    All rights reserved.
       4              :  *
       5              :  *    Licensed under the Apache License, Version 2.0 (the "License");
       6              :  *    you may not use this file except in compliance with the License.
       7              :  *    You may obtain a copy of the License at
       8              :  *
       9              :  *        http://www.apache.org/licenses/LICENSE-2.0
      10              :  *
      11              :  *    Unless required by applicable law or agreed to in writing, software
      12              :  *    distributed under the License is distributed on an "AS IS" BASIS,
      13              :  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      14              :  *    See the License for the specific language governing permissions and
      15              :  *    limitations under the License.
      16              :  */
      17              : 
      18              : /**
      19              :  *    @file
      20              :  *      This file defines a basic implementation of SubscriptionResumptionStorage that
      21              :  *      persists subscriptions in a flat list in TLV.
      22              :  */
      23              : 
      24              : #pragma once
      25              : 
      26              : #include <app/SubscriptionResumptionStorage.h>
      27              : 
      28              : #include <lib/core/TLV.h>
      29              : #include <lib/support/DefaultStorageKeyAllocator.h>
      30              : #include <lib/support/Pool.h>
      31              : 
      32              : namespace chip {
      33              : namespace app {
      34              : 
      35              : /**
      36              :  * An example SubscriptionResumptionStorage using PersistentStorageDelegate as it backend.
      37              :  */
      38              : class SimpleSubscriptionResumptionStorage : public SubscriptionResumptionStorage
      39              : {
      40              : public:
      41              :     static constexpr size_t kIteratorsMax = CHIP_CONFIG_MAX_SUBSCRIPTION_RESUMPTION_STORAGE_CONCURRENT_ITERATORS;
      42              : 
      43              :     CHIP_ERROR Init(PersistentStorageDelegate * storage);
      44              : 
      45              :     SubscriptionInfoIterator * IterateSubscriptions() override;
      46              : 
      47              :     CHIP_ERROR Save(SubscriptionInfo & subscriptionInfo) override;
      48              : 
      49              :     CHIP_ERROR Delete(NodeId nodeId, FabricIndex fabricIndex, SubscriptionId subscriptionId) override;
      50              : 
      51              :     CHIP_ERROR DeleteAll(FabricIndex fabricIndex) override;
      52              : 
      53              : protected:
      54              :     CHIP_ERROR Save(TLV::TLVWriter & writer, SubscriptionInfo & subscriptionInfo);
      55              :     CHIP_ERROR Load(uint16_t subscriptionIndex, SubscriptionInfo & subscriptionInfo);
      56              :     CHIP_ERROR Delete(uint16_t subscriptionIndex);
      57              :     uint16_t Count();
      58              :     CHIP_ERROR DeleteMaxCount();
      59              : 
      60              :     class SimpleSubscriptionInfoIterator : public SubscriptionInfoIterator
      61              :     {
      62              :     public:
      63              :         SimpleSubscriptionInfoIterator(SimpleSubscriptionResumptionStorage & storage);
      64              :         size_t Count() override;
      65              :         bool Next(SubscriptionInfo & output) override;
      66              :         void Release() override;
      67              : 
      68              :     private:
      69              :         SimpleSubscriptionResumptionStorage & mStorage;
      70              :         uint16_t mNextIndex;
      71              :     };
      72              : 
      73          440 :     static constexpr size_t MaxScopedNodeIdSize() { return TLV::EstimateStructOverhead(sizeof(NodeId), sizeof(FabricIndex)); }
      74              : 
      75          440 :     static constexpr size_t MaxSubscriptionPathsSize()
      76              :     {
      77              :         // IM engine declares an attribute path pool and an event path pool, and each pool
      78              :         // includes CHIP_IM_SERVER_MAX_NUM_PATH_GROUPS_FOR_SUBSCRIPTIONS for subscriptions
      79              :         return 2 *
      80          440 :             TLV::EstimateStructOverhead(
      81          440 :                    TLV::EstimateStructOverhead(sizeof(uint8_t), sizeof(EndpointId), sizeof(ClusterId), sizeof(AttributeId)) *
      82          440 :                    CHIP_IM_SERVER_MAX_NUM_PATH_GROUPS_FOR_SUBSCRIPTIONS);
      83              :     }
      84              : 
      85          440 :     static constexpr size_t MaxSubscriptionSize()
      86              :     {
      87              :         // All the fields added together
      88          440 :         return TLV::EstimateStructOverhead(MaxScopedNodeIdSize(), sizeof(SubscriptionId), sizeof(uint16_t), sizeof(uint16_t),
      89          440 :                                            sizeof(bool), MaxSubscriptionPathsSize());
      90              :     }
      91              : 
      92              :     enum class EventPathType : uint8_t
      93              :     {
      94              :         kUrgent    = 0x1,
      95              :         kNonUrgent = 0x2,
      96              :     };
      97              : 
      98              :     // Flat list of subscriptions indexed from from 0 to CHIP_IM_SERVER_MAX_NUM_PATH_GROUPS_FOR_SUBSCRIPTIONS-1
      99              :     //
     100              :     // Each entry in list is a Subscription TLV structure:
     101              :     //   Structure of: (Subscription info)
     102              :     //     Node ID
     103              :     //     Fabric Index
     104              :     //     Subscription ID
     105              :     //     Min interval
     106              :     //     Max interval
     107              :     //     Fabric filtered boolean
     108              :     //     List of:
     109              :     //       Structure of: (Attribute path)
     110              :     //         Endpoint ID
     111              :     //         Cluster ID
     112              :     //         Attribute ID
     113              :     //     List of:
     114              :     //       Structure of: (Event path)
     115              :     //         Event subscription type (urgent / non-urgent)
     116              :     //         Endpoint ID
     117              :     //         Cluster ID
     118              :     //         Event ID
     119              : 
     120              :     static constexpr TLV::Tag kPeerNodeIdTag         = TLV::ContextTag(1);
     121              :     static constexpr TLV::Tag kFabricIndexTag        = TLV::ContextTag(2);
     122              :     static constexpr TLV::Tag kSubscriptionIdTag     = TLV::ContextTag(3);
     123              :     static constexpr TLV::Tag kMinIntervalTag        = TLV::ContextTag(4);
     124              :     static constexpr TLV::Tag kMaxIntervalTag        = TLV::ContextTag(5);
     125              :     static constexpr TLV::Tag kFabricFilteredTag     = TLV::ContextTag(6);
     126              :     static constexpr TLV::Tag kAttributePathsListTag = TLV::ContextTag(7);
     127              :     static constexpr TLV::Tag kEventPathsListTag     = TLV::ContextTag(8);
     128              :     static constexpr TLV::Tag kAttributePathTag      = TLV::ContextTag(9);
     129              :     static constexpr TLV::Tag kEventPathTag          = TLV::ContextTag(10);
     130              :     static constexpr TLV::Tag kEndpointIdTag         = TLV::ContextTag(11);
     131              :     static constexpr TLV::Tag kClusterIdTag          = TLV::ContextTag(12);
     132              :     static constexpr TLV::Tag kAttributeIdTag        = TLV::ContextTag(13);
     133              :     static constexpr TLV::Tag kEventIdTag            = TLV::ContextTag(14);
     134              :     static constexpr TLV::Tag kEventPathTypeTag      = TLV::ContextTag(16);
     135              :     static constexpr TLV::Tag kResumptionRetriesTag  = TLV::ContextTag(17);
     136              : 
     137              :     PersistentStorageDelegate * mStorage;
     138              :     ObjectPool<SimpleSubscriptionInfoIterator, kIteratorsMax> mSubscriptionInfoIterators;
     139              : };
     140              : } // namespace app
     141              : } // namespace chip
        

Generated by: LCOV version 2.0-1