From 63eef51c16110fe78d0f44c21af638e443b8935f Mon Sep 17 00:00:00 2001 From: Sergey I Date: Thu, 24 Feb 2011 18:05:06 +0000 Subject: [PATCH] Slightly improve bytestreams management git-svn-id: http://delta.affinix.com/svn/trunk/iris@805 ac7a513c-5e3a-0410-af42-968c3ac6e7dc --- src/xmpp/xmpp-im/filetransfer.cpp | 82 ++++++++++++++++++++++++++++---------- src/xmpp/xmpp-im/filetransfer.h | 4 ++ src/xmpp/xmpp-im/s5b.cpp | 2 +- src/xmpp/xmpp-im/s5b.h | 2 +- src/xmpp/xmpp-im/xmpp_bytestream.h | 1 + src/xmpp/xmpp-im/xmpp_ibb.cpp | 2 +- src/xmpp/xmpp-im/xmpp_ibb.h | 2 +- 7 files changed, 69 insertions(+), 26 deletions(-) diff --git a/src/xmpp/xmpp-im/filetransfer.cpp b/src/xmpp/xmpp-im/filetransfer.cpp index 0464254..88edce6 100644 --- a/src/xmpp/xmpp-im/filetransfer.cpp +++ b/src/xmpp/xmpp-im/filetransfer.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include "xmpp_xmlcommon.h" #include "s5b.h" #include "xmpp_ibb.h" @@ -140,8 +141,7 @@ void FileTransfer::sendFile(const Jid &to, const QString &fname, qlonglong size, d->ft = new JT_FT(d->m->client()->rootTask()); connect(d->ft, SIGNAL(finished()), SLOT(ft_finished())); - d->ft->request(to, d->id, fname, size, desc, - QStringList() << S5BManager::ns() << IBBManager::ns() ); + d->ft->request(to, d->id, fname, size, desc, d->m->streamPriority() ); d->ft->go(true); } @@ -250,21 +250,24 @@ void FileTransfer::ft_finished() if(d->length == 0) d->length = d->size - d->rangeOffset; d->streamType = ft->streamType(); - if (d->streamType == S5BManager::ns()) { - d->c = d->m->client()->s5bManager()->createConnection(); - if(d->proxy.isValid()) + BytestreamManager *streamManager = d->m->streamManager(d->streamType); + if (streamManager) { + d->c = streamManager->createConnection(); + if (dynamic_cast(streamManager) && d->proxy.isValid()) { ((S5BConnection*)(d->c))->setProxy(d->proxy); + } + connect(d->c, SIGNAL(connected()), SLOT(stream_connected())); + connect(d->c, SIGNAL(connectionClosed()), SLOT(stream_connectionClosed())); + connect(d->c, SIGNAL(bytesWritten(int)), SLOT(stream_bytesWritten(int))); + connect(d->c, SIGNAL(error(int)), SLOT(stream_error(int))); + + d->c->connectToJid(d->peer, d->id); + accepted(); } - else if (d->streamType == IBBManager::ns()) { - d->c = d->m->client()->ibbManager()->createConnection(); + else { + emit error(Err400); + reset(); } - connect(d->c, SIGNAL(connected()), SLOT(stream_connected())); - connect(d->c, SIGNAL(connectionClosed()), SLOT(stream_connectionClosed())); - connect(d->c, SIGNAL(bytesWritten(int)), SLOT(stream_bytesWritten(int))); - connect(d->c, SIGNAL(error(int)), SLOT(stream_error(int))); - - d->c->connectToJid(d->peer, d->id); - accepted(); } else { if(ft->statusCode() == 403) @@ -312,7 +315,7 @@ void FileTransfer::stream_readyRead() a.resize((uint)need); d->sent += a.size(); if(d->sent == d->length) - QTimer::singleShot(3000, this, SLOT(reset())); // wait 3 sec for close from other side + reset(); readyRead(a); } @@ -361,6 +364,9 @@ class FileTransferManager::Private public: Client *client; QList list, incoming; + QStringList streamPriority; + QHash streamMap; + QSet disabledStreamTypes; JT_PushFT *pft; }; @@ -369,6 +375,14 @@ FileTransferManager::FileTransferManager(Client *client) { d = new Private; d->client = client; + if (client->s5bManager()) { + d->streamPriority.append(S5BManager::ns()); + d->streamMap[S5BManager::ns()] = client->s5bManager(); + } + if (client->ibbManager()) { + d->streamPriority.append(IBBManager::ns()); + d->streamMap[IBBManager::ns()] = client->ibbManager(); + } d->pft = new JT_PushFT(d->client->rootTask()); connect(d->pft, SIGNAL(incoming(const FTRequest &)), SLOT(pft_incoming(const FTRequest &))); @@ -411,17 +425,22 @@ bool FileTransferManager::isActive(const FileTransfer *ft) const return d->list.contains(const_cast(ft)) > 0; } +void FileTransferManager::setDisabled(const QString &ns, bool state) +{ + if (state) { + d->disabledStreamTypes.insert(ns); + } + else { + d->disabledStreamTypes.remove(ns); + } +} + void FileTransferManager::pft_incoming(const FTRequest &req) { QString streamType; foreach (const QString &ns, req.streamTypes) { - if (ns == S5BManager::ns() && - d->client->s5bManager()->isAcceptableSID(req.from, req.id)) { - streamType = ns; - break; - } - if (ns == IBBManager::ns() && - d->client->ibbManager()->isAcceptableSID(req.from, req.id)) { + BytestreamManager *manager = streamManager(ns); + if (manager && manager->isAcceptableSID(req.from, req.id)) { streamType = ns; break; } @@ -439,6 +458,25 @@ void FileTransferManager::pft_incoming(const FTRequest &req) incomingReady(); } +BytestreamManager* FileTransferManager::streamManager(const QString &ns) const +{ + if (d->disabledStreamTypes.contains(ns)) { + return 0; + } + return d->streamMap.value(ns); +} + +QStringList FileTransferManager::streamPriority() const +{ + QStringList ret; + foreach (const QString &ns, d->streamPriority) { + if (!d->disabledStreamTypes.contains(ns)) { + ret.append(ns); + } + } + return ret; +} + void FileTransferManager::stream_incomingReady(BSConnection *c) { foreach(FileTransfer* ft, d->list) { diff --git a/src/xmpp/xmpp-im/filetransfer.h b/src/xmpp/xmpp-im/filetransfer.h index db44848..6e4cdc0 100644 --- a/src/xmpp/xmpp-im/filetransfer.h +++ b/src/xmpp/xmpp-im/filetransfer.h @@ -27,6 +27,7 @@ namespace XMPP { //class BSConnection; class BSConnection; + class BytestreamManager; struct FTRequest; /*class AbstractFileTransfer @@ -108,6 +109,7 @@ namespace XMPP ~FileTransferManager(); bool isActive(const FileTransfer *ft) const; + void setDisabled(const QString &ns, bool state = true); Client *client() const; FileTransfer *createTransfer(); @@ -127,6 +129,8 @@ namespace XMPP void stream_incomingReady(BSConnection *); friend class FileTransfer; + BytestreamManager* streamManager(const QString &ns) const; + QStringList streamPriority() const; QString link(FileTransfer *); void con_accept(FileTransfer *); void con_reject(FileTransfer *); diff --git a/src/xmpp/xmpp-im/s5b.cpp b/src/xmpp/xmpp-im/s5b.cpp index 076fdd5..161f5ff 100644 --- a/src/xmpp/xmpp-im/s5b.cpp +++ b/src/xmpp/xmpp-im/s5b.cpp @@ -637,7 +637,7 @@ void S5BManager::setServer(S5BServer *serv) } } -S5BConnection *S5BManager::createConnection() +BSConnection *S5BManager::createConnection() { return new S5BConnection(this); } diff --git a/src/xmpp/xmpp-im/s5b.h b/src/xmpp/xmpp-im/s5b.h index e1de389..c9fd9bd 100644 --- a/src/xmpp/xmpp-im/s5b.h +++ b/src/xmpp/xmpp-im/s5b.h @@ -149,7 +149,7 @@ namespace XMPP Jid localPeer(const Jid &peer) const; bool isAcceptableSID(const Jid &peer, const QString &sid) const; - S5BConnection *createConnection(); + BSConnection *createConnection(); S5BConnection *takeIncoming(); class Item; diff --git a/src/xmpp/xmpp-im/xmpp_bytestream.h b/src/xmpp/xmpp-im/xmpp_bytestream.h index 6107b49..702749a 100644 --- a/src/xmpp/xmpp-im/xmpp_bytestream.h +++ b/src/xmpp/xmpp-im/xmpp_bytestream.h @@ -56,6 +56,7 @@ namespace XMPP virtual bool isAcceptableSID(const Jid &peer, const QString &sid) const = 0; QString genUniqueSID(const Jid &peer) const; + virtual BSConnection* createConnection() = 0; virtual void deleteConnection(BSConnection *c, int msec = 0); protected: diff --git a/src/xmpp/xmpp-im/xmpp_ibb.cpp b/src/xmpp/xmpp-im/xmpp_ibb.cpp index abfcccb..553a621 100644 --- a/src/xmpp/xmpp-im/xmpp_ibb.cpp +++ b/src/xmpp/xmpp-im/xmpp_ibb.cpp @@ -416,7 +416,7 @@ Client *IBBManager::client() const return d->client; } -IBBConnection *IBBManager::createConnection() +BSConnection *IBBManager::createConnection() { return new IBBConnection(this); } diff --git a/src/xmpp/xmpp-im/xmpp_ibb.h b/src/xmpp/xmpp-im/xmpp_ibb.h index 4d14b00..292d4f4 100644 --- a/src/xmpp/xmpp-im/xmpp_ibb.h +++ b/src/xmpp/xmpp-im/xmpp_ibb.h @@ -111,7 +111,7 @@ namespace XMPP Client *client() const; bool isAcceptableSID(const Jid &peer, const QString &sid) const; - IBBConnection *createConnection(); + BSConnection *createConnection(); IBBConnection *takeIncoming(); public slots: -- 2.11.4.GIT