12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 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)// Enumerate the various item subtypes that are supported by sync. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Each sync object is expected to have an immutable object type. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An object's type is inferred from the type of data it holds. 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef SYNC_INTERNAL_API_PUBLIC_BASE_MODEL_TYPE_H_ 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SYNC_INTERNAL_API_PUBLIC_BASE_MODEL_TYPE_H_ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/base/sync_export.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/enum_set.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StringValue; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sync_pb { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EntitySpecifics; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SyncEntity; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(akalin): Move the non-exported functions in this file to a 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// private header. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum ModelType { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Object type unknown. Objects may transition through 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the unknown state during their initial creation, before 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // their properties are set. After deletion, object types 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are generally preserved. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UNSPECIFIED, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A permanent folder whose children may be of mixed 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // datatypes (e.g. the "Google Chrome" folder). 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TOP_LEVEL_FOLDER, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ------------------------------------ Start of "real" model types. 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The model types declared before here are somewhat special, as they 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // they do not correspond to any browser data model. The remaining types 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are bona fide model types; all have a related browser data model and 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can be represented in the protocol using a specific Message type in the 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // EntitySpecifics protocol buffer. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A bookmark folder or a bookmark URL object. 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BOOKMARKS, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIRST_USER_MODEL_TYPE = BOOKMARKS, // Declared 2nd, for debugger prettiness. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIRST_REAL_MODEL_TYPE = FIRST_USER_MODEL_TYPE, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A preference object. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PREFERENCES, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A password object. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASSWORDS, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An AutofillProfile Object 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AUTOFILL_PROFILE, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An autofill object. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AUTOFILL, 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A themes object. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) THEMES, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // A typed_url object. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TYPED_URLS, 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An extension object. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSIONS, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An object representing a custom search engine. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SEARCH_ENGINES, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An object representing a browser session. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SESSIONS, 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // An app object. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APPS, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An app setting from the extension settings API. 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APP_SETTINGS, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An extension setting from the extension settings API. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXTENSION_SETTINGS, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // App notifications. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) APP_NOTIFICATIONS, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // History delete directives. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HISTORY_DELETE_DIRECTIVES, 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Synced push notifications. 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SYNCED_NOTIFICATIONS, 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Custom spelling dictionary. 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DICTIONARY, 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Favicon images. 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAVICON_IMAGES, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Favicon tracking information. 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FAVICON_TRACKING, 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // These preferences are synced before other user types and are never 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // encrypted. 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) PRIORITY_PREFERENCES, 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Managed user settings. 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MANAGED_USER_SETTINGS, 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Managed users. Every managed user is a profile that is configured remotely 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // by this user and can have restrictions applied. MANAGED_USERS and 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // MANAGED_USER_SETTINGS can not be encrypted. 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MANAGED_USERS, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ---- Proxy types ---- 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Proxy types are excluded from the sync protocol, but are still considered 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // real user types. By convention, we prefix them with 'PROXY_' to distinguish 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // them from normal protocol types. 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Tab sync. This is a placeholder type, so that Sessions can be implicitly 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // enabled for history sync and tabs sync. 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PROXY_TABS, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FIRST_PROXY_TYPE = PROXY_TABS, 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LAST_PROXY_TYPE = PROXY_TABS, 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LAST_USER_MODEL_TYPE = PROXY_TABS, 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ---- Control Types ---- 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An object representing a set of Nigori keys. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NIGORI, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FIRST_CONTROL_MODEL_TYPE = NIGORI, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Client-specific metadata. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DEVICE_INFO, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flags to enable experimental features. 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPERIMENTS, 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LAST_CONTROL_MODEL_TYPE = EXPERIMENTS, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LAST_REAL_MODEL_TYPE = LAST_CONTROL_MODEL_TYPE, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If you are adding a new sync datatype that is exposed to the user via the 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sync preferences UI, be sure to update the list in 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // chrome/browser/sync/user_selectable_sync_type.h so that the UMA histograms 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for sync include your new type. 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In this case, be sure to also update the UserSelectableTypes() definition 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in sync/syncable/model_type.cc. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MODEL_TYPE_COUNT, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef EnumSet<ModelType, FIRST_REAL_MODEL_TYPE, LAST_REAL_MODEL_TYPE> 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelTypeSet; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef EnumSet<ModelType, UNSPECIFIED, LAST_REAL_MODEL_TYPE> 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FullModelTypeSet; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline ModelType ModelTypeFromInt(int i) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_GE(i, 0); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_LT(i, MODEL_TYPE_COUNT); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<ModelType>(i); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by tests outside of sync/. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SYNC_EXPORT void AddDefaultFieldValue(ModelType datatype, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_pb::EntitySpecifics* specifics); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extract the model type of a SyncEntity protocol buffer. ModelType is a 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// local concept: the enum is not in the protocol. The SyncEntity's ModelType 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is inferred from the presence of particular datatype field in the 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// entity specifics. 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT_PRIVATE ModelType GetModelType( 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const sync_pb::SyncEntity& sync_entity); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extract the model type from an EntitySpecifics field. Note that there 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// are some ModelTypes (like TOP_LEVEL_FOLDER) that can't be inferred this way; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// prefer using GetModelType where possible. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SYNC_EXPORT ModelType GetModelTypeFromSpecifics( 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const sync_pb::EntitySpecifics& specifics); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Protocol types are those types that have actual protocol buffer 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// representations. This distinguishes them from Proxy types, which have no 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// protocol representation and are never sent to the server. 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT ModelTypeSet ProtocolTypes(); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These are the normal user-controlled types. This is to distinguish from 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ControlTypes which are always enabled. Note that some of these share a 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// preference flag, so not all of them are individually user-selectable. 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT ModelTypeSet UserTypes(); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These are the user-selectable data types. 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT ModelTypeSet UserSelectableTypes(); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT bool IsUserSelectableType(ModelType model_type); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This is the subset of UserTypes() that can be encrypted. 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT_PRIVATE ModelTypeSet EncryptableUserTypes(); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This is the subset of UserTypes() that have priority over other types. These 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// types are synced before other user types and are never encrypted. 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SYNC_EXPORT ModelTypeSet PriorityUserTypes(); 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Proxy types are placeholder types for handling implicitly enabling real 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// types. They do not exist at the server, and are simply used for 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// UI/Configuration logic. 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT ModelTypeSet ProxyTypes(); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a list of all control types. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The control types are intended to contain metadata nodes that are essential 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for the normal operation of the syncer. As such, they have the following 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// special properties: 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - They are downloaded early during SyncBackend initialization. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - They are always enabled. Users may not disable these types. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - Their contents are not encrypted automatically. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - They support custom update application and conflict resolution logic. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - All change processing occurs on the sync thread (GROUP_PASSIVE). 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT ModelTypeSet ControlTypes(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if this is a control type. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See comment above for more information on what makes these types special. 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT bool IsControlType(ModelType model_type); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 210ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Core types are those data types used by sync's core functionality (i.e. not 211ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// user data types). These types are always enabled, and include ControlTypes(). 212ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// 213ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// The set of all core types. 214ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochSYNC_EXPORT ModelTypeSet CoreTypes(); 215ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Those core types that have high priority (includes ControlTypes()). 216ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochSYNC_EXPORT ModelTypeSet PriorityCoreTypes(); 217ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Determine a model type from the field number of its associated 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// EntitySpecifics field. Returns UNSPECIFIED if the field number is 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// not recognized. 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// If you're putting the result in a ModelTypeSet, you should use the 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// following pattern: 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ModelTypeSet model_types; 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// // Say we're looping through a list of items, each of which has a 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// // field number. 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// for (...) { 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// int field_number = ...; 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ModelType model_type = 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// GetModelTypeFromSpecificsFieldNumber(field_number); 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// if (!IsRealDataType(model_type)) { 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// DLOG(WARNING) << "Unknown field number " << field_number; 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// continue; 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// } 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// model_types.Put(model_type); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// } 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT_PRIVATE ModelType GetModelTypeFromSpecificsFieldNumber( 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int field_number); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the field number of the EntitySpecifics field associated with 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a model type. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by tests outside of sync. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SYNC_EXPORT int GetSpecificsFieldNumberFromModelType( 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ModelType model_type); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FullModelTypeSet ToFullModelTypeSet(ModelTypeSet in); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(sync): The functions below badly need some cleanup. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a pointer to a string with application lifetime that represents 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the name of |model_type|. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SYNC_EXPORT const char* ModelTypeToString(ModelType model_type); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Some histograms take an integer parameter that represents a model type. 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The mapping from ModelType to integer is defined here. It should match 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the mapping from integer to labels defined in histograms.xml. 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT int ModelTypeToHistogramInt(ModelType model_type); 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Handles all model types, and not just real ones. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Caller takes ownership of returned value. 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT_PRIVATE base::StringValue* ModelTypeToValue(ModelType model_type); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts a Value into a ModelType - complement to ModelTypeToValue(). 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT_PRIVATE ModelType ModelTypeFromValue(const base::Value& value); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the ModelType corresponding to the name |model_type_string|. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SYNC_EXPORT ModelType ModelTypeFromString( 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& model_type_string); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SYNC_EXPORT std::string ModelTypeSetToString(ModelTypeSet model_types); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Caller takes ownership of returned list. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SYNC_EXPORT base::ListValue* ModelTypeSetToValue(ModelTypeSet model_types); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SYNC_EXPORT ModelTypeSet ModelTypeSetFromValue(const base::ListValue& value); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns a string corresponding to the syncable tag for this datatype. 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SYNC_EXPORT std::string ModelTypeToRootTag(ModelType type); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Convert a real model type to a notification type (used for 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// subscribing to server-issued notifications). Returns true iff 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |model_type| was a real model type and |notification_type| was 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// filled in. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RealModelTypeToNotificationType(ModelType model_type, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string* notification_type); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts a notification type to a real model type. Returns true 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// iff |notification_type| was the notification type of a real model 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type and |model_type| was filled in. 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)SYNC_EXPORT bool NotificationTypeToRealModelType( 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& notification_type, 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ModelType* model_type); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |model_type| is a real datatype 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SYNC_EXPORT bool IsRealDataType(ModelType model_type); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Returns true if |model_type| is an act-once type. Act once types drop 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// entities after applying them. Drops are deletes that are not synced to other 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// clients. 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(haitaol): Make entries of act-once data types immutable. 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SYNC_EXPORT bool IsActOnceDataType(ModelType model_type); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace syncer 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // SYNC_INTERNAL_API_PUBLIC_BASE_MODEL_TYPE_H_ 309