1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef DISCOVERY_DNSSD_IMPL_QUERIER_IMPL_H_ 6*3f982cf4SFabien Sanglard #define DISCOVERY_DNSSD_IMPL_QUERIER_IMPL_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <map> 9*3f982cf4SFabien Sanglard #include <memory> 10*3f982cf4SFabien Sanglard #include <string> 11*3f982cf4SFabien Sanglard #include <unordered_map> 12*3f982cf4SFabien Sanglard #include <vector> 13*3f982cf4SFabien Sanglard 14*3f982cf4SFabien Sanglard #include "absl/hash/hash.h" 15*3f982cf4SFabien Sanglard #include "absl/strings/string_view.h" 16*3f982cf4SFabien Sanglard #include "discovery/dnssd/impl/constants.h" 17*3f982cf4SFabien Sanglard #include "discovery/dnssd/impl/conversion_layer.h" 18*3f982cf4SFabien Sanglard #include "discovery/dnssd/impl/dns_data_graph.h" 19*3f982cf4SFabien Sanglard #include "discovery/dnssd/impl/instance_key.h" 20*3f982cf4SFabien Sanglard #include "discovery/dnssd/impl/service_key.h" 21*3f982cf4SFabien Sanglard #include "discovery/dnssd/public/dns_sd_instance_endpoint.h" 22*3f982cf4SFabien Sanglard #include "discovery/dnssd/public/dns_sd_querier.h" 23*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_record_changed_callback.h" 24*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_records.h" 25*3f982cf4SFabien Sanglard #include "discovery/mdns/public/mdns_service.h" 26*3f982cf4SFabien Sanglard 27*3f982cf4SFabien Sanglard namespace openscreen { 28*3f982cf4SFabien Sanglard namespace discovery { 29*3f982cf4SFabien Sanglard 30*3f982cf4SFabien Sanglard class NetworkInterfaceConfig; 31*3f982cf4SFabien Sanglard class ReportingClient; 32*3f982cf4SFabien Sanglard 33*3f982cf4SFabien Sanglard class QuerierImpl : public DnsSdQuerier, public MdnsRecordChangedCallback { 34*3f982cf4SFabien Sanglard public: 35*3f982cf4SFabien Sanglard // |querier|, |task_runner|, and |network_config| must outlive the QuerierImpl 36*3f982cf4SFabien Sanglard // instance constructed. 37*3f982cf4SFabien Sanglard QuerierImpl(MdnsService* querier, 38*3f982cf4SFabien Sanglard TaskRunner* task_runner, 39*3f982cf4SFabien Sanglard ReportingClient* reporting_client, 40*3f982cf4SFabien Sanglard const NetworkInterfaceConfig* network_config); 41*3f982cf4SFabien Sanglard ~QuerierImpl() override; 42*3f982cf4SFabien Sanglard 43*3f982cf4SFabien Sanglard bool IsQueryRunning(const std::string& service) const; 44*3f982cf4SFabien Sanglard 45*3f982cf4SFabien Sanglard // DnsSdQuerier overrides. 46*3f982cf4SFabien Sanglard void StartQuery(const std::string& service, Callback* callback) override; 47*3f982cf4SFabien Sanglard void StopQuery(const std::string& service, Callback* callback) override; 48*3f982cf4SFabien Sanglard void ReinitializeQueries(const std::string& service) override; 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglard // MdnsRecordChangedCallback overrides. 51*3f982cf4SFabien Sanglard std::vector<PendingQueryChange> OnRecordChanged( 52*3f982cf4SFabien Sanglard const MdnsRecord& record, 53*3f982cf4SFabien Sanglard RecordChangedEvent event) override; 54*3f982cf4SFabien Sanglard 55*3f982cf4SFabien Sanglard private: 56*3f982cf4SFabien Sanglard friend class QuerierImplTesting; 57*3f982cf4SFabien Sanglard 58*3f982cf4SFabien Sanglard // Applies the provided record change to the underlying |graph_| instance. 59*3f982cf4SFabien Sanglard ErrorOr<std::vector<PendingQueryChange>> ApplyRecordChanges( 60*3f982cf4SFabien Sanglard const MdnsRecord& record, 61*3f982cf4SFabien Sanglard RecordChangedEvent event); 62*3f982cf4SFabien Sanglard 63*3f982cf4SFabien Sanglard // Informs all relevant callbacks of the provided changes. 64*3f982cf4SFabien Sanglard void InvokeChangeCallbacks(std::vector<DnsSdInstanceEndpoint> created, 65*3f982cf4SFabien Sanglard std::vector<DnsSdInstanceEndpoint> updated, 66*3f982cf4SFabien Sanglard std::vector<DnsSdInstanceEndpoint> deleted); 67*3f982cf4SFabien Sanglard 68*3f982cf4SFabien Sanglard // Graph of underlying mDNS Record and their associations with each-other. 69*3f982cf4SFabien Sanglard std::unique_ptr<DnsDataGraph> graph_; 70*3f982cf4SFabien Sanglard 71*3f982cf4SFabien Sanglard // Map from the (service, domain) pairs currently being queried for to the 72*3f982cf4SFabien Sanglard // callbacks to call when new InstanceEndpoints are available. 73*3f982cf4SFabien Sanglard std::map<ServiceKey, std::vector<Callback*>> callback_map_; 74*3f982cf4SFabien Sanglard 75*3f982cf4SFabien Sanglard MdnsService* const mdns_querier_; 76*3f982cf4SFabien Sanglard TaskRunner* const task_runner_; 77*3f982cf4SFabien Sanglard 78*3f982cf4SFabien Sanglard ReportingClient* reporting_client_; 79*3f982cf4SFabien Sanglard }; 80*3f982cf4SFabien Sanglard 81*3f982cf4SFabien Sanglard } // namespace discovery 82*3f982cf4SFabien Sanglard } // namespace openscreen 83*3f982cf4SFabien Sanglard 84*3f982cf4SFabien Sanglard #endif // DISCOVERY_DNSSD_IMPL_QUERIER_IMPL_H_ 85