summaryrefslogtreecommitdiffstats
path: root/sync/syncable/entry_kernel.cc
diff options
context:
space:
mode:
Diffstat (limited to 'sync/syncable/entry_kernel.cc')
-rw-r--r--sync/syncable/entry_kernel.cc151
1 files changed, 151 insertions, 0 deletions
diff --git a/sync/syncable/entry_kernel.cc b/sync/syncable/entry_kernel.cc
new file mode 100644
index 0000000..0ea3d4e
--- /dev/null
+++ b/sync/syncable/entry_kernel.cc
@@ -0,0 +1,151 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "sync/syncable/entry_kernel.h"
+
+#include "base/string_number_conversions.h"
+#include "sync/protocol/proto_value_conversions.h"
+#include "sync/syncable/syncable_enum_conversions.h"
+
+namespace syncable {
+
+EntryKernel::EntryKernel() : dirty_(false) {
+ // Everything else should already be default-initialized.
+ for (int i = INT64_FIELDS_BEGIN; i < INT64_FIELDS_END; ++i) {
+ int64_fields[i] = 0;
+ }
+}
+
+EntryKernel::~EntryKernel() {}
+
+syncable::ModelType EntryKernel::GetServerModelType() const {
+ ModelType specifics_type = GetModelTypeFromSpecifics(ref(SERVER_SPECIFICS));
+ if (specifics_type != UNSPECIFIED)
+ return specifics_type;
+ if (ref(ID).IsRoot())
+ return TOP_LEVEL_FOLDER;
+ // Loose check for server-created top-level folders that aren't
+ // bound to a particular model type.
+ if (!ref(UNIQUE_SERVER_TAG).empty() && ref(SERVER_IS_DIR))
+ return TOP_LEVEL_FOLDER;
+
+ return UNSPECIFIED;
+}
+
+namespace {
+
+// Utility function to loop through a set of enum values and add the
+// field keys/values in the kernel to the given dictionary.
+//
+// V should be convertible to Value.
+template <class T, class U, class V>
+void SetFieldValues(const EntryKernel& kernel,
+ DictionaryValue* dictionary_value,
+ const char* (*enum_key_fn)(T),
+ V* (*enum_value_fn)(U),
+ int field_key_min, int field_key_max) {
+ DCHECK_LE(field_key_min, field_key_max);
+ for (int i = field_key_min; i <= field_key_max; ++i) {
+ T field = static_cast<T>(i);
+ const std::string& key = enum_key_fn(field);
+ V* value = enum_value_fn(kernel.ref(field));
+ dictionary_value->Set(key, value);
+ }
+}
+
+// Helper functions for SetFieldValues().
+
+StringValue* Int64ToValue(int64 i) {
+ return Value::CreateStringValue(base::Int64ToString(i));
+}
+
+StringValue* TimeToValue(const base::Time& t) {
+ return Value::CreateStringValue(browser_sync::GetTimeDebugString(t));
+}
+
+StringValue* IdToValue(const Id& id) {
+ return id.ToValue();
+}
+
+} // namespace
+
+DictionaryValue* EntryKernel::ToValue() const {
+ DictionaryValue* kernel_info = new DictionaryValue();
+ kernel_info->SetBoolean("isDirty", is_dirty());
+ kernel_info->Set("serverModelType", ModelTypeToValue(GetServerModelType()));
+
+ // Int64 fields.
+ SetFieldValues(*this, kernel_info,
+ &GetMetahandleFieldString, &Int64ToValue,
+ INT64_FIELDS_BEGIN, META_HANDLE);
+ SetFieldValues(*this, kernel_info,
+ &GetBaseVersionString, &Int64ToValue,
+ META_HANDLE + 1, BASE_VERSION);
+ SetFieldValues(*this, kernel_info,
+ &GetInt64FieldString, &Int64ToValue,
+ BASE_VERSION + 1, INT64_FIELDS_END - 1);
+
+ // Time fields.
+ SetFieldValues(*this, kernel_info,
+ &GetTimeFieldString, &TimeToValue,
+ TIME_FIELDS_BEGIN, TIME_FIELDS_END - 1);
+
+ // ID fields.
+ SetFieldValues(*this, kernel_info,
+ &GetIdFieldString, &IdToValue,
+ ID_FIELDS_BEGIN, ID_FIELDS_END - 1);
+
+ // Bit fields.
+ SetFieldValues(*this, kernel_info,
+ &GetIndexedBitFieldString, &Value::CreateBooleanValue,
+ BIT_FIELDS_BEGIN, INDEXED_BIT_FIELDS_END - 1);
+ SetFieldValues(*this, kernel_info,
+ &GetIsDelFieldString, &Value::CreateBooleanValue,
+ INDEXED_BIT_FIELDS_END, IS_DEL);
+ SetFieldValues(*this, kernel_info,
+ &GetBitFieldString, &Value::CreateBooleanValue,
+ IS_DEL + 1, BIT_FIELDS_END - 1);
+
+ // String fields.
+ {
+ // Pick out the function overload we want.
+ StringValue* (*string_to_value)(const std::string&) =
+ &Value::CreateStringValue;
+ SetFieldValues(*this, kernel_info,
+ &GetStringFieldString, string_to_value,
+ STRING_FIELDS_BEGIN, STRING_FIELDS_END - 1);
+ }
+
+ // Proto fields.
+ SetFieldValues(*this, kernel_info,
+ &GetProtoFieldString, &browser_sync::EntitySpecificsToValue,
+ PROTO_FIELDS_BEGIN, PROTO_FIELDS_END - 1);
+
+ // Bit temps.
+ SetFieldValues(*this, kernel_info,
+ &GetBitTempString, &Value::CreateBooleanValue,
+ BIT_TEMPS_BEGIN, BIT_TEMPS_END - 1);
+
+ return kernel_info;
+}
+
+ListValue* EntryKernelMutationMapToValue(
+ const EntryKernelMutationMap& mutations) {
+ ListValue* list = new ListValue();
+ for (EntryKernelMutationMap::const_iterator it = mutations.begin();
+ it != mutations.end(); ++it) {
+ list->Append(EntryKernelMutationToValue(it->second));
+ }
+ return list;
+}
+
+DictionaryValue* EntryKernelMutationToValue(
+ const EntryKernelMutation& mutation) {
+ DictionaryValue* dict = new DictionaryValue();
+ dict->Set("original", mutation.original.ToValue());
+ dict->Set("mutated", mutation.mutated.ToValue());
+ return dict;
+}
+
+}