summaryrefslogtreecommitdiff
path: root/libs/protoutil/src/ProtoOutputStream.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/protoutil/src/ProtoOutputStream.cpp')
-rw-r--r--libs/protoutil/src/ProtoOutputStream.cpp48
1 files changed, 40 insertions, 8 deletions
diff --git a/libs/protoutil/src/ProtoOutputStream.cpp b/libs/protoutil/src/ProtoOutputStream.cpp
index e9ca0dcb1093..15144ac2eb28 100644
--- a/libs/protoutil/src/ProtoOutputStream.cpp
+++ b/libs/protoutil/src/ProtoOutputStream.cpp
@@ -70,9 +70,8 @@ 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(int fd)
+ProtoOutputStream::ProtoOutputStream()
:mBuffer(),
- mFd(fd),
mCopyBegin(0),
mCompact(false),
mDepth(0),
@@ -483,6 +482,13 @@ ProtoOutputStream::compactSize(size_t rawSize)
return true;
}
+size_t
+ProtoOutputStream::size()
+{
+ compact();
+ return mBuffer.size();
+}
+
static bool write_all(int fd, uint8_t const* buf, size_t size)
{
while (size > 0) {
@@ -497,19 +503,47 @@ static bool write_all(int fd, uint8_t const* buf, size_t size)
}
bool
-ProtoOutputStream::flush()
+ProtoOutputStream::flush(int fd)
{
- if (mFd < 0) return false;
+ if (fd < 0) return false;
if (!compact()) return false;
EncodedBuffer::iterator it = mBuffer.begin();
while (it.readBuffer() != NULL) {
- if (!write_all(mFd, it.readBuffer(), it.currentToRead())) return false;
+ if (!write_all(fd, it.readBuffer(), it.currentToRead())) return false;
it.rp()->move(it.currentToRead());
}
return true;
}
+EncodedBuffer::iterator
+ProtoOutputStream::data()
+{
+ compact();
+ return mBuffer.begin();
+}
+
+void
+ProtoOutputStream::writeRawVarint(uint64_t varint)
+{
+ mBuffer.writeRawVarint64(varint);
+}
+
+void
+ProtoOutputStream::writeLengthDelimitedHeader(uint32_t id, size_t size)
+{
+ 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);
+}
+
+void
+ProtoOutputStream::writeRawByte(uint8_t byte)
+{
+ mBuffer.writeRawByte(byte);
+}
+
// =========================================================================
// Private functions
@@ -639,9 +673,7 @@ inline void
ProtoOutputStream::writeUtf8StringImpl(uint32_t id, const char* val, size_t size)
{
if (val == NULL || size == 0) return;
- mBuffer.writeHeader(id, WIRE_TYPE_LENGTH_DELIMITED);
- mBuffer.writeRawFixed32(size);
- mBuffer.writeRawFixed32(size);
+ writeLengthDelimitedHeader(id, size);
for (size_t i=0; i<size; i++) {
mBuffer.writeRawByte((uint8_t)val[i]);
}