xref: /aosp_15_r20/external/openscreen/discovery/mdns/public/mdns_service.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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