00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef QXMPPTRANSFERMANAGER_H
00025 #define QXMPPTRANSFERMANAGER_H
00026
00027 #include <QDateTime>
00028 #include <QVariant>
00029
00030 #include "QXmppClientExtension.h"
00031 #include "QXmppIq.h"
00032 #include "QXmppByteStreamIq.h"
00033
00034 class QTcpSocket;
00035 class QXmppByteStreamIq;
00036 class QXmppIbbCloseIq;
00037 class QXmppIbbDataIq;
00038 class QXmppIbbOpenIq;
00039 class QXmppSocksClient;
00040 class QXmppSocksServer;
00041 class QXmppStreamInitiationIq;
00042 class QXmppTransferJobPrivate;
00043
00044 class QXmppTransferFileInfo
00045 {
00046 public:
00047 QXmppTransferFileInfo();
00048
00049 QDateTime date() const;
00050 void setDate(const QDateTime &date);
00051
00052 QByteArray hash() const;
00053 void setHash(const QByteArray &hash);
00054
00055 QString name() const;
00056 void setName(const QString &name);
00057
00058 qint64 size() const;
00059 void setSize(qint64 size);
00060
00061 bool operator==(const QXmppTransferFileInfo &other) const;
00062
00063 private:
00064 QDateTime m_date;
00065 QByteArray m_hash;
00066 QString m_name;
00067 qint64 m_size;
00068 };
00069
00074
00075 class QXmppTransferJob : public QObject
00076 {
00077 Q_OBJECT
00078
00079 public:
00081 enum Direction
00082 {
00083 IncomingDirection,
00084 OutgoingDirection,
00085 };
00086
00088 enum Error
00089 {
00090 NoError = 0,
00091 AbortError,
00092 FileAccessError,
00093 FileCorruptError,
00094 ProtocolError,
00095 };
00096
00098 enum Method
00099 {
00100 NoMethod = 0,
00101 InBandMethod = 1,
00102 SocksMethod = 2,
00103 AnyMethod = 3,
00104 };
00105 Q_DECLARE_FLAGS(Methods, Method)
00106
00107
00108 enum State
00109 {
00110 OfferState = 0,
00111 StartState = 1,
00112 TransferState = 2,
00113 FinishedState = 3,
00114 };
00115
00116 ~QXmppTransferJob();
00117
00118 void abort();
00119 void accept(QIODevice *output);
00120
00121 QVariant data(int role) const;
00122 void setData(int role, const QVariant &value);
00123
00124 QXmppTransferJob::Direction direction() const;
00125 QXmppTransferJob::Error error() const;
00126 QString jid() const;
00127 QXmppTransferJob::Method method() const;
00128 QString sid() const;
00129 qint64 speed() const;
00130 QXmppTransferJob::State state() const;
00131
00132
00133 QXmppTransferFileInfo fileInfo() const;
00134
00136 QDateTime fileDate() const;
00137 QByteArray fileHash() const;
00138 QString fileName() const;
00139 qint64 fileSize() const;
00141
00142 signals:
00145 void error(QXmppTransferJob::Error error);
00146
00154 void finished();
00155
00157 void progress(qint64 done, qint64 total);
00158
00160 void stateChanged(QXmppTransferJob::State state);
00161
00162 private slots:
00163 void disconnected();
00164 void receiveData();
00165 void sendData();
00166 void slotTerminated();
00167
00168 private:
00169 QXmppTransferJob(const QString &jid, QXmppTransferJob::Direction direction, QObject *parent);
00170 void checkData();
00171 void setState(QXmppTransferJob::State state);
00172 void terminate(QXmppTransferJob::Error error);
00173 bool writeData(const QByteArray &data);
00174
00175 QXmppTransferJobPrivate *const d;
00176 friend class QXmppTransferManager;
00177 };
00178
00195
00196 class QXmppTransferManager : public QXmppClientExtension
00197 {
00198 Q_OBJECT
00199
00200 public:
00201 QXmppTransferManager();
00202 QXmppTransferJob *sendFile(const QString &jid, const QString &fileName, const QString &sid = QString());
00203 QXmppTransferJob *sendFile(const QString &jid, QIODevice *device, const QXmppTransferFileInfo &fileInfo, const QString &sid = QString());
00204
00205 QString proxy() const;
00206 void setProxy(const QString &proxyJid);
00207
00208 bool proxyOnly() const;
00209 void setProxyOnly(bool proxyOnly);
00210
00211 QXmppTransferJob::Methods supportedMethods() const;
00212 void setSupportedMethods(QXmppTransferJob::Methods methods);
00213
00215 QStringList discoveryFeatures() const;
00216 bool handleStanza(const QDomElement &element);
00218
00219 signals:
00224 void fileReceived(QXmppTransferJob *offer);
00225
00229 void finished(QXmppTransferJob *job);
00230
00231 protected:
00233 void setClient(QXmppClient* client);
00235
00236 private slots:
00237 void iqReceived(const QXmppIq&);
00238 void jobDestroyed(QObject *object);
00239 void jobError(QXmppTransferJob::Error error);
00240 void jobFinished();
00241 void jobStateChanged(QXmppTransferJob::State state);
00242 void socksServerConnected(QTcpSocket *socket, const QString &hostName, quint16 port);
00243
00244 private:
00245 QXmppTransferJob *getJobByRequestId(QXmppTransferJob::Direction direction, const QString &jid, const QString &id);
00246 QXmppTransferJob *getJobBySid(QXmppTransferJob::Direction, const QString &jid, const QString &sid);
00247 void byteStreamIqReceived(const QXmppByteStreamIq&);
00248 void byteStreamResponseReceived(const QXmppIq&);
00249 void byteStreamResultReceived(const QXmppByteStreamIq&);
00250 void byteStreamSetReceived(const QXmppByteStreamIq&);
00251 void ibbCloseIqReceived(const QXmppIbbCloseIq&);
00252 void ibbDataIqReceived(const QXmppIbbDataIq&);
00253 void ibbOpenIqReceived(const QXmppIbbOpenIq&);
00254 void ibbResponseReceived(const QXmppIq&);
00255 void streamInitiationIqReceived(const QXmppStreamInitiationIq&);
00256 void streamInitiationResultReceived(const QXmppStreamInitiationIq&);
00257 void streamInitiationSetReceived(const QXmppStreamInitiationIq&);
00258 void socksServerSendOffer(QXmppTransferJob *job);
00259
00260 int m_ibbBlockSize;
00261 QList<QXmppTransferJob*> m_jobs;
00262 QString m_proxy;
00263 bool m_proxyOnly;
00264 QXmppSocksServer *m_socksServer;
00265 QXmppTransferJob::Methods m_supportedMethods;
00266 };
00267
00268 Q_DECLARE_OPERATORS_FOR_FLAGS(QXmppTransferJob::Methods)
00269
00270 #endif