146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/services/gcm/gcm_desktop_utils.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
71675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch#include "base/command_line.h"
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/logging.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/sequenced_task_runner.h"
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
111675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch#include "chrome/browser/sync/glue/local_device_info_provider_impl.h"
121675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch#include "chrome/browser/sync/profile_sync_service.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/common/chrome_version_info.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/gcm_driver/gcm_client.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/gcm_driver/gcm_client_factory.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/gcm_driver/gcm_driver.h"
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/gcm_driver/gcm_driver_desktop.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/browser_thread.h"
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace gcm {
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace {
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
241675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochconst char kChannelStatusRelativePath[] = "/experimentstatus";
251675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)GCMClient::ChromePlatform GetPlatform() {
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_WIN)
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return GCMClient::PLATFORM_WIN;
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#elif defined(OS_MACOSX)
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return GCMClient::PLATFORM_MAC;
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#elif defined(OS_IOS)
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return GCMClient::PLATFORM_IOS;
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#elif defined(OS_ANDROID)
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return GCMClient::PLATFORM_ANDROID;
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#elif defined(OS_CHROMEOS)
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return GCMClient::PLATFORM_CROS;
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#elif defined(OS_LINUX)
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return GCMClient::PLATFORM_LINUX;
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#else
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // For all other platforms, return as LINUX.
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return GCMClient::PLATFORM_LINUX;
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)GCMClient::ChromeChannel GetChannel() {
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  chrome::VersionInfo::Channel channel = chrome::VersionInfo::GetChannel();
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  switch (channel) {
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case chrome::VersionInfo::CHANNEL_UNKNOWN:
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return GCMClient::CHANNEL_UNKNOWN;
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case chrome::VersionInfo::CHANNEL_CANARY:
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return GCMClient::CHANNEL_CANARY;
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case chrome::VersionInfo::CHANNEL_DEV:
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return GCMClient::CHANNEL_DEV;
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case chrome::VersionInfo::CHANNEL_BETA:
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return GCMClient::CHANNEL_BETA;
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    case chrome::VersionInfo::CHANNEL_STABLE:
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return GCMClient::CHANNEL_STABLE;
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    default:
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      NOTREACHED();
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return GCMClient::CHANNEL_UNKNOWN;
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)std::string GetVersion() {
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  chrome::VersionInfo version_info;
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return version_info.Version();
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)GCMClient::ChromeBuildInfo GetChromeBuildInfo() {
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  GCMClient::ChromeBuildInfo chrome_build_info;
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  chrome_build_info.platform = GetPlatform();
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  chrome_build_info.channel = GetChannel();
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  chrome_build_info.version = GetVersion();
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return chrome_build_info;
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
771675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochstd::string GetChannelStatusRequestUrl() {
781675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  GURL sync_url(
791675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      ProfileSyncService::GetSyncServiceURL(*CommandLine::ForCurrentProcess()));
801675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  return sync_url.spec() + kChannelStatusRelativePath;
811675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch}
821675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
831675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdochstd::string GetUserAgent() {
841675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  chrome::VersionInfo version_info;
851675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  return browser_sync::LocalDeviceInfoProviderImpl::MakeUserAgentForSyncApi(
861675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      version_info);
871675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch}
881675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)scoped_ptr<GCMDriver> CreateGCMDriverDesktop(
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_ptr<GCMClientFactory> gcm_client_factory,
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PrefService* prefs,
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const base::FilePath& store_path,
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const scoped_refptr<net::URLRequestContextGetter>& request_context) {
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_refptr<base::SequencedWorkerPool> worker_pool(
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      content::BrowserThread::GetBlockingPool());
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_refptr<base::SequencedTaskRunner> blocking_task_runner(
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      worker_pool->GetSequencedTaskRunnerWithShutdownBehavior(
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          worker_pool->GetSequenceToken(),
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          base::SequencedWorkerPool::SKIP_ON_SHUTDOWN));
1021675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch  return scoped_ptr<GCMDriver>(
1031675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch      new GCMDriverDesktop(gcm_client_factory.Pass(),
1041675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                           GetChromeBuildInfo(),
1051675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                           GetChannelStatusRequestUrl(),
1061675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                           GetUserAgent(),
1071675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                           prefs,
1081675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                           store_path,
1091675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                           request_context,
1101675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                           content::BrowserThread::GetMessageLoopProxyForThread(
1111675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                               content::BrowserThread::UI),
1121675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                           content::BrowserThread::GetMessageLoopProxyForThread(
1131675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                               content::BrowserThread::IO),
1141675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch                           blocking_task_runner));
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace gcm
118