172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Keep this file in sync with the .proto files in this directory.
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/proto_value_conversions.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/base64.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/basictypes.h"
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/logging.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/string_number_conversions.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/app_specifics.pb.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/autofill_specifics.pb.h"
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/bookmark_specifics.pb.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/encryption.pb.h"
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/extension_specifics.pb.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/nigori_specifics.pb.h"
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/password_specifics.pb.h"
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/preference_specifics.pb.h"
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/proto_enum_conversions.h"
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/session_specifics.pb.h"
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/sync.pb.h"
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/theme_specifics.pb.h"
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/protocol/typed_url_specifics.pb.h"
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace browser_sync {
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace {
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Basic Type -> Value functions.
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenStringValue* MakeInt64Value(int64 x) {
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return Value::CreateStringValue(base::Int64ToString(x));
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// TODO(akalin): Perhaps make JSONWriter support BinaryValue and use
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// that instead of a StringValue.
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenStringValue* MakeBytesValue(const std::string& bytes) {
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string bytes_base64;
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (!base::Base64Encode(bytes, &bytes_base64)) {
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    NOTREACHED();
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return Value::CreateStringValue(bytes_base64);
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// T is the enum type.
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <class T>
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenStringValue* MakeEnumValue(T t, const char* (*converter_fn)(T)) {
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return Value::CreateStringValue(converter_fn(t));
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// T is the field type, F is either RepeatedField or RepeatedPtrField,
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// and V is a subclass of Value.
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsentemplate <class T, class F, class V>
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenListValue* MakeRepeatedValue(const F& fields, V* (*converter_fn)(T)) {
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ListValue* list = new ListValue();
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (typename F::const_iterator it = fields.begin(); it != fields.end();
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen       ++it) {
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    list->Append(converter_fn(*it));
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return list;
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Helper macros to reduce the amount of boilerplate.
6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET(field, fn) value->Set(#field, fn(proto.field()))
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET_REP(field, fn) \
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->Set(#field, MakeRepeatedValue(proto.field(), fn))
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET_ENUM(field, fn) \
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->Set(#field, MakeEnumValue(proto.field(), fn))
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET_BOOL(field) SET(field, Value::CreateBooleanValue)
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET_BYTES(field) SET(field, MakeBytesValue)
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET_INT32(field) SET(field, MakeInt64Value)
7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET_INT32_REP(field) SET_REP(field, MakeInt64Value)
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET_INT64(field) SET(field, MakeInt64Value)
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET_INT64_REP(field) SET_REP(field, MakeInt64Value)
8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET_STR(field) SET(field, Value::CreateStringValue)
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define SET_EXTENSION(ns, field, fn)                                    \
8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  do {                                                                  \
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (specifics.HasExtension(ns::field)) {                            \
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      value->Set(#field, fn(specifics.GetExtension(ns::field)));        \
8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    }                                                                   \
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  } while (0)
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// If you add another macro, don't forget to add an #undef at the end
9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// of this file, too.
9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* EncryptedDataToValue(const sync_pb::EncryptedData& proto) {
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(key_name);
9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(akalin): Shouldn't blob be of type bytes instead of string?
9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BYTES(blob);
9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* SessionHeaderToValue(
10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::SessionHeader& proto) {
10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_REP(window, SessionWindowToValue);
10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* SessionTabToValue(
11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::SessionTab& proto) {
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT32(tab_id);
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT32(window_id);
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT32(tab_visual_index);
11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT32(current_navigation_index);
11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BOOL(pinned);
11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(extension_app_id);
11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_REP(navigation, TabNavigationToValue);
11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* SessionWindowToValue(
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::SessionWindow& proto) {
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT32(window_id);
12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT32(selected_tab_index);
12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT32_REP(tab);
12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_ENUM(browser_type, GetBrowserTypeString);
12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* TabNavigationToValue(
13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::TabNavigation& proto) {
13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT32(index);
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(virtual_url);
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(referrer);
13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(title);
13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(state);
14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_ENUM(page_transition, GetPageTransitionString);
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_ENUM(navigation_qualifier, GetPageTransitionQualifierString);
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* PasswordSpecificsDataToValue(
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::PasswordSpecificsData& proto) {
14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT32(scheme);
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(signon_realm);
15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(origin);
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(action);
15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(username_element);
15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(username_value);
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(password_element);
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  value->SetString("password_value", "<redacted>");
15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BOOL(ssl_valid);
15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BOOL(preferred);
15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT64(date_created);
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BOOL(blacklisted);
16072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* AppSpecificsToValue(
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::AppSpecifics& proto) {
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET(extension, ExtensionSpecificsToValue);
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* AutofillSpecificsToValue(
17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::AutofillSpecifics& proto) {
17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
17372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(name);
17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(value);
17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT64_REP(usage_timestamp);
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET(profile, AutofillProfileSpecificsToValue);
17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BYTES(encrypted_credit_card);
17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET(credit_card, AutofillCreditCardSpecificsToValue);
17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* AutofillCreditCardSpecificsToValue(
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::AutofillCreditCardSpecifics& proto) {
18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(label);
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(name_on_card);
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(type);
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(card_number);
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(expiration_month);
19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(expiration_year);
19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(verification_code);
19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(billing_address);
19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(shipping_address);
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* AutofillProfileSpecificsToValue(
19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::AutofillProfileSpecifics& proto) {
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(label);
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(guid);
20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(name_first);
20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(name_middle);
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(name_last);
20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(email_address);
20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(company_name);
20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(address_home_line1);
21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(address_home_line2);
21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(address_home_city);
21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(address_home_state);
21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(address_home_zip);
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(address_home_country);
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(phone_home_whole_number);
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(phone_fax_whole_number);
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* BookmarkSpecificsToValue(
22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::BookmarkSpecifics& proto) {
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(url);
22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BYTES(favicon);
22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* ExtensionSpecificsToValue(
23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::ExtensionSpecifics& proto) {
23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(id);
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(version);
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(update_url);
23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BOOL(enabled);
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BOOL(incognito_enabled);
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(name);
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* NigoriSpecificsToValue(
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::NigoriSpecifics& proto) {
24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET(encrypted, EncryptedDataToValue);
24572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BOOL(using_explicit_passphrase);
24672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
24772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* PasswordSpecificsToValue(
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::PasswordSpecifics& proto) {
25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET(encrypted, EncryptedDataToValue);
25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* PreferenceSpecificsToValue(
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::PreferenceSpecifics& proto) {
25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(name);
26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(value);
26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* SessionSpecificsToValue(
26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::SessionSpecifics& proto) {
26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(session_tag);
26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET(header, SessionHeaderToValue);
26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET(tab, SessionTabToValue);
27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* ThemeSpecificsToValue(
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::ThemeSpecifics& proto) {
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
27672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BOOL(use_custom_theme);
27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BOOL(use_system_theme_by_default);
27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(custom_theme_name);
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(custom_theme_id);
28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(custom_theme_update_url);
28172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
28272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
28372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* TypedUrlSpecificsToValue(
28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::TypedUrlSpecifics& proto) {
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(url);
28872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_STR(title);
28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT32(typed_count);
29072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_BOOL(hidden);
29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_INT64_REP(visit);
29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
29372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
29472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
29572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenDictionaryValue* EntitySpecificsToValue(
29672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    const sync_pb::EntitySpecifics& specifics) {
29772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DictionaryValue* value = new DictionaryValue();
29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(sync_pb, app, AppSpecificsToValue);
29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(sync_pb, autofill, AutofillSpecificsToValue);
30072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(sync_pb, autofill_profile, AutofillProfileSpecificsToValue);
30172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(sync_pb, bookmark, BookmarkSpecificsToValue);
30272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(sync_pb, extension, ExtensionSpecificsToValue);
30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(sync_pb, nigori, NigoriSpecificsToValue);
30472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(sync_pb, password, PasswordSpecificsToValue);
30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(sync_pb, preference, PreferenceSpecificsToValue);
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(sync_pb, session, SessionSpecificsToValue);
30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(sync_pb, theme, ThemeSpecificsToValue);
30872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  SET_EXTENSION(sync_pb, typed_url, TypedUrlSpecificsToValue);
30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return value;
31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#undef SET
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#undef SET_REP
31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#undef SET_BOOL
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#undef SET_BYTES
31772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#undef SET_INT32
31872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#undef SET_INT64
31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#undef SET_INT64_REP
32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#undef SET_STR
32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#undef SET_EXTENSION
32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
32472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace browser_sync
325