Vanetza
Loading...
Searching...
No Matches
archives.cpp
1#include <vanetza/common/archives.hpp>
2
3namespace vanetza
4{
5
6InputArchive::InputArchive(InputStream& is) :
7 m_stream_buffer(is.rdbuf())
8{
9}
10
11InputArchive::InputArchive(StreamBuffer& buf) :
12 m_stream_buffer(&buf)
13{
14}
15
16void InputArchive::load_binary(unsigned char* data, std::size_t len)
17{
18 load_binary(reinterpret_cast<char*>(data), len);
19}
20
21void InputArchive::load_binary(char* data, std::size_t len)
22{
23 std::size_t read_bytes = m_stream_buffer->sgetn(data, len);
24 if (read_bytes != len) {
25 fail(ErrorCode::IncompleteData);
26 throw Exception("incomplete read");
27 }
28}
29
30char InputArchive::peek_byte()
31{
32 auto got = m_stream_buffer->sgetc();
33 if (got == StreamBuffer::traits_type::eof()) {
34 fail(ErrorCode::IncompleteData);
35 throw Exception("impossible peek at end of stream");
36 } else {
37 return StreamBuffer::traits_type::to_char_type(got);
38 }
39}
40
41bool InputArchive::is_good() const
42{
43 return m_error_code == ErrorCode::Ok;
44}
45
46InputArchive::ErrorCode InputArchive::error_code() const
47{
48 return m_error_code;
49}
50
51void InputArchive::fail(ErrorCode error_code)
52{
53 // do not overwrite prior error code except "ok"
54 if (m_error_code == ErrorCode::Ok) {
55 m_error_code = error_code;
56 }
57}
58
59std::size_t InputArchive::remaining_bytes()
60{
61 return m_stream_buffer->in_avail();
62}
63
64OutputArchive::OutputArchive(OutputStream& os) :
65 m_stream_buffer(os.rdbuf())
66{
67}
68
69OutputArchive::OutputArchive(StreamBuffer& buf) :
70 m_stream_buffer(&buf)
71{
72}
73
74void OutputArchive::save_binary(const unsigned char* data, std::size_t len)
75{
76 save_binary(reinterpret_cast<const char*>(data), len);
77}
78
79void OutputArchive::save_binary(const char* data, std::size_t len)
80{
81 std::size_t written_bytes = m_stream_buffer->sputn(data, len);
82 if (written_bytes != len) {
83 throw Exception("incomplete write");
84 }
85}
86
87} // namespace vanetza