service_discovery_shared_client.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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/local_discovery/service_discovery_shared_client.h"
6
7#include "content/public/browser/browser_thread.h"
8
9#if defined(OS_WIN)
10#include "base/files/file_path.h"
11#include "base/metrics/histogram.h"
12#include "base/path_service.h"
13#include "base/timer/elapsed_timer.h"
14#include "chrome/browser/local_discovery/service_discovery_client_utility.h"
15#include "chrome/installer/util/browser_distribution.h"
16#include "chrome/installer/util/firewall_manager_win.h"
17#endif  // OS_WIN
18
19#if defined(OS_MACOSX)
20#include "chrome/browser/local_discovery/service_discovery_client_mac_factory.h"
21#endif
22
23#if defined(ENABLE_MDNS)
24#include "chrome/browser/local_discovery/service_discovery_client_mdns.h"
25#endif  // ENABLE_MDNS
26
27namespace {
28
29#if defined(OS_WIN)
30bool IsFirewallReady() {
31  base::FilePath exe_path;
32  if (!PathService::Get(base::FILE_EXE, &exe_path))
33    return false;
34  base::ElapsedTimer timer;
35  scoped_ptr<installer::FirewallManager> manager =
36      installer::FirewallManager::Create(BrowserDistribution::GetDistribution(),
37                                         exe_path);
38  if (!manager)
39    return false;
40  bool is_ready = manager->CanUseLocalPorts();
41  UMA_HISTOGRAM_TIMES("LocalDiscovery.FirewallAccessTime", timer.Elapsed());
42  UMA_HISTOGRAM_BOOLEAN("LocalDiscovery.IsFirewallReady", is_ready);
43  return is_ready;
44}
45#endif  // OS_WIN
46
47}  // namespace
48
49
50namespace local_discovery {
51
52using content::BrowserThread;
53
54namespace {
55ServiceDiscoverySharedClient* g_service_discovery_client = NULL;
56}  // namespace
57
58ServiceDiscoverySharedClient::ServiceDiscoverySharedClient() {
59  DCHECK(!g_service_discovery_client);
60  g_service_discovery_client = this;
61}
62
63ServiceDiscoverySharedClient::~ServiceDiscoverySharedClient() {
64  DCHECK_EQ(g_service_discovery_client, this);
65  g_service_discovery_client = NULL;
66}
67
68#if defined(ENABLE_MDNS) || defined(OS_MACOSX)
69
70scoped_refptr<ServiceDiscoverySharedClient>
71    ServiceDiscoverySharedClient::GetInstance() {
72  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
73
74  if (g_service_discovery_client)
75    return g_service_discovery_client;
76
77#if defined(OS_MACOSX)
78  return ServiceDiscoveryClientMacFactory::CreateInstance();
79#else
80
81#if defined(OS_WIN)
82  static bool is_firewall_ready = IsFirewallReady();
83  if (!is_firewall_ready) {
84    // TODO(vitalybuka): Remove after we find what to do with firewall for
85    // user-level installs. crbug.com/366408
86    return new ServiceDiscoveryClientUtility();
87  }
88#endif  // OS_WIN
89  return new ServiceDiscoveryClientMdns();
90#endif
91}
92
93#else
94
95scoped_refptr<ServiceDiscoverySharedClient>
96    ServiceDiscoverySharedClient::GetInstance() {
97  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
98  NOTIMPLEMENTED();
99  return NULL;
100}
101
102#endif  // ENABLE_MDNS
103
104}  // namespace local_discovery
105