QXmppTransferManager.h
/*
* Copyright (C) 2008-2019 The QXmpp developers
*
* Author:
* Jeremy Lainé
*
* Source:
* https://github.com/qxmpp-project/qxmpp
*
* This file is a part of QXmpp library.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
*/
#ifndef QXMPPTRANSFERMANAGER_H
#define QXMPPTRANSFERMANAGER_H
#include <QDateTime>
#include <QSharedData>
#include <QUrl>
#include <QVariant>
#include "QXmppClientExtension.h"
class QTcpSocket;
class QXmppByteStreamIq;
class QXmppIbbCloseIq;
class QXmppIbbDataIq;
class QXmppIbbOpenIq;
class QXmppIq;
class QXmppStreamInitiationIq;
class QXmppTransferFileInfoPrivate;
class QXmppTransferJobPrivate;
class QXmppTransferManager;
class QXmppTransferManagerPrivate;
class QXMPP_EXPORT QXmppTransferFileInfo
{
public:
QXmppTransferFileInfo();
QXmppTransferFileInfo(const QXmppTransferFileInfo &other);
~QXmppTransferFileInfo();
QDateTime date() const;
void setDate(const QDateTime &date);
QByteArray hash() const;
void setHash(const QByteArray &hash);
QString name() const;
void setName(const QString &name);
QString description() const;
void setDescription(const QString &description);
qint64 size() const;
void setSize(qint64 size);
bool isNull() const;
QXmppTransferFileInfo& operator=(const QXmppTransferFileInfo &other);
bool operator==(const QXmppTransferFileInfo &other) const;
void parse(const QDomElement &element);
void toXml(QXmlStreamWriter *writer) const;
private:
QSharedDataPointer<QXmppTransferFileInfoPrivate> d;
};
class QXMPP_EXPORT QXmppTransferJob : public QXmppLoggable
{
Q_OBJECT
Q_ENUMS(Direction Error State)
Q_FLAGS(Method Methods)
Q_PROPERTY(Direction direction READ direction CONSTANT)
Q_PROPERTY(QUrl localFileUrl READ localFileUrl WRITE setLocalFileUrl NOTIFY localFileUrlChanged)
Q_PROPERTY(QString jid READ jid CONSTANT)
Q_PROPERTY(Method method READ method CONSTANT)
Q_PROPERTY(State state READ state NOTIFY stateChanged)
Q_PROPERTY(QString fileName READ fileName CONSTANT)
Q_PROPERTY(qint64 fileSize READ fileSize CONSTANT)
public:
enum Direction
{
IncomingDirection,
OutgoingDirection
};
enum Error
{
NoError = 0,
AbortError,
FileAccessError,
FileCorruptError,
ProtocolError
};
enum Method
{
NoMethod = 0,
InBandMethod = 1,
SocksMethod = 2,
AnyMethod = 3
};
Q_DECLARE_FLAGS(Methods, Method)
enum State
{
OfferState = 0,
StartState = 1,
TransferState = 2,
FinishedState = 3
};
~QXmppTransferJob();
QXmppTransferJob::Direction direction() const;
QXmppTransferJob::Error error() const;
QString jid() const;
QXmppTransferJob::Method method() const;
QString sid() const;
qint64 speed() const;
QXmppTransferJob::State state() const;
// XEP-0096 : File transfer
QXmppTransferFileInfo fileInfo() const;
QUrl localFileUrl() const;
void setLocalFileUrl(const QUrl &localFileUrl);
QDateTime fileDate() const;
QByteArray fileHash() const;
QString fileName() const;
qint64 fileSize() const;
signals:
void error(QXmppTransferJob::Error error);
void finished();
void localFileUrlChanged(const QUrl &localFileUrl);
void progress(qint64 done, qint64 total);
void stateChanged(QXmppTransferJob::State state);
public slots:
void abort();
void accept(const QString &filePath);
void accept(QIODevice *output);
private slots:
void _q_terminated();
private:
QXmppTransferJob(const QString &jid, QXmppTransferJob::Direction direction, QXmppClient *client, QObject *parent);
void setState(QXmppTransferJob::State state);
void terminate(QXmppTransferJob::Error error);
QXmppTransferJobPrivate *const d;
friend class QXmppTransferManager;
friend class QXmppTransferManagerPrivate;
friend class QXmppTransferIncomingJob;
friend class QXmppTransferOutgoingJob;
};
class QXMPP_EXPORT QXmppTransferManager : public QXmppClientExtension
{
Q_OBJECT
Q_PROPERTY(QString proxy READ proxy WRITE setProxy)
Q_PROPERTY(bool proxyOnly READ proxyOnly WRITE setProxyOnly)
Q_PROPERTY(QXmppTransferJob::Methods supportedMethods READ supportedMethods WRITE setSupportedMethods)
public:
QXmppTransferManager();
~QXmppTransferManager();
QString proxy() const;
void setProxy(const QString &proxyJid);
bool proxyOnly() const;
void setProxyOnly(bool proxyOnly);
QXmppTransferJob::Methods supportedMethods() const;
void setSupportedMethods(QXmppTransferJob::Methods methods);
QStringList discoveryFeatures() const;
bool handleStanza(const QDomElement &element);
signals:
void fileReceived(QXmppTransferJob *job);
void jobStarted(QXmppTransferJob *job);
void jobFinished(QXmppTransferJob *job);
public slots:
QXmppTransferJob *sendFile(const QString &jid, const QString &filePath, const QString &description = QString());
QXmppTransferJob *sendFile(const QString &jid, QIODevice *device, const QXmppTransferFileInfo &fileInfo, const QString &sid = QString());
protected:
void setClient(QXmppClient* client);
private slots:
void _q_iqReceived(const QXmppIq&);
void _q_jobDestroyed(QObject *object);
void _q_jobError(QXmppTransferJob::Error error);
void _q_jobFinished();
void _q_jobStateChanged(QXmppTransferJob::State state);
void _q_socksServerConnected(QTcpSocket *socket, const QString &hostName, quint16 port);
private:
QXmppTransferManagerPrivate *d;
void byteStreamIqReceived(const QXmppByteStreamIq&);
void byteStreamResponseReceived(const QXmppIq&);
void byteStreamResultReceived(const QXmppByteStreamIq&);
void byteStreamSetReceived(const QXmppByteStreamIq&);
void ibbCloseIqReceived(const QXmppIbbCloseIq&);
void ibbDataIqReceived(const QXmppIbbDataIq&);
void ibbOpenIqReceived(const QXmppIbbOpenIq&);
void ibbResponseReceived(const QXmppIq&);
void streamInitiationIqReceived(const QXmppStreamInitiationIq&);
void streamInitiationResultReceived(const QXmppStreamInitiationIq&);
void streamInitiationSetReceived(const QXmppStreamInitiationIq&);
void socksServerSendOffer(QXmppTransferJob *job);
friend class QXmppTransferManagerPrivate;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QXmppTransferJob::Methods)
#endif
QXmppTransferJob::Method
Method
This enum is used to describe a transfer method.
Definition: QXmppTransferManager.h:119
QXmppTransferJob::FileAccessError
@ FileAccessError
An error was encountered trying to access a local file.
Definition: QXmppTransferManager.h:113
QXmppTransferJob::FileCorruptError
@ FileCorruptError
The file is corrupt: the file size or hash do not match.
Definition: QXmppTransferManager.h:114
QXmppClientExtension
The QXmppClientExtension class is the base class for QXmppClient extensions.
Definition: QXmppClientExtension.h:47
QXmppTransferJob
The QXmppTransferJob class represents a single file transfer job.
Definition: QXmppTransferManager.h:86
QXmppTransferManager
The QXmppTransferManager class provides support for sending and receiving files.
Definition: QXmppTransferManager.h:219
QXmppTransferJob::State
State
This enum is used to describe the state of a transfer job.
Definition: QXmppTransferManager.h:129
QXmppTransferJob::Direction
Direction
This enum is used to describe the direction of a transfer job.
Definition: QXmppTransferManager.h:102
QXmppIq
The QXmppIq class is the base class for all IQs.
Definition: QXmppIq.h:42
QXmppTransferJob::Error
Error
This enum is used to describe the type of error encountered by a transfer job.
Definition: QXmppTransferManager.h:109
QXmppClient
The QXmppClient class is the main class for using QXmpp.
Definition: QXmppClient.h:80
QXmppLoggable
The QXmppLoggable class represents a source of logging messages.
Definition: QXmppLogger.h:111
QXmppTransferJob::AbortError
@ AbortError
The file transfer was aborted.
Definition: QXmppTransferManager.h:112
QXmppTransferJob::IncomingDirection
@ IncomingDirection
The file is being received.
Definition: QXmppTransferManager.h:104