Implement ProtoOutputStream.h to write protobuf format data. Usage of dumping proto: ProtoOutputStream proto(fd); proto.write(fieldId, value1); // dump a single value // start to dump a message: long long token = proto.start(messageFieldId); proto.write(nestedField1, nestedValue1); ... proto.end(token); fieldId will be generated by protoc-cpp plugin(TBD). It is an encoded uint64_t value, with 0 - 32 bits as its proto number, 33 - 40 bits reserved for field type, int32, bool, string, message, etc. and 41 - 43 bits for single, repeated or packed type. Currently packed field is not supported. Bug: 65641021 Test: N/A, need to wait for protoc-cpp plugin and will test in incident_helper Change-Id: Ic188615b950235aae0edeee4876b78d31feb5619
70 lines
1.5 KiB
C++
70 lines
1.5 KiB
C++
/*
|
|
* Copyright (C) 2016 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.
|
|
*/
|
|
|
|
#include <android/util/protobuf.h>
|
|
|
|
namespace android {
|
|
namespace util {
|
|
|
|
uint8_t
|
|
read_wire_type(uint32_t varint)
|
|
{
|
|
return (uint8_t) (varint & WIRE_TYPE_MASK);
|
|
}
|
|
|
|
uint32_t
|
|
read_field_id(uint32_t varint)
|
|
{
|
|
return varint >> FIELD_ID_SHIFT;
|
|
}
|
|
|
|
size_t
|
|
get_varint_size(uint64_t varint)
|
|
{
|
|
size_t size = 1;
|
|
while ((varint & ~0x7F)) {
|
|
size++;
|
|
varint >>= 7;
|
|
}
|
|
return size;
|
|
}
|
|
|
|
uint8_t*
|
|
write_raw_varint(uint8_t* buf, uint64_t val)
|
|
{
|
|
uint8_t* p = buf;
|
|
while (true) {
|
|
if ((val & ~0x7F) == 0) {
|
|
*p++ = (uint8_t)val;
|
|
return p;
|
|
} else {
|
|
*p++ = (uint8_t)((val & 0x7F) | 0x80);
|
|
val >>= 7;
|
|
}
|
|
}
|
|
}
|
|
|
|
uint8_t*
|
|
write_length_delimited_tag_header(uint8_t* buf, uint32_t fieldId, size_t size)
|
|
{
|
|
buf = write_raw_varint(buf, (fieldId << FIELD_ID_SHIFT) | WIRE_TYPE_LENGTH_DELIMITED);
|
|
buf = write_raw_varint(buf, size);
|
|
return buf;
|
|
}
|
|
|
|
} // util
|
|
} // android
|