27 const std::string & server ,
bool read_only ,
bool always_pass ,
28 unsigned int connection_timeout ,
unsigned int response_timeout ) :
30 m_file_store(file_store) ,
32 m_read_only(read_only) ,
33 m_always_pass(always_pass) ,
34 m_connection_timeout(connection_timeout) ,
35 m_response_timeout(response_timeout)
37 m_client_ptr.eventSignal().connect(
G::Slot::slot(*
this,&GSmtp::SpamFilter::clientEvent) ) ;
38 m_client_ptr.deletedSignal().connect(
G::Slot::slot(*
this,&GSmtp::SpamFilter::clientDeleted) ) ;
43 m_client_ptr.eventSignal().disconnect() ;
44 m_client_ptr.deletedSignal().disconnect() ;
47std::string GSmtp::SpamFilter::id()
const
49 return m_location.displayString() ;
52bool GSmtp::SpamFilter::simple()
const
57void GSmtp::SpamFilter::start(
const MessageId & message_id )
60 m_client_ptr.reset( std::make_unique<SpamClient>(
GNet::ExceptionSink(m_client_ptr,m_es.esrc()) ,
61 m_location , m_read_only , m_connection_timeout , m_response_timeout ) ) ;
64 m_client_ptr->request( m_file_store.contentPath(message_id).str() ) ;
67void GSmtp::SpamFilter::clientDeleted(
const std::string & reason )
71 G_WARNING(
"GSmtp::SpamFilter::clientDeleted: spamd interaction failed: " << reason ) ;
77void GSmtp::SpamFilter::clientEvent(
const std::string & s1 ,
const std::string & s2 ,
const std::string & )
79 G_DEBUG(
"GSmtp::SpamFilter::clientEvent: [" << s1 <<
"] [" << s2 <<
"]" ) ;
82 m_text = ( s2.empty() || m_always_pass ) ? std::string() : (
"spam: "+
G::Str::printable(s2)) ;
83 emit( m_text.empty() ) ;
85 else if( s1 ==
"failed" )
88 emit( m_text.empty() ) ;
92void GSmtp::SpamFilter::emit(
bool ok )
94 m_done_signal.emit( ok ? 0 : 2 ) ;
97bool GSmtp::SpamFilter::special()
const
102std::string GSmtp::SpamFilter::response()
const
104 return m_text.empty() ? std::string() : std::string(
"rejected") ;
107std::string GSmtp::SpamFilter::reason()
const
114 return m_done_signal ;
117void GSmtp::SpamFilter::cancel()
119 G_DEBUG(
"GSmtp::SpamFilter::cancel: cancelled" ) ;
121 if( m_client_ptr.get() !=
nullptr && m_client_ptr->busy() )
122 m_client_ptr.reset() ;
125bool GSmtp::SpamFilter::abandoned()
const
A tuple containing an ExceptionHandler interface pointer and a bound 'exception source' pointer.
A concrete implementation of the MessageStore interface dealing in paired flat files.
~SpamFilter() override
Destructor.
SpamFilter(GNet::ExceptionSink, FileStore &, const std::string &server_location, bool read_only, bool always_pass, unsigned int connection_timeout, unsigned int response_timeout)
Constructor.
static std::string printable(const std::string &in, char escape='\\')
Returns a printable representation of the given input string, using chacter code ranges 0x20 to 0x7e ...
Slot< Args... > slot(TSink &sink, void(TSink::*method)(Args...))
A factory function for Slot objects.