diff options
author | Yi Jin <jinyithu@google.com> | 2017-10-17 18:29:33 -0700 |
---|---|---|
committer | Yi Jin <jinyithu@google.com> | 2017-10-31 16:54:38 -0700 |
commit | 04625ad4886a478bf74bbfc13937c10fa63eb272 (patch) | |
tree | ba39988adb170b2e6e744ab304de7f8846a4d444 /libs/protoutil | |
parent | eb7d335641ec1b9c91c1609a94cb1cbdba1d3987 (diff) |
Refactor incident_helper to use protoutil and cppstream plugin.
1. Split the parsers to its own file to prevent all the parsers in one
gaint file.
2. Completely get rid of protobuf-cpp-full in incident_helper, use
ProtoOutputStream and cppstream instead, the incident_helper binary is
reduced from ~500K to ~113K.
3. Write data to protobuf even its values are zero/default, the reason
is for example we have a repeated int32 orders = 1; and people
explicitly append 0 so the total repeated field has 10 values, if zero
is not written to serialized data, this repeated field will only have 9
values which is not what we want at first place. This also aligns with
the default protobuf serialization behavior in incident_helper_test.
4. Use Android.bp for protoutil lib since it is not able to depend on
libs compiled by .mk file, it works the other way.
5. Add a new custom message option for streaming_proto, if specified,
the cppstream will create extra metadata to get field ids by field name.
A Table class is created in incident_helper to use it.
Bug: 67860303
Test: unit tested as well as on device test
Change-Id: I8e136fd15f343a4a623d20910ec64b622b478a3e
Diffstat (limited to 'libs/protoutil')
-rw-r--r-- | libs/protoutil/Android.bp | 39 | ||||
-rw-r--r-- | libs/protoutil/Android.mk | 39 | ||||
-rw-r--r-- | libs/protoutil/include/android/util/ProtoOutputStream.h | 57 | ||||
-rw-r--r-- | libs/protoutil/src/ProtoOutputStream.cpp | 179 |
4 files changed, 150 insertions, 164 deletions
diff --git a/libs/protoutil/Android.bp b/libs/protoutil/Android.bp new file mode 100644 index 000000000000..4f1d2d5a4fe5 --- /dev/null +++ b/libs/protoutil/Android.bp @@ -0,0 +1,39 @@ +// +// Copyright (C) 2017 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +cc_library { + name: "libprotoutil", + + cflags: [ + "-Wall", + "-Werror", + "-Wno-missing-field-initializers", + "-Wno-unused-variable", + "-Wunused-parameter", + ], + + srcs: [ + "src/EncodedBuffer.cpp", + "src/ProtoOutputStream.cpp", + "src/protobuf.cpp", + ], + + export_include_dirs: ["include"], + + shared_libs: [ + "libcutils", + "liblog", + ], +} diff --git a/libs/protoutil/Android.mk b/libs/protoutil/Android.mk deleted file mode 100644 index 2a2b087dc032..000000000000 --- a/libs/protoutil/Android.mk +++ /dev/null @@ -1,39 +0,0 @@ -# -# Copyright (C) 2017 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -LOCAL_PATH:= $(call my-dir) -include $(CLEAR_VARS) - -LOCAL_MODULE := libprotoutil - -LOCAL_CFLAGS := \ - -Wall -Werror -Wno-missing-field-initializers -Wno-unused-variable -Wunused-parameter - -LOCAL_SHARED_LIBRARIES := \ - libcutils \ - liblog \ - -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH)/include - -LOCAL_SRC_FILES := \ - src/EncodedBuffer.cpp \ - src/ProtoOutputStream.cpp \ - src/protobuf.cpp \ - -LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include - -include $(BUILD_SHARED_LIBRARY) - diff --git a/libs/protoutil/include/android/util/ProtoOutputStream.h b/libs/protoutil/include/android/util/ProtoOutputStream.h index b8415b2e264b..2155084db534 100644 --- a/libs/protoutil/include/android/util/ProtoOutputStream.h +++ b/libs/protoutil/include/android/util/ProtoOutputStream.h @@ -19,13 +19,59 @@ #include <android/util/EncodedBuffer.h> -#include <stdint.h> #include <string> namespace android { namespace util { /** + * Position of the field type in a (long long) fieldId. + */ +const uint64_t FIELD_TYPE_SHIFT = 32; + +/** + * Mask for the field types stored in a fieldId. Leaves a whole + * byte for future expansion, even though there are currently only 17 types. + */ +const uint64_t FIELD_TYPE_MASK = 0x0ffULL << FIELD_TYPE_SHIFT; + +const uint64_t FIELD_TYPE_UNKNOWN = 0; +const uint64_t FIELD_TYPE_DOUBLE = 1ULL << FIELD_TYPE_SHIFT; // double, exactly eight bytes on the wire. +const uint64_t FIELD_TYPE_FLOAT = 2ULL << FIELD_TYPE_SHIFT; // float, exactly four bytes on the wire. +const uint64_t FIELD_TYPE_INT64 = 3ULL << FIELD_TYPE_SHIFT; // int64, varint on the wire. Negative numbers + // take 10 bytes. Use TYPE_SINT64 if negative + // values are likely. +const uint64_t FIELD_TYPE_UINT64 = 4ULL << FIELD_TYPE_SHIFT; // uint64, varint on the wire. +const uint64_t FIELD_TYPE_INT32 = 5ULL << FIELD_TYPE_SHIFT; // int32, varint on the wire. Negative numbers + // take 10 bytes. Use TYPE_SINT32 if negative + // values are likely. +const uint64_t FIELD_TYPE_FIXED64 = 6ULL << FIELD_TYPE_SHIFT; // uint64, exactly eight bytes on the wire. +const uint64_t FIELD_TYPE_FIXED32 = 7ULL << FIELD_TYPE_SHIFT; // uint32, exactly four bytes on the wire. +const uint64_t FIELD_TYPE_BOOL = 8ULL << FIELD_TYPE_SHIFT; // bool, varint on the wire. +const uint64_t FIELD_TYPE_STRING = 9ULL << FIELD_TYPE_SHIFT; // UTF-8 text. +const uint64_t FIELD_TYPE_GROUP = 10ULL << FIELD_TYPE_SHIFT; // Tag-delimited message. Deprecated. +const uint64_t FIELD_TYPE_MESSAGE = 11ULL << FIELD_TYPE_SHIFT; // Length-delimited message. + +const uint64_t FIELD_TYPE_BYTES = 12ULL << FIELD_TYPE_SHIFT; // Arbitrary byte array. +const uint64_t FIELD_TYPE_UINT32 = 13ULL << FIELD_TYPE_SHIFT; // uint32, varint on the wire +const uint64_t FIELD_TYPE_ENUM = 14ULL << FIELD_TYPE_SHIFT; // Enum, varint on the wire +const uint64_t FIELD_TYPE_SFIXED32 = 15ULL << FIELD_TYPE_SHIFT; // int32, exactly four bytes on the wire +const uint64_t FIELD_TYPE_SFIXED64 = 16ULL << FIELD_TYPE_SHIFT; // int64, exactly eight bytes on the wire +const uint64_t FIELD_TYPE_SINT32 = 17ULL << FIELD_TYPE_SHIFT; // int32, ZigZag-encoded varint on the wire +const uint64_t FIELD_TYPE_SINT64 = 18ULL << FIELD_TYPE_SHIFT; // int64, ZigZag-encoded varint on the wire + +// +// FieldId flags for whether the field is single, repeated or packed. +// TODO: packed is not supported yet. +// +const uint64_t FIELD_COUNT_SHIFT = 40; +const uint64_t FIELD_COUNT_MASK = 0x0fULL << FIELD_COUNT_SHIFT; +const uint64_t FIELD_COUNT_UNKNOWN = 0; +const uint64_t FIELD_COUNT_SINGLE = 1ULL << FIELD_COUNT_SHIFT; +const uint64_t FIELD_COUNT_REPEATED = 2ULL << FIELD_COUNT_SHIFT; +const uint64_t FIELD_COUNT_PACKED = 4ULL << FIELD_COUNT_SHIFT; + +/** * Class to write to a protobuf stream. * * Each write method takes an ID code from the protoc generated classes @@ -60,11 +106,12 @@ public: void end(long long token); /** - * Flushes the protobuf data out to given fd. + * Flushes the protobuf data out to given fd. When the following functions are called, + * it is not able to write to ProtoOutputStream any more since the data is compact. */ - size_t size(); - EncodedBuffer::iterator data(); - bool flush(int fd); + size_t size(); // Get the size of the serialized protobuf. + EncodedBuffer::iterator data(); // Get the reader apis of the data. + bool flush(int fd); // Flush data directly to a file descriptor. // Please don't use the following functions to dump protos unless you are familiar with protobuf encoding. void writeRawVarint(uint64_t varint); diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp index b91e3db0e39c..9d8ee729a80d 100644 --- a/libs/protoutil/src/ProtoOutputStream.cpp +++ b/libs/protoutil/src/ProtoOutputStream.cpp @@ -18,58 +18,10 @@ #include <android/util/protobuf.h> #include <android/util/ProtoOutputStream.h> #include <cutils/log.h> -#include <cstring> namespace android { namespace util { -/** - * Position of the field type in a (long long) fieldId. - */ -const uint64_t FIELD_TYPE_SHIFT = 32; - -/** - * Mask for the field types stored in a fieldId. Leaves a whole - * byte for future expansion, even though there are currently only 17 types. - */ -const uint64_t FIELD_TYPE_MASK = 0x0ffULL << FIELD_TYPE_SHIFT; - -const uint64_t FIELD_TYPE_UNKNOWN = 0; -const uint64_t TYPE_DOUBLE = 1ULL << FIELD_TYPE_SHIFT; // double, exactly eight bytes on the wire. -const uint64_t TYPE_FLOAT = 2ULL << FIELD_TYPE_SHIFT; // float, exactly four bytes on the wire. -const uint64_t TYPE_INT64 = 3ULL << FIELD_TYPE_SHIFT; // int64, varint on the wire. Negative numbers - // take 10 bytes. Use TYPE_SINT64 if negative - // values are likely. -const uint64_t TYPE_UINT64 = 4ULL << FIELD_TYPE_SHIFT; // uint64, varint on the wire. -const uint64_t TYPE_INT32 = 5ULL << FIELD_TYPE_SHIFT; // int32, varint on the wire. Negative numbers - // take 10 bytes. Use TYPE_SINT32 if negative - // values are likely. -const uint64_t TYPE_FIXED64 = 6ULL << FIELD_TYPE_SHIFT; // uint64, exactly eight bytes on the wire. -const uint64_t TYPE_FIXED32 = 7ULL << FIELD_TYPE_SHIFT; // uint32, exactly four bytes on the wire. -const uint64_t TYPE_BOOL = 8ULL << FIELD_TYPE_SHIFT; // bool, varint on the wire. -const uint64_t TYPE_STRING = 9ULL << FIELD_TYPE_SHIFT; // UTF-8 text. -const uint64_t TYPE_GROUP = 10ULL << FIELD_TYPE_SHIFT; // Tag-delimited message. Deprecated. -const uint64_t TYPE_MESSAGE = 11ULL << FIELD_TYPE_SHIFT; // Length-delimited message. - -const uint64_t TYPE_BYTES = 12ULL << FIELD_TYPE_SHIFT; // Arbitrary byte array. -const uint64_t TYPE_UINT32 = 13ULL << FIELD_TYPE_SHIFT; // uint32, varint on the wire -const uint64_t TYPE_ENUM = 14ULL << FIELD_TYPE_SHIFT; // Enum, varint on the wire -const uint64_t TYPE_SFIXED32 = 15ULL << FIELD_TYPE_SHIFT; // int32, exactly four bytes on the wire -const uint64_t TYPE_SFIXED64 = 16ULL << FIELD_TYPE_SHIFT; // int64, exactly eight bytes on the wire -const uint64_t TYPE_SINT32 = 17ULL << FIELD_TYPE_SHIFT; // int32, ZigZag-encoded varint on the wire -const uint64_t TYPE_SINT64 = 18ULL << FIELD_TYPE_SHIFT; // int64, ZigZag-encoded varint on the wire - -// -// FieldId flags for whether the field is single, repeated or packed. -// TODO: packed is not supported yet. -// -const uint64_t FIELD_COUNT_SHIFT = 40; -const uint64_t FIELD_COUNT_MASK = 0x0fULL << FIELD_COUNT_SHIFT; -const uint64_t FIELD_COUNT_UNKNOWN = 0; -const uint64_t FIELD_COUNT_SINGLE = 1ULL << FIELD_COUNT_SHIFT; -const uint64_t FIELD_COUNT_REPEATED = 2ULL << FIELD_COUNT_SHIFT; -const uint64_t FIELD_COUNT_PACKED = 4ULL << FIELD_COUNT_SHIFT; - ProtoOutputStream::ProtoOutputStream() :mBuffer(), mCopyBegin(0), @@ -90,18 +42,18 @@ ProtoOutputStream::write(uint64_t fieldId, double val) if (mCompact) return false; const uint32_t id = (uint32_t)fieldId; switch (fieldId & FIELD_TYPE_MASK) { - case TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break; - case TYPE_FLOAT: writeFloatImpl(id, (float)val); break; - case TYPE_INT64: writeInt64Impl(id, (long long)val); break; - case TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break; - case TYPE_INT32: writeInt32Impl(id, (int)val); break; - case TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break; - case TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break; - case TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break; - case TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break; - case TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break; - case TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break; - case TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break; + case FIELD_TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break; + case FIELD_TYPE_FLOAT: writeFloatImpl(id, (float)val); break; + case FIELD_TYPE_INT64: writeInt64Impl(id, (long long)val); break; + case FIELD_TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break; + case FIELD_TYPE_INT32: writeInt32Impl(id, (int)val); break; + case FIELD_TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break; + case FIELD_TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break; + case FIELD_TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break; + case FIELD_TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break; + case FIELD_TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break; + case FIELD_TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break; + case FIELD_TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break; default: ALOGW("Field type %d is not supported when writing double val.", (int)((fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT)); @@ -116,18 +68,18 @@ ProtoOutputStream::write(uint64_t fieldId, float val) if (mCompact) return false; const uint32_t id = (uint32_t)fieldId; switch (fieldId & FIELD_TYPE_MASK) { - case TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break; - case TYPE_FLOAT: writeFloatImpl(id, (float)val); break; - case TYPE_INT64: writeInt64Impl(id, (long long)val); break; - case TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break; - case TYPE_INT32: writeInt32Impl(id, (int)val); break; - case TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break; - case TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break; - case TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break; - case TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break; - case TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break; - case TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break; - case TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break; + case FIELD_TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break; + case FIELD_TYPE_FLOAT: writeFloatImpl(id, (float)val); break; + case FIELD_TYPE_INT64: writeInt64Impl(id, (long long)val); break; + case FIELD_TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break; + case FIELD_TYPE_INT32: writeInt32Impl(id, (int)val); break; + case FIELD_TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break; + case FIELD_TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break; + case FIELD_TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break; + case FIELD_TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break; + case FIELD_TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break; + case FIELD_TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break; + case FIELD_TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break; default: ALOGW("Field type %d is not supported when writing float val.", (int)((fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT)); @@ -142,20 +94,20 @@ ProtoOutputStream::write(uint64_t fieldId, int val) if (mCompact) return false; const uint32_t id = (uint32_t)fieldId; switch (fieldId & FIELD_TYPE_MASK) { - case TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break; - case TYPE_FLOAT: writeFloatImpl(id, (float)val); break; - case TYPE_INT64: writeInt64Impl(id, (long long)val); break; - case TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break; - case TYPE_INT32: writeInt32Impl(id, (int)val); break; - case TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break; - case TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break; - case TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break; - case TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break; - case TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break; - case TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break; - case TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break; - case TYPE_ENUM: writeEnumImpl(id, (int)val); break; - case TYPE_BOOL: writeBoolImpl(id, val != 0); break; + case FIELD_TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break; + case FIELD_TYPE_FLOAT: writeFloatImpl(id, (float)val); break; + case FIELD_TYPE_INT64: writeInt64Impl(id, (long long)val); break; + case FIELD_TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break; + case FIELD_TYPE_INT32: writeInt32Impl(id, (int)val); break; + case FIELD_TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break; + case FIELD_TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break; + case FIELD_TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break; + case FIELD_TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break; + case FIELD_TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break; + case FIELD_TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break; + case FIELD_TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break; + case FIELD_TYPE_ENUM: writeEnumImpl(id, (int)val); break; + case FIELD_TYPE_BOOL: writeBoolImpl(id, val != 0); break; default: ALOGW("Field type %d is not supported when writing int val.", (int)((fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT)); @@ -170,20 +122,20 @@ ProtoOutputStream::write(uint64_t fieldId, long long val) if (mCompact) return false; const uint32_t id = (uint32_t)fieldId; switch (fieldId & FIELD_TYPE_MASK) { - case TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break; - case TYPE_FLOAT: writeFloatImpl(id, (float)val); break; - case TYPE_INT64: writeInt64Impl(id, (long long)val); break; - case TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break; - case TYPE_INT32: writeInt32Impl(id, (int)val); break; - case TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break; - case TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break; - case TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break; - case TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break; - case TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break; - case TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break; - case TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break; - case TYPE_ENUM: writeEnumImpl(id, (int)val); break; - case TYPE_BOOL: writeBoolImpl(id, val != 0); break; + case FIELD_TYPE_DOUBLE: writeDoubleImpl(id, (double)val); break; + case FIELD_TYPE_FLOAT: writeFloatImpl(id, (float)val); break; + case FIELD_TYPE_INT64: writeInt64Impl(id, (long long)val); break; + case FIELD_TYPE_UINT64: writeUint64Impl(id, (uint64_t)val); break; + case FIELD_TYPE_INT32: writeInt32Impl(id, (int)val); break; + case FIELD_TYPE_FIXED64: writeFixed64Impl(id, (uint64_t)val); break; + case FIELD_TYPE_FIXED32: writeFixed32Impl(id, (uint32_t)val); break; + case FIELD_TYPE_UINT32: writeUint32Impl(id, (uint32_t)val); break; + case FIELD_TYPE_SFIXED32: writeSFixed32Impl(id, (int)val); break; + case FIELD_TYPE_SFIXED64: writeSFixed64Impl(id, (long long)val); break; + case FIELD_TYPE_SINT32: writeZigzagInt32Impl(id, (int)val); break; + case FIELD_TYPE_SINT64: writeZigzagInt64Impl(id, (long long)val); break; + case FIELD_TYPE_ENUM: writeEnumImpl(id, (int)val); break; + case FIELD_TYPE_BOOL: writeBoolImpl(id, val != 0); break; default: ALOGW("Field type %d is not supported when writing long long val.", (int)((fieldId & FIELD_TYPE_MASK) >> FIELD_TYPE_SHIFT)); @@ -198,7 +150,7 @@ ProtoOutputStream::write(uint64_t fieldId, bool val) if (mCompact) return false; const uint32_t id = (uint32_t)fieldId; switch (fieldId & FIELD_TYPE_MASK) { - case TYPE_BOOL: + case FIELD_TYPE_BOOL: writeBoolImpl(id, val); return true; default: @@ -214,7 +166,7 @@ ProtoOutputStream::write(uint64_t fieldId, string val) if (mCompact) return false; const uint32_t id = (uint32_t)fieldId; switch (fieldId & FIELD_TYPE_MASK) { - case TYPE_STRING: + case FIELD_TYPE_STRING: writeUtf8StringImpl(id, val.c_str(), val.size()); return true; default: @@ -230,11 +182,11 @@ ProtoOutputStream::write(uint64_t fieldId, const char* val, size_t size) if (mCompact) return false; const uint32_t id = (uint32_t)fieldId; switch (fieldId & FIELD_TYPE_MASK) { - case TYPE_STRING: - case TYPE_BYTES: + case FIELD_TYPE_STRING: + case FIELD_TYPE_BYTES: writeUtf8StringImpl(id, val, size); return true; - case TYPE_MESSAGE: + case FIELD_TYPE_MESSAGE: // can directly write valid format of message bytes into ProtoOutputStream without calling start/end writeMessageBytesImpl(id, val, size); return true; @@ -291,7 +243,7 @@ static int getSizePosFromToken(long long token) { long long ProtoOutputStream::start(uint64_t fieldId) { - if ((fieldId & FIELD_TYPE_MASK) != TYPE_MESSAGE) { + if ((fieldId & FIELD_TYPE_MASK) != FIELD_TYPE_MESSAGE) { ALOGE("Can't call start for non-message type field: 0x%llx", (long long)fieldId); return 0; } @@ -564,7 +516,6 @@ inline To bit_cast(From const &from) { inline void ProtoOutputStream::writeDoubleImpl(uint32_t id, double val) { - if (val == 0.0) return; mBuffer.writeHeader(id, WIRE_TYPE_FIXED64); mBuffer.writeRawFixed64(bit_cast<double, uint64_t>(val)); } @@ -572,7 +523,6 @@ ProtoOutputStream::writeDoubleImpl(uint32_t id, double val) inline void ProtoOutputStream::writeFloatImpl(uint32_t id, float val) { - if (val == 0.0) return; mBuffer.writeHeader(id, WIRE_TYPE_FIXED32); mBuffer.writeRawFixed32(bit_cast<float, uint32_t>(val)); } @@ -580,7 +530,6 @@ ProtoOutputStream::writeFloatImpl(uint32_t id, float val) inline void ProtoOutputStream::writeInt64Impl(uint32_t id, long long val) { - if (val == 0) return; mBuffer.writeHeader(id, WIRE_TYPE_VARINT); mBuffer.writeRawVarint64((uint64_t)val); } @@ -588,7 +537,6 @@ ProtoOutputStream::writeInt64Impl(uint32_t id, long long val) inline void ProtoOutputStream::writeInt32Impl(uint32_t id, int val) { - if (val == 0) return; mBuffer.writeHeader(id, WIRE_TYPE_VARINT); mBuffer.writeRawVarint32((uint32_t)val); } @@ -596,7 +544,6 @@ ProtoOutputStream::writeInt32Impl(uint32_t id, int val) inline void ProtoOutputStream::writeUint64Impl(uint32_t id, uint64_t val) { - if (val == 0) return; mBuffer.writeHeader(id, WIRE_TYPE_VARINT); mBuffer.writeRawVarint64(val); } @@ -604,7 +551,6 @@ ProtoOutputStream::writeUint64Impl(uint32_t id, uint64_t val) inline void ProtoOutputStream::writeUint32Impl(uint32_t id, uint32_t val) { - if (val == 0) return; mBuffer.writeHeader(id, WIRE_TYPE_VARINT); mBuffer.writeRawVarint32(val); } @@ -612,7 +558,6 @@ ProtoOutputStream::writeUint32Impl(uint32_t id, uint32_t val) inline void ProtoOutputStream::writeFixed64Impl(uint32_t id, uint64_t val) { - if (val == 0) return; mBuffer.writeHeader(id, WIRE_TYPE_FIXED64); mBuffer.writeRawFixed64(val); } @@ -620,7 +565,6 @@ ProtoOutputStream::writeFixed64Impl(uint32_t id, uint64_t val) inline void ProtoOutputStream::writeFixed32Impl(uint32_t id, uint32_t val) { - if (val == 0) return; mBuffer.writeHeader(id, WIRE_TYPE_FIXED32); mBuffer.writeRawFixed32(val); } @@ -628,7 +572,6 @@ ProtoOutputStream::writeFixed32Impl(uint32_t id, uint32_t val) inline void ProtoOutputStream::writeSFixed64Impl(uint32_t id, long long val) { - if (val == 0) return; mBuffer.writeHeader(id, WIRE_TYPE_FIXED64); mBuffer.writeRawFixed64((uint64_t)val); } @@ -636,7 +579,6 @@ ProtoOutputStream::writeSFixed64Impl(uint32_t id, long long val) inline void ProtoOutputStream::writeSFixed32Impl(uint32_t id, int val) { - if (val == 0) return; mBuffer.writeHeader(id, WIRE_TYPE_FIXED32); mBuffer.writeRawFixed32((uint32_t)val); } @@ -644,7 +586,6 @@ ProtoOutputStream::writeSFixed32Impl(uint32_t id, int val) inline void ProtoOutputStream::writeZigzagInt64Impl(uint32_t id, long long val) { - if (val == 0) return; mBuffer.writeHeader(id, WIRE_TYPE_VARINT); mBuffer.writeRawVarint64((val << 1) ^ (val >> 63)); } @@ -652,7 +593,6 @@ ProtoOutputStream::writeZigzagInt64Impl(uint32_t id, long long val) inline void ProtoOutputStream::writeZigzagInt32Impl(uint32_t id, int val) { - if (val == 0) return; mBuffer.writeHeader(id, WIRE_TYPE_VARINT); mBuffer.writeRawVarint32((val << 1) ^ (val >> 31)); } @@ -667,7 +607,6 @@ ProtoOutputStream::writeEnumImpl(uint32_t id, int val) inline void ProtoOutputStream::writeBoolImpl(uint32_t id, bool val) { - if (!val) return; mBuffer.writeHeader(id, WIRE_TYPE_VARINT); mBuffer.writeRawVarint32(val ? 1 : 0); } @@ -675,7 +614,7 @@ ProtoOutputStream::writeBoolImpl(uint32_t id, bool val) inline void ProtoOutputStream::writeUtf8StringImpl(uint32_t id, const char* val, size_t size) { - if (val == NULL || size == 0) return; + if (val == NULL) return; writeLengthDelimitedHeader(id, size); for (size_t i=0; i<size; i++) { mBuffer.writeRawByte((uint8_t)val[i]); |