Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 018f5a3c authored by Yi Jin's avatar Yi Jin Committed by android-build-merger
Browse files

Merge "Correctly use int types and fix uint64_t print." into pi-dev

am: 53f60f60

Change-Id: I34562b9ac0ee2a014b744ff786eaa578ed2061d8
parents 2ef863e9 53f60f60
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -137,8 +137,8 @@ private:
    EncodedBuffer mBuffer;
    size_t mCopyBegin;
    bool mCompact;
    int mDepth;
    int mObjectId;
    uint32_t mDepth;
    uint32_t mObjectId;
    uint64_t mExpectedObjectToken;

    inline void writeDoubleImpl(uint32_t id, double val);
+34 −26
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
 */
#define LOG_TAG "libprotoutil"

#include <inttypes.h>

#include <android/util/protobuf.h>
#include <android/util/ProtoOutputStream.h>
#include <cutils/log.h>
@@ -28,7 +30,7 @@ ProtoOutputStream::ProtoOutputStream()
         mCompact(false),
         mDepth(0),
         mObjectId(0),
         mExpectedObjectToken(0ULL)
         mExpectedObjectToken(UINT64_C(-1))
{
}

@@ -45,7 +47,7 @@ ProtoOutputStream::clear()
    mCompact = false;
    mDepth = 0;
    mObjectId = 0;
    mExpectedObjectToken = 0ULL;
    mExpectedObjectToken = UINT64_C(-1);
}

bool
@@ -215,48 +217,48 @@ ProtoOutputStream::write(uint64_t fieldId, const char* val, size_t size)
 *                - 3 bits, max value 7, max value needed 5
 *  Bit  60    - true if the object is repeated
 *  Bits 59-51 - depth (For error checking)
 *                - 9 bits, max value 512, when checking, value is masked (if we really
 *                  are more than 512 levels deep)
 *                - 9 bits, max value 511, when checking, value is masked (if we really
 *                  are more than 511 levels deep)
 *  Bits 32-50 - objectId (For error checking)
 *                - 19 bits, max value 524,288. that's a lot of objects. IDs will wrap
 *                - 19 bits, max value 524,287. that's a lot of objects. IDs will wrap
 *                  because of the overflow, and only the tokens are compared.
 *  Bits  0-31 - offset of the first size field in the buffer.
 */
uint64_t
makeToken(int tagSize, bool repeated, int depth, int objectId, int sizePos) {
    return ((0x07L & (uint64_t)tagSize) << 61)
            | (repeated ? (1LL << 60) : 0)
            | (0x01ffL & (uint64_t)depth) << 51
            | (0x07ffffL & (uint64_t)objectId) << 32
            | (0x0ffffffffL & (uint64_t)sizePos);
static uint64_t
makeToken(uint32_t tagSize, bool repeated, uint32_t depth, uint32_t objectId, size_t sizePos) {
    return ((UINT64_C(0x07) & (uint64_t)tagSize) << 61)
            | (repeated ? (UINT64_C(1) << 60) : 0)
            | (UINT64_C(0x01ff) & (uint64_t)depth) << 51
            | (UINT64_C(0x07ffff) & (uint64_t)objectId) << 32
            | (UINT64_C(0x0ffffffff) & (uint64_t)sizePos);
}

/**
 * Get the encoded tag size from the token.
 */
static int getTagSizeFromToken(uint64_t token) {
    return (int)(0x7 & (token >> 61));
static uint32_t getTagSizeFromToken(uint64_t token) {
    return 0x7 & (token >> 61);
}

/**
 * Get the nesting depth of startObject calls from the token.
 */
static int getDepthFromToken(uint64_t token) {
    return (int)(0x01ff & (token >> 51));
static uint32_t getDepthFromToken(uint64_t token) {
    return 0x01ff & (token >> 51);
}

/**
 * Get the location of the childRawSize (the first 32 bit size field) in this object.
 */
static int getSizePosFromToken(uint64_t token) {
    return (int)token;
static uint32_t getSizePosFromToken(uint64_t token) {
    return (uint32_t)token;
}

uint64_t
ProtoOutputStream::start(uint64_t fieldId)
{
    if ((fieldId & FIELD_TYPE_MASK) != FIELD_TYPE_MESSAGE) {
        ALOGE("Can't call start for non-message type field: 0x%llx", (long long)fieldId);
        ALOGE("Can't call start for non-message type field: 0x%" PRIx64, fieldId);
        return 0;
    }

@@ -278,18 +280,18 @@ void
ProtoOutputStream::end(uint64_t token)
{
    if (token != mExpectedObjectToken) {
        ALOGE("Unexpected token: 0x%llx, should be 0x%llx", (long long)token, (long long)mExpectedObjectToken);
        ALOGE("Unexpected token: 0x%" PRIx64 ", should be 0x%" PRIx64, token, mExpectedObjectToken);
        return;
    }

    int depth = getDepthFromToken(token);
    uint32_t depth = getDepthFromToken(token);
    if (depth != (mDepth & 0x01ff)) {
        ALOGE("Unexpected depth: %d, should be %d", depth, mDepth);
        ALOGE("Unexpected depth: %" PRIu32 ", should be %" PRIu32, depth, mDepth);
        return;
    }
    mDepth--;

    int sizePos = getSizePosFromToken(token);
    uint32_t sizePos = getSizePosFromToken(token);
    // number of bytes written in this start-end session.
    int childRawSize = mBuffer.wp()->pos() - sizePos - 8;

@@ -317,7 +319,7 @@ bool
ProtoOutputStream::compact() {
    if (mCompact) return true;
    if (mDepth != 0) {
        ALOGE("Can't compact when depth(%d) is not zero. Missing calls to end.", mDepth);
        ALOGE("Can't compact when depth(%" PRIu32 ") is not zero. Missing calls to end.", mDepth);
        return false;
    }
    // record the size of the original buffer.
@@ -458,7 +460,10 @@ ProtoOutputStream::compactSize(size_t rawSize)
size_t
ProtoOutputStream::size()
{
    compact();
    if (!compact()) {
        ALOGE("compact failed, the ProtoOutputStream data is corrupted!");
        // TODO: handle this error
    }
    return mBuffer.size();
}

@@ -492,7 +497,10 @@ ProtoOutputStream::flush(int fd)
EncodedBuffer::iterator
ProtoOutputStream::data()
{
    compact();
    if (!compact()) {
        ALOGE("compact failed, the ProtoOutputStream data is corrupted!");
        // TODO: handle this error
    }
    return mBuffer.begin();
}