31 Filter::Type filter_type ,
const Filter::Config & filter_config ,
33 m_message_id(
GStore::MessageId::none())
36 G_ASSERT( spec.first ==
"chain" ) ;
41 add( es , ff , filter_type , filter_config , Spec(first,second) ) ;
44 if( m_filters.empty() )
45 add( es , ff , filter_type , filter_config , {
"exit",
"0"} ) ;
49 Filter::Type filter_type ,
const Filter::Config & filter_config ,
52 m_filters.push_back( ff.
newFilter( es , filter_type , filter_config , spec ) ) ;
53 m_filter_id.append(m_filter_id.empty()?0U:1U,
',').append( m_filters.back()->id() ) ;
59 m_filter->doneSignal().disconnect() ;
62std::string GFilters::FilterChain::id()
const
67bool GFilters::FilterChain::quiet()
const
69 return std::all_of( m_filters.begin() , m_filters.end() ,
70 [](
const std::unique_ptr<Filter> & ptr){ return ptr->quiet() ; } ) ;
75 return m_done_signal ;
83 m_filter->doneSignal().disconnect() ;
88 m_filter = m_filters.at(0U).get() ;
89 m_filter->doneSignal().connect(
G::Slot::slot(*
this,&FilterChain::onFilterDone) ) ;
90 m_filter->start( m_message_id ) ;
93void GFilters::FilterChain::onFilterDone(
int ok_abandon_fail )
96 m_filter->doneSignal().disconnect() ;
97 if( ok_abandon_fail == 0 )
99 G_ASSERT( m_filter_index <= m_filters.size() ) ;
100 if( m_filter_index >= m_filters.size() )
103 m_done_signal.emit( 0 ) ;
107 m_filter = m_filters.at(m_filter_index).get() ;
108 m_filter->doneSignal().connect(
G::Slot::slot(*
this,&FilterChain::onFilterDone) ) ;
109 m_filter->start( m_message_id ) ;
115 m_done_signal.emit( ok_abandon_fail ) ;
119void GFilters::FilterChain::cancel()
124 m_filter->doneSignal().disconnect() ;
129GSmtp::Filter::Result GFilters::FilterChain::result()
const
131 return m_filter->result() ;
134std::string GFilters::FilterChain::response()
const
136 return m_filter->response() ;
139int GFilters::FilterChain::responseCode()
const
141 return m_filter->responseCode() ;
144std::string GFilters::FilterChain::reason()
const
146 return m_filter->reason() ;
149bool GFilters::FilterChain::special()
const
151 for( std::size_t i = 0U ; i < m_filter_index ; i++ )
153 if( m_filters.at(i)->special() )
FilterChain(GNet::EventState, GSmtp::FilterFactoryBase &, Filter::Type, const Filter::Config &, const GSmtp::FilterFactoryBase::Spec &spec)
Constructor.
~FilterChain() override
Destructor.
A lightweight object containing an ExceptionHandler pointer, optional ExceptionSource pointer and opt...
A factory interface for making GSmtp::Filter message processors.
virtual std::unique_ptr< Filter > newFilter(GNet::EventState, Filter::Type, const Filter::Config &, const Spec &spec)=0
Returns a Filter on the heap.
A somewhat opaque identifer for a GStore::MessageStore message id.
static std::string tail(std::string_view in, std::size_t pos, std::string_view default_={})
Returns the last part of the string after the given position.
static std::string head(std::string_view in, std::size_t pos, std::string_view default_={})
Returns the first part of the string up to just before the given position.
A zero-copy string token iterator where the token separators are runs of whitespace characters,...
Slot< Args... > slot(TSink &sink, void(TSink::*method)(Args...))
A factory function for Slot objects.
Filter specification tuple for GSmtp::FilterFactoryBase::newFilter().