15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/glue/local_device_info_provider_impl.h" 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/chrome_version_info.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/browser_thread.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "sync/util/get_session_name.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/device_form_factor.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace browser_sync { 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Converts VersionInfo::Channel to string for user-agent string. 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string ChannelToString(chrome::VersionInfo::Channel channel) { 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (channel) { 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case chrome::VersionInfo::CHANNEL_UNKNOWN: 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return "unknown"; 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case chrome::VersionInfo::CHANNEL_CANARY: 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return "canary"; 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case chrome::VersionInfo::CHANNEL_DEV: 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return "dev"; 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case chrome::VersionInfo::CHANNEL_BETA: 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return "beta"; 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case chrome::VersionInfo::CHANNEL_STABLE: 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return "stable"; 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NOTREACHED(); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return "unknown"; 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_ANDROID) 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool IsTabletUI() { 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET; 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccisync_pb::SyncEnums::DeviceType GetLocalDeviceType() { 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_CHROMEOS) 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return sync_pb::SyncEnums_DeviceType_TYPE_CROS; 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_LINUX) 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return sync_pb::SyncEnums_DeviceType_TYPE_LINUX; 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_MACOSX) 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return sync_pb::SyncEnums_DeviceType_TYPE_MAC; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_WIN) 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return sync_pb::SyncEnums_DeviceType_TYPE_WIN; 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_ANDROID) 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return IsTabletUI() ? sync_pb::SyncEnums_DeviceType_TYPE_TABLET 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : sync_pb::SyncEnums_DeviceType_TYPE_PHONE; 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return sync_pb::SyncEnums_DeviceType_TYPE_OTHER; 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)LocalDeviceInfoProviderImpl::LocalDeviceInfoProviderImpl() 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : weak_factory_(this) { 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)LocalDeviceInfoProviderImpl::~LocalDeviceInfoProviderImpl() { 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static. 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistd::string LocalDeviceInfoProviderImpl::MakeUserAgentForSyncApi( 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const chrome::VersionInfo& version_info) { 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string user_agent; 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent = "Chrome "; 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN) 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += "WIN "; 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_CHROMEOS) 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += "CROS "; 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_ANDROID) 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (IsTabletUI()) 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += "ANDROID-TABLET "; 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += "ANDROID-PHONE "; 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_LINUX) 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += "LINUX "; 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_FREEBSD) 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += "FREEBSD "; 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_OPENBSD) 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += "OPENBSD "; 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#elif defined(OS_MACOSX) 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += "MAC "; 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!version_info.is_valid()) { 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DLOG(ERROR) << "Unable to create chrome::VersionInfo object"; 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return user_agent; 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += version_info.Version(); 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += " (" + version_info.LastChange() + ")"; 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!version_info.IsOfficialBuild()) { 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += "-devel"; 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci user_agent += 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci " channel(" + ChannelToString(version_info.GetChannel()) + ")"; 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return user_agent; 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst sync_driver::DeviceInfo* 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)LocalDeviceInfoProviderImpl::GetLocalDeviceInfo() const { 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return local_device_info_.get(); 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)std::string LocalDeviceInfoProviderImpl::GetLocalSyncCacheGUID() const { 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return cache_guid_; 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<sync_driver::LocalDeviceInfoProvider::Subscription> 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)LocalDeviceInfoProviderImpl::RegisterOnInitializedCallback( 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const base::Closure& callback) { 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(!local_device_info_.get()); 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return callback_list_.Add(callback); 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void LocalDeviceInfoProviderImpl::Initialize( 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& cache_guid, const std::string& signin_scoped_device_id) { 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DCHECK(!cache_guid.empty()); 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) cache_guid_ = cache_guid; 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci syncer::GetSessionName( 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::BrowserThread::GetBlockingPool(), 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&LocalDeviceInfoProviderImpl::InitializeContinuation, 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci weak_factory_.GetWeakPtr(), 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci cache_guid, 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci signin_scoped_device_id)); 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void LocalDeviceInfoProviderImpl::InitializeContinuation( 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& guid, 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& signin_scoped_device_id, 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& session_name) { 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chrome::VersionInfo version_info; 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) local_device_info_.reset( 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new sync_driver::DeviceInfo(guid, 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session_name, 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci version_info.CreateVersionString(), 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MakeUserAgentForSyncApi(version_info), 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetLocalDeviceType(), 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci signin_scoped_device_id)); 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Notify observers. 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) callback_list_.Notify(); 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace browser_sync 155