168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/local_discovery/service_discovery_shared_client.h" 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(OS_WIN) 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/files/file_path.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/metrics/histogram.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/path_service.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/timer/elapsed_timer.h" 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/installer/util/browser_distribution.h" 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/installer/util/firewall_manager_win.h" 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif // OS_WIN 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_MACOSX) 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/local_discovery/service_discovery_client_mac_factory.h" 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_MDNS) 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/local_discovery/service_discovery_client_mdns.h" 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/local_discovery/service_discovery_client_utility.h" 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // ENABLE_MDNS 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace { 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#if defined(OS_WIN) 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool g_is_firewall_ready = false; 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool g_is_firewall_state_reported = false; 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void ReportFirewallStats() { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (g_is_firewall_state_reported) 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g_is_firewall_state_reported = true; 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::FilePath exe_path; 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!PathService::Get(base::FILE_EXE, &exe_path)) 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu base::ElapsedTimer timer; 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<installer::FirewallManager> manager = 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu installer::FirewallManager::Create(BrowserDistribution::GetDistribution(), 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu exe_path); 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!manager) 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) g_is_firewall_ready = manager->CanUseLocalPorts(); 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu UMA_HISTOGRAM_TIMES("LocalDiscovery.FirewallAccessTime", timer.Elapsed()); 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UMA_HISTOGRAM_BOOLEAN("LocalDiscovery.IsFirewallReady", g_is_firewall_ready); 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif // OS_WIN 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace local_discovery { 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)using content::BrowserThread; 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace { 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ServiceDiscoverySharedClient* g_service_discovery_client = NULL; 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ServiceDiscoverySharedClient::ServiceDiscoverySharedClient() { 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(!g_service_discovery_client); 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) g_service_discovery_client = this; 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)ServiceDiscoverySharedClient::~ServiceDiscoverySharedClient() { 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_EQ(g_service_discovery_client, this); 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) g_service_discovery_client = NULL; 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(ENABLE_MDNS) || defined(OS_MACOSX) 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)scoped_refptr<ServiceDiscoverySharedClient> 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ServiceDiscoverySharedClient::GetInstance() { 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (g_service_discovery_client) 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return g_service_discovery_client; 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#if defined(OS_MACOSX) 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return ServiceDiscoveryClientMacFactory::CreateInstance(); 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#else // OS_MACOSX 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new ServiceDiscoveryClientMdns(); 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // OS_MACOSX 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ServiceDiscoverySharedClient::GetInstanceWithoutAlert( 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GetInstanceCallback& callback) { 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(OS_WIN) 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<ServiceDiscoverySharedClient> result = GetInstance(); 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return callback.Run(result); 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else // OS_WIN 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // TODO(vitalybuka): Switch to |ServiceDiscoveryClientMdns| after we find what 102010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // to do with firewall for user-level installs. crbug.com/366408 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<ServiceDiscoverySharedClient> result = 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g_service_discovery_client; 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (result) 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return callback.Run(result); 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!g_is_firewall_state_reported) { 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserThread::PostTaskAndReply( 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BrowserThread::FILE, 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FROM_HERE, 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&ReportFirewallStats), 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&ServiceDiscoverySharedClient::GetInstanceWithoutAlert, 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback)); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci result = 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci g_is_firewall_ready ? GetInstance() : new ServiceDiscoveryClientUtility(); 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback.Run(result); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // OS_WIN 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#else 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)scoped_refptr<ServiceDiscoverySharedClient> 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ServiceDiscoverySharedClient::GetInstance() { 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) NOTIMPLEMENTED(); 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return NULL; 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // ENABLE_MDNS 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace local_discovery 136