/* * Copyright (C) by Klaas Freitag * Copyright (C) by Daniel Molkentin * * 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 2 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. */ #pragma once #include "owncloudlib.h" #include #include #include #include #include #include #include #include "accountfwd.h" class QUrl; namespace OCC { class AbstractSslErrorHandler; /** * @brief The AbstractNetworkJob class * @ingroup libsync */ class OWNCLOUDSYNC_EXPORT AbstractNetworkJob : public QObject { Q_OBJECT public: explicit AbstractNetworkJob(AccountPtr account, const QString &path, QObject* parent = 0); virtual ~AbstractNetworkJob(); virtual void start(); AccountPtr account() const { return _account; } void setPath(const QString &path); QString path() const { return _path; } void setReply(QNetworkReply *reply); QNetworkReply* reply() const { return _reply; } void setIgnoreCredentialFailure(bool ignore); bool ignoreCredentialFailure() const { return _ignoreCredentialFailure; } QByteArray responseTimestamp(); quint64 duration(); qint64 timeoutMsec() { return _timer.interval(); } public slots: void setTimeout(qint64 msec); void resetTimeout(); signals: void networkError(QNetworkReply *reply); void networkActivity(); protected: void setupConnections(QNetworkReply *reply); QNetworkReply* davRequest(const QByteArray& verb, const QString &relPath, QNetworkRequest req = QNetworkRequest(), QIODevice *data = 0); QNetworkReply* davRequest(const QByteArray& verb, const QUrl &url, QNetworkRequest req = QNetworkRequest(), QIODevice *data = 0); QNetworkReply* getRequest(const QString &relPath); QNetworkReply* getRequest(const QUrl &url); QNetworkReply* headRequest(const QString &relPath); QNetworkReply* headRequest(const QUrl &url); QNetworkReply* deleteRequest(const QUrl &url); int maxRedirects() const { return 10; } virtual bool finished() = 0; QByteArray _responseTimestamp; QElapsedTimer _durationTimer; quint64 _duration; bool _timedout; // set to true when the timeout slot is received // Automatically follows redirects. Note that this only works for // GET requests that don't set up any HTTP body or other flags. bool _followRedirects; private slots: void slotFinished(); virtual void slotTimeout(); protected: AccountPtr _account; private: QNetworkReply* addTimer(QNetworkReply *reply); bool _ignoreCredentialFailure; QPointer _reply; // (QPointer because the NetworkManager may be destroyed before the jobs at exit) QString _path; QTimer _timer; int _redirectCount; }; /** * @brief Internal Helper class */ class NetworkJobTimeoutPauser { public: NetworkJobTimeoutPauser(QNetworkReply *reply); ~NetworkJobTimeoutPauser(); private: QPointer _timer; }; /** Gets the SabreDAV-style error message from an error response. * * This assumes the response is XML with a 'error' tag that has a * 'message' tag that contains the data to extract. * * Returns a null string if no message was found. */ QString OWNCLOUDSYNC_EXPORT extractErrorMessage(const QByteArray& errorResponse); /** Builds a error message based on the error and the reply body. */ QString OWNCLOUDSYNC_EXPORT errorMessage(const QString& baseError, const QByteArray& body); } // namespace OCC