47 lines
1.2 KiB
C
47 lines
1.2 KiB
C
|
#ifndef REPLYTIMEOUT_H
|
||
|
#define REPLYTIMEOUT_H
|
||
|
|
||
|
#include <QBasicTimer>
|
||
|
#include <QNetworkReply>
|
||
|
#include <QObject>
|
||
|
#include <QTimerEvent>
|
||
|
|
||
|
#include "DoricExport.h"
|
||
|
|
||
|
class DORIC_EXPORT ReplyTimeout : public QObject {
|
||
|
Q_OBJECT
|
||
|
public:
|
||
|
enum HandleMethod { Abort, Close };
|
||
|
ReplyTimeout(QNetworkReply *reply, const int timeout,
|
||
|
HandleMethod method = Abort)
|
||
|
: QObject(reply), m_method(method) {
|
||
|
Q_ASSERT(reply);
|
||
|
if (reply && reply->isRunning()) {
|
||
|
m_timer.start(timeout, this);
|
||
|
connect(reply, &QNetworkReply::finished, this, &QObject::deleteLater);
|
||
|
}
|
||
|
}
|
||
|
static void set(QNetworkReply *reply, const int timeout,
|
||
|
HandleMethod method = Abort) {
|
||
|
new ReplyTimeout(reply, timeout, method);
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
QBasicTimer m_timer;
|
||
|
HandleMethod m_method;
|
||
|
void timerEvent(QTimerEvent *ev) {
|
||
|
if (!m_timer.isActive() || ev->timerId() != m_timer.timerId())
|
||
|
return;
|
||
|
auto reply = static_cast<QNetworkReply *>(parent());
|
||
|
if (reply->isRunning()) {
|
||
|
if (m_method == Close)
|
||
|
reply->close();
|
||
|
else if (m_method == Abort)
|
||
|
reply->abort();
|
||
|
m_timer.stop();
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#endif // REPLYTIMEOUT_H
|