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 |