8#include <botan/filter.h>
10#include <botan/assert.h>
11#include <botan/exceptn.h>
24 send(in.data(), length);
35 bool nothing_attached =
true;
36 for(
size_t j = 0; j != total_ports(); ++j) {
37 if(m_next[j] !=
nullptr) {
38 if(!m_write_queue.empty()) {
39 m_next[j]->write(m_write_queue.data(), m_write_queue.size());
41 m_next[j]->write(input, length);
42 nothing_attached =
false;
46 if(nothing_attached) {
47 m_write_queue += std::make_pair(input, length);
49 m_write_queue.clear();
56void Filter::new_msg() {
58 for(
size_t j = 0; j != total_ports(); ++j) {
59 if(m_next[j] !=
nullptr) {
68void Filter::finish_msg() {
70 for(
size_t j = 0; j != total_ports(); ++j) {
71 if(m_next[j] !=
nullptr) {
72 m_next[j]->finish_msg();
80void Filter::attach(
Filter* new_filter) {
81 if(new_filter !=
nullptr) {
83 while(last->get_next() !=
nullptr) {
84 last = last->get_next();
86 last->m_next[last->current_port()] = new_filter;
93void Filter::set_port(
size_t new_port) {
94 if(new_port >= total_ports()) {
95 throw Invalid_Argument(
"Filter: Invalid port number");
97 m_port_num = new_port;
103Filter* Filter::get_next()
const {
104 if(m_port_num < m_next.size()) {
105 return m_next[m_port_num];
113void Filter::set_next(
Filter* filters[],
size_t size) {
119 while(size > 0 && filters !=
nullptr && (filters[size - 1] ==
nullptr)) {
123 if(filters !=
nullptr && size > 0) {
124 m_next.assign(filters, filters + size);
131size_t Filter::total_ports()
const {
132 return m_next.size();
#define BOTAN_ASSERT_NOMSG(expr)
Filter(const Filter &)=delete
virtual void send(const uint8_t in[], size_t length)