1// Copyright 2014 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/services/gcm/gcm_desktop_utils.h" 6 7#include "base/command_line.h" 8#include "base/logging.h" 9#include "base/sequenced_task_runner.h" 10#include "base/threading/sequenced_worker_pool.h" 11#include "chrome/browser/sync/glue/local_device_info_provider_impl.h" 12#include "chrome/browser/sync/profile_sync_service.h" 13#include "chrome/common/chrome_version_info.h" 14#include "components/gcm_driver/gcm_client.h" 15#include "components/gcm_driver/gcm_client_factory.h" 16#include "components/gcm_driver/gcm_driver.h" 17#include "components/gcm_driver/gcm_driver_desktop.h" 18#include "content/public/browser/browser_thread.h" 19 20namespace gcm { 21 22namespace { 23 24const char kChannelStatusRelativePath[] = "/experimentstatus"; 25 26GCMClient::ChromePlatform GetPlatform() { 27#if defined(OS_WIN) 28 return GCMClient::PLATFORM_WIN; 29#elif defined(OS_MACOSX) 30 return GCMClient::PLATFORM_MAC; 31#elif defined(OS_IOS) 32 return GCMClient::PLATFORM_IOS; 33#elif defined(OS_ANDROID) 34 return GCMClient::PLATFORM_ANDROID; 35#elif defined(OS_CHROMEOS) 36 return GCMClient::PLATFORM_CROS; 37#elif defined(OS_LINUX) 38 return GCMClient::PLATFORM_LINUX; 39#else 40 // For all other platforms, return as LINUX. 41 return GCMClient::PLATFORM_LINUX; 42#endif 43} 44 45GCMClient::ChromeChannel GetChannel() { 46 chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel(); 47 switch (channel) { 48 case chrome::VersionInfo::CHANNEL_UNKNOWN: 49 return GCMClient::CHANNEL_UNKNOWN; 50 case chrome::VersionInfo::CHANNEL_CANARY: 51 return GCMClient::CHANNEL_CANARY; 52 case chrome::VersionInfo::CHANNEL_DEV: 53 return GCMClient::CHANNEL_DEV; 54 case chrome::VersionInfo::CHANNEL_BETA: 55 return GCMClient::CHANNEL_BETA; 56 case chrome::VersionInfo::CHANNEL_STABLE: 57 return GCMClient::CHANNEL_STABLE; 58 default: 59 NOTREACHED(); 60 return GCMClient::CHANNEL_UNKNOWN; 61 } 62} 63 64std::string GetVersion() { 65 chrome::VersionInfo version_info; 66 return version_info.Version(); 67} 68 69GCMClient::ChromeBuildInfo GetChromeBuildInfo() { 70 GCMClient::ChromeBuildInfo chrome_build_info; 71 chrome_build_info.platform = GetPlatform(); 72 chrome_build_info.channel = GetChannel(); 73 chrome_build_info.version = GetVersion(); 74 return chrome_build_info; 75} 76 77std::string GetChannelStatusRequestUrl() { 78 GURL sync_url( 79 ProfileSyncService::GetSyncServiceURL(*CommandLine::ForCurrentProcess())); 80 return sync_url.spec() + kChannelStatusRelativePath; 81} 82 83std::string GetUserAgent() { 84 chrome::VersionInfo version_info; 85 return browser_sync::LocalDeviceInfoProviderImpl::MakeUserAgentForSyncApi( 86 version_info); 87} 88 89} // namespace 90 91scoped_ptr<GCMDriver> CreateGCMDriverDesktop( 92 scoped_ptr<GCMClientFactory> gcm_client_factory, 93 PrefService* prefs, 94 const base::FilePath& store_path, 95 const scoped_refptr<net::URLRequestContextGetter>& request_context) { 96 scoped_refptr<base::SequencedWorkerPool> worker_pool( 97 content::BrowserThread::GetBlockingPool()); 98 scoped_refptr<base::SequencedTaskRunner> blocking_task_runner( 99 worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( 100 worker_pool->GetSequenceToken(), 101 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)); 102 return scoped_ptr<GCMDriver>( 103 new GCMDriverDesktop(gcm_client_factory.Pass(), 104 GetChromeBuildInfo(), 105 GetChannelStatusRequestUrl(), 106 GetUserAgent(), 107 prefs, 108 store_path, 109 request_context, 110 content::BrowserThread::GetMessageLoopProxyForThread( 111 content::BrowserThread::UI), 112 content::BrowserThread::GetMessageLoopProxyForThread( 113 content::BrowserThread::IO), 114 blocking_task_runner)); 115} 116 117} // namespace gcm 118