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

Unified 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, 4 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/api/mdns/mdns_service.cc
diff --git a/chrome/browser/extensions/api/mdns/mdns_service.cc b/chrome/browser/extensions/api/mdns/mdns_service.cc
new file mode 100644
index 0000000000000000000000000000000000000000..18d645b9f7d045f3725bb06d5a04cdb38318b62a
--- /dev/null
+++ b/chrome/browser/extensions/api/mdns/mdns_service.cc
@@ -0,0 +1,107 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/api/mdns/mdns_service.h"
+
+#include "base/bind.h"
+#include "chrome/browser/local_discovery/service_discovery_host_client.h"
+#include "chrome/common/extensions/api/mdns.h"
+#include "chrome/common/local_discovery/service_discovery_client.h"
+#include "net/base/net_util.h"
+
+using local_discovery::ServiceDescription;
+using local_discovery::ServiceResolver;
+using local_discovery::ServiceWatcher;
+using local_discovery::ServiceDiscoveryHostClientFactory;
+
+namespace extensions {
+
+MDnsService::MDnsService(const std::string& service_type,
+ MDnsService::Delegate *delegate)
+ : service_type_(service_type),
+ delegate_(delegate),
+ service_discovery_client_(ServiceDiscoveryHostClientFactory::GetClient()),
+ running_(false) {
+}
+
+MDnsService::~MDnsService() {}
+
+bool MDnsService::Start() {
+ if (running_) {
+ return true;
+ }
+ service_watcher_ = service_discovery_client_->CreateServiceWatcher(
+ service_type_,
+ base::Bind(&MDnsService::OnServiceUpdated,
+ base::Unretained(this)));
+ service_watcher_->Start();
+ return (running_ = true);
+}
+
+void MDnsService::Stop() {
+ service_watcher_.reset(NULL);
+}
+
+void MDnsService::Discover(bool force_update) {
+ service_watcher_->DiscoverNewServices(force_update);
+}
+
+void MDnsService::OnServiceUpdated(
+ ServiceWatcher::UpdateType update,
+ const std::string& service_name) {
+ bool added = (update == ServiceWatcher::UPDATE_ADDED);
+ // TODO: This used to not compile because of the switch. Needs a fix.
+ std::pair<ServiceResolverMap::iterator, bool> insert_result;
+ switch (update) {
+ case ServiceWatcher::UPDATE_ADDED:
+ case ServiceWatcher::UPDATE_CHANGED:
+ insert_result =
+ resolvers_.insert(make_pair(service_name,
+ linked_ptr<ServiceResolver>(NULL)));
+
+ // If there is already a resolver working on this service, don't add one.
+ if (insert_result.second) {
+ scoped_ptr<ServiceResolver> resolver =
+ service_discovery_client_->CreateServiceResolver(
+ service_name, base::Bind(
+ &MDnsService::OnResolveComplete,
+ base::Unretained(this),
+ added));
+ insert_result.first->second.reset(resolver.release());
+ insert_result.first->second->StartResolving();
+ }
+ break;
+ case ServiceWatcher::UPDATE_REMOVED:
+ delegate_->ServiceRemoved(service_name);
+ break;
+ default:
+ LOG(FATAL) << "Unknown ServiceWatcher::UpdateType " << update;
+ }
+}
+
+void MDnsService::OnResolveComplete(
+ bool added,
+ ServiceResolver::RequestStatus status,
+ const ServiceDescription& service_description) {
+ if (status != ServiceResolver::STATUS_SUCCESS) {
+ resolvers_.erase(service_description.service_name);
+ // TODO(noamsml): Add retry logic.
+ return;
+ }
+
+ std::string service_name = service_description.service_name;
+ resolvers_.erase(service_name);
+ api::mdns::MDnsService service;
+ service.service_name = service_name;
+ service.service_host_port = service_description.address.ToString();
+ service.ip_address = net::IPAddressToString(service_description.ip_address);
+ service.service_data = service_description.metadata;
+ if (added) {
+ delegate_->ServiceAdded(service_name, service);
+ } else {
+ delegate_->ServiceUpdated(service_name, service);
+ }
+}
+
+} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698