diff --git a/CMakeLists.txt b/CMakeLists.txt index 9acc28ce37642d8810acb9e9f7e3669d8a78f110..76f8b811e0fd7b6ad3f2ed862f9fd4a022a1d8a0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,7 +73,7 @@ FIND_PACKAGE(Qt4 COMPONENTS QtCore QtNetwork) # ADD_DEFINITIONS(${SWIFTEN_CFLAGS}) ADD_DEFINITIONS(-DSUPPORT_LEGACY_CAPS) -ADD_DEFINITIONS(-DBOOST_FILESYSTEM_VERSION=2) +# ADD_DEFINITIONS(-DBOOST_FILESYSTEM_VERSION=2) message(" Supported features") message("-----------------------") diff --git a/ChangeLog b/ChangeLog index 94cc0f645c82975e184df0cc1a3b823557ce2477..4b9951ed53e38522ab0670c1cb46f7a1cfce147f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18,11 +18,28 @@ Version 2.0.0-beta3 (2012-XX-XX): * Options from config file can now be set also using command line like --service.jid=domain.tld . * Do not send password in IQ-get registration response. + * Added support for AdHoc commands. + * Do not store buddies with empty name in database. + * Improved MySQL storage backend performance. + * Do not handle error messages as normal ones. + * Added Munin script for Spectrum 2. + * Use utf-8 encoding as default for MySQL. + * Added a way to disable xhtml-im. + * Fix crash caused by two XMPP users using single PurpleAccount instance. + * Support for [registration] allowed_usernames. + * Fixed compilation with boost-1.50. + + Spectrum2_manager: + * Rewritten to provide more features. Check the documentation. Libpurple: * prpl-gg: Fetch the contact list properly (#252). * Added support for prpl-novell as it was in spectrum1. + Twitter: + * Added Twitter support using Twitter backend. Thanks to Sarang and + Google Summer of Code. + Skype: * Log more errors. diff --git a/backends/frotz/main.cpp b/backends/frotz/main.cpp index 7a13290d1bb520e70d97bb31635649dedc892992..dcd67a1730a2d35f5f1bc7efd4db1f8556139a8c 100644 --- a/backends/frotz/main.cpp +++ b/backends/frotz/main.cpp @@ -235,7 +235,11 @@ class FrotzNetworkPlugin : public NetworkPlugin { directory_iterator end_itr; for (directory_iterator itr(p); itr != end_itr; ++itr) { if (extension(itr->path()) == ".z5") { +#if BOOST_FILESYSTEM_VERSION == 2 games.push_back(itr->path().leaf()); +#else + games.push_back(itr->path().filename().string()); +#endif } } return games; diff --git a/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.cpp b/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.cpp index 90516981c346b00ff5cc5024f4ef815ee7794173..394cec09dc3dbe590fbca9bee5b319d4ce4c302e 100644 --- a/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.cpp +++ b/include/Swiften/FileTransfer/MyOutgoingSIFileTransfer.cpp @@ -95,7 +95,12 @@ void MyOutgoingSIFileTransfer::finish(boost::optional error) ibbSession.reset(); } socksServer->removeReadBytestream(id, from, to); - onStateChange(FileTransfer::State(FileTransfer::State::Canceled)); + if(error) { + onStateChange(FileTransfer::State(FileTransfer::State::Canceled)); + } + else { + onStateChange(FileTransfer::State(FileTransfer::State::Finished)); + } onFinished(error); } diff --git a/src/tests/filetransfermanager.cpp b/src/tests/filetransfermanager.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e3ffec2086669143ef4e8b5ebce084569a633691 --- /dev/null +++ b/src/tests/filetransfermanager.cpp @@ -0,0 +1,202 @@ +#include "transport/userregistry.h" +#include "transport/userregistration.h" +#include "transport/config.h" +#include "transport/storagebackend.h" +#include "transport/user.h" +#include "transport/transport.h" +#include "transport/conversation.h" +#include "transport/usermanager.h" +#include "transport/localbuddy.h" +#include "transport/settingsadhoccommand.h" +#include "transport/filetransfermanager.h" +#include "transport/adhocmanager.h" +#include "transport/memoryreadbytestream.h" +#include +#include +#include +#include +#include +#include +#include +#include "Swiften/Server/ServerStanzaChannel.h" +#include "Swiften/Server/ServerFromClientSession.h" +#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h" +#include "basictest.h" + +using namespace Transport; + +class FileTransferManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTest { + CPPUNIT_TEST_SUITE(FileTransferManagerTest); + CPPUNIT_TEST(sendFileNoMethod); + CPPUNIT_TEST(sendFileSIIBB); + CPPUNIT_TEST_SUITE_END(); + + public: + FileTransferManager *manager; + std::string data; + FileTransferManager::Transfer transfer; + bool dataNeeded; + Swift::FileTransfer::State::FTState ftState; + boost::shared_ptr bytestream; + + void setUp (void) { + setMeUp(); + + dataNeeded = false; + data = "This is our testing file\n"; + manager = new FileTransferManager(component, userManager); + + connectUser(); + add2Buddies(); + received.clear(); + } + + void tearDown (void) { + received.clear(); + delete manager; + disconnectUser(); + tearMeDown(); + } + + void connectUser() { + CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount()); + userRegistry->isValidUserPassword(Swift::JID("user@localhost/resource"), serverFromClientSession.get(), Swift::createSafeByteArray("password")); + loop->processEvents(); + CPPUNIT_ASSERT_EQUAL(1, userManager->getUserCount()); + + User *user = userManager->getUser("user@localhost"); + CPPUNIT_ASSERT(user); + + UserInfo userInfo = user->getUserInfo(); + CPPUNIT_ASSERT_EQUAL(std::string("password"), userInfo.password); + CPPUNIT_ASSERT(user->isReadyToConnect() == true); + CPPUNIT_ASSERT(user->isConnected() == false); + + user->setConnected(true); + CPPUNIT_ASSERT(user->isConnected() == true); + + CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + received.clear(); + } + + void disconnectUser() { + userManager->disconnectUser("user@localhost"); + dynamic_cast(factories->getTimerFactory())->setTime(10); + loop->processEvents(); + + CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount()); + CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); + } + + void add2Buddies() { + User *user = userManager->getUser("user@localhost"); + CPPUNIT_ASSERT(user); + + std::vector grp; + grp.push_back("group1"); + LocalBuddy *buddy = new LocalBuddy(user->getRosterManager(), -1, "buddy1", "Buddy 1", grp, BUDDY_JID_ESCAPING); + buddy->setStatus(Swift::StatusShow(Swift::StatusShow::Away), "status1"); + user->getRosterManager()->setBuddy(buddy); + + std::vector grp2; + grp2.push_back("group2"); + buddy = new LocalBuddy(user->getRosterManager(), -1, "buddy2", "Buddy 2", grp2, BUDDY_JID_ESCAPING); + buddy->setStatus(Swift::StatusShow(Swift::StatusShow::Away), "status2"); + user->getRosterManager()->setBuddy(buddy); + } + + + void handleFTDataNeeded() { + dataNeeded = true; +// std::cout << "data needed\n"; + } + + void handleFTStateChanged(Swift::FileTransfer::State state) { +// std::cout << "state changed " << state.state << "\n"; + ftState = state.state; + } + + void _sendFile() { + User *user = userManager->getUser("user@localhost"); + + Swift::StreamInitiationFileInfo fileInfo; + fileInfo.setSize(data.size()); + fileInfo.setName("test.pdf"); + + bytestream = boost::shared_ptr(new MemoryReadBytestream(data.size())); + bytestream->onDataNeeded.connect(boost::bind(&FileTransferManagerTest::handleFTDataNeeded, this)); + + transfer = manager->sendFile(user, user->getRosterManager()->getBuddy("buddy1"), bytestream, fileInfo); + } + + void sendFileNoMethod() { + _sendFile(); + CPPUNIT_ASSERT(!transfer.ft); + } + + void sendFileSIIBB() { + User *user = userManager->getUser("user@localhost"); + boost::shared_ptr info(new Swift::DiscoInfo()); + info->addFeature("http://jabber.org/protocol/si/profile/file-transfer"); + user->handleDiscoInfo("user@localhost/resource", info); + + // Send file request + _sendFile(); + CPPUNIT_ASSERT(transfer.ft); + + transfer.ft->onStateChange.connect(boost::bind(&FileTransferManagerTest::handleFTStateChanged, this, _1)); + transfer.ft->start(); + loop->processEvents(); + + CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Set, dynamic_cast(getStanza(received[0]))->getType()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + + CPPUNIT_ASSERT_EQUAL(std::string("test.pdf"), dynamic_cast(getStanza(received[0]))->getPayload()->getFileInfo()->getName()); + CPPUNIT_ASSERT_EQUAL((int) data.size(), (int) dynamic_cast(getStanza(received[0]))->getPayload()->getFileInfo()->getSize()); + + // request acceptation + Swift::IQ::ref accept = Swift::IQ::createResult(getStanza(received[0])->getFrom(), getStanza(received[0])->getTo(), getStanza(received[0])->getID()); + Swift::StreamInitiation::ref payload(new Swift::StreamInitiation()); + payload->setRequestedMethod("http://jabber.org/protocol/ibb"); + accept->addPayload(payload); + injectIQ(accept); + loop->processEvents(); + received.erase(received.begin()); + + // handle open packet and accept the FT + CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Set, dynamic_cast(getStanza(received[0]))->getType()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(Swift::IBB::Open, getStanza(received[0])->getPayload()->getAction()); + injectIQ(Swift::IQ::createResult(getStanza(received[0])->getFrom(), getStanza(received[0])->getTo(), getStanza(received[0])->getID())); + loop->processEvents(); + + CPPUNIT_ASSERT_EQUAL(true, dataNeeded); + CPPUNIT_ASSERT_EQUAL(Swift::FileTransfer::State::Transferring, ftState); + + bytestream->appendData(data); // this will be send in one packet... + loop->processEvents(); + received.erase(received.begin()); + + // we received data now + CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Set, dynamic_cast(getStanza(received[0]))->getType()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(Swift::IBB::Data, getStanza(received[0])->getPayload()->getAction()); + injectIQ(Swift::IQ::createResult(getStanza(received[0])->getFrom(), getStanza(received[0])->getTo(), getStanza(received[0])->getID())); + loop->processEvents(); + received.erase(received.begin()); +// dumpReceived(); + // TODO: Check that we receive Swift::IBB:Close stanza. This is not done right now because of Swiften bug... + } + + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION (FileTransferManagerTest);