service_discovery_shared_client.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Copyright 2013 The Chromium Authors. All rights reserved. 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// found in the LICENSE file. 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian#include "chrome/browser/local_discovery/service_discovery_shared_client.h" 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "content/public/browser/browser_thread.h" 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 94633c49daa780de58d406e37dae53de78fbcfb2dDoug Kwan#if defined(OS_WIN) 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "base/files/file_path.h" 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "base/metrics/histogram.h" 126ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include "base/path_service.h" 136ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include "base/timer/elapsed_timer.h" 146ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include "chrome/installer/util/browser_distribution.h" 156ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include "chrome/installer/util/firewall_manager_win.h" 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // OS_WIN 17622cfadc8f0d294f875151fe1d8985e0553795eaMathias Agopian 18870b8aa15cb5c722b5d8eb7726eaa5f1a7c23d69Mathias Agopian#if defined(OS_MACOSX) 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "chrome/browser/local_discovery/service_discovery_client_mac_factory.h" 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif 218c1127fbe33fffc8bd7647a74b374068a9369b4aSriram Raman 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#if defined(ENABLE_MDNS) 23653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian#include "chrome/browser/local_discovery/service_discovery_client_mdns.h" 24653870d5e945ff94ff8136c97db0a016fc119683Mathias Agopian#include "chrome/browser/local_discovery/service_discovery_client_utility.h" 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#endif // ENABLE_MDNS 26 27namespace { 28 29#if defined(OS_WIN) 30 31bool g_is_firewall_ready = false; 32 33void ReportFirewallStats() { 34 base::FilePath exe_path; 35 if (!PathService::Get(base::FILE_EXE, &exe_path)) 36 return; 37 base::ElapsedTimer timer; 38 scoped_ptr<installer::FirewallManager> manager = 39 installer::FirewallManager::Create(BrowserDistribution::GetDistribution(), 40 exe_path); 41 if (!manager) 42 return; 43 g_is_firewall_ready = manager->CanUseLocalPorts(); 44 UMA_HISTOGRAM_TIMES("LocalDiscovery.FirewallAccessTime", timer.Elapsed()); 45 UMA_HISTOGRAM_BOOLEAN("LocalDiscovery.IsFirewallReady", g_is_firewall_ready); 46} 47#endif // OS_WIN 48 49} // namespace 50 51 52namespace local_discovery { 53 54using content::BrowserThread; 55 56namespace { 57ServiceDiscoverySharedClient* g_service_discovery_client = NULL; 58} // namespace 59 60ServiceDiscoverySharedClient::ServiceDiscoverySharedClient() { 61 DCHECK(!g_service_discovery_client); 62 g_service_discovery_client = this; 63} 64 65ServiceDiscoverySharedClient::~ServiceDiscoverySharedClient() { 66 DCHECK_EQ(g_service_discovery_client, this); 67 g_service_discovery_client = NULL; 68} 69 70#if defined(ENABLE_MDNS) || defined(OS_MACOSX) 71 72scoped_refptr<ServiceDiscoverySharedClient> 73 ServiceDiscoverySharedClient::GetInstance() { 74 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 75 76 if (g_service_discovery_client) 77 return g_service_discovery_client; 78 79#if defined(OS_MACOSX) 80 return ServiceDiscoveryClientMacFactory::CreateInstance(); 81#else // OS_MACOSX 82 83#if defined(OS_WIN) 84 static bool reported = 85 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, 86 base::Bind(&ReportFirewallStats)); 87 // TODO(vitalybuka): Switch to |ServiceDiscoveryClientMdns| after we find what 88 // to do with firewall for user-level installs. crbug.com/366408 89 if (!g_is_firewall_ready) 90 return new ServiceDiscoveryClientUtility(); 91#endif // OS_WIN 92 93 return new ServiceDiscoveryClientMdns(); 94#endif // OS_MACOSX 95} 96 97#else 98 99scoped_refptr<ServiceDiscoverySharedClient> 100 ServiceDiscoverySharedClient::GetInstance() { 101 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 102 NOTIMPLEMENTED(); 103 return NULL; 104} 105 106#endif // ENABLE_MDNS 107 108} // namespace local_discovery 109