Files
@ 46cd8f966425
Branch filter:
Location: libtransport.git/include/Swiften/FileTransfer/CombinedOutgoingFileTransferManager.cpp - annotation
46cd8f966425
5.0 KiB
text/x-c++hdr
Fixed malloc_trim
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 6b45e0e418ee 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 6d2f8c192761 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 6d2f8c192761 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 6d2f8c192761 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 6d2f8c192761 20d8dd690e21 20d8dd690e21 20d8dd690e21 6d2f8c192761 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 6b45e0e418ee 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 6b45e0e418ee 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 20d8dd690e21 | /*
* Copyright (c) 2011 Tobias Markmann
* Licensed under the simplified BSD license.
* See Documentation/Licenses/BSD-simplified.txt for more information.
*/
#include "CombinedOutgoingFileTransferManager.h"
#include <boost/foreach.hpp>
#include <boost/smart_ptr/make_shared.hpp>
#include <Swiften/JID/JID.h>
#include "Swiften/Disco/EntityCapsProvider.h"
#include <Swiften/Jingle/JingleSessionManager.h>
#include <Swiften/Jingle/JingleSessionImpl.h>
#include <Swiften/Jingle/JingleContentID.h>
#include <Swiften/FileTransfer/OutgoingJingleFileTransfer.h>
#include <Swiften/FileTransfer/MyOutgoingSIFileTransfer.h>
#include <Swiften/FileTransfer/SOCKS5BytestreamServer.h>
#include <Swiften/Base/IDGenerator.h>
#include <Swiften/Elements/Presence.h>
namespace Swift {
CombinedOutgoingFileTransferManager::CombinedOutgoingFileTransferManager(JingleSessionManager* jingleSessionManager, IQRouter* router, EntityCapsProvider* capsProvider, RemoteJingleTransportCandidateSelectorFactory* remoteFactory, LocalJingleTransportCandidateGeneratorFactory* localFactory, SOCKS5BytestreamRegistry* bytestreamRegistry, SOCKS5BytestreamProxy* bytestreamProxy, Transport::PresenceOracle *presOracle, SOCKS5BytestreamServer *bytestreamServer) : jsManager(jingleSessionManager), iqRouter(router), capsProvider(capsProvider), remoteFactory(remoteFactory), localFactory(localFactory), bytestreamRegistry(bytestreamRegistry), bytestreamProxy(bytestreamProxy), presenceOracle(presOracle), bytestreamServer(bytestreamServer) {
idGenerator = new IDGenerator();
}
CombinedOutgoingFileTransferManager::~CombinedOutgoingFileTransferManager() {
delete idGenerator;
}
SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<OutgoingFileTransfer> CombinedOutgoingFileTransferManager::createOutgoingFileTransfer(const JID& from, const JID& receipient, SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<ReadBytestream> readBytestream, const StreamInitiationFileInfo& fileInfo) {
// check if receipient support Jingle FT
boost::optional<JID> fullJID = highestPriorityJIDSupportingJingle(receipient);
if (!fullJID.is_initialized()) {
fullJID = highestPriorityJIDSupportingSI(receipient);
}
else {
JingleSessionImpl::ref jingleSession = SWIFTEN_SHRPTR_NAMESPACE::make_shared<JingleSessionImpl>(from, receipient, idGenerator->generateID(), iqRouter);
//jsManager->getSession(receipient, idGenerator->generateID());
assert(jingleSession);
jsManager->registerOutgoingSession(from, jingleSession);
#if !HAVE_SWIFTEN_3
SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<OutgoingJingleFileTransfer> jingleFT = SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<OutgoingJingleFileTransfer>(new OutgoingJingleFileTransfer(jingleSession, remoteFactory, localFactory, iqRouter, idGenerator, from, receipient, readBytestream, fileInfo, bytestreamRegistry, bytestreamProxy));
return jingleFT;
#endif
}
if (!fullJID.is_initialized()) {
return SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<OutgoingFileTransfer>();
}
// otherwise try SI
SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<MyOutgoingSIFileTransfer> jingleFT = SWIFTEN_SHRPTR_NAMESPACE::shared_ptr<MyOutgoingSIFileTransfer>(new MyOutgoingSIFileTransfer(idGenerator->generateID(), from, fullJID.get(), fileInfo.getName(), fileInfo.getSize(), fileInfo.getDescription(), readBytestream, iqRouter, bytestreamServer, bytestreamRegistry));
// else fail
return jingleFT;
}
boost::optional<JID> CombinedOutgoingFileTransferManager::highestPriorityJIDSupportingJingle(const JID& bareJID) {
JID fullReceipientJID;
int priority = INT_MIN;
//getAllPresence(bareJID) gives you all presences for the bare JID (i.e. all resources) Remko Tronçon @ 11:11
std::vector<Presence::ref> presences = presenceOracle->getAllPresence(bareJID);
//iterate over them
BOOST_FOREACH(Presence::ref pres, presences) {
if (pres->getPriority() > priority) {
// look up caps from the jid
DiscoInfo::ref info = capsProvider->getCaps(pres->getFrom());
if (info && info->hasFeature(DiscoInfo::JingleFeature) && info->hasFeature(DiscoInfo::JingleFTFeature) &&
info->hasFeature(DiscoInfo::JingleTransportsIBBFeature)) {
priority = pres->getPriority();
fullReceipientJID = pres->getFrom();
}
}
}
return fullReceipientJID.isValid() ? boost::optional<JID>(fullReceipientJID) : boost::optional<JID>();
}
boost::optional<JID> CombinedOutgoingFileTransferManager::highestPriorityJIDSupportingSI(const JID& bareJID) {
JID fullReceipientJID;
int priority = INT_MIN;
//getAllPresence(bareJID) gives you all presences for the bare JID (i.e. all resources) Remko Tronçon @ 11:11
std::vector<Presence::ref> presences = presenceOracle->getAllPresence(bareJID);
//iterate over them
BOOST_FOREACH(Presence::ref pres, presences) {
if (pres->getPriority() > priority) {
// look up caps from the jid
DiscoInfo::ref info = capsProvider->getCaps(pres->getFrom());
if (info && info->hasFeature("http://jabber.org/protocol/si/profile/file-transfer")) {
priority = pres->getPriority();
fullReceipientJID = pres->getFrom();
}
}
}
return fullReceipientJID.isValid() ? boost::optional<JID>(fullReceipientJID) : boost::optional<JID>();
}
}
|