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