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