QXmpp Version:0.3.91
QXmppTransferManager.h
00001 /*
00002  * Copyright (C) 2008-2011 The QXmpp developers
00003  *
00004  * Author:
00005  *  Jeremy Lainé
00006  *
00007  * Source:
00008  *  http://code.google.com/p/qxmpp
00009  *
00010  * This file is a part of QXmpp library.
00011  *
00012  * This library is free software; you can redistribute it and/or
00013  * modify it under the terms of the GNU Lesser General Public
00014  * License as published by the Free Software Foundation; either
00015  * version 2.1 of the License, or (at your option) any later version.
00016  *
00017  * This library is distributed in the hope that it will be useful,
00018  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00019  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00020  * Lesser General Public License for more details.
00021  *
00022  */
00023 
00024 #ifndef QXMPPTRANSFERMANAGER_H
00025 #define QXMPPTRANSFERMANAGER_H
00026 
00027 #include <QDateTime>
00028 #include <QUrl>
00029 #include <QVariant>
00030 
00031 #include "QXmppClientExtension.h"
00032 #include "QXmppIq.h"
00033 #include "QXmppByteStreamIq.h"
00034 
00035 class QTcpSocket;
00036 class QXmppByteStreamIq;
00037 class QXmppIbbCloseIq;
00038 class QXmppIbbDataIq;
00039 class QXmppIbbOpenIq;
00040 class QXmppSocksClient;
00041 class QXmppSocksServer;
00042 class QXmppStreamInitiationIq;
00043 class QXmppTransferJobPrivate;
00044 
00045 class QXmppTransferFileInfo
00046 {
00047 public:
00048     QXmppTransferFileInfo();
00049 
00050     QDateTime date() const;
00051     void setDate(const QDateTime &date);
00052 
00053     QByteArray hash() const;
00054     void setHash(const QByteArray &hash);
00055 
00056     QString name() const;
00057     void setName(const QString &name);
00058 
00059     qint64 size() const;
00060     void setSize(qint64 size);
00061 
00062     bool operator==(const QXmppTransferFileInfo &other) const;
00063 
00064 private:
00065     QDateTime m_date;
00066     QByteArray m_hash;
00067     QString m_name;
00068     qint64 m_size;
00069 };
00070 
00075 
00076 class QXmppTransferJob : public QXmppLoggable
00077 {
00078     Q_OBJECT
00079     Q_ENUMS(Direction Error State)
00080     Q_FLAGS(Method Methods)
00081     Q_PROPERTY(Direction direction READ direction CONSTANT)
00082     Q_PROPERTY(QUrl localFileUrl READ localFileUrl WRITE setLocalFileUrl NOTIFY localFileUrlChanged)
00083     Q_PROPERTY(QString jid READ jid CONSTANT)
00084     Q_PROPERTY(Method method READ method CONSTANT)
00085     Q_PROPERTY(State state READ state NOTIFY stateChanged)
00086 
00087     Q_PROPERTY(QString fileName READ fileName CONSTANT)
00088     Q_PROPERTY(qint64 fileSize READ fileSize CONSTANT)
00089 
00090 public:
00092     enum Direction
00093     {
00094         IncomingDirection, 
00095         OutgoingDirection, 
00096     };
00097 
00099     enum Error
00100     {
00101         NoError = 0,      
00102         AbortError,       
00103         FileAccessError,  
00104         FileCorruptError, 
00105         ProtocolError,    
00106     };
00107 
00109     enum Method
00110     {
00111         NoMethod = 0,     
00112         InBandMethod = 1, 
00113         SocksMethod = 2,  
00114         AnyMethod = 3,    
00115     };
00116     Q_DECLARE_FLAGS(Methods, Method)
00117 
00118     
00119     enum State
00120     {
00121         OfferState = 0,    
00122         StartState = 1,    
00123         TransferState = 2, 
00124         FinishedState = 3, 
00125     };
00126 
00127     ~QXmppTransferJob();
00128 
00129     QXmppTransferJob::Direction direction() const;
00130     QXmppTransferJob::Error error() const;
00131     QString jid() const;
00132     QXmppTransferJob::Method method() const;
00133     QString sid() const;
00134     qint64 speed() const;
00135     QXmppTransferJob::State state() const;
00136 
00137     // XEP-0096 : File transfer
00138     QXmppTransferFileInfo fileInfo() const;
00139     QUrl localFileUrl() const;
00140     void setLocalFileUrl(const QUrl &localFileUrl);
00141 
00143     QDateTime fileDate() const;
00144     QByteArray fileHash() const;
00145     QString fileName() const;
00146     qint64 fileSize() const;
00148 
00149 signals:
00152     void error(QXmppTransferJob::Error error);
00153 
00161     void finished();
00162 
00164     void localFileUrlChanged(const QUrl &localFileUrl);
00165 
00167     void progress(qint64 done, qint64 total);
00168 
00170     void stateChanged(QXmppTransferJob::State state);
00171 
00172 public slots:
00173     void abort();
00174     void accept(const QString &filePath);
00175     void accept(QIODevice *output);
00176 
00177 private slots:
00178     void _q_disconnected();
00179     void _q_receiveData();
00180     void _q_sendData();
00181     void _q_terminated();
00182 
00183 private:
00184     QXmppTransferJob(const QString &jid, QXmppTransferJob::Direction direction, QObject *parent);
00185     void checkData();
00186     void setState(QXmppTransferJob::State state);
00187     void terminate(QXmppTransferJob::Error error);
00188     bool writeData(const QByteArray &data);
00189 
00190     QXmppTransferJobPrivate *const d;
00191     friend class QXmppTransferManager;
00192 };
00193 
00210 
00211 class QXmppTransferManager : public QXmppClientExtension
00212 {
00213     Q_OBJECT
00214     Q_PROPERTY(QString proxy READ proxy WRITE setProxy)
00215     Q_PROPERTY(bool proxyOnly READ proxyOnly WRITE setProxyOnly)
00216     Q_PROPERTY(QXmppTransferJob::Methods supportedMethods READ supportedMethods WRITE setSupportedMethods)
00217 
00218 public:
00219     QXmppTransferManager();
00220 
00221     QString proxy() const;
00222     void setProxy(const QString &proxyJid);
00223 
00224     bool proxyOnly() const;
00225     void setProxyOnly(bool proxyOnly);
00226 
00227     QXmppTransferJob::Methods supportedMethods() const;
00228     void setSupportedMethods(QXmppTransferJob::Methods methods);
00229 
00231     QStringList discoveryFeatures() const;
00232     bool handleStanza(const QDomElement &element);
00234 
00235 signals:
00240     void fileReceived(QXmppTransferJob *job);
00241 
00243     void jobStarted(QXmppTransferJob *job);
00244 
00248     void jobFinished(QXmppTransferJob *job);
00249 
00250 public slots:
00251     QXmppTransferJob *sendFile(const QString &jid, const QString &filePath, const QString &sid = QString());
00252     QXmppTransferJob *sendFile(const QString &jid, QIODevice *device, const QXmppTransferFileInfo &fileInfo, const QString &sid = QString());
00253 
00254 protected:
00256     void setClient(QXmppClient* client);
00258 
00259 private slots:
00260     void _q_iqReceived(const QXmppIq&);
00261     void _q_jobDestroyed(QObject *object);
00262     void _q_jobError(QXmppTransferJob::Error error);
00263     void _q_jobFinished();
00264     void _q_jobStateChanged(QXmppTransferJob::State state);
00265     void _q_socksServerConnected(QTcpSocket *socket, const QString &hostName, quint16 port);
00266 
00267 private:
00268     QXmppTransferJob *getJobByRequestId(QXmppTransferJob::Direction direction, const QString &jid, const QString &id);
00269     QXmppTransferJob *getJobBySid(QXmppTransferJob::Direction, const QString &jid, const QString &sid);
00270     void byteStreamIqReceived(const QXmppByteStreamIq&);
00271     void byteStreamResponseReceived(const QXmppIq&);
00272     void byteStreamResultReceived(const QXmppByteStreamIq&);
00273     void byteStreamSetReceived(const QXmppByteStreamIq&);
00274     void ibbCloseIqReceived(const QXmppIbbCloseIq&);
00275     void ibbDataIqReceived(const QXmppIbbDataIq&);
00276     void ibbOpenIqReceived(const QXmppIbbOpenIq&);
00277     void ibbResponseReceived(const QXmppIq&);
00278     void streamInitiationIqReceived(const QXmppStreamInitiationIq&);
00279     void streamInitiationResultReceived(const QXmppStreamInitiationIq&);
00280     void streamInitiationSetReceived(const QXmppStreamInitiationIq&);
00281     void socksServerSendOffer(QXmppTransferJob *job);
00282 
00283     int m_ibbBlockSize;
00284     QList<QXmppTransferJob*> m_jobs;
00285     QString m_proxy;
00286     bool m_proxyOnly;
00287     QXmppSocksServer *m_socksServer;
00288     QXmppTransferJob::Methods m_supportedMethods;
00289 };
00290 
00291 Q_DECLARE_OPERATORS_FOR_FLAGS(QXmppTransferJob::Methods)
00292 
00293 #endif
 All Classes Functions Enumerations Enumerator Properties