158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/extensions/api/mdns/dns_sd_device_lister.h" 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/extensions/api/mdns.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using local_discovery::ServiceDescription; 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace extensions { 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace { 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void FillServiceInfo(const ServiceDescription& service_description, 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdService* service) { 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service->service_name = service_description.service_name; 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service->service_host_port = service_description.address.ToString(); 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!service_description.ip_address.empty()) { 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) service->ip_address = net::IPAddressToString( 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) service_description.ip_address); 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) service->service_data = service_description.metadata; 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "Found " << service->service_name << ", " 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << service->service_host_port << ", " 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) << service->ip_address; 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)DnsSdDeviceLister::DnsSdDeviceLister( 338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) local_discovery::ServiceDiscoveryClient* service_discovery_client, 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdDelegate* delegate, 358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& service_type) 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : delegate_(delegate), 378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) device_lister_(this, service_discovery_client, service_type), 388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) started_(false) { 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)DnsSdDeviceLister::~DnsSdDeviceLister() { 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void DnsSdDeviceLister::Discover(bool force_update) { 458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (!started_) { 468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) device_lister_.Start(); 478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) started_ = true; 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) VLOG(1) << "Started device lister for service type " 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << device_lister_.service_type(); 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) device_lister_.DiscoverNewDevices(force_update); 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) VLOG(1) << "Discovery new devices for service type " 531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) << device_lister_.service_type(); 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void DnsSdDeviceLister::OnDeviceChanged( 5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool added, 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const ServiceDescription& service_description) { 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DnsSdService service; 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) FillServiceInfo(service_description, &service); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "OnDeviceChanged: " 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "service_name: " << service.service_name << ", " 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "added: " << added << ", " 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "service_type: " << device_lister_.service_type(); 658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) delegate_->ServiceChanged(device_lister_.service_type(), added, service); 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void DnsSdDeviceLister::OnDeviceRemoved(const std::string& service_name) { 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "OnDeviceRemoved: " 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "service_name: " << service_name << ", " 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "service_type: " << device_lister_.service_type(); 728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) delegate_->ServiceRemoved(device_lister_.service_type(), service_name); 738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void DnsSdDeviceLister::OnDeviceCacheFlushed() { 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VLOG(1) << "OnDeviceCacheFlushed: " 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << "service_type: " << device_lister_.service_type(); 788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) delegate_->ServicesFlushed(device_lister_.service_type()); 798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) device_lister_.DiscoverNewDevices(false); 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace extensions 83