Home | History | Annotate | Download | only in glue
      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 "base/bind.h"
      6 #include "chrome/browser/sync/glue/local_device_info_provider_impl.h"
      7 #include "chrome/common/chrome_version_info.h"
      8 #include "content/public/browser/browser_thread.h"
      9 #include "sync/util/get_session_name.h"
     10 #include "ui/base/device_form_factor.h"
     11 
     12 namespace browser_sync {
     13 
     14 namespace {
     15 
     16 // Converts VersionInfo::Channel to string for user-agent string.
     17 std::string ChannelToString(chrome::VersionInfo::Channel channel) {
     18   switch (channel) {
     19     case chrome::VersionInfo::CHANNEL_UNKNOWN:
     20       return "unknown";
     21     case chrome::VersionInfo::CHANNEL_CANARY:
     22       return "canary";
     23     case chrome::VersionInfo::CHANNEL_DEV:
     24       return "dev";
     25     case chrome::VersionInfo::CHANNEL_BETA:
     26       return "beta";
     27     case chrome::VersionInfo::CHANNEL_STABLE:
     28       return "stable";
     29     default:
     30       NOTREACHED();
     31       return "unknown";
     32   }
     33 }
     34 
     35 #if defined(OS_ANDROID)
     36 bool IsTabletUI() {
     37   return ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET;
     38 }
     39 #endif
     40 
     41 sync_pb::SyncEnums::DeviceType GetLocalDeviceType() {
     42 #if defined(OS_CHROMEOS)
     43   return sync_pb::SyncEnums_DeviceType_TYPE_CROS;
     44 #elif defined(OS_LINUX)
     45   return sync_pb::SyncEnums_DeviceType_TYPE_LINUX;
     46 #elif defined(OS_MACOSX)
     47   return sync_pb::SyncEnums_DeviceType_TYPE_MAC;
     48 #elif defined(OS_WIN)
     49   return sync_pb::SyncEnums_DeviceType_TYPE_WIN;
     50 #elif defined(OS_ANDROID)
     51   return IsTabletUI() ? sync_pb::SyncEnums_DeviceType_TYPE_TABLET
     52                       : sync_pb::SyncEnums_DeviceType_TYPE_PHONE;
     53 #else
     54   return sync_pb::SyncEnums_DeviceType_TYPE_OTHER;
     55 #endif
     56 }
     57 
     58 }  // namespace
     59 
     60 LocalDeviceInfoProviderImpl::LocalDeviceInfoProviderImpl()
     61     : weak_factory_(this) {
     62 }
     63 
     64 LocalDeviceInfoProviderImpl::~LocalDeviceInfoProviderImpl() {
     65 }
     66 
     67 // static.
     68 std::string LocalDeviceInfoProviderImpl::MakeUserAgentForSyncApi(
     69     const chrome::VersionInfo& version_info) {
     70   std::string user_agent;
     71   user_agent = "Chrome ";
     72 #if defined(OS_WIN)
     73   user_agent += "WIN ";
     74 #elif defined(OS_CHROMEOS)
     75   user_agent += "CROS ";
     76 #elif defined(OS_ANDROID)
     77   if (IsTabletUI())
     78     user_agent += "ANDROID-TABLET ";
     79   else
     80     user_agent += "ANDROID-PHONE ";
     81 #elif defined(OS_LINUX)
     82   user_agent += "LINUX ";
     83 #elif defined(OS_FREEBSD)
     84   user_agent += "FREEBSD ";
     85 #elif defined(OS_OPENBSD)
     86   user_agent += "OPENBSD ";
     87 #elif defined(OS_MACOSX)
     88   user_agent += "MAC ";
     89 #endif
     90   if (!version_info.is_valid()) {
     91     DLOG(ERROR) << "Unable to create chrome::VersionInfo object";
     92     return user_agent;
     93   }
     94 
     95   user_agent += version_info.Version();
     96   user_agent += " (" + version_info.LastChange() + ")";
     97   if (!version_info.IsOfficialBuild()) {
     98     user_agent += "-devel";
     99   } else {
    100     user_agent +=
    101         " channel(" + ChannelToString(version_info.GetChannel()) + ")";
    102   }
    103 
    104   return user_agent;
    105 }
    106 
    107 const sync_driver::DeviceInfo*
    108 LocalDeviceInfoProviderImpl::GetLocalDeviceInfo() const {
    109   return local_device_info_.get();
    110 }
    111 
    112 std::string LocalDeviceInfoProviderImpl::GetLocalSyncCacheGUID() const {
    113   return cache_guid_;
    114 }
    115 
    116 scoped_ptr<sync_driver::LocalDeviceInfoProvider::Subscription>
    117 LocalDeviceInfoProviderImpl::RegisterOnInitializedCallback(
    118     const base::Closure& callback) {
    119   DCHECK(!local_device_info_.get());
    120   return callback_list_.Add(callback);
    121 }
    122 
    123 void LocalDeviceInfoProviderImpl::Initialize(
    124     const std::string& cache_guid, const std::string& signin_scoped_device_id) {
    125   DCHECK(!cache_guid.empty());
    126   cache_guid_ = cache_guid;
    127 
    128   syncer::GetSessionName(
    129       content::BrowserThread::GetBlockingPool(),
    130       base::Bind(&LocalDeviceInfoProviderImpl::InitializeContinuation,
    131                  weak_factory_.GetWeakPtr(),
    132                  cache_guid,
    133                  signin_scoped_device_id));
    134 }
    135 
    136 void LocalDeviceInfoProviderImpl::InitializeContinuation(
    137     const std::string& guid,
    138     const std::string& signin_scoped_device_id,
    139     const std::string& session_name) {
    140   chrome::VersionInfo version_info;
    141 
    142   local_device_info_.reset(
    143       new sync_driver::DeviceInfo(guid,
    144                                   session_name,
    145                                   version_info.CreateVersionString(),
    146                                   MakeUserAgentForSyncApi(version_info),
    147                                   GetLocalDeviceType(),
    148                                   signin_scoped_device_id));
    149 
    150   // Notify observers.
    151   callback_list_.Notify();
    152 }
    153 
    154 }  // namespace browser_sync
    155