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

Side by Side Diff: chrome/browser/extensions/api/mdns/mdns_service.cc

Issue 22870011: chrome.mdns API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address comments Created 7 years, 3 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 (c) 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 #include "chrome/browser/extensions/api/mdns/mdns_service.h"
6
7 #include "base/bind.h"
8 #include "chrome/browser/local_discovery/service_discovery_host_client.h"
9 #include "chrome/common/extensions/api/mdns.h"
10 #include "chrome/common/local_discovery/service_discovery_client.h"
11 #include "net/base/net_util.h"
12
13 using local_discovery::ServiceDescription;
14 using local_discovery::ServiceResolver;
15 using local_discovery::ServiceWatcher;
16 using local_discovery::ServiceDiscoveryHostClientFactory;
17
18 namespace extensions {
19
20 MDnsService::MDnsService(const std::string& service_type,
21 MDnsService::Delegate *delegate)
22 : service_type_(service_type),
23 delegate_(delegate),
24 service_discovery_client_(ServiceDiscoveryHostClientFactory::GetClient()),
25 running_(false) {
26 }
27
28 MDnsService::~MDnsService() {}
29
30 bool MDnsService::Start() {
31 if (running_) {
32 return true;
33 }
34 service_watcher_ = service_discovery_client_->CreateServiceWatcher(
35 service_type_,
36 base::Bind(&MDnsService::OnServiceUpdated,
37 base::Unretained(this)));
38 service_watcher_->Start();
39 return (running_ = true);
40 }
41
42 void MDnsService::Stop() {
43 service_watcher_.reset(NULL);
44 }
45
46 void MDnsService::Discover(bool force_update) {
47 service_watcher_->DiscoverNewServices(force_update);
48 }
49
50 void MDnsService::OnServiceUpdated(
51 ServiceWatcher::UpdateType update,
52 const std::string& service_name) {
53 bool added = (update == ServiceWatcher::UPDATE_ADDED);
54 // TODO: This used to not compile because of the switch. Needs a fix.
55 std::pair<ServiceResolverMap::iterator, bool> insert_result;
56 switch (update) {
57 case ServiceWatcher::UPDATE_ADDED:
58 case ServiceWatcher::UPDATE_CHANGED:
59 insert_result =
60 resolvers_.insert(make_pair(service_name,
61 linked_ptr<ServiceResolver>(NULL)));
62
63 // If there is already a resolver working on this service, don't add one.
64 if (insert_result.second) {
65 scoped_ptr<ServiceResolver> resolver =
66 service_discovery_client_->CreateServiceResolver(
67 service_name, base::Bind(
68 &MDnsService::OnResolveComplete,
69 base::Unretained(this),
70 added));
71 insert_result.first->second.reset(resolver.release());
72 insert_result.first->second->StartResolving();
73 }
74 break;
75 case ServiceWatcher::UPDATE_REMOVED:
76 delegate_->ServiceRemoved(service_name);
77 break;
78 default:
79 LOG(FATAL) << "Unknown ServiceWatcher::UpdateType " << update;
80 }
81 }
82
83 void MDnsService::OnResolveComplete(
84 bool added,
85 ServiceResolver::RequestStatus status,
86 const ServiceDescription& service_description) {
87 if (status != ServiceResolver::STATUS_SUCCESS) {
88 resolvers_.erase(service_description.service_name);
89 // TODO(noamsml): Add retry logic.
90 return;
91 }
92
93 std::string service_name = service_description.service_name;
94 resolvers_.erase(service_name);
95 api::mdns::MDnsService service;
96 service.service_name = service_name;
97 service.service_host_port = service_description.address.ToString();
98 service.ip_address = net::IPAddressToString(service_description.ip_address);
99 service.service_data = service_description.metadata;
100 if (added) {
101 delegate_->ServiceAdded(service_name, service);
102 } else {
103 delegate_->ServiceUpdated(service_name, service);
104 }
105 }
106
107 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698