31 Filter::Type filter_type ,
const Filter::Config & filter_config ,
36 m_message_id(
GStore::MessageId::none())
39 G_ASSERT( spec.first ==
"chain" ) ;
42 std::string first =
G::Str::head( t() ,
":"_sv ,
false ) ;
44 add( es , ff , filter_type , filter_config , Spec(first,second) ) ;
47 if( m_filters.empty() )
48 add( es , ff , filter_type , filter_config , {
"exit",
"0"} ) ;
52 Filter::Type filter_type ,
const Filter::Config & filter_config ,
55 m_filters.push_back( ff.
newFilter( es , filter_type , filter_config , spec ) ) ;
56 m_filter_id.append(m_filter_id.empty()?0U:1U,
',').append( m_filters.back()->id() ) ;
62 m_filter->doneSignal().disconnect() ;
65std::string GFilters::FilterChain::id()
const
70bool GFilters::FilterChain::quiet()
const
72 return std::all_of( m_filters.begin() , m_filters.end() ,
73 [](
const std::unique_ptr<Filter> & ptr){ return ptr->quiet() ; } ) ;
78 return m_done_signal ;
86 m_filter->doneSignal().disconnect() ;
91 m_filter = m_filters.at(0U).get() ;
92 m_filter->doneSignal().connect(
G::Slot::slot(*
this,&FilterChain::onFilterDone) ) ;
93 m_filter->start( m_message_id ) ;
96void GFilters::FilterChain::onFilterDone(
int ok_abandon_fail )
99 m_filter->doneSignal().disconnect() ;
100 if( ok_abandon_fail == 0 )
102 G_ASSERT( m_filter_index <= m_filters.size() ) ;
103 if( m_filter_index >= m_filters.size() )
106 m_done_signal.emit( 0 ) ;
110 m_filter = m_filters.at(m_filter_index).get() ;
111 m_filter->doneSignal().connect(
G::Slot::slot(*
this,&FilterChain::onFilterDone) ) ;
112 m_filter->start( m_message_id ) ;
118 m_done_signal.emit( ok_abandon_fail ) ;
122void GFilters::FilterChain::cancel()
127 m_filter->doneSignal().disconnect() ;
132GSmtp::Filter::Result GFilters::FilterChain::result()
const
134 return m_filter->result() ;
137std::string GFilters::FilterChain::response()
const
139 return m_filter->response() ;
142int GFilters::FilterChain::responseCode()
const
144 return m_filter->responseCode() ;
147std::string GFilters::FilterChain::reason()
const
149 return m_filter->reason() ;
152bool GFilters::FilterChain::special()
const
154 for( std::size_t i = 0U ; i < m_filter_index ; i++ )
156 if( m_filters.at(i)->special() )
FilterChain(GNet::ExceptionSink, GSmtp::FilterFactoryBase &, Filter::Type, const Filter::Config &, const GSmtp::FilterFactoryBase::Spec &spec)
Constructor.
~FilterChain() override
Destructor.
A tuple containing an ExceptionHandler interface pointer and a bound 'exception source' pointer.
A factory interface for making GSmtp::Filter message processors.
virtual std::unique_ptr< Filter > newFilter(GNet::ExceptionSink, 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(string_view in, std::size_t pos, string_view default_={})
Returns the last part of the string after the given position.
static std::string head(string_view in, std::size_t pos, 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().