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 <QCryptographicHash>
00028 #include <QDateTime>
00029 #include <QHash>
00030 #include <QHostAddress>
00031 #include <QVariant>
00032
00033 #include "QXmppIq.h"
00034 #include "QXmppByteStreamIq.h"
00035 #include "QXmppLogger.h"
00036
00037 class QTcpSocket;
00038 class QXmppByteStreamIq;
00039 class QXmppStream;
00040 class QXmppIbbCloseIq;
00041 class QXmppIbbDataIq;
00042 class QXmppIbbOpenIq;
00043 class QXmppSocksClient;
00044 class QXmppSocksServer;
00045 class QXmppStreamInitiationIq;
00046
00047 class QXmppTransferFileInfo
00048 {
00049 public:
00050 QXmppTransferFileInfo();
00051
00052 QDateTime date() const;
00053 void setDate(const QDateTime &date);
00054
00055 QByteArray hash() const;
00056 void setHash(const QByteArray &hash);
00057
00058 QString name() const;
00059 void setName(const QString &name);
00060
00061 qint64 size() const;
00062 void setSize(qint64 size);
00063
00064 bool operator==(const QXmppTransferFileInfo &other) const;
00065
00066 private:
00067 QDateTime m_date;
00068 QByteArray m_hash;
00069 QString m_name;
00070 qint64 m_size;
00071 };
00072
00077
00078 class QXmppTransferJob : public QObject
00079 {
00080 Q_OBJECT
00081
00082 public:
00084 enum Direction
00085 {
00086 IncomingDirection,
00087 OutgoingDirection,
00088 };
00089
00091 enum Error
00092 {
00093 NoError = 0,
00094 AbortError,
00095 FileAccessError,
00096 FileCorruptError,
00097 ProtocolError,
00098 };
00099
00101 enum Method
00102 {
00103 NoMethod = 0,
00104 InBandMethod = 1,
00105 SocksMethod = 2,
00106 AnyMethod = 3,
00107 };
00108 Q_DECLARE_FLAGS(Methods, Method)
00109
00110
00111 enum State
00112 {
00113 OfferState = 0,
00114 StartState = 1,
00115 TransferState = 2,
00116 FinishedState = 3,
00117 };
00118
00119 void abort();
00120 void accept(QIODevice *output);
00121
00122 QVariant data(int role) const;
00123 void setData(int role, const QVariant &value);
00124
00125 QXmppTransferJob::Direction direction() const;
00126 QXmppTransferJob::Error error() const;
00127 QString jid() const;
00128 QXmppTransferJob::Method method() const;
00129 QString sid() const;
00130 QXmppTransferJob::State state() const;
00131
00132
00133 QXmppTransferFileInfo fileInfo() const;
00134 QDateTime fileDate() const;
00135 QByteArray fileHash() const;
00136 QString fileName() const;
00137 qint64 fileSize() const;
00138
00139 signals:
00142 void error(QXmppTransferJob::Error error);
00143
00151 void finished();
00152
00154 void progress(qint64 done, qint64 total);
00155
00157 void stateChanged(QXmppTransferJob::State state);
00158
00159 private slots:
00160 void disconnected();
00161 void receiveData();
00162 void sendData();
00163 void slotTerminated();
00164
00165 private:
00166 QXmppTransferJob(const QString &jid, QXmppTransferJob::Direction direction, QObject *parent);
00167 void checkData();
00168 void setState(QXmppTransferJob::State state);
00169 void terminate(QXmppTransferJob::Error error);
00170 bool writeData(const QByteArray &data);
00171
00172 int m_blockSize;
00173 QXmppTransferJob::Direction m_direction;
00174 qint64 m_done;
00175 QXmppTransferJob::Error m_error;
00176 QCryptographicHash m_hash;
00177 QIODevice *m_iodevice;
00178 QString m_offerId;
00179 QString m_jid;
00180 QString m_sid;
00181 Method m_method;
00182 QString m_mimeType;
00183 QString m_requestId;
00184 State m_state;
00185
00186
00187 QHash<int, QVariant> m_data;
00188
00189
00190 QXmppTransferFileInfo m_fileInfo;
00191
00192
00193 int m_ibbSequence;
00194
00195
00196 QTcpSocket *m_socksSocket;
00197 QXmppByteStreamIq::StreamHost m_socksProxy;
00198
00199 friend class QXmppTransferManager;
00200 };
00201
00210
00211 class QXmppTransferManager : public QObject
00212 {
00213 Q_OBJECT
00214
00215 public:
00216 QXmppTransferManager(QXmppStream *stream, QObject *parent = 0);
00217 QXmppTransferJob *sendFile(const QString &jid, const QString &fileName, const QString &sid = QString());
00218 QXmppTransferJob *sendFile(const QString &jid, QIODevice *device, const QXmppTransferFileInfo &fileInfo, const QString &sid = QString());
00219
00220 QString proxy() const;
00221 void setProxy(const QString &proxyJid);
00222
00223 bool proxyOnly() const;
00224 void setProxyOnly(bool proxyOnly);
00225
00226 QXmppTransferJob::Methods supportedMethods() const;
00227 void setSupportedMethods(QXmppTransferJob::Methods methods);
00228
00229 signals:
00234 void fileReceived(QXmppTransferJob *offer);
00235
00239 void finished(QXmppTransferJob *job);
00240
00242 void logMessage(QXmppLogger::MessageType type, const QString &msg);
00243
00244 private slots:
00245 void byteStreamIqReceived(const QXmppByteStreamIq&);
00246 void ibbCloseIqReceived(const QXmppIbbCloseIq&);
00247 void ibbDataIqReceived(const QXmppIbbDataIq&);
00248 void ibbOpenIqReceived(const QXmppIbbOpenIq&);
00249 void iqReceived(const QXmppIq&);
00250 void jobDestroyed(QObject *object);
00251 void jobError(QXmppTransferJob::Error error);
00252 void jobFinished();
00253 void jobStateChanged(QXmppTransferJob::State state);
00254 void socksServerConnected(QTcpSocket *socket, const QString &hostName, quint16 port);
00255 void streamInitiationIqReceived(const QXmppStreamInitiationIq&);
00256
00257 private:
00258 QXmppTransferJob *getJobByRequestId(const QString &jid, const QString &id);
00259 QXmppTransferJob *getJobBySid(const QString &jid, const QString &sid);
00260 void byteStreamResponseReceived(const QXmppIq&);
00261 void byteStreamResultReceived(const QXmppByteStreamIq&);
00262 void byteStreamSetReceived(const QXmppByteStreamIq&);
00263 void ibbResponseReceived(const QXmppIq&);
00264 void streamInitiationResultReceived(const QXmppStreamInitiationIq&);
00265 void streamInitiationSetReceived(const QXmppStreamInitiationIq&);
00266 void socksServerSendOffer(QXmppTransferJob *job);
00267
00268
00269 QXmppStream* m_stream;
00270 int m_ibbBlockSize;
00271 QList<QXmppTransferJob*> m_jobs;
00272 QString m_proxy;
00273 bool m_proxyOnly;
00274 QXmppSocksServer *m_socksServer;
00275 QXmppTransferJob::Methods m_supportedMethods;
00276 };
00277
00278 Q_DECLARE_OPERATORS_FOR_FLAGS(QXmppTransferJob::Methods)
00279
00280 #endif