-const uint8_t *ChecksumOutputStream::finish_and_checksum()
-{
- return csum.checksum();
-}
-
-/* Utility functions, for encoding data types to strings. */
-string encode_u16(uint16_t val)
-{
- StringOutputStream s;
- s.write_u16(val);
- return s.contents();
-}
-
-string encode_u32(uint32_t val)
-{
- StringOutputStream s;
- s.write_u32(val);
- return s.contents();
-}
-
-string encode_u64(uint64_t val)
-{
- StringOutputStream s;
- s.write_u64(val);
- return s.contents();
-}
-
-string encode_objref(const struct uuid &segment, uint32_t object)
-{
- StringOutputStream s;
- s.write_uuid(segment);
- s.write_u32(object);
- return s.contents();
-}
-
-SegmentWriter::SegmentWriter(OutputStream *output, struct uuid u)
- : raw_out(output),
- id(u),
- object_stream(NULL)
-{
- /* All output data will be checksummed except the very last few bytes,
- * which are the checksum itself. */
- out = new ChecksumOutputStream(*raw_out);
-
- /* Write out the segment header first. */
- static const char signature[] = "LBSSEG0\n";
- out->write(signature, strlen(signature));
- out->write_uuid(id);
-}
-
-SegmentWriter::~SegmentWriter()
-{
- if (object_stream)
- finish_object();
-
- // Write out the object table which gives the sizes and locations of all
- // objects, and then add the trailing signature, which indicates the end of
- // the segment and gives the offset of the object table.
- int64_t index_offset = out->get_pos();
-
- for (object_table::const_iterator i = objects.begin();
- i != objects.end(); ++i) {
- out->write_s64(i->first);
- out->write_s64(i->second);