From b271a6e25144be8cf872d028bb82336b5da2074c Mon Sep 17 00:00:00 2001 From: rsgowman Date: Thu, 21 Jun 2018 13:59:56 -0400 Subject: Initial creation of the local serializer. (#1415) Added a single, basic test as a motivator. --- .../src/firebase/firestore/remote/serializer.cc | 55 +++++++++++++++------- .../src/firebase/firestore/remote/serializer.h | 17 ++++++- 2 files changed, 53 insertions(+), 19 deletions(-) (limited to 'Firestore/core/src/firebase/firestore/remote') diff --git a/Firestore/core/src/firebase/firestore/remote/serializer.cc b/Firestore/core/src/firebase/firestore/remote/serializer.cc index 19a068b..fc8b312 100644 --- a/Firestore/core/src/firebase/firestore/remote/serializer.cc +++ b/Firestore/core/src/firebase/firestore/remote/serializer.cc @@ -63,11 +63,11 @@ using firebase::firestore::util::StatusOr; namespace { void EncodeMapValue(Writer* writer, const ObjectValue& object_value); -void EncodeObjectMap(Writer* writer, - const ObjectValue::Map& object_value_map, - uint32_t map_tag, - uint32_t key_tag, - uint32_t value_tag); +void EncodeObjectMapImpl(Writer* writer, + const ObjectValue::Map& object_value_map, + uint32_t map_tag, + uint32_t key_tag, + uint32_t value_tag); ObjectValue::Map DecodeMapValue(Reader* reader); @@ -336,11 +336,11 @@ ObjectValue::Map::value_type DecodeDocumentFieldsEntry(Reader* reader) { google_firestore_v1beta1_Document_FieldsEntry_value_tag); } -void EncodeObjectMap(Writer* writer, - const ObjectValue::Map& object_value_map, - uint32_t map_tag, - uint32_t key_tag, - uint32_t value_tag) { +void EncodeObjectMapImpl(Writer* writer, + const ObjectValue::Map& object_value_map, + uint32_t map_tag, + uint32_t key_tag, + uint32_t value_tag) { // Write each FieldsEntry (i.e. key-value pair.) for (const auto& kv : object_value_map) { writer->WriteTag({PB_WT_STRING, map_tag}); @@ -351,10 +351,10 @@ void EncodeObjectMap(Writer* writer, } void EncodeMapValue(Writer* writer, const ObjectValue& object_value) { - EncodeObjectMap(writer, object_value.internal_value, - google_firestore_v1beta1_MapValue_fields_tag, - google_firestore_v1beta1_MapValue_FieldsEntry_key_tag, - google_firestore_v1beta1_MapValue_FieldsEntry_value_tag); + EncodeObjectMapImpl(writer, object_value.internal_value, + google_firestore_v1beta1_MapValue_fields_tag, + google_firestore_v1beta1_MapValue_FieldsEntry_key_tag, + google_firestore_v1beta1_MapValue_FieldsEntry_value_tag); } ObjectValue::Map DecodeMapValue(Reader* reader) { @@ -499,10 +499,11 @@ void Serializer::EncodeDocument(Writer* writer, // Encode Document.fields (unless it's empty) if (!object_value.internal_value.empty()) { - EncodeObjectMap(writer, object_value.internal_value, - google_firestore_v1beta1_Document_fields_tag, - google_firestore_v1beta1_Document_FieldsEntry_key_tag, - google_firestore_v1beta1_Document_FieldsEntry_value_tag); + EncodeObjectMapImpl( + writer, object_value.internal_value, + google_firestore_v1beta1_Document_fields_tag, + google_firestore_v1beta1_Document_FieldsEntry_key_tag, + google_firestore_v1beta1_Document_FieldsEntry_value_tag); } // Skip Document.create_time and Document.update_time, since they're @@ -667,6 +668,24 @@ std::unique_ptr Serializer::DecodeDocument(Reader* reader) const { /*has_local_modifications=*/false); } +void Serializer::EncodeObjectMap( + nanopb::Writer* writer, + const model::ObjectValue::Map& object_value_map, + uint32_t map_tag, + uint32_t key_tag, + uint32_t value_tag) { + // TODO(rsgowman): Move the implementation of EncodeObjectMapImpl here and + // eliminate that function. The only reason I'm (temporarily) keeping it, is + // that performing that refactoring now will cause a cascade of things that + // need to move into the local serializer class (as private functions). + EncodeObjectMapImpl(writer, object_value_map, map_tag, key_tag, value_tag); +} + +void Serializer::EncodeVersion(nanopb::Writer* writer, + const model::SnapshotVersion& version) { + EncodeTimestamp(writer, version.timestamp()); +} + } // namespace remote } // namespace firestore } // namespace firebase diff --git a/Firestore/core/src/firebase/firestore/remote/serializer.h b/Firestore/core/src/firebase/firestore/remote/serializer.h index 379069c..3b72693 100644 --- a/Firestore/core/src/firebase/firestore/remote/serializer.h +++ b/Firestore/core/src/firebase/firestore/remote/serializer.h @@ -38,6 +38,11 @@ namespace firebase { namespace firestore { + +namespace local { +class LocalSerializer; +} + namespace remote { /** @@ -158,13 +163,23 @@ class Serializer { return DecodeMaybeDocument(bytes.data(), bytes.size()); } + std::unique_ptr DecodeDocument(nanopb::Reader* reader) const; + + static void EncodeObjectMap(nanopb::Writer* writer, + const model::ObjectValue::Map& object_value_map, + uint32_t map_tag, + uint32_t key_tag, + uint32_t value_tag); + + static void EncodeVersion(nanopb::Writer* writer, + const model::SnapshotVersion& version); + private: void EncodeDocument(nanopb::Writer* writer, const model::DocumentKey& key, const model::ObjectValue& object_value) const; std::unique_ptr DecodeBatchGetDocumentsResponse( nanopb::Reader* reader) const; - std::unique_ptr DecodeDocument(nanopb::Reader* reader) const; const firebase::firestore::model::DatabaseId& database_id_; }; -- cgit v1.2.3