aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-11-09 12:47:05 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-11-09 12:47:05 +0000
commitd6d0b4d7a57b9d36b868b49fb83bf6ddc301274b (patch)
treeb8cd08275de5a44a8adc68ef531d214fac322370 /src
parent4e929a0dba54816fea45e9a90a749f5afae6c541 (diff)
downloadqxmpp-d6d0b4d7a57b9d36b868b49fb83bf6ddc301274b.tar.gz
start hiding some of QXmppTransferJob's internals
Diffstat (limited to 'src')
-rw-r--r--src/QXmppTransferManager.cpp360
-rw-r--r--src/QXmppTransferManager.h36
2 files changed, 208 insertions, 188 deletions
diff --git a/src/QXmppTransferManager.cpp b/src/QXmppTransferManager.cpp
index 4071817a..ad56ccf2 100644
--- a/src/QXmppTransferManager.cpp
+++ b/src/QXmppTransferManager.cpp
@@ -21,10 +21,14 @@
*
*/
+#include <QCryptographicHash>
#include <QDomElement>
#include <QFile>
#include <QFileInfo>
+#include <QHash>
+#include <QHostAddress>
#include <QNetworkInterface>
+#include <QTime>
#include <QTimer>
#include "QXmppByteStreamIq.h"
@@ -99,20 +103,64 @@ bool QXmppTransferFileInfo::operator==(const QXmppTransferFileInfo &other) const
other.m_name == m_name;
}
+class QXmppTransferJobPrivate
+{
+public:
+ QXmppTransferJobPrivate();
+
+ int blockSize;
+ QXmppTransferJob::Direction direction;
+ qint64 done;
+ QXmppTransferJob::Error error;
+ QCryptographicHash hash;
+ QIODevice *iodevice;
+ QString offerId;
+ QString jid;
+ QString sid;
+ QXmppTransferJob::Method method;
+ QString mimeType;
+ QString requestId;
+ QXmppTransferJob::State state;
+ QTime transferStart;
+
+ // arbitrary data
+ QHash<int, QVariant> data;
+
+ // file meta-data
+ QXmppTransferFileInfo fileInfo;
+
+ // for in-band bytestreams
+ int ibbSequence;
+
+ // for socks5 bytestreams
+ QTcpSocket *socksSocket;
+ QXmppByteStreamIq::StreamHost socksProxy;
+};
+
+QXmppTransferJobPrivate::QXmppTransferJobPrivate()
+ : blockSize(16384),
+ done(0),
+ error(QXmppTransferJob::NoError),
+ hash(QCryptographicHash::Md5),
+ iodevice(0),
+ method(QXmppTransferJob::NoMethod),
+ state(QXmppTransferJob::OfferState),
+ ibbSequence(0),
+ socksSocket(0)
+{
+}
+
QXmppTransferJob::QXmppTransferJob(const QString &jid, QXmppTransferJob::Direction direction, QObject *parent)
: QObject(parent),
- m_blockSize(16384),
- m_direction(direction),
- m_done(0),
- m_error(NoError),
- m_hash(QCryptographicHash::Md5),
- m_iodevice(0),
- m_jid(jid),
- m_method(NoMethod),
- m_state(OfferState),
- m_ibbSequence(0),
- m_socksSocket(0)
+ d(new QXmppTransferJobPrivate)
+{
+ d->direction = direction;
+ d->jid = jid;
+}
+
+QXmppTransferJob::~QXmppTransferJob()
{
+ delete d;
}
/// Call this method if you wish to abort on ongoing transfer job.
@@ -128,17 +176,17 @@ void QXmppTransferJob::abort()
void QXmppTransferJob::accept(QIODevice *iodevice)
{
- if (m_direction == IncomingDirection && m_state == OfferState && !m_iodevice)
+ if (d->direction == IncomingDirection && d->state == OfferState && !d->iodevice)
{
- m_iodevice = iodevice;
+ d->iodevice = iodevice;
setState(QXmppTransferJob::StartState);
}
}
void QXmppTransferJob::checkData()
{
- if ((m_fileInfo.size() && m_done != m_fileInfo.size()) ||
- (!m_fileInfo.hash().isEmpty() && m_hash.result() != m_fileInfo.hash()))
+ if ((d->fileInfo.size() && d->done != d->fileInfo.size()) ||
+ (!d->fileInfo.hash().isEmpty() && d->hash.result() != d->fileInfo.hash()))
terminate(QXmppTransferJob::FileCorruptError);
else
terminate(QXmppTransferJob::NoError);
@@ -150,7 +198,7 @@ void QXmppTransferJob::checkData()
QVariant QXmppTransferJob::data(int role) const
{
- return m_data.value(role);
+ return d->data.value(role);
}
/// Sets the data for a given role to the given value.
@@ -160,7 +208,7 @@ QVariant QXmppTransferJob::data(int role) const
void QXmppTransferJob::setData(int role, const QVariant &value)
{
- m_data.insert(role, value);
+ d->data.insert(role, value);
}
/// Returns the job's transfer direction.
@@ -168,7 +216,7 @@ void QXmppTransferJob::setData(int role, const QVariant &value)
QXmppTransferJob::Direction QXmppTransferJob::direction() const
{
- return m_direction;
+ return d->direction;
}
/// Returns the last error that was encountered.
@@ -176,7 +224,7 @@ QXmppTransferJob::Direction QXmppTransferJob::direction() const
QXmppTransferJob::Error QXmppTransferJob::error() const
{
- return m_error;
+ return d->error;
}
/// Returns the remote party's JID.
@@ -184,7 +232,7 @@ QXmppTransferJob::Error QXmppTransferJob::error() const
QString QXmppTransferJob::jid() const
{
- return m_jid;
+ return d->jid;
}
/// Returns meta-data about the file being transferred.
@@ -192,27 +240,27 @@ QString QXmppTransferJob::jid() const
QXmppTransferFileInfo QXmppTransferJob::fileInfo() const
{
- return m_fileInfo;
+ return d->fileInfo;
}
QDateTime QXmppTransferJob::fileDate() const
{
- return m_fileInfo.date();
+ return d->fileInfo.date();
}
QByteArray QXmppTransferJob::fileHash() const
{
- return m_fileInfo.hash();
+ return d->fileInfo.hash();
}
QString QXmppTransferJob::fileName() const
{
- return m_fileInfo.name();
+ return d->fileInfo.name();
}
qint64 QXmppTransferJob::fileSize() const
{
- return m_fileInfo.size();
+ return d->fileInfo.size();
}
/// Returns the job's transfer method.
@@ -220,7 +268,7 @@ qint64 QXmppTransferJob::fileSize() const
QXmppTransferJob::Method QXmppTransferJob::method() const
{
- return m_method;
+ return d->method;
}
/// Returns the job's session identifier.
@@ -228,7 +276,7 @@ QXmppTransferJob::Method QXmppTransferJob::method() const
QString QXmppTransferJob::sid() const
{
- return m_sid;
+ return d->sid;
}
/// Returns the job's transfer speed in bytes per second.
@@ -238,10 +286,10 @@ QString QXmppTransferJob::sid() const
qint64 QXmppTransferJob::speed() const
{
- qint64 elapsed = m_transferStart.elapsed();
- if (m_state != QXmppTransferJob::TransferState || !elapsed)
+ qint64 elapsed = d->transferStart.elapsed();
+ if (d->state != QXmppTransferJob::TransferState || !elapsed)
return 0;
- return (m_done * 1000.0) / elapsed;
+ return (d->done * 1000.0) / elapsed;
}
/// Returns the job's state.
@@ -249,31 +297,31 @@ qint64 QXmppTransferJob::speed() const
QXmppTransferJob::State QXmppTransferJob::state() const
{
- return m_state;
+ return d->state;
}
void QXmppTransferJob::setState(QXmppTransferJob::State state)
{
- if (m_state != state)
+ if (d->state != state)
{
- m_state = state;
- if (m_state == QXmppTransferJob::TransferState)
- m_transferStart.start();
- emit stateChanged(m_state);
+ d->state = state;
+ if (d->state == QXmppTransferJob::TransferState)
+ d->transferStart.start();
+ emit stateChanged(d->state);
}
}
void QXmppTransferJob::disconnected()
{
- if (m_state == QXmppTransferJob::FinishedState)
+ if (d->state == QXmppTransferJob::FinishedState)
return;
// terminate transfer
- if (m_direction == QXmppTransferJob::IncomingDirection)
+ if (d->direction == QXmppTransferJob::IncomingDirection)
{
checkData();
} else {
- if (fileSize() && m_done != fileSize())
+ if (fileSize() && d->done != fileSize())
terminate(QXmppTransferJob::ProtocolError);
else
terminate(QXmppTransferJob::NoError);
@@ -282,39 +330,39 @@ void QXmppTransferJob::disconnected()
void QXmppTransferJob::receiveData()
{
- if (m_state != QXmppTransferJob::TransferState)
+ if (d->state != QXmppTransferJob::TransferState)
return;
// receive data block
- if (m_direction == QXmppTransferJob::IncomingDirection)
+ if (d->direction == QXmppTransferJob::IncomingDirection)
{
- writeData(m_socksSocket->readAll());
+ writeData(d->socksSocket->readAll());
// if we have received all the data, stop here
- if (fileSize() && m_done >= fileSize())
+ if (fileSize() && d->done >= fileSize())
checkData();
}
}
void QXmppTransferJob::sendData()
{
- if (m_state != QXmppTransferJob::TransferState)
+ if (d->state != QXmppTransferJob::TransferState)
return;
// don't saturate the outgoing socket
- if (m_socksSocket->bytesToWrite() > 2 * m_blockSize)
+ if (d->socksSocket->bytesToWrite() > 2 * d->blockSize)
return;
// check whether we have written the whole file
- if (m_fileInfo.size() && m_done >= m_fileInfo.size())
+ if (d->fileInfo.size() && d->done >= d->fileInfo.size())
{
- if (!m_socksSocket->bytesToWrite())
+ if (!d->socksSocket->bytesToWrite())
terminate(QXmppTransferJob::NoError);
return;
}
- char *buffer = new char[m_blockSize];
- qint64 length = m_iodevice->read(buffer, m_blockSize);
+ char *buffer = new char[d->blockSize];
+ qint64 length = d->iodevice->read(buffer, d->blockSize);
if (length < 0)
{
delete [] buffer;
@@ -323,39 +371,39 @@ void QXmppTransferJob::sendData()
}
if (length > 0)
{
- m_socksSocket->write(buffer, length);
+ d->socksSocket->write(buffer, length);
delete [] buffer;
- m_done += length;
- emit progress(m_done, fileSize());
+ d->done += length;
+ emit progress(d->done, fileSize());
}
}
void QXmppTransferJob::slotTerminated()
{
- emit stateChanged(m_state);
- if (m_error != NoError)
- emit error(m_error);
+ emit stateChanged(d->state);
+ if (d->error != NoError)
+ emit error(d->error);
emit finished();
}
void QXmppTransferJob::terminate(QXmppTransferJob::Error cause)
{
- if (m_state == FinishedState)
+ if (d->state == FinishedState)
return;
// change state
- m_error = cause;
- m_state = FinishedState;
+ d->error = cause;
+ d->state = FinishedState;
// close IO device
- if (m_iodevice)
- m_iodevice->close();
+ if (d->iodevice)
+ d->iodevice->close();
// close socket
- if (m_socksSocket)
+ if (d->socksSocket)
{
- m_socksSocket->flush();
- m_socksSocket->close();
+ d->socksSocket->flush();
+ d->socksSocket->close();
}
// emit signals later
@@ -364,13 +412,13 @@ void QXmppTransferJob::terminate(QXmppTransferJob::Error cause)
bool QXmppTransferJob::writeData(const QByteArray &data)
{
- const qint64 written = m_iodevice->write(data);
+ const qint64 written = d->iodevice->write(data);
if (written < 0)
return false;
- m_done += written;
- if (!m_fileInfo.hash().isEmpty())
- m_hash.addData(data);
- progress(m_done, m_fileInfo.size());
+ d->done += written;
+ if (!d->fileInfo.hash().isEmpty())
+ d->hash.addData(data);
+ progress(d->done, d->fileInfo.size());
return true;
}
@@ -402,11 +450,11 @@ void QXmppTransferManager::byteStreamIqReceived(const QXmppByteStreamIq &iq)
// handle IQ from proxy
foreach (QXmppTransferJob *job, m_jobs)
{
- if (job->m_socksProxy.jid() == iq.from() && job->m_requestId == iq.id())
+ if (job->d->socksProxy.jid() == iq.from() && job->d->requestId == iq.id())
{
if (iq.type() == QXmppIq::Result && iq.streamHosts().size() > 0)
{
- job->m_socksProxy = iq.streamHosts().first();
+ job->d->socksProxy = iq.streamHosts().first();
socksServerSendOffer(job);
return;
}
@@ -444,18 +492,18 @@ void QXmppTransferManager::byteStreamResultReceived(const QXmppByteStreamIq &iq)
return;
// check the stream host
- if (iq.streamHostUsed() == job->m_socksProxy.jid())
+ if (iq.streamHostUsed() == job->d->socksProxy.jid())
{
- const QXmppByteStreamIq::StreamHost streamHost = job->m_socksProxy;
+ const QXmppByteStreamIq::StreamHost streamHost = job->d->socksProxy;
info(QString("Connecting to proxy: %1 (%2:%3)").arg(
streamHost.jid(),
streamHost.host().toString(),
QString::number(streamHost.port())));
// connect to proxy
- const QString hostName = streamHash(job->m_sid,
+ const QString hostName = streamHash(job->d->sid,
client()->configuration().jid(),
- job->m_jid);
+ job->d->jid);
QXmppSocksClient *socksClient = new QXmppSocksClient(streamHost.host(), streamHost.port(), job);
socksClient->connectToHost(hostName, 0);
@@ -470,32 +518,32 @@ void QXmppTransferManager::byteStreamResultReceived(const QXmppByteStreamIq &iq)
job->terminate(QXmppTransferJob::ProtocolError);
return;
}
- job->m_socksSocket = socksClient;
- connect(job->m_socksSocket, SIGNAL(disconnected()), job, SLOT(disconnected()));
+ job->d->socksSocket = socksClient;
+ connect(job->d->socksSocket, SIGNAL(disconnected()), job, SLOT(disconnected()));
// activate stream
QXmppByteStreamIq streamIq;
streamIq.setType(QXmppIq::Set);
streamIq.setFrom(client()->configuration().jid());
streamIq.setTo(streamHost.jid());
- streamIq.setSid(job->m_sid);
- streamIq.setActivate(job->m_jid);
- job->m_requestId = streamIq.id();
+ streamIq.setSid(job->d->sid);
+ streamIq.setActivate(job->d->jid);
+ job->d->requestId = streamIq.id();
client()->sendPacket(streamIq);
return;
}
// direction connection, start sending data
- if (!job->m_socksSocket)
+ if (!job->d->socksSocket)
{
warning("Client says they connected to our SOCKS server, but they did not");
job->terminate(QXmppTransferJob::ProtocolError);
return;
}
job->setState(QXmppTransferJob::TransferState);
- connect(job->m_socksSocket, SIGNAL(disconnected()), job, SLOT(disconnected()));
- connect(job->m_socksSocket, SIGNAL(bytesWritten(qint64)), job, SLOT(sendData()));
- connect(job->m_iodevice, SIGNAL(readyRead()), job, SLOT(sendData()));
+ connect(job->d->socksSocket, SIGNAL(disconnected()), job, SLOT(disconnected()));
+ connect(job->d->socksSocket, SIGNAL(bytesWritten(qint64)), job, SLOT(sendData()));
+ connect(job->d->iodevice, SIGNAL(readyRead()), job, SLOT(sendData()));
job->sendData();
}
@@ -529,8 +577,8 @@ void QXmppTransferManager::byteStreamSetReceived(const QXmppByteStreamIq &iq)
streamHost.host().toString(),
QString::number(streamHost.port())));
- const QString hostName = streamHash(job->m_sid,
- job->m_jid,
+ const QString hostName = streamHash(job->d->sid,
+ job->d->jid,
client()->configuration().jid());
// try to connect to stream host
@@ -540,15 +588,15 @@ void QXmppTransferManager::byteStreamSetReceived(const QXmppByteStreamIq &iq)
if (socksClient->waitForReady(socksTimeout))
{
job->setState(QXmppTransferJob::TransferState);
- job->m_socksSocket = socksClient;
- connect(job->m_socksSocket, SIGNAL(readyRead()), job, SLOT(receiveData()));
- connect(job->m_socksSocket, SIGNAL(disconnected()), job, SLOT(disconnected()));
+ job->d->socksSocket = socksClient;
+ connect(job->d->socksSocket, SIGNAL(readyRead()), job, SLOT(receiveData()));
+ connect(job->d->socksSocket, SIGNAL(disconnected()), job, SLOT(disconnected()));
QXmppByteStreamIq ackIq;
ackIq.setId(iq.id());
ackIq.setTo(iq.from());
ackIq.setType(QXmppIq::Result);
- ackIq.setSid(job->m_sid);
+ ackIq.setSid(job->d->sid);
ackIq.setStreamHostUsed(streamHost.jid());
client()->sendPacket(ackIq);
return;
@@ -630,9 +678,9 @@ bool QXmppTransferManager::handleStanza(const QDomElement &element)
QXmppTransferJob* QXmppTransferManager::getJobByRequestId(QXmppTransferJob::Direction direction, const QString &jid, const QString &id)
{
foreach (QXmppTransferJob *job, m_jobs)
- if (job->m_direction == direction &&
- job->m_jid == jid &&
- job->m_requestId == id)
+ if (job->d->direction == direction &&
+ job->d->jid == jid &&
+ job->d->requestId == id)
return job;
return 0;
}
@@ -640,9 +688,9 @@ QXmppTransferJob* QXmppTransferManager::getJobByRequestId(QXmppTransferJob::Dire
QXmppTransferJob* QXmppTransferManager::getJobBySid(QXmppTransferJob::Direction direction, const QString &jid, const QString &sid)
{
foreach (QXmppTransferJob *job, m_jobs)
- if (job->m_direction == direction &&
- job->m_jid == jid &&
- job->m_sid == sid)
+ if (job->d->direction == direction &&
+ job->d->jid == jid &&
+ job->d->sid == sid)
return job;
return 0;
}
@@ -692,7 +740,7 @@ void QXmppTransferManager::ibbDataIqReceived(const QXmppIbbDataIq &iq)
return;
}
- if (iq.sequence() != job->m_ibbSequence)
+ if (iq.sequence() != job->d->ibbSequence)
{
// the packet is out of sequence
QXmppStanza::Error error(QXmppStanza::Error::Cancel, QXmppStanza::Error::UnexpectedRequest);
@@ -704,7 +752,7 @@ void QXmppTransferManager::ibbDataIqReceived(const QXmppIbbDataIq &iq)
// write data
job->writeData(iq.payload());
- job->m_ibbSequence++;
+ job->d->ibbSequence++;
// acknowledge the packet
response.setType(QXmppIq::Result);
@@ -739,7 +787,7 @@ void QXmppTransferManager::ibbOpenIqReceived(const QXmppIbbOpenIq &iq)
return;
}
- job->m_blockSize = iq.blockSize();
+ job->d->blockSize = iq.blockSize();
job->setState(QXmppTransferJob::TransferState);
// accept transfer
@@ -756,32 +804,32 @@ void QXmppTransferManager::ibbResponseReceived(const QXmppIq &iq)
return;
// if the IO device is closed, do nothing
- if (!job->m_iodevice->isOpen())
+ if (!job->d->iodevice->isOpen())
return;
if (iq.type() == QXmppIq::Result)
{
- const QByteArray buffer = job->m_iodevice->read(job->m_blockSize);
+ const QByteArray buffer = job->d->iodevice->read(job->d->blockSize);
job->setState(QXmppTransferJob::TransferState);
if (buffer.size())
{
// send next data block
QXmppIbbDataIq dataIq;
- dataIq.setTo(job->m_jid);
- dataIq.setSid(job->m_sid);
- dataIq.setSequence(job->m_ibbSequence++);
+ dataIq.setTo(job->d->jid);
+ dataIq.setSid(job->d->sid);
+ dataIq.setSequence(job->d->ibbSequence++);
dataIq.setPayload(buffer);
- job->m_requestId = dataIq.id();
+ job->d->requestId = dataIq.id();
client()->sendPacket(dataIq);
- job->m_done += buffer.size();
- job->progress(job->m_done, job->fileSize());
+ job->d->done += buffer.size();
+ job->progress(job->d->done, job->fileSize());
} else {
// close the bytestream
QXmppIbbCloseIq closeIq;
- closeIq.setTo(job->m_jid);
- closeIq.setSid(job->m_sid);
- job->m_requestId = closeIq.id();
+ closeIq.setTo(job->d->jid);
+ closeIq.setSid(job->d->sid);
+ job->d->requestId = closeIq.id();
client()->sendPacket(closeIq);
job->terminate(QXmppTransferJob::NoError);
@@ -791,9 +839,9 @@ void QXmppTransferManager::ibbResponseReceived(const QXmppIq &iq)
{
// close the bytestream
QXmppIbbCloseIq closeIq;
- closeIq.setTo(job->m_jid);
- closeIq.setSid(job->m_sid);
- job->m_requestId = closeIq.id();
+ closeIq.setTo(job->d->jid);
+ closeIq.setSid(job->d->sid);
+ job->d->requestId = closeIq.id();
client()->sendPacket(closeIq);
job->terminate(QXmppTransferJob::ProtocolError);
@@ -805,17 +853,17 @@ void QXmppTransferManager::iqReceived(const QXmppIq &iq)
foreach (QXmppTransferJob *job, m_jobs)
{
// handle IQ from proxy
- if (job->m_socksProxy.jid() == iq.from() && job->m_requestId == iq.id())
+ if (job->d->socksProxy.jid() == iq.from() && job->d->requestId == iq.id())
{
- if (job->m_socksSocket)
+ if (job->d->socksSocket)
{
// proxy connection activation result
if (iq.type() == QXmppIq::Result)
{
// proxy stream activated, start sending data
job->setState(QXmppTransferJob::TransferState);
- connect(job->m_socksSocket, SIGNAL(bytesWritten(qint64)), job, SLOT(sendData()));
- connect(job->m_iodevice, SIGNAL(readyRead()), job, SLOT(sendData()));
+ connect(job->d->socksSocket, SIGNAL(bytesWritten(qint64)), job, SLOT(sendData()));
+ connect(job->d->iodevice, SIGNAL(readyRead()), job, SLOT(sendData()));
job->sendData();
} else if (iq.type() == QXmppIq::Error) {
// proxy stream not activated, terminate
@@ -831,7 +879,7 @@ void QXmppTransferManager::iqReceived(const QXmppIq &iq)
}
// handle IQ from peer
- else if (job->m_jid == iq.from() && job->m_requestId == iq.id())
+ else if (job->d->jid == iq.from() && job->d->requestId == iq.id())
{
if (job->direction() == QXmppTransferJob::OutgoingDirection &&
job->method() == QXmppTransferJob::InBandMethod)
@@ -873,9 +921,9 @@ void QXmppTransferManager::jobError(QXmppTransferJob::Error error)
{
// close the bytestream
QXmppIbbCloseIq closeIq;
- closeIq.setTo(job->m_jid);
- closeIq.setSid(job->m_sid);
- job->m_requestId = closeIq.id();
+ closeIq.setTo(job->d->jid);
+ closeIq.setSid(job->d->sid);
+ job->d->requestId = closeIq.id();
client()->sendPacket(closeIq);
}
}
@@ -902,14 +950,14 @@ void QXmppTransferManager::jobStateChanged(QXmppTransferJob::State state)
disconnect(job, SIGNAL(stateChanged(QXmppTransferJob::State)), this, SLOT(jobStateChanged(QXmppTransferJob::State)));
// the job was refused by the local party
- if (state != QXmppTransferJob::StartState || !job->m_iodevice || !job->m_iodevice->isWritable())
+ if (state != QXmppTransferJob::StartState || !job->d->iodevice || !job->d->iodevice->isWritable())
{
QXmppStanza::Error error(QXmppStanza::Error::Cancel, QXmppStanza::Error::Forbidden);
error.setCode(403);
QXmppIq response;
response.setTo(job->jid());
- response.setId(job->m_offerId);
+ response.setId(job->d->offerId);
response.setType(QXmppIq::Error);
response.setError(error);
client()->sendPacket(response);
@@ -946,7 +994,7 @@ void QXmppTransferManager::jobStateChanged(QXmppTransferJob::State state)
QXmppStreamInitiationIq response;
response.setTo(job->jid());
- response.setId(job->m_offerId);
+ response.setId(job->d->offerId);
response.setType(QXmppIq::Result);
response.setProfile(QXmppStreamInitiationIq::FileTransfer);
response.setSiItems(feature);
@@ -1001,11 +1049,11 @@ QXmppTransferJob *QXmppTransferManager::sendFile(const QString &jid, QIODevice *
{
QXmppTransferJob *job = new QXmppTransferJob(jid, QXmppTransferJob::OutgoingDirection, this);
if (sid.isEmpty())
- job->m_sid = generateStanzaHash();
+ job->d->sid = generateStanzaHash();
else
- job->m_sid = sid;
- job->m_fileInfo = fileInfo;
- job->m_iodevice = device;
+ job->d->sid = sid;
+ job->d->fileInfo = fileInfo;
+ job->d->iodevice = device;
if (device)
device->setParent(job);
@@ -1088,8 +1136,8 @@ QXmppTransferJob *QXmppTransferManager::sendFile(const QString &jid, QIODevice *
request.setTo(jid);
request.setProfile(QXmppStreamInitiationIq::FileTransfer);
request.setSiItems(items);
- request.setSiId(job->m_sid);
- job->m_requestId = request.id();
+ request.setSiId(job->d->sid);
+ job->d->requestId = request.id();
client()->sendPacket(request);
return job;
@@ -1100,9 +1148,9 @@ void QXmppTransferManager::socksServerConnected(QTcpSocket *socket, const QStrin
const QString ownJid = client()->configuration().jid();
foreach (QXmppTransferJob *job, m_jobs)
{
- if (hostName == streamHash(job->m_sid, ownJid, job->jid()) && port == 0)
+ if (hostName == streamHash(job->d->sid, ownJid, job->jid()) && port == 0)
{
- job->m_socksSocket = socket;
+ job->d->socksSocket = socket;
return;
}
}
@@ -1141,8 +1189,8 @@ void QXmppTransferManager::socksServerSendOffer(QXmppTransferJob *job)
}
// add proxy
- if (!job->m_socksProxy.jid().isEmpty())
- streamHosts.append(job->m_socksProxy);
+ if (!job->d->socksProxy.jid().isEmpty())
+ streamHosts.append(job->d->socksProxy);
// check we have some stream hosts
if (!streamHosts.size())
@@ -1155,10 +1203,10 @@ void QXmppTransferManager::socksServerSendOffer(QXmppTransferJob *job)
// send offer
QXmppByteStreamIq streamIq;
streamIq.setType(QXmppIq::Set);
- streamIq.setTo(job->m_jid);
- streamIq.setSid(job->m_sid);
+ streamIq.setTo(job->d->jid);
+ streamIq.setSid(job->d->sid);
streamIq.setStreamHosts(streamHosts);
- job->m_requestId = streamIq.id();
+ job->d->requestId = streamIq.id();
client()->sendPacket(streamIq);
}
@@ -1189,10 +1237,10 @@ void QXmppTransferManager::streamInitiationResultReceived(const QXmppStreamIniti
{
if ((field.firstChildElement("value").value() == ns_ibb) &&
(m_supportedMethods & QXmppTransferJob::InBandMethod))
- job->m_method = QXmppTransferJob::InBandMethod;
+ job->d->method = QXmppTransferJob::InBandMethod;
else if ((field.firstChildElement("value").value() == ns_bytestreams) &&
(m_supportedMethods & QXmppTransferJob::SocksMethod))
- job->m_method = QXmppTransferJob::SocksMethod;
+ job->d->method = QXmppTransferJob::SocksMethod;
}
field = field.nextSiblingElement("field");
}
@@ -1204,13 +1252,13 @@ void QXmppTransferManager::streamInitiationResultReceived(const QXmppStreamIniti
if (job->method() == QXmppTransferJob::InBandMethod)
{
// lower block size for IBB
- job->m_blockSize = m_ibbBlockSize;
+ job->d->blockSize = m_ibbBlockSize;
QXmppIbbOpenIq openIq;
- openIq.setTo(job->m_jid);
- openIq.setSid(job->m_sid);
- openIq.setBlockSize(job->m_blockSize);
- job->m_requestId = openIq.id();
+ openIq.setTo(job->d->jid);
+ openIq.setSid(job->d->sid);
+ openIq.setBlockSize(job->d->blockSize);
+ job->d->requestId = openIq.id();
client()->sendPacket(openIq);
} else if (job->method() == QXmppTransferJob::SocksMethod) {
if (!m_socksServer->isListening())
@@ -1221,14 +1269,14 @@ void QXmppTransferManager::streamInitiationResultReceived(const QXmppStreamIniti
}
if (!m_proxy.isEmpty())
{
- job->m_socksProxy.setJid(m_proxy);
+ job->d->socksProxy.setJid(m_proxy);
// query proxy
QXmppByteStreamIq streamIq;
streamIq.setType(QXmppIq::Get);
- streamIq.setTo(job->m_socksProxy.jid());
- streamIq.setSid(job->m_sid);
- job->m_requestId = streamIq.id();
+ streamIq.setTo(job->d->socksProxy.jid());
+ streamIq.setSid(job->d->sid);
+ job->d->requestId = streamIq.id();
client()->sendPacket(streamIq);
} else {
socksServerSendOffer(job);
@@ -1274,9 +1322,9 @@ void QXmppTransferManager::streamInitiationSetReceived(const QXmppStreamInitiati
// check the stream type
QXmppTransferJob *job = new QXmppTransferJob(iq.from(), QXmppTransferJob::IncomingDirection, this);
int offeredMethods = QXmppTransferJob::NoMethod;
- job->m_offerId = iq.id();
- job->m_sid = iq.siId();
- job->m_mimeType = iq.mimeType();
+ job->d->offerId = iq.id();
+ job->d->sid = iq.siId();
+ job->d->mimeType = iq.mimeType();
foreach (const QXmppElement &item, iq.siItems())
{
if (item.tagName() == "feature" && item.attribute("xmlns") == ns_feature_negotiation)
@@ -1301,19 +1349,19 @@ void QXmppTransferManager::streamInitiationSetReceived(const QXmppStreamInitiati
}
else if (item.tagName() == "file" && item.attribute("xmlns") == ns_stream_initiation_file_transfer)
{
- job->m_fileInfo.setDate(datetimeFromString(item.attribute("date")));
- job->m_fileInfo.setHash(QByteArray::fromHex(item.attribute("hash").toAscii()));
- job->m_fileInfo.setName(item.attribute("name"));
- job->m_fileInfo.setSize(item.attribute("size").toLongLong());
+ job->d->fileInfo.setDate(datetimeFromString(item.attribute("date")));
+ job->d->fileInfo.setHash(QByteArray::fromHex(item.attribute("hash").toAscii()));
+ job->d->fileInfo.setName(item.attribute("name"));
+ job->d->fileInfo.setSize(item.attribute("size").toLongLong());
}
}
// select a method supported by both parties
int sharedMethods = (offeredMethods & m_supportedMethods);
if (sharedMethods & QXmppTransferJob::SocksMethod)
- job->m_method = QXmppTransferJob::SocksMethod;
+ job->d->method = QXmppTransferJob::SocksMethod;
else if (sharedMethods & QXmppTransferJob::InBandMethod)
- job->m_method = QXmppTransferJob::InBandMethod;
+ job->d->method = QXmppTransferJob::InBandMethod;
else
{
// FIXME : we should add:
diff --git a/src/QXmppTransferManager.h b/src/QXmppTransferManager.h
index f4d025e7..6584a31f 100644
--- a/src/QXmppTransferManager.h
+++ b/src/QXmppTransferManager.h
@@ -24,12 +24,8 @@
#ifndef QXMPPTRANSFERMANAGER_H
#define QXMPPTRANSFERMANAGER_H
-#include <QCryptographicHash>
#include <QDateTime>
-#include <QHash>
-#include <QHostAddress>
#include <QVariant>
-#include <QTime>
#include "QXmppClientExtension.h"
#include "QXmppIq.h"
@@ -43,6 +39,7 @@ class QXmppIbbOpenIq;
class QXmppSocksClient;
class QXmppSocksServer;
class QXmppStreamInitiationIq;
+class QXmppTransferJobPrivate;
class QXmppTransferFileInfo
{
@@ -116,6 +113,8 @@ public:
FinishedState = 3, ///< The transfer is finished.
};
+ ~QXmppTransferJob();
+
void abort();
void accept(QIODevice *output);
@@ -170,34 +169,7 @@ private:
void terminate(QXmppTransferJob::Error error);
bool writeData(const QByteArray &data);
- int m_blockSize;
- QXmppTransferJob::Direction m_direction;
- qint64 m_done;
- QXmppTransferJob::Error m_error;
- QCryptographicHash m_hash;
- QIODevice *m_iodevice;
- QString m_offerId;
- QString m_jid;
- QString m_sid;
- Method m_method;
- QString m_mimeType;
- QString m_requestId;
- State m_state;
- QTime m_transferStart;
-
- // arbitrary data
- QHash<int, QVariant> m_data;
-
- // file meta-data
- QXmppTransferFileInfo m_fileInfo;
-
- // for in-band bytestreams
- int m_ibbSequence;
-
- // for socks5 bytestreams
- QTcpSocket *m_socksSocket;
- QXmppByteStreamIq::StreamHost m_socksProxy;
-
+ QXmppTransferJobPrivate *const d;
friend class QXmppTransferManager;
};