11754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato/*
2c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin * Copyright (C) 2017 The Android Open Source Project
31754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
41754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
51754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * you may not use this file except in compliance with the License.
61754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * You may obtain a copy of the License at
71754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
81754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *      http://www.apache.org/licenses/LICENSE-2.0
91754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato *
101754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Unless required by applicable law or agreed to in writing, software
111754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * distributed under the License is distributed on an "AS IS" BASIS,
121754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * See the License for the specific language governing permissions and
141754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * limitations under the License.
151754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato */
161754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
17c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin#ifndef ANDROID_UTIL_PROTOBUF_H
18c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin#define ANDROID_UTIL_PROTOBUF_H
191754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
201754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato#include <stdint.h>
21c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin
22c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinnamespace android {
23c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jinnamespace util {
2499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin
25974a9c28853d24ff94f000ae9f5c816d9538897bYi Jinconst int FIELD_ID_SHIFT = 3;
26974a9c28853d24ff94f000ae9f5c816d9538897bYi Jinconst uint8_t WIRE_TYPE_MASK = (1 << FIELD_ID_SHIFT) - 1;
27974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin
2899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinconst uint8_t WIRE_TYPE_VARINT = 0;
2999c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinconst uint8_t WIRE_TYPE_FIXED64 = 1;
3099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinconst uint8_t WIRE_TYPE_LENGTH_DELIMITED = 2;
3199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinconst uint8_t WIRE_TYPE_FIXED32 = 5;
3299c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin
3399c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin/**
3499c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin * Read the wire type from varint, it is the smallest 3 bits.
3599c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin */
3699c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinuint8_t read_wire_type(uint32_t varint);
3799c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin
3899c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin/**
39974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin * Read field id from varint, it is varint >> 3;
4099c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jin */
4199c248feb2d1f863b864bdfd1e3b37af17f18732Yi Jinuint32_t read_field_id(uint32_t varint);
421754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
431754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato/**
44974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin * Get the size of a varint.
45974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin */
46974a9c28853d24ff94f000ae9f5c816d9538897bYi Jinsize_t get_varint_size(uint64_t varint);
47974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin
48974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin/**
491754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato * Write a varint into the buffer. Return the next position to write at.
50974a9c28853d24ff94f000ae9f5c816d9538897bYi Jin * There must be 10 bytes in the buffer.
511754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato */
52974a9c28853d24ff94f000ae9f5c816d9538897bYi Jinuint8_t* write_raw_varint(uint8_t* buf, uint64_t val);
531754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
541754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato/**
550a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin * Write a protobuf WIRE_TYPE_LENGTH_DELIMITED header. Return the next position
560a3406fc4f8e9a8c8a9155fc7886a0496f692496Yi Jin * to write at. There must be 20 bytes in the buffer.
571754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato */
581754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onoratouint8_t* write_length_delimited_tag_header(uint8_t* buf, uint32_t fieldId, size_t size);
591754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
60c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin} // util
61c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin} // android
621754d744a7a34731ffc07af1bc3dbfcb06864ab0Joe Onorato
63c23fad2f9079f678eae15338f5e57e2a6bf7e391Yi Jin#endif  // ANDROID_UTIL_PROTOUBUF_H
64