1 /* LBS: An LFS-inspired filesystem backup system
2 * Copyright (C) 2006 Michael Vrable
4 * Backup data is stored in a collection of objects, which are grouped together
5 * into segments for storage purposes. This file provides interfaces for
6 * reading and writing objects and segments. */
14 OutputStream::OutputStream()
19 void OutputStream::write(const void *data, size_t len)
21 write_internal(data, len);
25 void OutputStream::write_u8(uint8_t val)
30 void OutputStream::write_u16(uint16_t val)
35 buf[1] = (val >> 8) & 0xff;
39 void OutputStream::write_u32(uint32_t val)
44 buf[1] = (val >> 8) & 0xff;
45 buf[2] = (val >> 16) & 0xff;
46 buf[3] = (val >> 24) & 0xff;
50 void OutputStream::write_u64(uint64_t val)
55 buf[1] = (val >> 8) & 0xff;
56 buf[2] = (val >> 16) & 0xff;
57 buf[3] = (val >> 24) & 0xff;
58 buf[4] = (val >> 32) & 0xff;
59 buf[5] = (val >> 40) & 0xff;
60 buf[6] = (val >> 48) & 0xff;
61 buf[7] = (val >> 56) & 0xff;
65 /* Writes an integer to an output stream using a variable-sized representation:
66 * seven bits are written at a time (little-endian), and the eigth bit of each
67 * byte is set if more data follows. */
68 void OutputStream::write_varint(uint64_t val)
71 uint8_t remainder = (val & 0x7f);
79 /* Write an arbitrary string by first writing out the length, followed by the
81 void OutputStream::write_string(const string &s)
83 size_t len = s.length();
88 void OutputStream::write_dictionary(const dictionary &d)
90 size_t size = d.size();
95 for (dictionary::const_iterator i = d.begin(); i != d.end(); ++i) {
96 write_string(i->first);
97 write_string(i->second);
101 assert(written == size);
104 StringOutputStream::StringOutputStream()
105 : buf(std::ios_base::out)
109 void StringOutputStream::write_internal(const void *data, size_t len)
111 buf.write((const char *)data, len);
113 throw IOException("error writing to StringOutputStream");
116 FileOutputStream::FileOutputStream(FILE *file)
121 FileOutputStream::~FileOutputStream()
126 void FileOutputStream::write_internal(const void *data, size_t len)
130 res = fwrite(data, 1, len, f);
132 throw IOException("write error");
136 /* Utility functions, for encoding data types to strings. */
137 string encode_u16(uint16_t val)
139 StringOutputStream s;
144 string encode_u32(uint32_t val)
146 StringOutputStream s;
151 string encode_u64(uint64_t val)
153 StringOutputStream s;