incidentd can now handle multiple callers asking it for incident reports

Test: bit incident_test:* GtsIncidentManagerTestCases:*
Bug: 123543706
Change-Id: I9f671dd5d8b2ad139f952a23e575c2be16120459
diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp
index ff3fad6..ccbb83b 100644
--- a/libs/protoutil/src/ProtoOutputStream.cpp
+++ b/libs/protoutil/src/ProtoOutputStream.cpp
@@ -27,7 +27,7 @@
 namespace util {
 
 ProtoOutputStream::ProtoOutputStream()
-        :mBuffer(),
+        :mBuffer(new EncodedBuffer()),
          mCopyBegin(0),
          mCompact(false),
          mDepth(0),
@@ -44,7 +44,7 @@
 void
 ProtoOutputStream::clear()
 {
-    mBuffer.clear();
+    mBuffer->clear();
     mCopyBegin = 0;
     mCompact = false;
     mDepth = 0;
@@ -226,13 +226,13 @@
     }
 
     uint32_t id = (uint32_t)fieldId;
-    size_t prevPos = mBuffer.wp()->pos();
-    mBuffer.writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED);
-    size_t sizePos = mBuffer.wp()->pos();
+    size_t prevPos = mBuffer->wp()->pos();
+    mBuffer->writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED);
+    size_t sizePos = mBuffer->wp()->pos();
 
     mDepth++;
     mObjectId++;
-    mBuffer.writeRawFixed64(mExpectedObjectToken); // push previous token into stack.
+    mBuffer->writeRawFixed64(mExpectedObjectToken); // push previous token into stack.
 
     mExpectedObjectToken = makeToken(sizePos - prevPos,
         (bool)(fieldId & FIELD_COUNT_REPEATED), mDepth, mObjectId, sizePos);
@@ -258,26 +258,26 @@
 
     uint32_t sizePos = getSizePosFromToken(token);
     // number of bytes written in this start-end session.
-    int childRawSize = mBuffer.wp()->pos() - sizePos - 8;
+    int childRawSize = mBuffer->wp()->pos() - sizePos - 8;
 
     // retrieve the old token from stack.
-    mBuffer.ep()->rewind()->move(sizePos);
-    mExpectedObjectToken = mBuffer.readRawFixed64();
+    mBuffer->ep()->rewind()->move(sizePos);
+    mExpectedObjectToken = mBuffer->readRawFixed64();
 
     // If raw size is larger than 0, write the negative value here to indicate a compact is needed.
     if (childRawSize > 0) {
-        mBuffer.editRawFixed32(sizePos, -childRawSize);
-        mBuffer.editRawFixed32(sizePos+4, -1);
+        mBuffer->editRawFixed32(sizePos, -childRawSize);
+        mBuffer->editRawFixed32(sizePos+4, -1);
     } else {
         // reset wp which erase the header tag of the message when its size is 0.
-        mBuffer.wp()->rewind()->move(sizePos - getTagSizeFromToken(token));
+        mBuffer->wp()->rewind()->move(sizePos - getTagSizeFromToken(token));
     }
 }
 
 size_t
 ProtoOutputStream::bytesWritten()
 {
-    return mBuffer.size();
+    return mBuffer->size();
 }
 
 bool
@@ -288,26 +288,26 @@
         return false;
     }
     // record the size of the original buffer.
-    size_t rawBufferSize = mBuffer.size();
+    size_t rawBufferSize = mBuffer->size();
     if (rawBufferSize == 0) return true; // nothing to do if the buffer is empty;
 
     // reset edit pointer and recursively compute encoded size of messages.
-    mBuffer.ep()->rewind();
+    mBuffer->ep()->rewind();
     if (editEncodedSize(rawBufferSize) == 0) {
         ALOGE("Failed to editEncodedSize.");
         return false;
     }
 
     // reset both edit pointer and write pointer, and compact recursively.
-    mBuffer.ep()->rewind();
-    mBuffer.wp()->rewind();
+    mBuffer->ep()->rewind();
+    mBuffer->wp()->rewind();
     if (!compactSize(rawBufferSize)) {
         ALOGE("Failed to compactSize.");
         return false;
     }
     // copy the reset to the buffer.
     if (mCopyBegin < rawBufferSize) {
-        mBuffer.copy(mCopyBegin, rawBufferSize - mCopyBegin);
+        mBuffer->copy(mCopyBegin, rawBufferSize - mCopyBegin);
     }
 
     // mark true means it is not legal to write to this ProtoOutputStream anymore
@@ -322,34 +322,34 @@
 size_t
 ProtoOutputStream::editEncodedSize(size_t rawSize)
 {
-    size_t objectStart = mBuffer.ep()->pos();
+    size_t objectStart = mBuffer->ep()->pos();
     size_t objectEnd = objectStart + rawSize;
     size_t encodedSize = 0;
     int childRawSize, childEncodedSize;
     size_t childEncodedSizePos;
 
-    while (mBuffer.ep()->pos() < objectEnd) {
-        uint32_t tag = (uint32_t)mBuffer.readRawVarint();
+    while (mBuffer->ep()->pos() < objectEnd) {
+        uint32_t tag = (uint32_t)mBuffer->readRawVarint();
         encodedSize += get_varint_size(tag);
         switch (read_wire_type(tag)) {
             case WIRE_TYPE_VARINT:
                 do {
                     encodedSize++;
-                } while ((mBuffer.readRawByte() & 0x80) != 0);
+                } while ((mBuffer->readRawByte() & 0x80) != 0);
                 break;
             case WIRE_TYPE_FIXED64:
                 encodedSize += 8;
-                mBuffer.ep()->move(8);
+                mBuffer->ep()->move(8);
                 break;
             case WIRE_TYPE_LENGTH_DELIMITED:
-                childRawSize = (int)mBuffer.readRawFixed32();
-                childEncodedSizePos = mBuffer.ep()->pos();
-                childEncodedSize = (int)mBuffer.readRawFixed32();
+                childRawSize = (int)mBuffer->readRawFixed32();
+                childEncodedSizePos = mBuffer->ep()->pos();
+                childEncodedSize = (int)mBuffer->readRawFixed32();
                 if (childRawSize >= 0 && childRawSize == childEncodedSize) {
-                    mBuffer.ep()->move(childRawSize);
+                    mBuffer->ep()->move(childRawSize);
                 } else if (childRawSize < 0 && childEncodedSize == -1){
                     childEncodedSize = editEncodedSize(-childRawSize);
-                    mBuffer.editRawFixed32(childEncodedSizePos, childEncodedSize);
+                    mBuffer->editRawFixed32(childEncodedSizePos, childEncodedSize);
                 } else {
                     ALOGE("Bad raw or encoded values: raw=%d, encoded=%d at %zu",
                             childRawSize, childEncodedSize, childEncodedSizePos);
@@ -359,7 +359,7 @@
                 break;
             case WIRE_TYPE_FIXED32:
                 encodedSize += 4;
-                mBuffer.ep()->move(4);
+                mBuffer->ep()->move(4);
                 break;
             default:
                 ALOGE("Unexpected wire type %d in editEncodedSize at [%zu, %zu]",
@@ -378,30 +378,30 @@
 bool
 ProtoOutputStream::compactSize(size_t rawSize)
 {
-    size_t objectStart = mBuffer.ep()->pos();
+    size_t objectStart = mBuffer->ep()->pos();
     size_t objectEnd = objectStart + rawSize;
     int childRawSize, childEncodedSize;
 
-    while (mBuffer.ep()->pos() < objectEnd) {
-        uint32_t tag = (uint32_t)mBuffer.readRawVarint();
+    while (mBuffer->ep()->pos() < objectEnd) {
+        uint32_t tag = (uint32_t)mBuffer->readRawVarint();
         switch (read_wire_type(tag)) {
             case WIRE_TYPE_VARINT:
-                while ((mBuffer.readRawByte() & 0x80) != 0) {}
+                while ((mBuffer->readRawByte() & 0x80) != 0) {}
                 break;
             case WIRE_TYPE_FIXED64:
-                mBuffer.ep()->move(8);
+                mBuffer->ep()->move(8);
                 break;
             case WIRE_TYPE_LENGTH_DELIMITED:
-                mBuffer.copy(mCopyBegin, mBuffer.ep()->pos() - mCopyBegin);
+                mBuffer->copy(mCopyBegin, mBuffer->ep()->pos() - mCopyBegin);
 
-                childRawSize = (int)mBuffer.readRawFixed32();
-                childEncodedSize = (int)mBuffer.readRawFixed32();
-                mCopyBegin = mBuffer.ep()->pos();
+                childRawSize = (int)mBuffer->readRawFixed32();
+                childEncodedSize = (int)mBuffer->readRawFixed32();
+                mCopyBegin = mBuffer->ep()->pos();
 
                 // write encoded size to buffer.
-                mBuffer.writeRawVarint32(childEncodedSize);
+                mBuffer->writeRawVarint32(childEncodedSize);
                 if (childRawSize >= 0 && childRawSize == childEncodedSize) {
-                    mBuffer.ep()->move(childEncodedSize);
+                    mBuffer->ep()->move(childEncodedSize);
                 } else if (childRawSize < 0){
                     if (!compactSize(-childRawSize)) return false;
                 } else {
@@ -411,7 +411,7 @@
                 }
                 break;
             case WIRE_TYPE_FIXED32:
-                mBuffer.ep()->move(4);
+                mBuffer->ep()->move(4);
                 break;
             default:
                 ALOGE("Unexpected wire type %d in compactSize at [%zu, %zu]",
@@ -429,7 +429,7 @@
         ALOGE("compact failed, the ProtoOutputStream data is corrupted!");
         return 0;
     }
-    return mBuffer.size();
+    return mBuffer->size();
 }
 
 bool
@@ -438,43 +438,45 @@
     if (fd < 0) return false;
     if (!compact()) return false;
 
-    EncodedBuffer::iterator it = mBuffer.begin();
-    while (it.readBuffer() != NULL) {
-        if (!android::base::WriteFully(fd, it.readBuffer(), it.currentToRead())) return false;
-        it.rp()->move(it.currentToRead());
+    sp<ProtoReader> reader = mBuffer->read();
+    while (reader->readBuffer() != NULL) {
+        if (!android::base::WriteFully(fd, reader->readBuffer(), reader->currentToRead())) {
+            return false;
+        }
+        reader->move(reader->currentToRead());
     }
     return true;
 }
 
-EncodedBuffer::iterator
+sp<ProtoReader>
 ProtoOutputStream::data()
 {
     if (!compact()) {
         ALOGE("compact failed, the ProtoOutputStream data is corrupted!");
-        mBuffer.clear();
+        mBuffer->clear();
     }
-    return mBuffer.begin();
+    return mBuffer->read();
 }
 
 void
 ProtoOutputStream::writeRawVarint(uint64_t varint)
 {
-    mBuffer.writeRawVarint64(varint);
+    mBuffer->writeRawVarint64(varint);
 }
 
 void
 ProtoOutputStream::writeLengthDelimitedHeader(uint32_t id, size_t size)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED);
+    mBuffer->writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED);
     // reserves 64 bits for length delimited fields, if first field is negative, compact it.
-    mBuffer.writeRawFixed32(size);
-    mBuffer.writeRawFixed32(size);
+    mBuffer->writeRawFixed32(size);
+    mBuffer->writeRawFixed32(size);
 }
 
 void
 ProtoOutputStream::writeRawByte(uint8_t byte)
 {
-    mBuffer.writeRawByte(byte);
+    mBuffer->writeRawByte(byte);
 }
 
 
@@ -494,99 +496,99 @@
 inline void
 ProtoOutputStream::writeDoubleImpl(uint32_t id, double val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_FIXED64);
-    mBuffer.writeRawFixed64(bit_cast<double, uint64_t>(val));
+    mBuffer->writeHeader(id, WIRE_TYPE_FIXED64);
+    mBuffer->writeRawFixed64(bit_cast<double, uint64_t>(val));
 }
 
 inline void
 ProtoOutputStream::writeFloatImpl(uint32_t id, float val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_FIXED32);
-    mBuffer.writeRawFixed32(bit_cast<float, uint32_t>(val));
+    mBuffer->writeHeader(id, WIRE_TYPE_FIXED32);
+    mBuffer->writeRawFixed32(bit_cast<float, uint32_t>(val));
 }
 
 inline void
 ProtoOutputStream::writeInt64Impl(uint32_t id, int64_t val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
-    mBuffer.writeRawVarint64(val);
+    mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+    mBuffer->writeRawVarint64(val);
 }
 
 inline void
 ProtoOutputStream::writeInt32Impl(uint32_t id, int32_t val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
-    mBuffer.writeRawVarint32(val);
+    mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+    mBuffer->writeRawVarint32(val);
 }
 
 inline void
 ProtoOutputStream::writeUint64Impl(uint32_t id, uint64_t val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
-    mBuffer.writeRawVarint64(val);
+    mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+    mBuffer->writeRawVarint64(val);
 }
 
 inline void
 ProtoOutputStream::writeUint32Impl(uint32_t id, uint32_t val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
-    mBuffer.writeRawVarint32(val);
+    mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+    mBuffer->writeRawVarint32(val);
 }
 
 inline void
 ProtoOutputStream::writeFixed64Impl(uint32_t id, uint64_t val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_FIXED64);
-    mBuffer.writeRawFixed64(val);
+    mBuffer->writeHeader(id, WIRE_TYPE_FIXED64);
+    mBuffer->writeRawFixed64(val);
 }
 
 inline void
 ProtoOutputStream::writeFixed32Impl(uint32_t id, uint32_t val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_FIXED32);
-    mBuffer.writeRawFixed32(val);
+    mBuffer->writeHeader(id, WIRE_TYPE_FIXED32);
+    mBuffer->writeRawFixed32(val);
 }
 
 inline void
 ProtoOutputStream::writeSFixed64Impl(uint32_t id, int64_t val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_FIXED64);
-    mBuffer.writeRawFixed64(val);
+    mBuffer->writeHeader(id, WIRE_TYPE_FIXED64);
+    mBuffer->writeRawFixed64(val);
 }
 
 inline void
 ProtoOutputStream::writeSFixed32Impl(uint32_t id, int32_t val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_FIXED32);
-    mBuffer.writeRawFixed32(val);
+    mBuffer->writeHeader(id, WIRE_TYPE_FIXED32);
+    mBuffer->writeRawFixed32(val);
 }
 
 inline void
 ProtoOutputStream::writeZigzagInt64Impl(uint32_t id, int64_t val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
-    mBuffer.writeRawVarint64((val << 1) ^ (val >> 63));
+    mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+    mBuffer->writeRawVarint64((val << 1) ^ (val >> 63));
 }
 
 inline void
 ProtoOutputStream::writeZigzagInt32Impl(uint32_t id, int32_t val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
-    mBuffer.writeRawVarint32((val << 1) ^ (val >> 31));
+    mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+    mBuffer->writeRawVarint32((val << 1) ^ (val >> 31));
 }
 
 inline void
 ProtoOutputStream::writeEnumImpl(uint32_t id, int val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
-    mBuffer.writeRawVarint32((uint32_t) val);
+    mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+    mBuffer->writeRawVarint32((uint32_t) val);
 }
 
 inline void
 ProtoOutputStream::writeBoolImpl(uint32_t id, bool val)
 {
-    mBuffer.writeHeader(id, WIRE_TYPE_VARINT);
-    mBuffer.writeRawVarint32(val ? 1 : 0);
+    mBuffer->writeHeader(id, WIRE_TYPE_VARINT);
+    mBuffer->writeRawVarint32(val ? 1 : 0);
 }
 
 inline void
@@ -595,7 +597,7 @@
     if (val == NULL) return;
     writeLengthDelimitedHeader(id, size);
     for (size_t i=0; i<size; i++) {
-        mBuffer.writeRawByte((uint8_t)val[i]);
+        mBuffer->writeRawByte((uint8_t)val[i]);
     }
 }
 
@@ -605,7 +607,7 @@
     if (val == NULL) return;
     writeLengthDelimitedHeader(id, size);
     for (size_t i=0; i<size; i++) {
-        mBuffer.writeRawByte(val[i]);
+        mBuffer->writeRawByte(val[i]);
     }
 }