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_MDNS_PUBLIC_MDNS_SERVICE_H_ 6*3f982cf4SFabien Sanglard #define DISCOVERY_MDNS_PUBLIC_MDNS_SERVICE_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <functional> 9*3f982cf4SFabien Sanglard #include <memory> 10*3f982cf4SFabien Sanglard 11*3f982cf4SFabien Sanglard #include "discovery/common/config.h" 12*3f982cf4SFabien Sanglard #include "discovery/mdns/public/mdns_constants.h" 13*3f982cf4SFabien Sanglard #include "platform/base/error.h" 14*3f982cf4SFabien Sanglard #include "platform/base/interface_info.h" 15*3f982cf4SFabien Sanglard #include "platform/base/ip_address.h" 16*3f982cf4SFabien Sanglard 17*3f982cf4SFabien Sanglard namespace openscreen { 18*3f982cf4SFabien Sanglard 19*3f982cf4SFabien Sanglard class TaskRunner; 20*3f982cf4SFabien Sanglard 21*3f982cf4SFabien Sanglard namespace discovery { 22*3f982cf4SFabien Sanglard 23*3f982cf4SFabien Sanglard class DomainName; 24*3f982cf4SFabien Sanglard class MdnsDomainConfirmedProvider; 25*3f982cf4SFabien Sanglard class MdnsRecord; 26*3f982cf4SFabien Sanglard class MdnsRecordChangedCallback; 27*3f982cf4SFabien Sanglard class ReportingClient; 28*3f982cf4SFabien Sanglard 29*3f982cf4SFabien Sanglard class MdnsService { 30*3f982cf4SFabien Sanglard public: 31*3f982cf4SFabien Sanglard MdnsService(); 32*3f982cf4SFabien Sanglard virtual ~MdnsService(); 33*3f982cf4SFabien Sanglard 34*3f982cf4SFabien Sanglard // Creates a new MdnsService instance, to be owned by the caller. On failure, 35*3f982cf4SFabien Sanglard // returns nullptr. |task_runner|, |reporting_client|, and |config| must exist 36*3f982cf4SFabien Sanglard // for the duration of the resulting instance's life. 37*3f982cf4SFabien Sanglard static std::unique_ptr<MdnsService> Create(TaskRunner* task_runner, 38*3f982cf4SFabien Sanglard ReportingClient* reporting_client, 39*3f982cf4SFabien Sanglard const Config& config, 40*3f982cf4SFabien Sanglard const InterfaceInfo& network_info); 41*3f982cf4SFabien Sanglard 42*3f982cf4SFabien Sanglard // Starts an mDNS query with the given properties. Updated records are passed 43*3f982cf4SFabien Sanglard // to |callback|. The caller must ensure |callback| remains alive while it is 44*3f982cf4SFabien Sanglard // registered with a query. 45*3f982cf4SFabien Sanglard virtual void StartQuery(const DomainName& name, 46*3f982cf4SFabien Sanglard DnsType dns_type, 47*3f982cf4SFabien Sanglard DnsClass dns_class, 48*3f982cf4SFabien Sanglard MdnsRecordChangedCallback* callback) = 0; 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglard // Stops an mDNS query with the given properties. |callback| must be the same 51*3f982cf4SFabien Sanglard // callback pointer that was previously passed to StartQuery. 52*3f982cf4SFabien Sanglard virtual void StopQuery(const DomainName& name, 53*3f982cf4SFabien Sanglard DnsType dns_type, 54*3f982cf4SFabien Sanglard DnsClass dns_class, 55*3f982cf4SFabien Sanglard MdnsRecordChangedCallback* callback) = 0; 56*3f982cf4SFabien Sanglard 57*3f982cf4SFabien Sanglard // Re-initializes the process of service discovery for the provided domain 58*3f982cf4SFabien Sanglard // name. All ongoing queries for this domain are restarted and any previously 59*3f982cf4SFabien Sanglard // received query results are discarded. 60*3f982cf4SFabien Sanglard virtual void ReinitializeQueries(const DomainName& name) = 0; 61*3f982cf4SFabien Sanglard 62*3f982cf4SFabien Sanglard // Starts probing for a valid domain name based on the given one. |callback| 63*3f982cf4SFabien Sanglard // will be called once a valid domain is found, and the instance must persist 64*3f982cf4SFabien Sanglard // until that call is received. 65*3f982cf4SFabien Sanglard virtual Error StartProbe(MdnsDomainConfirmedProvider* callback, 66*3f982cf4SFabien Sanglard DomainName requested_name, 67*3f982cf4SFabien Sanglard IPAddress address) = 0; 68*3f982cf4SFabien Sanglard 69*3f982cf4SFabien Sanglard // Registers a new mDNS record for advertisement by this service. For A, AAAA, 70*3f982cf4SFabien Sanglard // SRV, and TXT records, the domain name must have already been claimed by the 71*3f982cf4SFabien Sanglard // ClaimExclusiveOwnership() method and for PTR records the name being pointed 72*3f982cf4SFabien Sanglard // to must have been claimed in the same fashion, but the domain name in the 73*3f982cf4SFabien Sanglard // top-level MdnsRecord entity does not. 74*3f982cf4SFabien Sanglard virtual Error RegisterRecord(const MdnsRecord& record) = 0; 75*3f982cf4SFabien Sanglard 76*3f982cf4SFabien Sanglard // Updates the existing record with name matching the name of the new record. 77*3f982cf4SFabien Sanglard // NOTE: This method is not valid for PTR records. 78*3f982cf4SFabien Sanglard virtual Error UpdateRegisteredRecord(const MdnsRecord& old_record, 79*3f982cf4SFabien Sanglard const MdnsRecord& new_record) = 0; 80*3f982cf4SFabien Sanglard 81*3f982cf4SFabien Sanglard // Stops advertising the provided record. If no more records with the provided 82*3f982cf4SFabien Sanglard // name are bing advertised after this call's completion, then ownership of 83*3f982cf4SFabien Sanglard // the name is released. 84*3f982cf4SFabien Sanglard virtual Error UnregisterRecord(const MdnsRecord& record) = 0; 85*3f982cf4SFabien Sanglard }; 86*3f982cf4SFabien Sanglard 87*3f982cf4SFabien Sanglard } // namespace discovery 88*3f982cf4SFabien Sanglard } // namespace openscreen 89*3f982cf4SFabien Sanglard 90*3f982cf4SFabien Sanglard #endif // DISCOVERY_MDNS_PUBLIC_MDNS_SERVICE_H_ 91