LCOV - code coverage report
Current view: top level - lib/dnssd/minimal_mdns - QueryReplyFilter.h (source / functions) Hit Total Coverage
Test: lcov_final.info Lines: 22 23 95.7 %
Date: 2024-02-15 08:20:41 Functions: 7 7 100.0 %

          Line data    Source code
       1             : /*
       2             :  *
       3             :  *    Copyright (c) 2020 Project CHIP Authors
       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             : #pragma once
      19             : 
      20             : #include <lib/dnssd/minimal_mdns/responders/ReplyFilter.h>
      21             : 
      22             : #include "Parser.h"
      23             : #include "Query.h"
      24             : 
      25             : namespace mdns {
      26             : namespace Minimal {
      27             : 
      28             : /// A reply filter implementation based on a received/parsed query.
      29             : class QueryReplyFilter : public ReplyFilter
      30             : {
      31             : public:
      32         298 :     QueryReplyFilter(const QueryData & queryData) : mQueryData(queryData) {}
      33             : 
      34        1961 :     bool Accept(QType qType, QClass qClass, FullQName qname) override
      35             :     {
      36        1961 :         if (!AcceptableQueryType(qType))
      37             :         {
      38         467 :             return false;
      39             :         }
      40             : 
      41        1494 :         if (!AcceptableQueryClass(qClass))
      42             :         {
      43           0 :             return false;
      44             :         }
      45             : 
      46        1494 :         return AcceptablePath(qname);
      47             :     }
      48             : 
      49             :     /// Ignore qname matches during Accept calls (if set to true, only qtype and qclass are matched).
      50             :     ///
      51             :     /// Ignoring qname is useful when sending related data replies: cliens often query for PTR
      52             :     /// records however to avoid chattyness, servers generally send all of PTR, SRV (pointed to by PTR)
      53             :     /// and A/AAAA (pointed to by SRV).
      54         149 :     QueryReplyFilter & SetIgnoreNameMatch(bool ignore)
      55             :     {
      56         149 :         mIgnoreNameMatch = ignore;
      57         149 :         return *this;
      58             :     }
      59             : 
      60         149 :     QueryReplyFilter & SetSendingAdditionalItems(bool additional)
      61             :     {
      62         149 :         mSendingAdditionalItems = additional;
      63         149 :         return *this;
      64             :     }
      65             : 
      66             : private:
      67        1961 :     bool AcceptableQueryType(QType qType)
      68             :     {
      69        1961 :         if (mSendingAdditionalItems)
      70             :         {
      71         394 :             return true;
      72             :         }
      73             : 
      74        1567 :         return ((mQueryData.GetType() == QType::ANY) || (mQueryData.GetType() == qType));
      75             :     }
      76             : 
      77        1494 :     bool AcceptableQueryClass(QClass qClass)
      78             :     {
      79        1494 :         return ((mQueryData.GetClass() == QClass::ANY) || (mQueryData.GetClass() == qClass));
      80             :     }
      81             : 
      82        1494 :     bool AcceptablePath(FullQName qname)
      83             :     {
      84        1494 :         if (mIgnoreNameMatch || mQueryData.IsAnnounceBroadcast())
      85             :         {
      86        1096 :             return true;
      87             :         }
      88             : 
      89         398 :         return (mQueryData.GetName() == qname);
      90             :     }
      91             : 
      92             :     const QueryData & mQueryData;
      93             :     bool mIgnoreNameMatch        = false;
      94             :     bool mSendingAdditionalItems = false;
      95             : };
      96             : 
      97             : } // namespace Minimal
      98             : } // namespace mdns

Generated by: LCOV version 1.14