- add sources.
[platform/framework/web/crosswalk.git] / src / sync / internal_api / public / base / model_type.h
1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // Enumerate the various item subtypes that are supported by sync.
6 // Each sync object is expected to have an immutable object type.
7 // An object's type is inferred from the type of data it holds.
8
9 #ifndef SYNC_INTERNAL_API_PUBLIC_BASE_MODEL_TYPE_H_
10 #define SYNC_INTERNAL_API_PUBLIC_BASE_MODEL_TYPE_H_
11
12 #include <set>
13 #include <string>
14
15 #include "base/logging.h"
16 #include "sync/base/sync_export.h"
17 #include "sync/internal_api/public/base/enum_set.h"
18
19 namespace base {
20 class ListValue;
21 class StringValue;
22 class Value;
23 }
24
25 namespace sync_pb {
26 class EntitySpecifics;
27 class SyncEntity;
28 }
29
30 namespace syncer {
31
32 // TODO(akalin): Move the non-exported functions in this file to a
33 // private header.
34
35 enum ModelType {
36   // Object type unknown.  Objects may transition through
37   // the unknown state during their initial creation, before
38   // their properties are set.  After deletion, object types
39   // are generally preserved.
40   UNSPECIFIED,
41   // A permanent folder whose children may be of mixed
42   // datatypes (e.g. the "Google Chrome" folder).
43   TOP_LEVEL_FOLDER,
44
45   // ------------------------------------ Start of "real" model types.
46   // The model types declared before here are somewhat special, as they
47   // they do not correspond to any browser data model.  The remaining types
48   // are bona fide model types; all have a related browser data model and
49   // can be represented in the protocol using a specific Message type in the
50   // EntitySpecifics protocol buffer.
51   //
52   // A bookmark folder or a bookmark URL object.
53   BOOKMARKS,
54   FIRST_USER_MODEL_TYPE = BOOKMARKS,  // Declared 2nd, for debugger prettiness.
55   FIRST_REAL_MODEL_TYPE = FIRST_USER_MODEL_TYPE,
56
57   // A preference object.
58   PREFERENCES,
59   // A password object.
60   PASSWORDS,
61   // An AutofillProfile Object
62   AUTOFILL_PROFILE,
63   // An autofill object.
64   AUTOFILL,
65   // A themes object.
66   THEMES,
67   // A typed_url object.
68   TYPED_URLS,
69   // An extension object.
70   EXTENSIONS,
71   // An object representing a custom search engine.
72   SEARCH_ENGINES,
73   // An object representing a browser session.
74   SESSIONS,
75   // An app object.
76   APPS,
77   // An app setting from the extension settings API.
78   APP_SETTINGS,
79   // An extension setting from the extension settings API.
80   EXTENSION_SETTINGS,
81   // App notifications.
82   APP_NOTIFICATIONS,
83   // History delete directives.
84   HISTORY_DELETE_DIRECTIVES,
85   // Synced push notifications.
86   SYNCED_NOTIFICATIONS,
87   // Custom spelling dictionary.
88   DICTIONARY,
89   // Favicon images.
90   FAVICON_IMAGES,
91   // Favicon tracking information.
92   FAVICON_TRACKING,
93   // These preferences are synced before other user types and are never
94   // encrypted.
95   PRIORITY_PREFERENCES,
96   // Managed user settings.
97   MANAGED_USER_SETTINGS,
98   // Managed users. Every managed user is a profile that is configured remotely
99   // by this user and can have restrictions applied. MANAGED_USERS and
100   // MANAGED_USER_SETTINGS can not be encrypted.
101   MANAGED_USERS,
102   // Distilled articles.
103   ARTICLES,
104
105   // ---- Proxy types ----
106   // Proxy types are excluded from the sync protocol, but are still considered
107   // real user types. By convention, we prefix them with 'PROXY_' to distinguish
108   // them from normal protocol types.
109
110   // Tab sync. This is a placeholder type, so that Sessions can be implicitly
111   // enabled for history sync and tabs sync.
112   PROXY_TABS,
113
114   FIRST_PROXY_TYPE = PROXY_TABS,
115   LAST_PROXY_TYPE = PROXY_TABS,
116
117   LAST_USER_MODEL_TYPE = PROXY_TABS,
118
119   // ---- Control Types ----
120   // An object representing a set of Nigori keys.
121   NIGORI,
122   FIRST_CONTROL_MODEL_TYPE = NIGORI,
123   // Client-specific metadata.
124   DEVICE_INFO,
125   // Flags to enable experimental features.
126   EXPERIMENTS,
127   LAST_CONTROL_MODEL_TYPE = EXPERIMENTS,
128
129   LAST_REAL_MODEL_TYPE = LAST_CONTROL_MODEL_TYPE,
130
131   // If you are adding a new sync datatype that is exposed to the user via the
132   // sync preferences UI, be sure to update the list in
133   // chrome/browser/sync/user_selectable_sync_type.h so that the UMA histograms
134   // for sync include your new type.
135   // In this case, be sure to also update the UserSelectableTypes() definition
136   // in sync/syncable/model_type.cc.
137
138   MODEL_TYPE_COUNT,
139 };
140
141 typedef EnumSet<ModelType, FIRST_REAL_MODEL_TYPE, LAST_REAL_MODEL_TYPE>
142     ModelTypeSet;
143 typedef EnumSet<ModelType, UNSPECIFIED, LAST_REAL_MODEL_TYPE>
144     FullModelTypeSet;
145
146 inline ModelType ModelTypeFromInt(int i) {
147   DCHECK_GE(i, 0);
148   DCHECK_LT(i, MODEL_TYPE_COUNT);
149   return static_cast<ModelType>(i);
150 }
151
152 // Used by tests outside of sync/.
153 SYNC_EXPORT void AddDefaultFieldValue(ModelType datatype,
154                                       sync_pb::EntitySpecifics* specifics);
155
156 // Extract the model type of a SyncEntity protocol buffer.  ModelType is a
157 // local concept: the enum is not in the protocol.  The SyncEntity's ModelType
158 // is inferred from the presence of particular datatype field in the
159 // entity specifics.
160 SYNC_EXPORT_PRIVATE ModelType GetModelType(
161     const sync_pb::SyncEntity& sync_entity);
162
163 // Extract the model type from an EntitySpecifics field.  Note that there
164 // are some ModelTypes (like TOP_LEVEL_FOLDER) that can't be inferred this way;
165 // prefer using GetModelType where possible.
166 SYNC_EXPORT ModelType GetModelTypeFromSpecifics(
167     const sync_pb::EntitySpecifics& specifics);
168
169 // Protocol types are those types that have actual protocol buffer
170 // representations. This distinguishes them from Proxy types, which have no
171 // protocol representation and are never sent to the server.
172 SYNC_EXPORT ModelTypeSet ProtocolTypes();
173
174 // These are the normal user-controlled types. This is to distinguish from
175 // ControlTypes which are always enabled.  Note that some of these share a
176 // preference flag, so not all of them are individually user-selectable.
177 SYNC_EXPORT ModelTypeSet UserTypes();
178
179 // These are the user-selectable data types.
180 SYNC_EXPORT ModelTypeSet UserSelectableTypes();
181 SYNC_EXPORT bool IsUserSelectableType(ModelType model_type);
182
183 // This is the subset of UserTypes() that can be encrypted.
184 SYNC_EXPORT_PRIVATE ModelTypeSet EncryptableUserTypes();
185
186 // This is the subset of UserTypes() that have priority over other types.  These
187 // types are synced before other user types and are never encrypted.
188 SYNC_EXPORT ModelTypeSet PriorityUserTypes();
189
190 // Proxy types are placeholder types for handling implicitly enabling real
191 // types. They do not exist at the server, and are simply used for
192 // UI/Configuration logic.
193 SYNC_EXPORT ModelTypeSet ProxyTypes();
194
195 // Returns a list of all control types.
196 //
197 // The control types are intended to contain metadata nodes that are essential
198 // for the normal operation of the syncer.  As such, they have the following
199 // special properties:
200 // - They are downloaded early during SyncBackend initialization.
201 // - They are always enabled.  Users may not disable these types.
202 // - Their contents are not encrypted automatically.
203 // - They support custom update application and conflict resolution logic.
204 // - All change processing occurs on the sync thread (GROUP_PASSIVE).
205 SYNC_EXPORT ModelTypeSet ControlTypes();
206
207 // Returns true if this is a control type.
208 //
209 // See comment above for more information on what makes these types special.
210 SYNC_EXPORT bool IsControlType(ModelType model_type);
211
212 // Core types are those data types used by sync's core functionality (i.e. not
213 // user data types). These types are always enabled, and include ControlTypes().
214 //
215 // The set of all core types.
216 SYNC_EXPORT ModelTypeSet CoreTypes();
217 // Those core types that have high priority (includes ControlTypes()).
218 SYNC_EXPORT ModelTypeSet PriorityCoreTypes();
219
220 // Determine a model type from the field number of its associated
221 // EntitySpecifics field.  Returns UNSPECIFIED if the field number is
222 // not recognized.
223 //
224 // If you're putting the result in a ModelTypeSet, you should use the
225 // following pattern:
226 //
227 //   ModelTypeSet model_types;
228 //   // Say we're looping through a list of items, each of which has a
229 //   // field number.
230 //   for (...) {
231 //     int field_number = ...;
232 //     ModelType model_type =
233 //         GetModelTypeFromSpecificsFieldNumber(field_number);
234 //     if (!IsRealDataType(model_type)) {
235 //       DLOG(WARNING) << "Unknown field number " << field_number;
236 //       continue;
237 //     }
238 //     model_types.Put(model_type);
239 //   }
240 SYNC_EXPORT_PRIVATE ModelType GetModelTypeFromSpecificsFieldNumber(
241     int field_number);
242
243 // Return the field number of the EntitySpecifics field associated with
244 // a model type.
245 //
246 // Used by tests outside of sync.
247 SYNC_EXPORT int GetSpecificsFieldNumberFromModelType(
248     ModelType model_type);
249
250 FullModelTypeSet ToFullModelTypeSet(ModelTypeSet in);
251
252 // TODO(sync): The functions below badly need some cleanup.
253
254 // Returns a pointer to a string with application lifetime that represents
255 // the name of |model_type|.
256 SYNC_EXPORT const char* ModelTypeToString(ModelType model_type);
257
258 // Some histograms take an integer parameter that represents a model type.
259 // The mapping from ModelType to integer is defined here.  It should match
260 // the mapping from integer to labels defined in histograms.xml.
261 SYNC_EXPORT int ModelTypeToHistogramInt(ModelType model_type);
262
263 // Handles all model types, and not just real ones.
264 //
265 // Caller takes ownership of returned value.
266 SYNC_EXPORT_PRIVATE base::StringValue* ModelTypeToValue(ModelType model_type);
267
268 // Converts a Value into a ModelType - complement to ModelTypeToValue().
269 SYNC_EXPORT_PRIVATE ModelType ModelTypeFromValue(const base::Value& value);
270
271 // Returns the ModelType corresponding to the name |model_type_string|.
272 SYNC_EXPORT ModelType ModelTypeFromString(
273     const std::string& model_type_string);
274
275 SYNC_EXPORT std::string ModelTypeSetToString(ModelTypeSet model_types);
276
277 // Caller takes ownership of returned list.
278 SYNC_EXPORT base::ListValue* ModelTypeSetToValue(ModelTypeSet model_types);
279
280 SYNC_EXPORT ModelTypeSet ModelTypeSetFromValue(const base::ListValue& value);
281
282 // Returns a string corresponding to the syncable tag for this datatype.
283 SYNC_EXPORT std::string ModelTypeToRootTag(ModelType type);
284
285 // Convert a real model type to a notification type (used for
286 // subscribing to server-issued notifications).  Returns true iff
287 // |model_type| was a real model type and |notification_type| was
288 // filled in.
289 bool RealModelTypeToNotificationType(ModelType model_type,
290                                      std::string* notification_type);
291
292 // Converts a notification type to a real model type.  Returns true
293 // iff |notification_type| was the notification type of a real model
294 // type and |model_type| was filled in.
295 SYNC_EXPORT bool NotificationTypeToRealModelType(
296     const std::string& notification_type,
297     ModelType* model_type);
298
299 // Returns true if |model_type| is a real datatype
300 SYNC_EXPORT bool IsRealDataType(ModelType model_type);
301
302 // Returns true if |model_type| is an act-once type. Act once types drop
303 // entities after applying them. Drops are deletes that are not synced to other
304 // clients.
305 // TODO(haitaol): Make entries of act-once data types immutable.
306 SYNC_EXPORT bool IsActOnceDataType(ModelType model_type);
307
308 }  // namespace syncer
309
310 #endif  // SYNC_INTERNAL_API_PUBLIC_BASE_MODEL_TYPE_H_