OLD | NEW |
(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 |
OLD | NEW |