183 lines
4.4 KiB
C++
183 lines
4.4 KiB
C++
/*
|
|
* filetransfer.h - File Transfer
|
|
* Copyright (C) 2004 Justin Karneges
|
|
*
|
|
* 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.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
*/
|
|
|
|
#ifndef XMPP_FILETRANSFER_H
|
|
#define XMPP_FILETRANSFER_H
|
|
|
|
#include "im.h"
|
|
|
|
namespace XMPP
|
|
{
|
|
class S5BConnection;
|
|
struct FTRequest;
|
|
|
|
/*class AbstractFileTransfer
|
|
{
|
|
public:
|
|
// Receive
|
|
virtual Jid peer() const = 0;
|
|
virtual QString fileName() const = 0;
|
|
virtual qlonglong fileSize() const = 0;
|
|
virtual QString description() const { return ""; }
|
|
virtual bool rangeSupported() const { return false; }
|
|
virtual void accept(qlonglong offset=0, qlonglong length=0) = 0;
|
|
};*/
|
|
|
|
class FileTransfer : public QObject /*, public AbstractFileTransfer */
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
enum { ErrReject, ErrNeg, ErrConnect, ErrProxy, ErrStream };
|
|
enum { Idle, Requesting, Connecting, WaitingForAccept, Active };
|
|
~FileTransfer();
|
|
|
|
FileTransfer *copy() const;
|
|
|
|
void setProxy(const Jid &proxy);
|
|
|
|
// send
|
|
void sendFile(const Jid &to, const QString &fname, qlonglong size, const QString &desc);
|
|
qlonglong offset() const;
|
|
qlonglong length() const;
|
|
int dataSizeNeeded() const;
|
|
void writeFileData(const QByteArray &a);
|
|
|
|
// receive
|
|
Jid peer() const;
|
|
QString fileName() const;
|
|
qlonglong fileSize() const;
|
|
QString description() const;
|
|
bool rangeSupported() const;
|
|
void accept(qlonglong offset=0, qlonglong length=0);
|
|
|
|
// both
|
|
void close(); // reject, or stop sending/receiving
|
|
S5BConnection *s5bConnection() const; // active link
|
|
|
|
signals:
|
|
void accepted(); // indicates S5BConnection has started
|
|
void connected();
|
|
void readyRead(const QByteArray &a);
|
|
void bytesWritten(int);
|
|
void error(int);
|
|
|
|
private slots:
|
|
void ft_finished();
|
|
void s5b_connected();
|
|
void s5b_connectionClosed();
|
|
void s5b_readyRead();
|
|
void s5b_bytesWritten(int);
|
|
void s5b_error(int);
|
|
void doAccept();
|
|
|
|
private:
|
|
class Private;
|
|
Private *d;
|
|
|
|
void reset();
|
|
|
|
friend class FileTransferManager;
|
|
FileTransfer(FileTransferManager *, QObject *parent=0);
|
|
FileTransfer(const FileTransfer& other);
|
|
void man_waitForAccept(const FTRequest &req);
|
|
void takeConnection(S5BConnection *c);
|
|
};
|
|
|
|
class FileTransferManager : public QObject
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
FileTransferManager(Client *);
|
|
~FileTransferManager();
|
|
|
|
bool isActive(const FileTransfer *ft) const;
|
|
|
|
Client *client() const;
|
|
FileTransfer *createTransfer();
|
|
FileTransfer *takeIncoming();
|
|
|
|
signals:
|
|
void incomingReady();
|
|
|
|
private slots:
|
|
void pft_incoming(const FTRequest &req);
|
|
|
|
private:
|
|
class Private;
|
|
Private *d;
|
|
|
|
friend class Client;
|
|
void s5b_incomingReady(S5BConnection *);
|
|
|
|
friend class FileTransfer;
|
|
QString link(FileTransfer *);
|
|
void con_accept(FileTransfer *);
|
|
void con_reject(FileTransfer *);
|
|
void unlink(FileTransfer *);
|
|
};
|
|
|
|
class JT_FT : public Task
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
JT_FT(Task *parent);
|
|
~JT_FT();
|
|
|
|
void request(const Jid &to, const QString &id, const QString &fname, qlonglong size, const QString &desc, const QStringList &streamTypes);
|
|
qlonglong rangeOffset() const;
|
|
qlonglong rangeLength() const;
|
|
QString streamType() const;
|
|
|
|
void onGo();
|
|
bool take(const QDomElement &);
|
|
|
|
private:
|
|
class Private;
|
|
Private *d;
|
|
};
|
|
|
|
struct FTRequest
|
|
{
|
|
Jid from;
|
|
QString iq_id, id;
|
|
QString fname;
|
|
qlonglong size;
|
|
QString desc;
|
|
bool rangeSupported;
|
|
QStringList streamTypes;
|
|
};
|
|
class JT_PushFT : public Task
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
JT_PushFT(Task *parent);
|
|
~JT_PushFT();
|
|
|
|
void respondSuccess(const Jid &to, const QString &id, qlonglong rangeOffset, qlonglong rangeLength, const QString &streamType);
|
|
void respondError(const Jid &to, const QString &id, int code, const QString &str);
|
|
|
|
bool take(const QDomElement &);
|
|
|
|
signals:
|
|
void incoming(const FTRequest &req);
|
|
};
|
|
}
|
|
|
|
#endif
|