Default timeout handler. Fixed spelling.
This commit is contained in:
parent
b65d748ff3
commit
baf79458fe
@ -685,7 +685,7 @@ information, please read the class documentation for
|
|||||||
|
|
||||||
|
|
||||||
% ============================================================================
|
% ============================================================================
|
||||||
\section{Handling time-outs}
|
\section{Handling timeouts}
|
||||||
|
|
||||||
Unexpected errors can occur while messaging services are performing
|
Unexpected errors can occur while messaging services are performing
|
||||||
operations and waiting a response from the server (eg. server stops
|
operations and waiting a response from the server (eg. server stops
|
||||||
@ -705,18 +705,18 @@ class timeoutHandler : public object
|
|||||||
{
|
{
|
||||||
/** Called to test if the time limit has been reached.
|
/** Called to test if the time limit has been reached.
|
||||||
*
|
*
|
||||||
* @return true if the time-out delay is elapsed
|
* @return true if the timeout delay is elapsed
|
||||||
*/
|
*/
|
||||||
virtual const bool isTimeOut() = 0;
|
virtual const bool isTimeOut() = 0;
|
||||||
|
|
||||||
/** Called to reset the time-out counter.
|
/** Called to reset the timeout counter.
|
||||||
*/
|
*/
|
||||||
virtual void resetTimeOut() = 0;
|
virtual void resetTimeOut() = 0;
|
||||||
|
|
||||||
/** Called when the time limit has been reached (when
|
/** Called when the time limit has been reached (when
|
||||||
* isTimeOut() returned true).
|
* isTimeOut() returned true).
|
||||||
*
|
*
|
||||||
* @return true to continue (and reset the time-out)
|
* @return true to continue (and reset the timeout)
|
||||||
* or false to cancel the current operation
|
* or false to cancel the current operation
|
||||||
*/
|
*/
|
||||||
virtual const bool handleTimeOut() = 0;
|
virtual const bool handleTimeOut() = 0;
|
||||||
@ -729,25 +729,35 @@ then {\vcode handleTimeout()} is called. If the {\vcode handleTimeout()}
|
|||||||
function returns {\vcode false}, the operation is cancelled and
|
function returns {\vcode false}, the operation is cancelled and
|
||||||
an {\vcode operation\_timed\_out} exception is thrown. Else, if
|
an {\vcode operation\_timed\_out} exception is thrown. Else, if
|
||||||
{\vcode handleTimeout()} returns true, the operation continues and the
|
{\vcode handleTimeout()} returns true, the operation continues and the
|
||||||
time-out count is reset.
|
timeout counter is reset.
|
||||||
The function {\vcode resetTimeout()} is called each time data has
|
The function {\vcode resetTimeout()} is called each time data has
|
||||||
been received from the server to reset time-out delay.
|
been received from the server to reset the timeout delay.
|
||||||
|
|
||||||
The following example shows how to implement a simple time-out handler:
|
When using a service, a default timeout handler is set: if an operation
|
||||||
|
is blocked for more than 30 seconds (ie. network link is down and no data
|
||||||
|
was received since 30 seconds), an {\vcode operation\_timed\_out} exception
|
||||||
|
is thrown.
|
||||||
|
|
||||||
\begin{lstlisting}[caption={Implementing a simple time-out handler}]
|
The following example shows how to implement a simple timeout handler:
|
||||||
|
|
||||||
|
\begin{lstlisting}[caption={Implementing a simple timeout handler}]
|
||||||
class myTimeoutHandler : public vmime::net::timeoutHandler
|
class myTimeoutHandler : public vmime::net::timeoutHandler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
myTimeoutHandler()
|
||||||
|
{
|
||||||
|
m_startTime = time(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
const bool isTimeOut()
|
const bool isTimeOut()
|
||||||
{
|
{
|
||||||
return (getTime() >= m_last + 30); // 30 seconds time-out
|
return (time(NULL) >= m_startTime + 30); // 30 seconds timeout
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetTimeOut()
|
void resetTimeOut()
|
||||||
{
|
{
|
||||||
m_last = getTime();
|
m_startTime = time(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool handleTimeOut()
|
const bool handleTimeOut()
|
||||||
@ -764,19 +774,14 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
const unsigned int getTime() const
|
time_t m_startTime;
|
||||||
{
|
|
||||||
return vmime::platform::getHandler()->getUnixTime();
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int m_last;
|
|
||||||
};
|
};
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
To make the service use your time-out handler, you need to write a factory
|
To make the service use your timeout handler, you need to write a factory
|
||||||
class, to allow the service to create instances of the handler class. This
|
class, to allow the service to create instances of the handler class. This
|
||||||
is required because the service can use several connections to the server
|
is required because the service can use several connections to the server
|
||||||
simultaneously, and each connection needs its own time-out handler.
|
simultaneously, and each connection needs its own timeout handler.
|
||||||
|
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
class myTimeoutHandlerFactory : public vmime::net::timeoutHandlerFactory
|
class myTimeoutHandlerFactory : public vmime::net::timeoutHandlerFactory
|
||||||
@ -791,7 +796,7 @@ public:
|
|||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
Then, call the {\vcode setTimeoutHandlerFactory()} method on the service object
|
Then, call the {\vcode setTimeoutHandlerFactory()} method on the service object
|
||||||
to set the time-out handler factory to use during the session:
|
to set the timeout handler factory to use during the session:
|
||||||
|
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
theService->setTimeoutHandlerFactory(vmime::make_shared <myTimeoutHandlerFactory>());
|
theService->setTimeoutHandlerFactory(vmime::make_shared <myTimeoutHandlerFactory>());
|
||||||
|
78
src/vmime/net/defaultTimeoutHandler.cpp
Normal file
78
src/vmime/net/defaultTimeoutHandler.cpp
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
//
|
||||||
|
// VMime library (http://www.vmime.org)
|
||||||
|
// Copyright (C) 2002-2014 Vincent Richard <vincent@vmime.org>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License as
|
||||||
|
// published by the Free Software Foundation; either version 3 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
//
|
||||||
|
// Linking this library statically or dynamically with other modules is making
|
||||||
|
// a combined work based on this library. Thus, the terms and conditions of
|
||||||
|
// the GNU General Public License cover the whole combination.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "vmime/config.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
#if VMIME_HAVE_MESSAGING_FEATURES
|
||||||
|
|
||||||
|
|
||||||
|
#include "vmime/net/defaultTimeoutHandler.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
namespace vmime {
|
||||||
|
namespace net {
|
||||||
|
|
||||||
|
|
||||||
|
defaultTimeoutHandler::defaultTimeoutHandler()
|
||||||
|
{
|
||||||
|
m_startTime = time(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
defaultTimeoutHandler::~defaultTimeoutHandler()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool defaultTimeoutHandler::isTimeOut()
|
||||||
|
{
|
||||||
|
return time(NULL) - m_startTime >= 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void defaultTimeoutHandler::resetTimeOut()
|
||||||
|
{
|
||||||
|
m_startTime = time(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool defaultTimeoutHandler::handleTimeOut()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
shared_ptr <timeoutHandler> defaultTimeoutHandlerFactory::create()
|
||||||
|
{
|
||||||
|
return make_shared <defaultTimeoutHandler>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // net
|
||||||
|
} // vmime
|
||||||
|
|
||||||
|
|
||||||
|
#endif // VMIME_HAVE_MESSAGING_FEATURES
|
82
src/vmime/net/defaultTimeoutHandler.hpp
Normal file
82
src/vmime/net/defaultTimeoutHandler.hpp
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
//
|
||||||
|
// VMime library (http://www.vmime.org)
|
||||||
|
// Copyright (C) 2002-2014 Vincent Richard <vincent@vmime.org>
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License as
|
||||||
|
// published by the Free Software Foundation; either version 3 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
// General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License along
|
||||||
|
// with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
//
|
||||||
|
// Linking this library statically or dynamically with other modules is making
|
||||||
|
// a combined work based on this library. Thus, the terms and conditions of
|
||||||
|
// the GNU General Public License cover the whole combination.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef VMIME_NET_DEFAULTTIMEOUTHANDLER_HPP_INCLUDED
|
||||||
|
#define VMIME_NET_DEFAULTTIMEOUTHANDLER_HPP_INCLUDED
|
||||||
|
|
||||||
|
|
||||||
|
#include "vmime/config.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
#if VMIME_HAVE_MESSAGING_FEATURES
|
||||||
|
|
||||||
|
|
||||||
|
#include "vmime/net/timeoutHandler.hpp"
|
||||||
|
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
|
|
||||||
|
namespace vmime {
|
||||||
|
namespace net {
|
||||||
|
|
||||||
|
|
||||||
|
/** A default timeout handler for messaging services. The default action
|
||||||
|
* is to throw a exceptions::operation_timed_out exception when an
|
||||||
|
* operation is blocked for more than 30 seconds.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class VMIME_EXPORT defaultTimeoutHandler : public timeoutHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
defaultTimeoutHandler();
|
||||||
|
~defaultTimeoutHandler();
|
||||||
|
|
||||||
|
bool isTimeOut();
|
||||||
|
void resetTimeOut();
|
||||||
|
bool handleTimeOut();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
time_t m_startTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** A class that creates default timeout handlers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class defaultTimeoutHandlerFactory : public timeoutHandlerFactory
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
shared_ptr <timeoutHandler> create();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // net
|
||||||
|
} // vmime
|
||||||
|
|
||||||
|
|
||||||
|
#endif // VMIME_HAVE_MESSAGING_FEATURES
|
||||||
|
|
||||||
|
#endif // VMIME_NET_DEFAULTTIMEOUTHANDLER_HPP_INCLUDED
|
@ -31,6 +31,8 @@
|
|||||||
|
|
||||||
#include "vmime/platform.hpp"
|
#include "vmime/platform.hpp"
|
||||||
|
|
||||||
|
#include "vmime/net/defaultTimeoutHandler.hpp"
|
||||||
|
|
||||||
#if VMIME_HAVE_SASL_SUPPORT
|
#if VMIME_HAVE_SASL_SUPPORT
|
||||||
#include "vmime/security/sasl/defaultSASLAuthenticator.hpp"
|
#include "vmime/security/sasl/defaultSASLAuthenticator.hpp"
|
||||||
#else
|
#else
|
||||||
@ -66,6 +68,8 @@ service::service(shared_ptr <session> sess, const serviceInfos& /* infos */,
|
|||||||
#endif // VMIME_HAVE_TLS_SUPPORT
|
#endif // VMIME_HAVE_TLS_SUPPORT
|
||||||
|
|
||||||
m_socketFactory = platform::getHandler()->getSocketFactory();
|
m_socketFactory = platform::getHandler()->getSocketFactory();
|
||||||
|
|
||||||
|
m_toHandlerFactory = make_shared <defaultTimeoutHandlerFactory>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -169,8 +169,8 @@ public:
|
|||||||
shared_ptr <socketFactory> getSocketFactory();
|
shared_ptr <socketFactory> getSocketFactory();
|
||||||
|
|
||||||
/** Set the factory used to create timeoutHandler objects for
|
/** Set the factory used to create timeoutHandler objects for
|
||||||
* this service. By default, no timeout handler is used. Not all
|
* this service. By default, the defaultTimeoutHandler class
|
||||||
* services support timeout handling.
|
* is used. Not all services support timeout handling.
|
||||||
*
|
*
|
||||||
* @param thf timeoutHandler factory
|
* @param thf timeoutHandler factory
|
||||||
*/
|
*/
|
||||||
|
@ -38,7 +38,9 @@ namespace vmime {
|
|||||||
namespace net {
|
namespace net {
|
||||||
|
|
||||||
|
|
||||||
/** A class to manage time-out in messaging services.
|
/** A class to manage timeouts in messaging services. This can be used
|
||||||
|
* to stop operations that takes too much time to complete (ie. no data
|
||||||
|
* received from the server for a long time if the network link is down).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class VMIME_EXPORT timeoutHandler : public object
|
class VMIME_EXPORT timeoutHandler : public object
|
||||||
@ -49,18 +51,18 @@ public:
|
|||||||
|
|
||||||
/** Called to test if the time limit has been reached.
|
/** Called to test if the time limit has been reached.
|
||||||
*
|
*
|
||||||
* @return true if the time-out delay is elapsed
|
* @return true if the timeout delay is elapsed
|
||||||
*/
|
*/
|
||||||
virtual bool isTimeOut() = 0;
|
virtual bool isTimeOut() = 0;
|
||||||
|
|
||||||
/** Called to reset the time-out counter.
|
/** Called to reset the timeout counter.
|
||||||
*/
|
*/
|
||||||
virtual void resetTimeOut() = 0;
|
virtual void resetTimeOut() = 0;
|
||||||
|
|
||||||
/** Called when the time limit has been reached (when
|
/** Called when the time limit has been reached (when
|
||||||
* isTimeOut() returned true).
|
* isTimeOut() returned true).
|
||||||
*
|
*
|
||||||
* @return true to continue (and reset the time-out)
|
* @return true to continue (and reset the timeout)
|
||||||
* or false to cancel the current operation
|
* or false to cancel the current operation
|
||||||
*/
|
*/
|
||||||
virtual bool handleTimeOut() = 0;
|
virtual bool handleTimeOut() = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user