Botan 3.7.1
Crypto and TLS for C&
out_buf.cpp
Go to the documentation of this file.
1/*
2* Pipe Output Buffer
3* (C) 1999-2007,2011 Jack Lloyd
4* 2012 Markus Wanner
5*
6* Botan is released under the Simplified BSD License (see license.txt)
7*/
8
9#include <botan/internal/out_buf.h>
10
11#include <botan/assert.h>
12#include <botan/internal/secqueue.h>
13
14namespace Botan {
15
16/*
17* Read data from a message
18*/
19size_t Output_Buffers::read(uint8_t output[], size_t length, Pipe::message_id msg) {
20 SecureQueue* q = get(msg);
21 if(q) {
22 return q->read(output, length);
23 }
24 return 0;
25}
26
27/*
28* Peek at data in a message
29*/
30size_t Output_Buffers::peek(uint8_t output[], size_t length, size_t stream_offset, Pipe::message_id msg) const {
31 SecureQueue* q = get(msg);
32 if(q) {
33 return q->peek(output, length, stream_offset);
34 }
35 return 0;
36}
37
38/*
39* Check available bytes in a message
40*/
42 SecureQueue* q = get(msg);
43 if(q) {
44 return q->size();
45 }
46 return 0;
47}
48
49/*
50* Return the total bytes of a message that have already been read.
51*/
53 SecureQueue* q = get(msg);
54 if(q) {
55 return q->get_bytes_read();
56 }
57 return 0;
58}
59
60/*
61* Add a new output queue
62*/
64 BOTAN_ASSERT(queue, "queue was provided");
65
66 BOTAN_ASSERT(m_buffers.size() < m_buffers.max_size(), "Room was available in container");
67
68 m_buffers.push_back(std::unique_ptr<SecureQueue>(queue));
69}
70
71/*
72* Retire old output queues
73*/
75 for(auto& buf : m_buffers) {
76 if(buf && buf->empty()) {
77 buf.reset();
78 }
79 }
80
81 while(!m_buffers.empty() && !m_buffers[0]) {
82 m_buffers.pop_front();
83 m_offset = m_offset + Pipe::message_id(1);
84 }
85}
86
87/*
88* Get a particular output queue
89*/
90SecureQueue* Output_Buffers::get(Pipe::message_id msg) const {
91 if(msg < m_offset) {
92 return nullptr;
93 }
94
95 BOTAN_ASSERT(msg < message_count(), "Message number is in range");
96
97 return m_buffers[msg - m_offset].get();
98}
99
100/*
101* Return the total number of messages
102*/
104 return (m_offset + m_buffers.size());
105}
106
107/*
108* Output_Buffers Constructor
109*/
111 m_offset = 0;
112}
113
114} // namespace Botan
#define BOTAN_ASSERT(expr, assertion_made)
Definition assert.h:50
Pipe::message_id message_count() const
Definition out_buf.cpp:103
size_t get_bytes_read(Pipe::message_id) const
Definition out_buf.cpp:52
size_t remaining(Pipe::message_id) const
Definition out_buf.cpp:41
size_t peek(uint8_t[], size_t, size_t, Pipe::message_id) const
Definition out_buf.cpp:30
void add(SecureQueue *)
Definition out_buf.cpp:63
size_t read(uint8_t[], size_t, Pipe::message_id)
Definition out_buf.cpp:19
size_t message_id
Definition pipe.h:34
size_t read(uint8_t[], size_t) override
Definition secqueue.cpp:146
size_t get_bytes_read() const override
Definition secqueue.cpp:193
size_t peek(uint8_t[], size_t, size_t=0) const override
Definition secqueue.cpp:166
size_t size() const
Definition secqueue.cpp:200