proto_value_conversions.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
1f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org// Use of this source code is governed by a BSD-style license that can be
3f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org// found in the LICENSE file.
4f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
5f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org// Keep this file in sync with the .proto files in this directory.
6f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
7f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/proto_value_conversions.h"
8f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
9f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include <string>
10f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
11f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "base/base64.h"
12f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "base/basictypes.h"
13f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "base/logging.h"
14f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "base/strings/string_number_conversions.h"
15f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "base/values.h"
16f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/internal_api/public/base/unique_position.h"
17f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/app_list_specifics.pb.h"
18f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/app_notification_specifics.pb.h"
1970e2ce90d527388f9829a7d084dfa3b2a525bb49henrik.lundin@webrtc.org#include "sync/protocol/app_setting_specifics.pb.h"
20f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/app_specifics.pb.h"
21f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/autofill_specifics.pb.h"
22f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/bookmark_specifics.pb.h"
23d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org#include "sync/protocol/dictionary_specifics.pb.h"
24f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/encryption.pb.h"
25c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org#include "sync/protocol/experiments_specifics.pb.h"
26eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org#include "sync/protocol/extension_setting_specifics.pb.h"
27f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/extension_specifics.pb.h"
28e2a7a77646b23fb3704d267e6079e04bde493543pbos@webrtc.org#include "sync/protocol/favicon_image_specifics.pb.h"
29f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/favicon_tracking_specifics.pb.h"
30f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/history_delete_directive_specifics.pb.h"
31f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/nigori_specifics.pb.h"
32f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/password_specifics.pb.h"
33f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/preference_specifics.pb.h"
34f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/priority_preference_specifics.pb.h"
35f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/proto_enum_conversions.h"
36f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/search_engine_specifics.pb.h"
37f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/session_specifics.pb.h"
38f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/sync.pb.h"
39f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/synced_notification_app_info_specifics.pb.h"
40f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/synced_notification_specifics.pb.h"
41f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/theme_specifics.pb.h"
42f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/typed_url_specifics.pb.h"
43f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#include "sync/protocol/unique_position.pb.h"
4479426b9ef9171ddbd673373e62e0142e51ee89f8kjellander@webrtc.org
4579426b9ef9171ddbd673373e62e0142e51ee89f8kjellander@webrtc.orgnamespace syncer {
4679426b9ef9171ddbd673373e62e0142e51ee89f8kjellander@webrtc.org
47f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.orgnamespace {
48f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
49eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org// Basic Type -> Value functions.
508ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org
51d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.orgbase::StringValue* MakeInt64Value(int64 x) {
52d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org  return new base::StringValue(base::Int64ToString(x));
533f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org}
543f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org
55093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org// TODO(akalin): Perhaps make JSONWriter support BinaryValue and use
56093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org// that instead of a StringValue.
57093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.orgbase::StringValue* MakeBytesValue(const std::string& bytes) {
58093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  std::string bytes_base64;
59f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::Base64Encode(bytes, &bytes_base64);
60f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return new base::StringValue(bytes_base64);
61f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
62f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
63aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.orgbase::StringValue* MakeStringValue(const std::string& str) {
64eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return new base::StringValue(str);
65c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org}
66f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
67f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org// T is the enum type.
68f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.orgtemplate <class T>
69f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.orgbase::StringValue* MakeEnumValue(T t, const char* (*converter_fn)(T)) {
70f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return new base::StringValue(converter_fn(t));
71f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
72f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
73f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org// T is the field type, F is either RepeatedField or RepeatedPtrField,
74f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org// and V is a subclass of Value.
75f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.orgtemplate <class T, class F, class V>
76d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.orgbase::ListValue* MakeRepeatedValue(const F& fields, V* (*converter_fn)(T)) {
77f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::ListValue* list = new base::ListValue();
78f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  for (typename F::const_iterator it = fields.begin(); it != fields.end();
79f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org       ++it) {
80f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    list->Append(converter_fn(*it));
81f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  }
82f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return list;
83f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
84f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
85f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}  // namespace
86f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
87c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org// Helper macros to reduce the amount of boilerplate.
88f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
89f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#define SET(field, fn) \
90f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  if (proto.has_##field()) { \
91f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    value->Set(#field, fn(proto.field())); \
92f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  }
93d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org#define SET_REP(field, fn) \
94f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  value->Set(#field, MakeRepeatedValue(proto.field(), fn))
95f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#define SET_ENUM(field, fn) \
96f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  value->Set(#field, MakeEnumValue(proto.field(), fn))
97f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
98f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#define SET_BOOL(field) SET(field, new base::FundamentalValue)
99f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#define SET_BYTES(field) SET(field, MakeBytesValue)
100d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org#define SET_INT32(field) SET(field, MakeInt64Value)
101c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org#define SET_INT32_REP(field) SET_REP(field, MakeInt64Value)
102d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org#define SET_INT64(field) SET(field, MakeInt64Value)
103f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#define SET_INT64_REP(field) SET_REP(field, MakeInt64Value)
104f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#define SET_STR(field) SET(field, new base::StringValue)
105f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#define SET_STR_REP(field) \
106f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  value->Set(#field, \
107f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org             MakeRepeatedValue<const std::string&, \
108f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org                               google::protobuf::RepeatedPtrField< \
109f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org                                   std::string >, \
110f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org                               base::StringValue>(proto.field(), \
111f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org                                            MakeStringValue))
112f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#define SET_EXPERIMENT_ENABLED_FIELD(field)          \
113f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  do {                                               \
114f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    if (proto.has_##field() &&                       \
115f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org        proto.field().has_enabled()) {               \
116f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org      value->Set(#field,                             \
117f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org                 new base::FundamentalValue(         \
118f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org                     proto.field().enabled()));      \
119c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org    }                                                \
120d2fb259b3bc61c68f368929510215a7ee7d00fdawu@webrtc.org  } while (0)
121f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
122f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org#define SET_FIELD(field, fn)                         \
123f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  do {                                               \
124f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    if (specifics.has_##field()) {                   \
125f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org      value->Set(#field, fn(specifics.field()));     \
126f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    }                                                \
127f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  } while (0)
128f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
129f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org// If you add another macro, don't forget to add an #undef at the end
130f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org// of this file, too.
131f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
1326cee2bafdd7b97c6b3893d67690ed2e37ada6ef1henrik.lundin@webrtc.orgbase::DictionaryValue* EncryptedDataToValue(
133aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org    const sync_pb::EncryptedData& proto) {
134f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
135f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(key_name);
136f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  // TODO(akalin): Shouldn't blob be of type bytes instead of string?
137f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_BYTES(blob);
138f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return value;
1396cee2bafdd7b97c6b3893d67690ed2e37ada6ef1henrik.lundin@webrtc.org}
140f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
141f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.orgbase::DictionaryValue* AppSettingsToValue(
142f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    const sync_pb::AppNotificationSettings& proto) {
143f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
144f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_BOOL(initial_setup_done);
145f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_BOOL(disabled);
146f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(oauth_client_id);
147f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return value;
148f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
149f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
150f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.orgbase::DictionaryValue* SessionHeaderToValue(
151f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    const sync_pb::SessionHeader& proto) {
152f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
153f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_REP(window, SessionWindowToValue);
154f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(client_name);
155f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_ENUM(device_type, GetDeviceTypeString);
156f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return value;
157f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
15870e2ce90d527388f9829a7d084dfa3b2a525bb49henrik.lundin@webrtc.org
1596cee2bafdd7b97c6b3893d67690ed2e37ada6ef1henrik.lundin@webrtc.orgbase::DictionaryValue* SessionTabToValue(const sync_pb::SessionTab& proto) {
16070e2ce90d527388f9829a7d084dfa3b2a525bb49henrik.lundin@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
16170e2ce90d527388f9829a7d084dfa3b2a525bb49henrik.lundin@webrtc.org  SET_INT32(tab_id);
16270e2ce90d527388f9829a7d084dfa3b2a525bb49henrik.lundin@webrtc.org  SET_INT32(window_id);
16370e2ce90d527388f9829a7d084dfa3b2a525bb49henrik.lundin@webrtc.org  SET_INT32(tab_visual_index);
164f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_INT32(current_navigation_index);
165f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_BOOL(pinned);
166f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(extension_app_id);
167f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_REP(navigation, TabNavigationToValue);
168f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_BYTES(favicon);
1692a25b6c685c7d6323a8fdaf514a7b36f4f2d827dpbos@webrtc.org  SET_ENUM(favicon_type, GetFaviconTypeString);
170f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(favicon_source);
171f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return value;
172f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
1736cee2bafdd7b97c6b3893d67690ed2e37ada6ef1henrik.lundin@webrtc.org
174f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.orgbase::DictionaryValue* SessionWindowToValue(
175f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    const sync_pb::SessionWindow& proto) {
176f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
177f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_INT32(window_id);
178f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_INT32(selected_tab_index);
179f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_INT32_REP(tab);
180f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_ENUM(browser_type, GetBrowserTypeString);
181f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return value;
182f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
183f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
184f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.orgbase::DictionaryValue* TabNavigationToValue(
185c476e64d056c5e342bc5b23eecd493abf6d85d7fpbos@webrtc.org    const sync_pb::TabNavigation& proto) {
186f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
187f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(virtual_url);
188f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(referrer);
189f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(title);
190f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(state);
191f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_ENUM(page_transition, GetPageTransitionString);
192f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_ENUM(redirect_type, GetPageTransitionRedirectTypeString);
193d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org  SET_INT32(unique_id);
194eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT64(timestamp_msec);
195eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_BOOL(navigation_forward_back);
196eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_BOOL(navigation_from_address_bar);
197eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_BOOL(navigation_home_page);
198eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_BOOL(navigation_chain_start);
199eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_BOOL(navigation_chain_end);
200eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT64(global_id);
201eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(search_terms);
202eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(favicon_url);
203eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_ENUM(blocked_state, GetBlockedStateString);
204eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR_REP(content_pack_categories);
205eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT32(http_status_code);
206eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT32(referrer_policy);
207eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_BOOL(is_restored);
208eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
209eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
210eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
211eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* PasswordSpecificsDataToValue(
212eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::PasswordSpecificsData& proto) {
213eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
214eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT32(scheme);
215eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(signon_realm);
216eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(origin);
217eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(action);
218eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(username_element);
219f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(username_value);
220f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(password_element);
221f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  value->SetString("password_value", "<redacted>");
222f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_BOOL(ssl_valid);
223f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_BOOL(preferred);
224f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_INT64(date_created);
225f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_BOOL(blacklisted);
226f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return value;
227f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
228f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
229f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.orgbase::DictionaryValue* GlobalIdDirectiveToValue(
2306cee2bafdd7b97c6b3893d67690ed2e37ada6ef1henrik.lundin@webrtc.org    const sync_pb::GlobalIdDirective& proto) {
231f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
232aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org  SET_INT64_REP(global_id);
233aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org  SET_INT64(start_time_usec);
234d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org  SET_INT64(end_time_usec);
235aacdb9f6eed4ceedc8db73865384e29444abcda2stefan@webrtc.org  return value;
23670e2ce90d527388f9829a7d084dfa3b2a525bb49henrik.lundin@webrtc.org}
23770e2ce90d527388f9829a7d084dfa3b2a525bb49henrik.lundin@webrtc.org
23870e2ce90d527388f9829a7d084dfa3b2a525bb49henrik.lundin@webrtc.orgbase::DictionaryValue* TimeRangeDirectiveToValue(
2396cee2bafdd7b97c6b3893d67690ed2e37ada6ef1henrik.lundin@webrtc.org    const sync_pb::TimeRangeDirective& proto) {
240f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
241f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_INT64(start_time_usec);
242f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_INT64(end_time_usec);
243eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
244eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
245f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
246f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.orgbase::DictionaryValue* SyncedNotificationAppInfoToValue(
247f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    const sync_pb::SyncedNotificationAppInfo& proto) {
248eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
249f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR_REP(app_id);
250f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(settings_display_name);
251f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET(icon, SyncedNotificationImageToValue);
2520a298154b3a4781f0294d3877f77feb58e33eeb7sprang@webrtc.org  // TODO(petewil): Add fields for the monochrome icon when it is available.
253f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return value;
254f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
255f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
256eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* SyncedNotificationImageToValue(
257f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    const sync_pb::SyncedNotificationImage& proto) {
258f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
259f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(url);
260eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(alt_text);
261eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT32(preferred_width);
262eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT32(preferred_height);
263d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org  return value;
264d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org}
265d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org
266d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.orgbase::DictionaryValue* SyncedNotificationProfileImageToValue(
267d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org    const sync_pb::SyncedNotificationProfileImage& proto) {
268d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
269d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org  SET_STR(image_url);
270d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org  SET_STR(oid);
27188b558febb8e8f42df6c7482efe76795c3fed399pbos@webrtc.org  SET_STR(display_name);
27288b558febb8e8f42df6c7482efe76795c3fed399pbos@webrtc.org  return value;
273eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
274eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
275eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* MediaToValue(
276eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::Media& proto) {
277eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
278eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(image, SyncedNotificationImageToValue);
279f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return value;
280f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
281f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
282f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.orgbase::DictionaryValue* SyncedNotificationActionToValue(
283f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    const sync_pb::SyncedNotificationAction& proto) {
284f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
285f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(text);
286f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET(icon, SyncedNotificationImageToValue);
287f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(url);
288f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(request_data);
289f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(accessibility_label);
290f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return value;
291f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
292f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org
293eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* SyncedNotificationDestiationToValue(
294f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org    const sync_pb::SyncedNotificationDestination& proto) {
295f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
296f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(text);
297f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET(icon, SyncedNotificationImageToValue);
298f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(url);
299f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(accessibility_label);
300f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  return value;
301f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org}
3028ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org
303eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* TargetToValue(
304093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org    const sync_pb::Target& proto) {
305eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
306eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(destination, SyncedNotificationDestiationToValue);
307093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET(action, SyncedNotificationActionToValue);
308d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org  SET_STR(target_key);
309d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org  return value;
310d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org}
311d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org
312d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.orgbase::DictionaryValue* SimpleCollapsedLayoutToValue(
313d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org    const sync_pb::SimpleCollapsedLayout& proto) {
314d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
315d01c49138f5c9c49c86251094f72759ee2c4705fstefan@webrtc.org  SET(app_icon, SyncedNotificationImageToValue);
316eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_REP(profile_image, SyncedNotificationProfileImageToValue);
317eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(heading);
318eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(description);
319eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(annotation);
320eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_REP(media, MediaToValue);
321eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
322eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
323eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
324eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* CollapsedInfoToValue(
325eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::CollapsedInfo& proto) {
326eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
327eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(simple_collapsed_layout, SimpleCollapsedLayoutToValue);
328eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT64(creation_timestamp_usec);
329eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(default_destination, SyncedNotificationDestiationToValue);
330eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_REP(target, TargetToValue);
331eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
332eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
333eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
334eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* SyncedNotificationToValue(
335eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::SyncedNotification& proto) {
336093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
337eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(type);
338eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(external_id);
339eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  // TODO(petewil) Add SyncedNotificationCreator here if we ever need it.
340eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
341eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
342eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
343eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* RenderInfoToValue(
344eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::SyncedNotificationRenderInfo& proto) {
345093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
346eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  // TODO(petewil): Add the expanded info values once we start using them.
347eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(collapsed_info, CollapsedInfoToValue);
348eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
349eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
350eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
351eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* CoalescedNotificationToValue(
352093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org    const sync_pb::CoalescedSyncedNotification& proto) {
353eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
354eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(key);
355eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(app_id);
356093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET_REP(notification, SyncedNotificationToValue);
357eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(render_info, RenderInfoToValue);
358eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT32(read_state);
359eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT64(creation_time_msec);
360eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT32(priority);
361eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
362eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
363eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
364eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* AppListSpecificsToValue(
365eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::AppListSpecifics& proto) {
366eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
367eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(item_id);
368eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_ENUM(item_type, GetAppListItemTypeString);
369eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(item_name);
370eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(parent_id);
371eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(page_ordinal);
372eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(item_ordinal);
373eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
374eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
375093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org}
376093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org
377eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* AppNotificationToValue(
378eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::AppNotification& proto) {
3796aae61c2c693fa3425c73c420e7046e95486b592pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
380eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(guid);
381eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(app_id);
382eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT64(creation_timestamp_ms);
383eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(title);
384eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(body_text);
385eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(link_url);
386eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(link_text);
387eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
388eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
389093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org
390eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* AppSettingSpecificsToValue(
391eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::AppSettingSpecifics& proto) {
392eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
393eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(extension_setting, ExtensionSettingSpecificsToValue);
394eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
395eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
396093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org
397eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* AppSpecificsToValue(
398eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::AppSpecifics& proto) {
399eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
400eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(extension, ExtensionSpecificsToValue);
401093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET(notification_settings, AppSettingsToValue);
402eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(app_launch_ordinal);
403eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(page_ordinal);
40488b558febb8e8f42df6c7482efe76795c3fed399pbos@webrtc.org  SET_ENUM(launch_type, GetLaunchTypeString);
405eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
40688b558febb8e8f42df6c7482efe76795c3fed399pbos@webrtc.org  return value;
407eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
40888b558febb8e8f42df6c7482efe76795c3fed399pbos@webrtc.org
409eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* AutofillSpecificsToValue(
410093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org    const sync_pb::AutofillSpecifics& proto) {
411eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
412eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(name);
413eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(value);
414eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT64_REP(usage_timestamp);
415eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(profile, AutofillProfileSpecificsToValue);
416093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  return value;
417eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
418eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
419eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* AutofillProfileSpecificsToValue(
420eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::AutofillProfileSpecifics& proto) {
421eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
422eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(guid);
423eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(origin);
424eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
425eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR_REP(name_first);
426eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR_REP(name_middle);
427eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR_REP(name_last);
428eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR_REP(email_address);
429eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(company_name);
430093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org
431093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET_STR(address_home_line1);
4321ef9cee4e53d42bec5761fdae0d963b163ba17aawu@webrtc.org  SET_STR(address_home_line2);
433093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET_STR(address_home_city);
434093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET_STR(address_home_state);
435093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET_STR(address_home_zip);
436093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET_STR(address_home_country);
4371ef9cee4e53d42bec5761fdae0d963b163ba17aawu@webrtc.org
438093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET_STR(address_home_street_address);
439093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET_STR(address_home_sorting_code);
440093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET_STR(address_home_dependent_locality);
441093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org
442093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET_STR_REP(phone_home_whole_number);
4431cbc360c03fcad0ebed910d371530f48cb11951fwu@webrtc.org  return value;
444093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org}
4451cbc360c03fcad0ebed910d371530f48cb11951fwu@webrtc.org
446093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.orgbase::DictionaryValue* MetaInfoToValue(
447093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org    const sync_pb::MetaInfo& proto) {
448093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
4491cbc360c03fcad0ebed910d371530f48cb11951fwu@webrtc.org  SET_STR(key);
450093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  SET_STR(value);
451093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org  return value;
452093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org}
453093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.org
454093fc0b0b0b9ca4fe56a32e17c9c418382e802f0wu@webrtc.orgbase::DictionaryValue* BookmarkSpecificsToValue(
4558ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org    const sync_pb::BookmarkSpecifics& proto) {
4568ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
457eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(url);
4588ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org  SET_BYTES(favicon);
4598ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org  SET_STR(title);
460eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT64(creation_time_us);
4618ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org  SET_STR(icon_url);
4628ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org  SET_REP(meta_info, &MetaInfoToValue);
4638ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org  return value;
4648ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org}
465eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
4668ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.orgbase::DictionaryValue* DeviceInfoSpecificsToValue(
4678ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org    const sync_pb::DeviceInfoSpecifics& proto) {
4688ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
4698ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org  SET_STR(cache_guid);
470eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(client_name);
471eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_ENUM(device_type, GetDeviceTypeString);
472eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(sync_user_agent);
473eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(chrome_version);
474eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
475eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
476eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
477eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* DictionarySpecificsToValue(
478eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::DictionarySpecifics& proto) {
479eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
480eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(word);
4818ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org  return value;
482eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
4838ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org
4843f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.orgnamespace {
4853f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org
4863f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.orgbase::DictionaryValue* FaviconSyncFlagsToValue(
4871d61e3a79d4a5c6693c959f59d9f9cc6c1bfb359pbos@webrtc.org    const sync_pb::FaviconSyncFlags& proto) {
4883f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
4893f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_BOOL(enabled);
4903f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_INT32(favicon_sync_limit);
491eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
4923f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org}
4933f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org
494eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}  // namespace
4953f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org
4963f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.orgbase::DictionaryValue* ExperimentsSpecificsToValue(
497eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::ExperimentsSpecifics& proto) {
4983f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
4993f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_EXPERIMENT_ENABLED_FIELD(keystore_encryption);
500eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_EXPERIMENT_ENABLED_FIELD(history_delete_directives);
5013f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_EXPERIMENT_ENABLED_FIELD(autofill_culling);
5023f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_EXPERIMENT_ENABLED_FIELD(pre_commit_update_avoidance);
5033f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET(favicon_sync, FaviconSyncFlagsToValue);
5043f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_EXPERIMENT_ENABLED_FIELD(gcm_channel);
5053f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_EXPERIMENT_ENABLED_FIELD(enhanced_bookmarks);
5063f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_EXPERIMENT_ENABLED_FIELD(gcm_invalidations);
5073f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  return value;
508bc57e0f1a00227c0cec3d429fc58cc442d07b509pbos@webrtc.org}
509bc57e0f1a00227c0cec3d429fc58cc442d07b509pbos@webrtc.org
5103f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.orgbase::DictionaryValue* ExtensionSettingSpecificsToValue(
5113f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org    const sync_pb::ExtensionSettingSpecifics& proto) {
5123f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
5133f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_STR(extension_id);
5143f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_STR(key);
5153f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_STR(value);
5163f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  return value;
517eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
518eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
5193f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.orgbase::DictionaryValue* ExtensionSpecificsToValue(
5203f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org    const sync_pb::ExtensionSpecifics& proto) {
5213f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
5223f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_STR(id);
523eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(version);
5243f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_STR(update_url);
5253f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_BOOL(enabled);
5263f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_BOOL(incognito_enabled);
5273f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_STR(name);
5283f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  return value;
5293f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org}
5303f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org
5313f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.orgnamespace {
5323f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.orgbase::DictionaryValue* FaviconDataToValue(
5333f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org    const sync_pb::FaviconData& proto) {
5343f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
5353f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_BYTES(favicon);
5363f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_INT32(width);
5373f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_INT32(height);
5383f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  return value;
5393f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org}
5403f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org}  // namespace
5413f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org
5423f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.orgbase::DictionaryValue* FaviconImageSpecificsToValue(
54388b558febb8e8f42df6c7482efe76795c3fed399pbos@webrtc.org    const sync_pb::FaviconImageSpecifics& proto) {
54488b558febb8e8f42df6c7482efe76795c3fed399pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
54588b558febb8e8f42df6c7482efe76795c3fed399pbos@webrtc.org  SET_STR(favicon_url);
546eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(favicon_web, FaviconDataToValue);
547eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(favicon_web_32, FaviconDataToValue);
548eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(favicon_touch_64, FaviconDataToValue);
549eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET(favicon_touch_precomposed_64, FaviconDataToValue);
550eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
55188b558febb8e8f42df6c7482efe76795c3fed399pbos@webrtc.org}
552eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
553eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* FaviconTrackingSpecificsToValue(
554eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::FaviconTrackingSpecifics& proto) {
555eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
556eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_STR(favicon_url);
557eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_INT64(last_visit_time_ms)
558eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  SET_BOOL(is_bookmarked);
559eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
560eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org}
561eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
562eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.orgbase::DictionaryValue* HistoryDeleteDirectiveSpecificsToValue(
563eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org    const sync_pb::HistoryDeleteDirectiveSpecifics& proto) {
564eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
5653f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET(global_id_directive, GlobalIdDirectiveToValue);
5663f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET(time_range_directive, TimeRangeDirectiveToValue);
567eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  return value;
5683f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org}
569eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org
5703f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.orgbase::DictionaryValue* ManagedUserSettingSpecificsToValue(
5713f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org    const sync_pb::ManagedUserSettingSpecifics& proto) {
572eb67a6be101fe1ac8f2a4c062dbe6250f2e36bc0pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
5733f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_STR(name);
5743f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  SET_STR(value);
5753f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  return value;
5763f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org}
5773f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org
5783f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.orgbase::DictionaryValue* ManagedUserSpecificsToValue(
5793f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org    const sync_pb::ManagedUserSpecifics& proto) {
5803f83f9cae99b605aee71b46839e902653baeb3f6pbos@webrtc.org  base::DictionaryValue* value = new base::DictionaryValue();
581f94ccd41be08c937f523b2749544f07011203905pbos@webrtc.org  SET_STR(id);
58279426b9ef9171ddbd673373e62e0142e51ee89f8kjellander@webrtc.org  SET_STR(name);
58379426b9ef9171ddbd673373e62e0142e51ee89f8kjellander@webrtc.org  SET_BOOL(acknowledged);
584  SET_STR(master_key);
585  SET_STR(chrome_avatar);
586  SET_STR(chromeos_avatar);
587  return value;
588}
589
590base::DictionaryValue* ManagedUserSharedSettingSpecificsToValue(
591    const sync_pb::ManagedUserSharedSettingSpecifics& proto) {
592  base::DictionaryValue* value = new base::DictionaryValue();
593  SET_STR(mu_id);
594  SET_STR(key);
595  SET_STR(value);
596  SET_BOOL(acknowledged);
597  return value;
598}
599
600base::DictionaryValue* NigoriSpecificsToValue(
601    const sync_pb::NigoriSpecifics& proto) {
602  base::DictionaryValue* value = new base::DictionaryValue();
603  SET(encryption_keybag, EncryptedDataToValue);
604  SET_BOOL(keybag_is_frozen);
605  SET_BOOL(encrypt_bookmarks);
606  SET_BOOL(encrypt_preferences);
607  SET_BOOL(encrypt_autofill_profile);
608  SET_BOOL(encrypt_autofill);
609  SET_BOOL(encrypt_themes);
610  SET_BOOL(encrypt_typed_urls);
611  SET_BOOL(encrypt_extension_settings);
612  SET_BOOL(encrypt_extensions);
613  SET_BOOL(encrypt_sessions);
614  SET_BOOL(encrypt_app_settings);
615  SET_BOOL(encrypt_apps);
616  SET_BOOL(encrypt_search_engines);
617  SET_BOOL(encrypt_dictionary);
618  SET_BOOL(encrypt_articles);
619  SET_BOOL(encrypt_app_list);
620  SET_BOOL(encrypt_everything);
621  SET_BOOL(sync_tab_favicons);
622  SET_ENUM(passphrase_type, PassphraseTypeString);
623  SET(keystore_decryptor_token, EncryptedDataToValue);
624  SET_INT64(keystore_migration_time);
625  SET_INT64(custom_passphrase_time);
626  return value;
627}
628
629base::DictionaryValue* ArticlePageToValue(
630    const sync_pb::ArticlePage& proto) {
631  base::DictionaryValue* value = new base::DictionaryValue();
632  SET_STR(url);
633  return value;
634}
635
636base::DictionaryValue* ArticleSpecificsToValue(
637    const sync_pb::ArticleSpecifics& proto) {
638  base::DictionaryValue* value = new base::DictionaryValue();
639  SET_STR(entry_id);
640  SET_STR(title);
641  SET_REP(pages, ArticlePageToValue);
642  return value;
643}
644
645base::DictionaryValue* PasswordSpecificsToValue(
646    const sync_pb::PasswordSpecifics& proto) {
647  base::DictionaryValue* value = new base::DictionaryValue();
648  SET(encrypted, EncryptedDataToValue);
649  return value;
650}
651
652base::DictionaryValue* PreferenceSpecificsToValue(
653    const sync_pb::PreferenceSpecifics& proto) {
654  base::DictionaryValue* value = new base::DictionaryValue();
655  SET_STR(name);
656  SET_STR(value);
657  return value;
658}
659
660base::DictionaryValue* PriorityPreferenceSpecificsToValue(
661    const sync_pb::PriorityPreferenceSpecifics& specifics) {
662  base::DictionaryValue* value = new base::DictionaryValue();
663  SET_FIELD(preference, PreferenceSpecificsToValue);
664  return value;
665}
666
667base::DictionaryValue* SyncedNotificationAppInfoSpecificsToValue(
668    const sync_pb::SyncedNotificationAppInfoSpecifics& proto) {
669  base::DictionaryValue* value = new base::DictionaryValue();
670  SET_REP(synced_notification_app_info, SyncedNotificationAppInfoToValue);
671  return value;
672}
673
674base::DictionaryValue* SyncedNotificationSpecificsToValue(
675    const sync_pb::SyncedNotificationSpecifics& proto) {
676  // There is a lot of data, for now just use heading, description, key, and
677  // the read state.
678  // TODO(petewil): Eventually add more data here.
679  base::DictionaryValue* value = new base::DictionaryValue();
680  SET(coalesced_notification, CoalescedNotificationToValue);
681  return value;
682}
683
684base::DictionaryValue* SearchEngineSpecificsToValue(
685    const sync_pb::SearchEngineSpecifics& proto) {
686  base::DictionaryValue* value = new base::DictionaryValue();
687  SET_STR(short_name);
688  SET_STR(keyword);
689  SET_STR(favicon_url);
690  SET_STR(url);
691  SET_BOOL(safe_for_autoreplace);
692  SET_STR(originating_url);
693  SET_INT64(date_created);
694  SET_STR(input_encodings);
695  SET_BOOL(show_in_default_list);
696  SET_STR(suggestions_url);
697  SET_INT32(prepopulate_id);
698  SET_BOOL(autogenerate_keyword);
699  SET_STR(instant_url);
700  SET_INT64(last_modified);
701  SET_STR(sync_guid);
702  SET_STR_REP(alternate_urls);
703  SET_STR(search_terms_replacement_key);
704  SET_STR(image_url);
705  SET_STR(search_url_post_params);
706  SET_STR(suggestions_url_post_params);
707  SET_STR(instant_url_post_params);
708  SET_STR(image_url_post_params);
709  SET_STR(new_tab_url);
710  return value;
711}
712
713base::DictionaryValue* SessionSpecificsToValue(
714    const sync_pb::SessionSpecifics& proto) {
715  base::DictionaryValue* value = new base::DictionaryValue();
716  SET_STR(session_tag);
717  SET(header, SessionHeaderToValue);
718  SET(tab, SessionTabToValue);
719  SET_INT32(tab_node_id);
720  return value;
721}
722
723base::DictionaryValue* ThemeSpecificsToValue(
724    const sync_pb::ThemeSpecifics& proto) {
725  base::DictionaryValue* value = new base::DictionaryValue();
726  SET_BOOL(use_custom_theme);
727  SET_BOOL(use_system_theme_by_default);
728  SET_STR(custom_theme_name);
729  SET_STR(custom_theme_id);
730  SET_STR(custom_theme_update_url);
731  return value;
732}
733
734base::DictionaryValue* TypedUrlSpecificsToValue(
735    const sync_pb::TypedUrlSpecifics& proto) {
736  base::DictionaryValue* value = new base::DictionaryValue();
737  SET_STR(url);
738  SET_STR(title);
739  SET_BOOL(hidden);
740  SET_INT64_REP(visits);
741  SET_INT32_REP(visit_transitions);
742  return value;
743}
744
745base::DictionaryValue* EntitySpecificsToValue(
746    const sync_pb::EntitySpecifics& specifics) {
747  base::DictionaryValue* value = new base::DictionaryValue();
748  SET_FIELD(app, AppSpecificsToValue);
749  SET_FIELD(app_list, AppListSpecificsToValue);
750  SET_FIELD(app_notification, AppNotificationToValue);
751  SET_FIELD(app_setting, AppSettingSpecificsToValue);
752  SET_FIELD(article, ArticleSpecificsToValue);
753  SET_FIELD(autofill, AutofillSpecificsToValue);
754  SET_FIELD(autofill_profile, AutofillProfileSpecificsToValue);
755  SET_FIELD(bookmark, BookmarkSpecificsToValue);
756  SET_FIELD(device_info, DeviceInfoSpecificsToValue);
757  SET_FIELD(dictionary, DictionarySpecificsToValue);
758  SET_FIELD(experiments, ExperimentsSpecificsToValue);
759  SET_FIELD(extension, ExtensionSpecificsToValue);
760  SET_FIELD(extension_setting, ExtensionSettingSpecificsToValue);
761  SET_FIELD(favicon_image, FaviconImageSpecificsToValue);
762  SET_FIELD(favicon_tracking, FaviconTrackingSpecificsToValue);
763  SET_FIELD(history_delete_directive, HistoryDeleteDirectiveSpecificsToValue);
764  SET_FIELD(managed_user_setting, ManagedUserSettingSpecificsToValue);
765  SET_FIELD(managed_user_shared_setting,
766            ManagedUserSharedSettingSpecificsToValue);
767  SET_FIELD(managed_user, ManagedUserSpecificsToValue);
768  SET_FIELD(nigori, NigoriSpecificsToValue);
769  SET_FIELD(password, PasswordSpecificsToValue);
770  SET_FIELD(preference, PreferenceSpecificsToValue);
771  SET_FIELD(priority_preference, PriorityPreferenceSpecificsToValue);
772  SET_FIELD(search_engine, SearchEngineSpecificsToValue);
773  SET_FIELD(session, SessionSpecificsToValue);
774  SET_FIELD(synced_notification, SyncedNotificationSpecificsToValue);
775  SET_FIELD(synced_notification_app_info,
776            SyncedNotificationAppInfoSpecificsToValue);
777  SET_FIELD(theme, ThemeSpecificsToValue);
778  SET_FIELD(typed_url, TypedUrlSpecificsToValue);
779  return value;
780}
781
782namespace {
783
784base::StringValue* UniquePositionToStringValue(
785    const sync_pb::UniquePosition& proto) {
786  UniquePosition pos = UniquePosition::FromProto(proto);
787  return new base::StringValue(pos.ToDebugString());
788}
789
790base::DictionaryValue* SyncEntityToValue(const sync_pb::SyncEntity& proto,
791                                         bool include_specifics) {
792  base::DictionaryValue* value = new base::DictionaryValue();
793  SET_STR(id_string);
794  SET_STR(parent_id_string);
795  SET_STR(old_parent_id);
796  SET_INT64(version);
797  SET_INT64(mtime);
798  SET_INT64(ctime);
799  SET_STR(name);
800  SET_STR(non_unique_name);
801  SET_INT64(sync_timestamp);
802  SET_STR(server_defined_unique_tag);
803  SET_INT64(position_in_parent);
804  SET(unique_position, UniquePositionToStringValue);
805  SET_STR(insert_after_item_id);
806  SET_BOOL(deleted);
807  SET_STR(originator_cache_guid);
808  SET_STR(originator_client_item_id);
809  if (include_specifics)
810    SET(specifics, EntitySpecificsToValue);
811  SET_BOOL(folder);
812  SET_STR(client_defined_unique_tag);
813  return value;
814}
815
816base::ListValue* SyncEntitiesToValue(
817    const ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>& entities,
818    bool include_specifics) {
819  base::ListValue* list = new base::ListValue();
820  ::google::protobuf::RepeatedPtrField<sync_pb::SyncEntity>::const_iterator it;
821  for (it = entities.begin(); it != entities.end(); ++it) {
822    list->Append(SyncEntityToValue(*it, include_specifics));
823  }
824
825  return list;
826}
827
828base::DictionaryValue* ChromiumExtensionActivityToValue(
829    const sync_pb::ChromiumExtensionsActivity& proto) {
830  base::DictionaryValue* value = new base::DictionaryValue();
831  SET_STR(extension_id);
832  SET_INT32(bookmark_writes_since_last_commit);
833  return value;
834}
835
836base::DictionaryValue* CommitMessageToValue(
837    const sync_pb::CommitMessage& proto,
838    bool include_specifics) {
839  base::DictionaryValue* value = new base::DictionaryValue();
840  value->Set("entries",
841             SyncEntitiesToValue(proto.entries(), include_specifics));
842  SET_STR(cache_guid);
843  SET_REP(extensions_activity, ChromiumExtensionActivityToValue);
844  SET(config_params, ClientConfigParamsToValue);
845  return value;
846}
847
848base::DictionaryValue* GetUpdateTriggersToValue(
849    const sync_pb::GetUpdateTriggers& proto) {
850  base::DictionaryValue* value = new base::DictionaryValue();
851  SET_STR_REP(notification_hint);
852  SET_BOOL(client_dropped_hints);
853  SET_BOOL(invalidations_out_of_sync);
854  SET_INT64(local_modification_nudges);
855  SET_INT64(datatype_refresh_nudges);
856  return value;
857}
858
859base::DictionaryValue* DataTypeProgressMarkerToValue(
860    const sync_pb::DataTypeProgressMarker& proto) {
861  base::DictionaryValue* value = new base::DictionaryValue();
862  SET_INT32(data_type_id);
863  SET_BYTES(token);
864  SET_INT64(timestamp_token_for_migration);
865  SET_STR(notification_hint);
866  SET(get_update_triggers, GetUpdateTriggersToValue);
867  return value;
868}
869
870base::DictionaryValue* GetUpdatesCallerInfoToValue(
871    const sync_pb::GetUpdatesCallerInfo& proto) {
872  base::DictionaryValue* value = new base::DictionaryValue();
873  SET_ENUM(source, GetUpdatesSourceString);
874  SET_BOOL(notifications_enabled);
875  return value;
876}
877
878base::DictionaryValue* GetUpdatesMessageToValue(
879    const sync_pb::GetUpdatesMessage& proto) {
880  base::DictionaryValue* value = new base::DictionaryValue();
881  SET(caller_info, GetUpdatesCallerInfoToValue);
882  SET_BOOL(fetch_folders);
883  SET_INT32(batch_size);
884  SET_REP(from_progress_marker, DataTypeProgressMarkerToValue);
885  SET_BOOL(streaming);
886  SET_BOOL(need_encryption_key);
887  SET_BOOL(create_mobile_bookmarks_folder);
888  SET_ENUM(get_updates_origin, GetUpdatesOriginString);
889  return value;
890}
891
892base::DictionaryValue* ClientStatusToValue(const sync_pb::ClientStatus& proto) {
893  base::DictionaryValue* value = new base::DictionaryValue();
894  SET_BOOL(hierarchy_conflict_detected);
895  return value;
896}
897
898base::DictionaryValue* EntryResponseToValue(
899    const sync_pb::CommitResponse::EntryResponse& proto) {
900  base::DictionaryValue* value = new base::DictionaryValue();
901  SET_ENUM(response_type, GetResponseTypeString);
902  SET_STR(id_string);
903  SET_STR(parent_id_string);
904  SET_INT64(position_in_parent);
905  SET_INT64(version);
906  SET_STR(name);
907  SET_STR(error_message);
908  SET_INT64(mtime);
909  return value;
910}
911
912base::DictionaryValue* CommitResponseToValue(
913    const sync_pb::CommitResponse& proto) {
914  base::DictionaryValue* value = new base::DictionaryValue();
915  SET_REP(entryresponse, EntryResponseToValue);
916  return value;
917}
918
919base::DictionaryValue* GetUpdatesResponseToValue(
920    const sync_pb::GetUpdatesResponse& proto,
921    bool include_specifics) {
922  base::DictionaryValue* value = new base::DictionaryValue();
923  value->Set("entries",
924             SyncEntitiesToValue(proto.entries(), include_specifics));
925  SET_INT64(changes_remaining);
926  SET_REP(new_progress_marker, DataTypeProgressMarkerToValue);
927  return value;
928}
929
930base::DictionaryValue* ClientCommandToValue(
931    const sync_pb::ClientCommand& proto) {
932  base::DictionaryValue* value = new base::DictionaryValue();
933  SET_INT32(set_sync_poll_interval);
934  SET_INT32(set_sync_long_poll_interval);
935  SET_INT32(max_commit_batch_size);
936  SET_INT32(sessions_commit_delay_seconds);
937  SET_INT32(throttle_delay_seconds);
938  SET_INT32(client_invalidation_hint_buffer_size);
939  return value;
940}
941
942base::DictionaryValue* ErrorToValue(
943    const sync_pb::ClientToServerResponse::Error& proto) {
944  base::DictionaryValue* value = new base::DictionaryValue();
945  SET_ENUM(error_type, GetErrorTypeString);
946  SET_STR(error_description);
947  SET_STR(url);
948  SET_ENUM(action, GetActionString);
949  return value;
950}
951
952}  // namespace
953
954base::DictionaryValue* ClientToServerResponseToValue(
955    const sync_pb::ClientToServerResponse& proto,
956    bool include_specifics) {
957  base::DictionaryValue* value = new base::DictionaryValue();
958  SET(commit, CommitResponseToValue);
959  if (proto.has_get_updates()) {
960    value->Set("get_updates", GetUpdatesResponseToValue(proto.get_updates(),
961                                                        include_specifics));
962  }
963
964  SET(error, ErrorToValue);
965  SET_ENUM(error_code, GetErrorTypeString);
966  SET_STR(error_message);
967  SET_STR(store_birthday);
968  SET(client_command, ClientCommandToValue);
969  SET_INT32_REP(migrated_data_type_id);
970  return value;
971}
972
973base::DictionaryValue* ClientToServerMessageToValue(
974    const sync_pb::ClientToServerMessage& proto,
975    bool include_specifics) {
976  base::DictionaryValue* value = new base::DictionaryValue();
977  SET_STR(share);
978  SET_INT32(protocol_version);
979  if (proto.has_commit()) {
980    value->Set("commit",
981               CommitMessageToValue(proto.commit(), include_specifics));
982  }
983
984  SET(get_updates, GetUpdatesMessageToValue);
985  SET_STR(store_birthday);
986  SET_BOOL(sync_problem_detected);
987  SET(debug_info, DebugInfoToValue);
988  SET(client_status, ClientStatusToValue);
989  return value;
990}
991
992base::DictionaryValue* DatatypeAssociationStatsToValue(
993    const sync_pb::DatatypeAssociationStats& proto) {
994  base::DictionaryValue* value = new base::DictionaryValue();
995  SET_INT32(data_type_id);
996  SET_INT32(num_local_items_before_association);
997  SET_INT32(num_sync_items_before_association);
998  SET_INT32(num_local_items_after_association);
999  SET_INT32(num_sync_items_after_association);
1000  SET_INT32(num_local_items_added);
1001  SET_INT32(num_local_items_deleted);
1002  SET_INT32(num_local_items_modified);
1003  SET_INT32(num_sync_items_added);
1004  SET_INT32(num_sync_items_deleted);
1005  SET_INT32(num_sync_items_modified);
1006  SET_INT64(local_version_pre_association);
1007  SET_INT64(sync_version_pre_association)
1008  SET_BOOL(had_error);
1009  SET_INT64(download_wait_time_us);
1010  SET_INT64(download_time_us);
1011  SET_INT64(association_wait_time_for_high_priority_us);
1012  SET_INT64(association_wait_time_for_same_priority_us);
1013  return value;
1014}
1015
1016base::DictionaryValue* DebugEventInfoToValue(
1017    const sync_pb::DebugEventInfo& proto) {
1018  base::DictionaryValue* value = new base::DictionaryValue();
1019  SET_ENUM(singleton_event, SingletonDebugEventTypeString);
1020  SET(sync_cycle_completed_event_info, SyncCycleCompletedEventInfoToValue);
1021  SET_INT32(nudging_datatype);
1022  SET_INT32_REP(datatypes_notified_from_server);
1023  SET(datatype_association_stats, DatatypeAssociationStatsToValue);
1024  return value;
1025}
1026
1027base::DictionaryValue* DebugInfoToValue(const sync_pb::DebugInfo& proto) {
1028  base::DictionaryValue* value = new base::DictionaryValue();
1029  SET_REP(events, DebugEventInfoToValue);
1030  SET_BOOL(cryptographer_ready);
1031  SET_BOOL(cryptographer_has_pending_keys);
1032  SET_BOOL(events_dropped);
1033  return value;
1034}
1035
1036base::DictionaryValue* SyncCycleCompletedEventInfoToValue(
1037    const sync_pb::SyncCycleCompletedEventInfo& proto) {
1038  base::DictionaryValue* value = new base::DictionaryValue();
1039  SET_INT32(num_encryption_conflicts);
1040  SET_INT32(num_hierarchy_conflicts);
1041  SET_INT32(num_server_conflicts);
1042  SET_INT32(num_updates_downloaded);
1043  SET_INT32(num_reflected_updates_downloaded);
1044  SET(caller_info, GetUpdatesCallerInfoToValue);
1045  return value;
1046}
1047
1048base::DictionaryValue* ClientConfigParamsToValue(
1049    const sync_pb::ClientConfigParams& proto) {
1050  base::DictionaryValue* value = new base::DictionaryValue();
1051  SET_INT32_REP(enabled_type_ids);
1052  SET_BOOL(tabs_datatype_enabled);
1053  return value;
1054}
1055
1056#undef SET
1057#undef SET_REP
1058
1059#undef SET_BOOL
1060#undef SET_BYTES
1061#undef SET_INT32
1062#undef SET_INT64
1063#undef SET_INT64_REP
1064#undef SET_STR
1065#undef SET_STR_REP
1066
1067#undef SET_FIELD
1068
1069}  // namespace syncer
1070