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)#ifndef CHROME_BROWSER_SYNC_GLUE_DEVICE_INFO_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SYNC_GLUE_DEVICE_INFO_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace base {
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass DictionaryValue;
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VersionInfo;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace browser_sync {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class that holds information regarding the properties of a device.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeviceInfo {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  DeviceInfo(const std::string& guid,
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch             const std::string& client_name,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const std::string& chrome_version,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const std::string& sync_user_agent,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const sync_pb::SyncEnums::DeviceType device_type);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~DeviceInfo();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Sync specific unique identifier for the device. Note if a device
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // is wiped and sync is set up again this id WILL be different.
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The same device might have more than 1 guid if the device has multiple
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // accounts syncing.
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const std::string& guid() const;
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The host name for the client.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& client_name() const;
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Chrome version string.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& chrome_version() const;
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // The user agent is the combination of OS type, chrome version and which
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // channel of chrome(stable or beta). For more information see
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // |DeviceInfo::MakeUserAgentForSyncApi|.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& sync_user_agent() const;
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Third party visible id for the device. See |public_id_| for more details.
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const std::string& public_id() const;
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Device Type.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pb::SyncEnums::DeviceType device_type() const;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compares this object's fields with another's.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Equals(const DeviceInfo& other) const;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Apps can set ids for a device that is meaningful to them but
61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // not unique enough so the user can be tracked. Exposing |guid|
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // would lead to a stable unique id for a device which can potentially
63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // be used for tracking.
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void set_public_id(std::string id);
65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Converts the |DeviceInfo| values to a JS friendly DictionaryValue,
67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // which extension APIs can expose to third party apps.
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  base::DictionaryValue* ToValue();
69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static sync_pb::SyncEnums::DeviceType GetLocalDeviceType();
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Creates a |DeviceInfo| object representing the local device and passes
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // it as parameter to the callback.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CreateLocalDeviceInfo(
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const std::string& guid,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Callback<void(const DeviceInfo& local_info)> callback);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Gets the local device name and passes it as a parameter to callback.
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void GetClientName(
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Callback<void(const std::string& local_info)> callback);
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper to construct a user agent string (ASCII) suitable for use by
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the syncapi for any HTTP communication. This string is used by the sync
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // backend for classifying client types when calculating statistics.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string MakeUserAgentForSyncApi(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const chrome::VersionInfo& version_info);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void GetClientNameContinuation(
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      base::Callback<void(const std::string& local_info)> callback,
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const std::string& session_name);
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void CreateLocalDeviceInfoContinuation(
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const std::string& guid,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Callback<void(const DeviceInfo& local_info)> callback,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& session_name);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  const std::string guid_;
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string client_name_;
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string chrome_version_;
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string sync_user_agent_;
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const sync_pb::SyncEnums::DeviceType device_type_;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Exposing |guid| would lead to a stable unique id for a device which
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // can potentially be used for tracking. Public ids are privacy safe
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // ids in that the same device will have different id for different apps
111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // and they are also reset when app/extension is uninstalled.
112ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string public_id_;
113ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DeviceInfo);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}  // namespace browser_sync
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_SYNC_GLUE_DEVICE_INFO_H_
120