1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/sync/syncable/model_type_payload_map.h"
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/values.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace syncable {
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenModelTypePayloadMap ModelTypePayloadMapFromBitSet(
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const syncable::ModelTypeBitSet& types,
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::string& payload) {
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ModelTypePayloadMap types_with_payloads;
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (size_t i = syncable::FIRST_REAL_MODEL_TYPE;
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen       i < types.size(); ++i) {
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (types[i]) {
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      types_with_payloads[syncable::ModelTypeFromInt(i)] = payload;
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return types_with_payloads;
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenModelTypePayloadMap ModelTypePayloadMapFromRoutingInfo(
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const browser_sync::ModelSafeRoutingInfo& routes,
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::string& payload) {
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ModelTypePayloadMap types_with_payloads;
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (browser_sync::ModelSafeRoutingInfo::const_iterator i = routes.begin();
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen       i != routes.end(); ++i) {
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    types_with_payloads[i->first] = payload;
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return types_with_payloads;
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenDictionaryValue* ModelTypePayloadMapToValue(
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const ModelTypePayloadMap& type_payloads) {
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  DictionaryValue* value = new DictionaryValue();
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (ModelTypePayloadMap::const_iterator it = type_payloads.begin();
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen       it != type_payloads.end(); ++it) {
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    value->SetString(syncable::ModelTypeToString(it->first), it->second);
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return value;
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid CoalescePayloads(ModelTypePayloadMap* original,
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                      const ModelTypePayloadMap& update) {
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  for (ModelTypePayloadMap::const_iterator i = update.begin();
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen       i != update.end(); ++i) {
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (original->count(i->first) == 0) {
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // If this datatype isn't already in our map, add it with
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // whatever payload it has.
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      (*original)[i->first] = i->second;
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    } else if (i->second.length() > 0) {
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // If this datatype is already in our map, we only overwrite the
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // payload if the new one is non-empty.
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      (*original)[i->first] = i->second;
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace syncable
62