8#include <botan/filter.h>
10#include <botan/assert.h>
11#include <botan/exceptn.h>
27 send(in.data(), length);
38 bool nothing_attached =
true;
39 for(
size_t j = 0; j != total_ports(); ++j) {
41 if(!m_write_queue.empty()) {
42 m_next[j]->write(m_write_queue.data(), m_write_queue.size());
44 m_next[j]->write(input, length);
45 nothing_attached =
false;
49 if(nothing_attached) {
50 m_write_queue += std::make_pair(input, length);
52 m_write_queue.clear();
59void Filter::new_msg() {
61 for(
size_t j = 0; j != total_ports(); ++j) {
71void Filter::finish_msg() {
73 for(
size_t j = 0; j != total_ports(); ++j) {
75 m_next[j]->finish_msg();
83void Filter::attach(
Filter* new_filter) {
86 while(last->get_next()) {
87 last = last->get_next();
89 last->m_next[last->current_port()] = new_filter;
96void Filter::set_port(
size_t new_port) {
97 if(new_port >= total_ports()) {
98 throw Invalid_Argument(
"Filter: Invalid port number");
100 m_port_num = new_port;
106Filter* Filter::get_next()
const {
107 if(m_port_num < m_next.size()) {
108 return m_next[m_port_num];
116void Filter::set_next(
Filter* filters[],
size_t size) {
122 while(size && filters && (filters[size - 1] ==
nullptr)) {
126 if(filters && size) {
127 m_next.assign(filters, filters + size);
134size_t Filter::total_ports()
const {
135 return m_next.size();
#define BOTAN_ASSERT_NOMSG(expr)
Filter(const Filter &)=delete
virtual void send(const uint8_t in[], size_t length)