15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/sync/glue/device_info.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/values.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_version_info.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/util/get_session_name.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/device_form_factor.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool IsTabletUI() {
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Converts VersionInfo::Channel to string for user-agent string.
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string ChannelToString(chrome::VersionInfo::Channel channel) {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (channel) {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::VersionInfo::CHANNEL_UNKNOWN:
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "unknown";
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::VersionInfo::CHANNEL_CANARY:
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "canary";
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::VersionInfo::CHANNEL_DEV:
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "dev";
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::VersionInfo::CHANNEL_BETA:
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "beta";
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::VersionInfo::CHANNEL_STABLE:
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "stable";
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return "unknown";
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochDeviceInfo::DeviceInfo(const std::string& guid,
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                       const std::string& client_name,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const std::string& chrome_version,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const std::string& sync_user_agent,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const sync_pb::SyncEnums::DeviceType device_type)
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    : guid_(guid),
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      client_name_(client_name),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome_version_(chrome_version),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sync_user_agent_(sync_user_agent),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_type_(device_type) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DeviceInfo::~DeviceInfo() { }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst std::string& DeviceInfo::guid() const {
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return guid_;
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& DeviceInfo::client_name() const {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return client_name_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& DeviceInfo::chrome_version() const {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return chrome_version_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const std::string& DeviceInfo::sync_user_agent() const {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_user_agent_;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const std::string& DeviceInfo::public_id() const {
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return public_id_;
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEnums::DeviceType DeviceInfo::device_type() const {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return device_type_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string DeviceInfo::GetOSString() const {
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  switch (device_type_) {
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_WIN:
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "win";
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_MAC:
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "mac";
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_LINUX:
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "linux";
9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_CROS:
9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "chrome_os";
9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_PHONE:
9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_TABLET:
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      // TODO(lipalani): crbug.com/170375. Add support for ios
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      // phones and tablets.
9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "android";
10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    default:
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "unknown";
10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
10368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
10468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::string DeviceInfo::GetDeviceTypeString() const {
10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  switch (device_type_) {
10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_WIN:
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_MAC:
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_LINUX:
11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_CROS:
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "desktop_or_laptop";
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_PHONE:
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "phone";
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case sync_pb::SyncEnums_DeviceType_TYPE_TABLET:
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "tablet";
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    default:
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return "unknown";
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool DeviceInfo::Equals(const DeviceInfo& other) const {
1227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return this->guid() == other.guid()
1237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      && this->client_name() == other.client_name()
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      && this->chrome_version() == other.chrome_version()
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      && this->sync_user_agent() == other.sync_user_agent()
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      && this->device_type() == other.device_type();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sync_pb::SyncEnums::DeviceType DeviceInfo::GetLocalDeviceType() {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_pb::SyncEnums_DeviceType_TYPE_CROS;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_pb::SyncEnums_DeviceType_TYPE_LINUX;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_pb::SyncEnums_DeviceType_TYPE_MAC;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_pb::SyncEnums_DeviceType_TYPE_WIN;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IsTabletUI() ?
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sync_pb::SyncEnums_DeviceType_TYPE_TABLET :
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sync_pb::SyncEnums_DeviceType_TYPE_PHONE;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return sync_pb::SyncEnums_DeviceType_TYPE_OTHER;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string DeviceInfo::MakeUserAgentForSyncApi(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const chrome::VersionInfo& version_info) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string user_agent;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_agent = "Chrome ";
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_agent += "WIN ";
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_CHROMEOS)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_agent += "CROS ";
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID)
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (IsTabletUI())
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_agent += "ANDROID-TABLET ";
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_agent += "ANDROID-PHONE ";
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_LINUX)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_agent += "LINUX ";
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_FREEBSD)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_agent += "FREEBSD ";
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_OPENBSD)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_agent += "OPENBSD ";
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_agent += "MAC ";
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!version_info.is_valid()) {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DLOG(ERROR) << "Unable to create chrome::VersionInfo object";
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return user_agent;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_agent += version_info.Version();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_agent += " (" + version_info.LastChange() + ")";
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!version_info.IsOfficialBuild()) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    user_agent += "-devel";
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    user_agent += " channel(" +
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ChannelToString(version_info.GetChannel()) + ")";
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return user_agent;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochbase::DictionaryValue* DeviceInfo::ToValue() {
189ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::DictionaryValue* value = new base::DictionaryValue();
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  value->SetString("name", client_name_);
191d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  value->SetString("id", public_id_);
19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  value->SetString("os", GetOSString());
19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  value->SetString("type", GetDeviceTypeString());
194d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  value->SetString("chromeVersion", chrome_version_);
195ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return value;
196ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
197ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
198a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void DeviceInfo::set_public_id(std::string id) {
199ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  public_id_ = id;
200ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
201ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceInfo::CreateLocalDeviceInfo(
2047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& guid,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Callback<void(const DeviceInfo& local_info)> callback) {
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  GetClientName(
2077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&DeviceInfo::CreateLocalDeviceInfoContinuation,
2087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 guid,
2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 callback));
2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// static.
2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DeviceInfo::GetClientName(
2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::Callback<void(const std::string& client_name)> callback) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::GetSessionName(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::BrowserThread::GetBlockingPool(),
2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Bind(&DeviceInfo::GetClientNameContinuation,
2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 callback));
2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid DeviceInfo::GetClientNameContinuation(
2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::Callback<void(const std::string& local_info)> callback,
2237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& session_name) {
2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  callback.Run(session_name);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DeviceInfo::CreateLocalDeviceInfoContinuation(
2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const std::string& guid,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::Callback<void(const DeviceInfo& local_info)> callback,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& session_name) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::VersionInfo version_info;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeviceInfo local_info(
2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      guid,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      session_name,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      version_info.CreateVersionString(),
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MakeUserAgentForSyncApi(version_info),
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetLocalDeviceType());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(local_info);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace browser_sync
245