Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: chrome/utility/local_discovery/service_discovery_client_impl.h

Issue 256923003: Move service_discovery_client_impl.* into chrome/common. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sun 04/27/2014 11:39:04.49 Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_UTILITY_LOCAL_DISCOVERY_SERVICE_DISCOVERY_CLIENT_IMPL_H_
6 #define CHROME_UTILITY_LOCAL_DISCOVERY_SERVICE_DISCOVERY_CLIENT_IMPL_H_
7
8 #include <map>
9 #include <string>
10 #include <vector>
11
12 #include "base/callback.h"
13 #include "base/cancelable_callback.h"
14 #include "base/memory/linked_ptr.h"
15 #include "base/memory/weak_ptr.h"
16 #include "base/message_loop/message_loop.h"
17 #include "chrome/common/local_discovery/service_discovery_client.h"
18 #include "net/dns/mdns_client.h"
19
20 namespace local_discovery {
21
22 class ServiceDiscoveryClientImpl : public ServiceDiscoveryClient {
23 public:
24 // |mdns_client| must outlive the Service Discovery Client.
25 explicit ServiceDiscoveryClientImpl(net::MDnsClient* mdns_client);
26 virtual ~ServiceDiscoveryClientImpl();
27
28 // ServiceDiscoveryClient implementation:
29 virtual scoped_ptr<ServiceWatcher> CreateServiceWatcher(
30 const std::string& service_type,
31 const ServiceWatcher::UpdatedCallback& callback) OVERRIDE;
32
33 virtual scoped_ptr<ServiceResolver> CreateServiceResolver(
34 const std::string& service_name,
35 const ServiceResolver::ResolveCompleteCallback& callback) OVERRIDE;
36
37 virtual scoped_ptr<LocalDomainResolver> CreateLocalDomainResolver(
38 const std::string& domain,
39 net::AddressFamily address_family,
40 const LocalDomainResolver::IPAddressCallback& callback) OVERRIDE;
41
42 private:
43 net::MDnsClient* mdns_client_;
44
45 DISALLOW_COPY_AND_ASSIGN(ServiceDiscoveryClientImpl);
46 };
47
48 class ServiceWatcherImpl : public ServiceWatcher,
49 public net::MDnsListener::Delegate,
50 public base::SupportsWeakPtr<ServiceWatcherImpl> {
51 public:
52 ServiceWatcherImpl(const std::string& service_type,
53 const ServiceWatcher::UpdatedCallback& callback,
54 net::MDnsClient* mdns_client);
55 // Listening will automatically stop when the destructor is called.
56 virtual ~ServiceWatcherImpl();
57
58 // ServiceWatcher implementation:
59 virtual void Start() OVERRIDE;
60
61 virtual void DiscoverNewServices(bool force_update) OVERRIDE;
62
63 virtual void SetActivelyRefreshServices(
64 bool actively_refresh_services) OVERRIDE;
65
66 virtual std::string GetServiceType() const OVERRIDE;
67
68 virtual void OnRecordUpdate(net::MDnsListener::UpdateType update,
69 const net::RecordParsed* record) OVERRIDE;
70
71 virtual void OnNsecRecord(const std::string& name, unsigned rrtype) OVERRIDE;
72
73 virtual void OnCachePurged() OVERRIDE;
74
75 virtual void OnTransactionResponse(
76 scoped_ptr<net::MDnsTransaction>* transaction,
77 net::MDnsTransaction::Result result,
78 const net::RecordParsed* record);
79
80 private:
81 struct ServiceListeners {
82 ServiceListeners(const std::string& service_name,
83 ServiceWatcherImpl* watcher,
84 net::MDnsClient* mdns_client);
85 ~ServiceListeners();
86 bool Start();
87 void SetActiveRefresh(bool auto_update);
88
89 void set_update_pending(bool update_pending) {
90 update_pending_ = update_pending;
91 }
92
93 bool update_pending() { return update_pending_; }
94
95 void set_has_ptr(bool has_ptr) {
96 has_ptr_ = has_ptr;
97 }
98
99 void set_has_srv(bool has_srv);
100
101 bool has_ptr_or_srv() { return has_ptr_ || has_srv_; }
102
103 private:
104 void OnSRVRecord(net::MDnsTransaction::Result result,
105 const net::RecordParsed* record);
106
107 void DoQuerySRV();
108
109 scoped_ptr<net::MDnsListener> srv_listener_;
110 scoped_ptr<net::MDnsListener> txt_listener_;
111 scoped_ptr<net::MDnsTransaction> srv_transaction_;
112
113 std::string service_name_;
114 net::MDnsClient* mdns_client_;
115 bool update_pending_;
116
117 bool has_ptr_;
118 bool has_srv_;
119 };
120
121 typedef std::map<std::string, linked_ptr<ServiceListeners> >
122 ServiceListenersMap;
123
124 void ReadCachedServices();
125 void AddService(const std::string& service);
126 void RemovePTR(const std::string& service);
127 void RemoveSRV(const std::string& service);
128 void AddSRV(const std::string& service);
129 bool CreateTransaction(bool active, bool alert_existing_services,
130 bool force_refresh,
131 scoped_ptr<net::MDnsTransaction>* transaction);
132
133 void DeferUpdate(ServiceWatcher::UpdateType update_type,
134 const std::string& service_name);
135 void DeliverDeferredUpdate(ServiceWatcher::UpdateType update_type,
136 const std::string& service_name);
137
138 void ScheduleQuery(int timeout_seconds);
139
140 void SendQuery(int next_timeout_seconds, bool force_update);
141
142 std::string service_type_;
143 ServiceListenersMap services_;
144 scoped_ptr<net::MDnsTransaction> transaction_network_;
145 scoped_ptr<net::MDnsTransaction> transaction_cache_;
146 scoped_ptr<net::MDnsListener> listener_;
147
148 ServiceWatcher::UpdatedCallback callback_;
149 bool started_;
150 bool actively_refresh_services_;
151
152 net::MDnsClient* mdns_client_;
153
154 DISALLOW_COPY_AND_ASSIGN(ServiceWatcherImpl);
155 };
156
157 class ServiceResolverImpl
158 : public ServiceResolver,
159 public base::SupportsWeakPtr<ServiceResolverImpl> {
160 public:
161 ServiceResolverImpl(const std::string& service_name,
162 const ServiceResolver::ResolveCompleteCallback& callback,
163 net::MDnsClient* mdns_client);
164
165 virtual ~ServiceResolverImpl();
166
167 // ServiceResolver implementation:
168 virtual void StartResolving() OVERRIDE;
169
170 virtual std::string GetName() const OVERRIDE;
171
172 private:
173 // Respond to transaction finishing for SRV records.
174 void SrvRecordTransactionResponse(net::MDnsTransaction::Result status,
175 const net::RecordParsed* record);
176
177 // Respond to transaction finishing for TXT records.
178 void TxtRecordTransactionResponse(net::MDnsTransaction::Result status,
179 const net::RecordParsed* record);
180
181 // Respond to transaction finishing for A records.
182 void ARecordTransactionResponse(net::MDnsTransaction::Result status,
183 const net::RecordParsed* record);
184
185 void AlertCallbackIfReady();
186
187 void ServiceNotFound(RequestStatus status);
188
189 // Convert a TXT record to a vector of strings (metadata).
190 const std::vector<std::string>& RecordToMetadata(
191 const net::RecordParsed* record) const;
192
193 // Convert an SRV record to a host and port pair.
194 net::HostPortPair RecordToAddress(
195 const net::RecordParsed* record) const;
196
197 // Convert an A record to an IP address.
198 const net::IPAddressNumber& RecordToIPAddress(
199 const net::RecordParsed* record) const;
200
201 // Convert an MDns status to a service discovery status.
202 RequestStatus MDnsStatusToRequestStatus(
203 net::MDnsTransaction::Result status) const;
204
205 bool CreateTxtTransaction();
206 bool CreateSrvTransaction();
207 void CreateATransaction();
208
209 std::string service_name_;
210 ResolveCompleteCallback callback_;
211
212 bool has_resolved_;
213
214 bool metadata_resolved_;
215 bool address_resolved_;
216
217 scoped_ptr<net::MDnsTransaction> txt_transaction_;
218 scoped_ptr<net::MDnsTransaction> srv_transaction_;
219 scoped_ptr<net::MDnsTransaction> a_transaction_;
220
221 ServiceDescription service_staging_;
222
223 net::MDnsClient* mdns_client_;
224
225 DISALLOW_COPY_AND_ASSIGN(ServiceResolverImpl);
226 };
227
228 class LocalDomainResolverImpl : public LocalDomainResolver {
229 public:
230 LocalDomainResolverImpl(const std::string& domain,
231 net::AddressFamily address_family,
232 const IPAddressCallback& callback,
233 net::MDnsClient* mdns_client);
234 virtual ~LocalDomainResolverImpl();
235
236 virtual void Start() OVERRIDE;
237
238 const std::string& domain() { return domain_; }
239
240 private:
241 void OnTransactionComplete(
242 net::MDnsTransaction::Result result,
243 const net::RecordParsed* record);
244
245 scoped_ptr<net::MDnsTransaction> CreateTransaction(uint16 type);
246
247 bool IsSuccess();
248
249 void SendResolvedAddresses();
250
251 std::string domain_;
252 net::AddressFamily address_family_;
253 IPAddressCallback callback_;
254
255 scoped_ptr<net::MDnsTransaction> transaction_a_;
256 scoped_ptr<net::MDnsTransaction> transaction_aaaa_;
257
258 int transactions_finished_;
259
260 net::MDnsClient* mdns_client_;
261
262 net::IPAddressNumber address_ipv4_;
263 net::IPAddressNumber address_ipv6_;
264
265 base::CancelableCallback<void()> timeout_callback_;
266
267 DISALLOW_COPY_AND_ASSIGN(LocalDomainResolverImpl);
268 };
269
270
271 } // namespace local_discovery
272
273 #endif // CHROME_UTILITY_LOCAL_DISCOVERY_SERVICE_DISCOVERY_CLIENT_IMPL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698