Botan 2.13.0 Crypto and TLS for C++11

- Main Page
- Namespaces
- Classes
- Files

- File List
- File Members

pipe_rw.cpp
Go to the documentation of this file.
1 /*
2 * Pipe Reading/Writing
3 * (C) 1999-2007 Jack Lloyd
4 * 2012 Markus Wanner
5 *
6 * Botan is released under the Simplified BSD License (see license.txt)
7 */
8
9 #include <botan/pipe.h>
10 #include <botan/filter.h>
11 #include <botan/internal/out_buf.h>
12
13 namespace Botan {
14
15 /*
16 * Look up the canonical ID for a queue
17 */
18 Pipe::message_id Pipe::get_message_no(const std::string& func_name,
19 message_id msg) const
20 {
21 if(msg == DEFAULT_MESSAGE)
22 msg = default_msg();
23 else if(msg == LAST_MESSAGE)
24 msg = message_count() - 1;
25
26 if(msg >= message_count())
27 throw Invalid_Message_Number(func_name, msg);
28
29 return msg;
30 }
31
32 /*
33 * Write into a Pipe
34 */
35 void Pipe::write(const uint8_t input[], size_t length)
36 {
37 if(!m_inside_msg)
38 throw Invalid_State("Cannot write to a Pipe while it is not processing");
39 m_pipe->write(input, length);
40 }
41
42 /*
43 * Write a string into a Pipe
44 */
45 void Pipe::write(const std::string& str)
46 {
47 write(cast_char_ptr_to_uint8(str.data()), str.size());
48 }
49
50 /*
51 * Write a single byte into a Pipe
52 */
53 void Pipe::write(uint8_t input)
54 {
55 write(&input, 1);
56 }
57
58 /*
59 * Write the contents of a DataSource into a Pipe
60 */
61 void Pipe::write(DataSource& source)
62 {
63 secure_vector<uint8_t> buffer(BOTAN_DEFAULT_BUFFER_SIZE);
64 while(!source.end_of_data())
65 {
66 size_t got = source.read(buffer.data(), buffer.size());
67 write(buffer.data(), got);
68 }
69 }
70
71 /*
72 * Read some data from the pipe
73 */
74 size_t Pipe::read(uint8_t output[], size_t length, message_id msg)
75 {
76 return m_outputs->read(output, length, get_message_no("read", msg));
77 }
78
79 /*
80 * Read some data from the pipe
81 */
82 size_t Pipe::read(uint8_t output[], size_t length)
83 {
84 return read(output, length, DEFAULT_MESSAGE);
85 }
86
87 /*
88 * Read a single byte from the pipe
89 */
90 size_t Pipe::read(uint8_t& out, message_id msg)
91 {
92 return read(&out, 1, msg);
93 }
94
95 /*
96 * Return all data in the pipe
97 */
98 secure_vector<uint8_t> Pipe::read_all(message_id msg)
99 {
100 msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg());
101 secure_vector<uint8_t> buffer(remaining(msg));
102 size_t got = read(buffer.data(), buffer.size(), msg);
103 buffer.resize(got);
104 return buffer;
105 }
106
107 /*
108 * Return all data in the pipe as a string
109 */
110 std::string Pipe::read_all_as_string(message_id msg)
111 {
112 msg = ((msg != DEFAULT_MESSAGE) ? msg : default_msg());
113 secure_vector<uint8_t> buffer(BOTAN_DEFAULT_BUFFER_SIZE);
114 std::string str;
115 str.reserve(remaining(msg));
116
117 while(true)
118 {
119 size_t got = read(buffer.data(), buffer.size(), msg);
120 if(got == 0)
121 break;
122 str.append(cast_uint8_ptr_to_char(buffer.data()), got);
123 }
124
125 return str;
126 }
127
128 /*
129 * Find out how many bytes are ready to read
130 */
131 size_t Pipe::remaining(message_id msg) const
132 {
133 return m_outputs->remaining(get_message_no("remaining", msg));
134 }
135
136 /*
137 * Peek at some data in the pipe
138 */
139 size_t Pipe::peek(uint8_t output[], size_t length,
140 size_t offset, message_id msg) const
141 {
142 return m_outputs->peek(output, length, offset, get_message_no("peek", msg));
143 }
144
145 /*
146 * Peek at some data in the pipe
147 */
148 size_t Pipe::peek(uint8_t output[], size_t length, size_t offset) const
149 {
150 return peek(output, length, offset, DEFAULT_MESSAGE);
151 }
152
153 /*
154 * Peek at a byte in the pipe
155 */
156 size_t Pipe::peek(uint8_t& out, size_t offset, message_id msg) const
157 {
158 return peek(&out, 1, offset, msg);
159 }
160
161 size_t Pipe::get_bytes_read() const
162 {
163 return m_outputs->get_bytes_read(default_msg());
164 }
165
166 size_t Pipe::get_bytes_read(message_id msg) const
167 {
168 return m_outputs->get_bytes_read(msg);
169 }
170
171 bool Pipe::check_available(size_t n)
172 {
173 return (n <= remaining(default_msg()));
174 }
175
176 bool Pipe::check_available_msg(size_t n, message_id msg)
177 {
178 return (n <= remaining(msg));
179 }
180
181 }
Botan::Pipe::remaining
size_t remaining(message_id msg=DEFAULT_MESSAGE) const BOTAN_WARN_UNUSED_RESULT
Definition: pipe_rw.cpp:131
Botan::Pipe::get_bytes_read
size_t get_bytes_read() const override
Definition: pipe_rw.cpp:161
Botan::Pipe::message_id
size_t message_id
Definition: pipe.h:35
Botan::Filter::write
virtual void write(const uint8_t input[], size_t length)=0
Botan::cast_char_ptr_to_uint8
const uint8_t * cast_char_ptr_to_uint8(const char *s)
Definition: mem_ops.h:189
Botan::Pipe::check_available
bool check_available(size_t n) override
Definition: pipe_rw.cpp:171
Botan::Pipe::read
size_t read(uint8_t output[], size_t length) override BOTAN_WARN_UNUSED_RESULT
Definition: pipe_rw.cpp:82
Botan::Pipe::read_all
secure_vector< uint8_t > read_all(message_id msg=DEFAULT_MESSAGE) BOTAN_WARN_UNUSED_RESULT
Definition: pipe_rw.cpp:98
Botan::Pipe::peek
size_t peek(uint8_t output[], size_t length, size_t offset) const override BOTAN_WARN_UNUSED_RESULT
Definition: pipe_rw.cpp:148
Botan::DataSource
Definition: data_src.h:21
Botan::Pipe::DEFAULT_MESSAGE
static const message_id DEFAULT_MESSAGE
Definition: pipe.h:62
Botan::Pipe::check_available_msg
bool check_available_msg(size_t n, message_id msg)
Definition: pipe_rw.cpp:176
Botan::secure_vector
std::vector< T, secure_allocator< T >> secure_vector
Definition: secmem.h:65
Botan::Pipe::LAST_MESSAGE
static const message_id LAST_MESSAGE
Definition: pipe.h:57
Botan::DataSource::end_of_data
virtual bool end_of_data() const =0
Botan::DataSource::read
virtual size_t read(uint8_t out[], size_t length) BOTAN_WARN_UNUSED_RESULT=0
Botan
Definition: alg_id.cpp:13
Botan::Pipe::read_all_as_string
std::string read_all_as_string(message_id msg=DEFAULT_MESSAGE) BOTAN_WARN_UNUSED_RESULT
Definition: pipe_rw.cpp:110
Botan::Invalid_State
Definition: exceptn.h:215
Botan::Pipe::default_msg
size_t default_msg() const
Definition: pipe.h:239
Botan::cast_uint8_ptr_to_char
const char * cast_uint8_ptr_to_char(const uint8_t *b)
Definition: mem_ops.h:194
Botan::Pipe::message_count
message_id message_count() const
Definition: pipe.cpp:297
Botan::Pipe::write
void write(const uint8_t in[], size_t length)
Definition: pipe_rw.cpp:35