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