1// Copyright 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/dns_sd_device_lister.h"
6
7#include "chrome/common/extensions/api/mdns.h"
8
9using local_discovery::ServiceDescription;
10
11namespace extensions {
12
13namespace {
14
15void FillServiceInfo(const ServiceDescription& service_description,
16                     DnsSdService* service) {
17  service->service_name = service_description.service_name;
18  service->service_host_port = service_description.address.ToString();
19  if (!service_description.ip_address.empty()) {
20    service->ip_address = net::IPAddressToString(
21        service_description.ip_address);
22  }
23  service->service_data = service_description.metadata;
24
25  VLOG(1) << "Found " << service->service_name << ", "
26           << service->service_host_port << ", "
27           << service->ip_address;
28}
29
30}  // namespace
31
32DnsSdDeviceLister::DnsSdDeviceLister(
33    local_discovery::ServiceDiscoveryClient* service_discovery_client,
34    DnsSdDelegate* delegate,
35    const std::string& service_type)
36    : delegate_(delegate),
37      device_lister_(this, service_discovery_client, service_type),
38      started_(false) {
39}
40
41DnsSdDeviceLister::~DnsSdDeviceLister() {
42}
43
44void DnsSdDeviceLister::Discover(bool force_update) {
45  if (!started_) {
46    device_lister_.Start();
47    started_ = true;
48    VLOG(1) << "Started device lister for service type "
49             << device_lister_.service_type();
50  }
51  device_lister_.DiscoverNewDevices(force_update);
52  VLOG(1) << "Discovery new devices for service type "
53           << device_lister_.service_type();
54}
55
56void DnsSdDeviceLister::OnDeviceChanged(
57    bool added,
58    const ServiceDescription& service_description) {
59  DnsSdService service;
60  FillServiceInfo(service_description, &service);
61  VLOG(1) << "OnDeviceChanged: "
62          << "service_name: " << service.service_name << ", "
63          << "added: " << added << ", "
64          << "service_type: " << device_lister_.service_type();
65  delegate_->ServiceChanged(device_lister_.service_type(), added, service);
66}
67
68void DnsSdDeviceLister::OnDeviceRemoved(const std::string& service_name) {
69  VLOG(1) << "OnDeviceRemoved: "
70          << "service_name: " << service_name << ", "
71          << "service_type: " << device_lister_.service_type();
72  delegate_->ServiceRemoved(device_lister_.service_type(), service_name);
73}
74
75void DnsSdDeviceLister::OnDeviceCacheFlushed() {
76  VLOG(1) << "OnDeviceCacheFlushed: "
77          << "service_type: " << device_lister_.service_type();
78  delegate_->ServicesFlushed(device_lister_.service_type());
79  device_lister_.DiscoverNewDevices(false);
80}
81
82}  // namespace extensions
83