1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/syncable/model_type.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "base/metrics/histogram.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/engine/syncproto.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/sync/protocol/app_specifics.pb.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/autofill_specifics.pb.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/bookmark_specifics.pb.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/extension_specifics.pb.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/nigori_specifics.pb.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/password_specifics.pb.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/preference_specifics.pb.h"
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/sync/protocol/session_specifics.pb.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/sync.pb.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/theme_specifics.pb.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/sync/protocol/typed_url_specifics.pb.h"
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace syncable {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid AddDefaultExtensionValue(syncable::ModelType datatype,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              sync_pb::EntitySpecifics* specifics) {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (datatype) {
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case BOOKMARKS:
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      specifics->MutableExtension(sync_pb::bookmark);
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case PASSWORDS:
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      specifics->MutableExtension(sync_pb::password);
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case PREFERENCES:
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      specifics->MutableExtension(sync_pb::preference);
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case AUTOFILL:
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      specifics->MutableExtension(sync_pb::autofill);
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
39201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case AUTOFILL_PROFILE:
40201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      specifics->MutableExtension(sync_pb::autofill_profile);
41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      break;
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case THEMES:
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      specifics->MutableExtension(sync_pb::theme);
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case TYPED_URLS:
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      specifics->MutableExtension(sync_pb::typed_url);
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case EXTENSIONS:
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      specifics->MutableExtension(sync_pb::extension);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NIGORI:
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      specifics->MutableExtension(sync_pb::nigori);
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case SESSIONS:
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      specifics->MutableExtension(sync_pb::session);
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case APPS:
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      specifics->MutableExtension(sync_pb::app);
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      break;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      NOTREACHED() << "No known extension for model type.";
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenModelType GetModelTypeFromExtensionFieldNumber(int field_number) {
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) {
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ModelType model_type = ModelTypeFromInt(i);
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (GetExtensionFieldNumberFromModelType(model_type) == field_number)
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return model_type;
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NOTREACHED();
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return UNSPECIFIED;
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenint GetExtensionFieldNumberFromModelType(ModelType model_type) {
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  switch (model_type) {
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case BOOKMARKS:
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return sync_pb::kBookmarkFieldNumber;
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case PASSWORDS:
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return sync_pb::kPasswordFieldNumber;
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case PREFERENCES:
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return sync_pb::kPreferenceFieldNumber;
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case AUTOFILL:
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return sync_pb::kAutofillFieldNumber;
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case AUTOFILL_PROFILE:
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return sync_pb::kAutofillProfileFieldNumber;
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case THEMES:
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return sync_pb::kThemeFieldNumber;
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case TYPED_URLS:
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return sync_pb::kTypedUrlFieldNumber;
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case EXTENSIONS:
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return sync_pb::kExtensionFieldNumber;
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case NIGORI:
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return sync_pb::kNigoriFieldNumber;
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case SESSIONS:
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return sync_pb::kSessionFieldNumber;
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case APPS:
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return sync_pb::kAppFieldNumber;
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    default:
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      NOTREACHED() << "No known extension for model type.";
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return 0;
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NOTREACHED() << "Needed for linux_keep_shadow_stacks because of "
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen               << "http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20681";
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return 0;
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Note: keep this consistent with GetModelType in syncable.cc!
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochModelType GetModelType(const sync_pb::SyncEntity& sync_pb_entity) {
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const browser_sync::SyncEntity& sync_entity =
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      static_cast<const browser_sync::SyncEntity&>(sync_pb_entity);
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DCHECK(!sync_entity.id().IsRoot());  // Root shouldn't ever go over the wire.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (sync_entity.deleted())
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return UNSPECIFIED;
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Backwards compatibility with old (pre-specifics) protocol.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (sync_entity.has_bookmarkdata())
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return BOOKMARKS;
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ModelType specifics_type = GetModelTypeFromSpecifics(sync_entity.specifics());
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (specifics_type != UNSPECIFIED)
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return specifics_type;
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Loose check for server-created top-level folders that aren't
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // bound to a particular model type.
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!sync_entity.server_defined_unique_tag().empty() &&
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      sync_entity.IsFolder()) {
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return TOP_LEVEL_FOLDER;
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is an item of a datatype we can't understand. Maybe it's
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // from the future?  Either we mis-encoded the object, or the
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // server sent us entries it shouldn't have.
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NOTREACHED() << "Unknown datatype in sync proto.";
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return UNSPECIFIED;
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochModelType GetModelTypeFromSpecifics(const sync_pb::EntitySpecifics& specifics) {
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (specifics.HasExtension(sync_pb::bookmark))
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return BOOKMARKS;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (specifics.HasExtension(sync_pb::password))
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return PASSWORDS;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (specifics.HasExtension(sync_pb::preference))
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return PREFERENCES;
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (specifics.HasExtension(sync_pb::autofill))
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return AUTOFILL;
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  if (specifics.HasExtension(sync_pb::autofill_profile))
164201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return AUTOFILL_PROFILE;
165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (specifics.HasExtension(sync_pb::theme))
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return THEMES;
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (specifics.HasExtension(sync_pb::typed_url))
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return TYPED_URLS;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (specifics.HasExtension(sync_pb::extension))
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return EXTENSIONS;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (specifics.HasExtension(sync_pb::nigori))
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NIGORI;
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (specifics.HasExtension(sync_pb::app))
1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return APPS;
1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (specifics.HasExtension(sync_pb::session))
1823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return SESSIONS;
1833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return UNSPECIFIED;
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::string ModelTypeToString(ModelType model_type) {
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (model_type) {
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case BOOKMARKS:
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "Bookmarks";
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case PREFERENCES:
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "Preferences";
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case PASSWORDS:
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "Passwords";
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case AUTOFILL:
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "Autofill";
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case THEMES:
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "Themes";
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case TYPED_URLS:
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "Typed URLs";
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case EXTENSIONS:
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "Extensions";
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NIGORI:
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return "Encryption keys";
2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case SESSIONS:
2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return "Sessions";
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case APPS:
2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return "Apps";
20921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    case AUTOFILL_PROFILE:
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      return "Autofill Profiles";
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      break;
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  NOTREACHED() << "No known extension for model type.";
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return "INVALID";
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenStringValue* ModelTypeToValue(ModelType model_type) {
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (model_type >= syncable::FIRST_REAL_MODEL_TYPE) {
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return Value::CreateStringValue(ModelTypeToString(model_type));
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (model_type == syncable::TOP_LEVEL_FOLDER) {
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return Value::CreateStringValue("Top-level folder");
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (model_type == syncable::UNSPECIFIED) {
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return Value::CreateStringValue("Unspecified");
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NOTREACHED();
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return Value::CreateStringValue("");
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string ModelTypeSetToString(const ModelTypeSet& model_types) {
231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  std::string result;
232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (ModelTypeSet::const_iterator iter = model_types.begin();
233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       iter != model_types.end();) {
234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    result += ModelTypeToString(*iter);
235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (++iter != model_types.end())
236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      result += ", ";
237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return result;
239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
240dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
241513209b27ff55e2841eac0e4120199c23acce758Ben MurdochModelType ModelTypeFromString(const std::string& model_type_string) {
242513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (model_type_string == "Bookmarks")
243513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return BOOKMARKS;
244513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  else if (model_type_string == "Preferences")
245513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return PREFERENCES;
246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  else if (model_type_string == "Passwords")
247513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return PASSWORDS;
248513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  else if (model_type_string == "Autofill")
249513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return AUTOFILL;
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  else if (model_type_string == "Autofill Profiles")
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return AUTOFILL_PROFILE;
252513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  else if (model_type_string == "Themes")
253513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return THEMES;
254513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  else if (model_type_string == "Typed URLs")
255513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return TYPED_URLS;
256513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  else if (model_type_string == "Extensions")
257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return EXTENSIONS;
258513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  else if (model_type_string == "Encryption keys")
259513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return NIGORI;
260513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  else if (model_type_string == "Sessions")
261513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return SESSIONS;
262513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  else if (model_type_string == "Apps")
263513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    return APPS;
264513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  else
265513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NOTREACHED() << "No known model type corresponding to "
266513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                 << model_type_string << ".";
267513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  return UNSPECIFIED;
268513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch}
269513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
2704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochbool ModelTypeBitSetFromString(
2714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    const std::string& model_type_bitset_string,
2724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    ModelTypeBitSet* model_types) {
273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(model_types);
274dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (model_type_bitset_string.length() != MODEL_TYPE_COUNT)
2754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    return false;
276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (model_type_bitset_string.find_first_not_of("01") != std::string::npos)
277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return false;
278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  *model_types = ModelTypeBitSet(model_type_bitset_string);
279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return true;
280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
2814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
282dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenModelTypeBitSet ModelTypeBitSetFromSet(const ModelTypeSet& set) {
283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ModelTypeBitSet bitset;
284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (ModelTypeSet::const_iterator iter = set.begin(); iter != set.end();
285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       ++iter) {
286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    bitset.set(*iter);
287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return bitset;
2894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
2904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenListValue* ModelTypeBitSetToValue(const ModelTypeBitSet& model_types) {
29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ListValue* value = new ListValue();
29372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (int i = FIRST_REAL_MODEL_TYPE; i < MODEL_TYPE_COUNT; ++i) {
29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (model_types[i]) {
29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      value->Append(
296dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen          Value::CreateStringValue(ModelTypeToString(ModelTypeFromInt(i))));
29772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
302dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenListValue* ModelTypeSetToValue(const ModelTypeSet& model_types) {
303dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ListValue* value = new ListValue();
304dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (ModelTypeSet::const_iterator i = model_types.begin();
305dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       i != model_types.end(); ++i) {
306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    value->Append(Value::CreateStringValue(ModelTypeToString(*i)));
307dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
308dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return value;
309dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
310dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
311dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// TODO(zea): remove all hardcoded tags in model associators and have them use
312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// this instead.
313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenstd::string ModelTypeToRootTag(ModelType type) {
314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  switch (type) {
315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case BOOKMARKS:
316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return "google_chrome_bookmarks";
317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PREFERENCES:
318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return "google_chrome_preferences";
319dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case PASSWORDS:
320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return "google_chrome_passwords";
321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case AUTOFILL:
322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return "google_chrome_autofill";
323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case THEMES:
324dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return "google_chrome_themes";
325dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case TYPED_URLS:
326dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return "google_chrome_typed_urls";
327dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case EXTENSIONS:
328dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return "google_chrome_extensions";
329dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case NIGORI:
330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return "google_chrome_nigori";
331dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case SESSIONS:
332dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return "google_chrome_sessions";
333dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case APPS:
334dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return "google_chrome_apps";
335dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    case AUTOFILL_PROFILE:
336dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return "google_chrome_autofill_profiles";
337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    default:
338dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      break;
339dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
340dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  NOTREACHED() << "No known extension for model type.";
341dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return "INVALID";
342dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
343dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
3444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// For now, this just implements UMA_HISTOGRAM_LONG_TIMES. This can be adjusted
3454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// if we feel the min, max, or bucket count amount are not appropriate.
3464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define SYNC_FREQ_HISTOGRAM(name, time) UMA_HISTOGRAM_CUSTOM_TIMES( \
3474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    name, time, base::TimeDelta::FromMilliseconds(1), \
3484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    base::TimeDelta::FromHours(1), 50)
3494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
3504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochvoid PostTimeToTypeHistogram(ModelType model_type, base::TimeDelta time) {
3514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  switch (model_type) {
3524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case BOOKMARKS: {
3534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        SYNC_FREQ_HISTOGRAM("Sync.FreqBookmarks", time);
3544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        return;
3554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
3564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case PREFERENCES: {
3574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        SYNC_FREQ_HISTOGRAM("Sync.FreqPreferences", time);
3584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        return;
3594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
3604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case PASSWORDS: {
3614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        SYNC_FREQ_HISTOGRAM("Sync.FreqPasswords", time);
3624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        return;
3634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
3644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case AUTOFILL: {
3654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        SYNC_FREQ_HISTOGRAM("Sync.FreqAutofill", time);
3664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        return;
3674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
36872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    case AUTOFILL_PROFILE: {
36972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        SYNC_FREQ_HISTOGRAM("Sync.FreqAutofillProfiles", time);
37072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        return;
37172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }
3724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case THEMES: {
3734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        SYNC_FREQ_HISTOGRAM("Sync.FreqThemes", time);
3744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        return;
3754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
3764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case TYPED_URLS: {
3774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        SYNC_FREQ_HISTOGRAM("Sync.FreqTypedUrls", time);
3784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        return;
3794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
3804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case EXTENSIONS: {
3814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        SYNC_FREQ_HISTOGRAM("Sync.FreqExtensions", time);
3824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        return;
3834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
3844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case NIGORI: {
3854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        SYNC_FREQ_HISTOGRAM("Sync.FreqNigori", time);
3864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        return;
3874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
3884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case SESSIONS: {
3894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        SYNC_FREQ_HISTOGRAM("Sync.FreqSessions", time);
3904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        return;
3914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
3924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    case APPS: {
3934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        SYNC_FREQ_HISTOGRAM("Sync.FreqApps", time);
3944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch        return;
3954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    }
3964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch    default:
3974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch      LOG(ERROR) << "No known extension for model type.";
3984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  }
3994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
4004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
4014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#undef SYNC_FREQ_HISTOGRAM
4024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(akalin): Figure out a better way to do these mappings.
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kBookmarkNotificationType[] = "BOOKMARK";
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kPreferenceNotificationType[] = "PREFERENCE";
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kPasswordNotificationType[] = "PASSWORD";
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kAutofillNotificationType[] = "AUTOFILL";
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kThemeNotificationType[] = "THEME";
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kTypedUrlNotificationType[] = "TYPED_URL";
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kExtensionNotificationType[] = "EXTENSION";
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kNigoriNotificationType[] = "NIGORI";
4143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kAppNotificationType[] = "APP";
4153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst char kSessionNotificationType[] = "SESSION";
41621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenconst char kAutofillProfileNotificationType[] = "AUTOFILL_PROFILE";
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool RealModelTypeToNotificationType(ModelType model_type,
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     std::string* notification_type) {
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  switch (model_type) {
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case BOOKMARKS:
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *notification_type = kBookmarkNotificationType;
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case PREFERENCES:
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *notification_type = kPreferenceNotificationType;
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case PASSWORDS:
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *notification_type = kPasswordNotificationType;
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case AUTOFILL:
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *notification_type = kAutofillNotificationType;
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case THEMES:
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *notification_type = kThemeNotificationType;
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case TYPED_URLS:
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *notification_type = kTypedUrlNotificationType;
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case EXTENSIONS:
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *notification_type = kExtensionNotificationType;
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    case NIGORI:
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      *notification_type = kNigoriNotificationType;
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return true;
4463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case APPS:
4473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      *notification_type = kAppNotificationType;
4483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return true;
4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    case SESSIONS:
4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      *notification_type = kSessionNotificationType;
4513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return true;
452201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    case AUTOFILL_PROFILE:
45321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      *notification_type = kAutofillProfileNotificationType;
454201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      return true;
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    default:
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  notification_type->clear();
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool NotificationTypeToRealModelType(const std::string& notification_type,
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     ModelType* model_type) {
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (notification_type == kBookmarkNotificationType) {
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *model_type = BOOKMARKS;
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (notification_type == kPreferenceNotificationType) {
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *model_type = PREFERENCES;
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (notification_type == kPasswordNotificationType) {
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *model_type = PASSWORDS;
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (notification_type == kAutofillNotificationType) {
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *model_type = AUTOFILL;
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (notification_type == kThemeNotificationType) {
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *model_type = THEMES;
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (notification_type == kTypedUrlNotificationType) {
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *model_type = TYPED_URLS;
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (notification_type == kExtensionNotificationType) {
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *model_type = EXTENSIONS;
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else if (notification_type == kNigoriNotificationType) {
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *model_type = NIGORI;
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return true;
4883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else if (notification_type == kAppNotificationType) {
4893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    *model_type = APPS;
4903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return true;
4913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  } else if (notification_type == kSessionNotificationType) {
4923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    *model_type = SESSIONS;
4933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return true;
49421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  } else if (notification_type == kAutofillProfileNotificationType) {
49521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    *model_type = AUTOFILL_PROFILE;
49621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return true;
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  *model_type = UNSPECIFIED;
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return false;
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace syncable
503