diff options
Diffstat (limited to 'Swiften')
110 files changed, 185 insertions, 338 deletions
diff --git a/Swiften/Base/foreach.h b/Swiften/Base/foreach.h deleted file mode 100644 index 3e8ec43..0000000 --- a/Swiften/Base/foreach.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) 2010 Isode Limited. - * All rights reserved. - * See the COPYING file for more information. - */ - -#pragma once - -#include <boost/foreach.hpp> - -#undef foreach -#define foreach BOOST_FOREACH -#define reverse_foreach BOOST_REVERSE_FOREACH diff --git a/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp b/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp index 278068a..7eeb531 100644 --- a/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp +++ b/Swiften/Chat/UnitTest/ChatStateNotifierTest.cpp @@ -1,42 +1,41 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <boost/bind.hpp> #include <cppunit/extensions/HelperMacros.h> #include <cppunit/extensions/TestFactoryRegistry.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Chat/ChatStateNotifier.h> #include <Swiften/Client/DummyStanzaChannel.h> #include <Swiften/Disco/DummyEntityCapsProvider.h> using namespace Swift; class ChatStateNotifierTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(ChatStateNotifierTest); CPPUNIT_TEST(testStartTypingReply_CapsNotIncluded); CPPUNIT_TEST(testStartTypingReply_CapsIncluded); CPPUNIT_TEST(testCancelledNewMessage); CPPUNIT_TEST(testContinueTypingReply_CapsIncluded); CPPUNIT_TEST(testTypeReplies_WentOffline); CPPUNIT_TEST(testContactShouldReceiveStates_CapsOnly); CPPUNIT_TEST(testContactShouldReceiveStates_CapsNorActive); CPPUNIT_TEST(testContactShouldReceiveStates_ActiveOverrideOn); CPPUNIT_TEST(testContactShouldReceiveStates_ActiveOverrideOff); CPPUNIT_TEST_SUITE_END(); public: void setUp() { stanzaChannel = new DummyStanzaChannel(); stanzaChannel->setAvailable(true); entityCapsProvider = new DummyEntityCapsProvider(); notifier_ = new ChatStateNotifier(stanzaChannel, JID("foo@bar.com/baz"), entityCapsProvider); notifier_->setContactIsOnline(true); } void tearDown() { delete notifier_; @@ -115,55 +114,55 @@ public: notifier_->setUserIsTyping(); notifier_->setUserIsTyping(); notifier_->setUserIsTyping(); CPPUNIT_ASSERT_EQUAL(1, getComposingCount()); notifier_->userSentMessage(); notifier_->setUserIsTyping(); CPPUNIT_ASSERT_EQUAL(2, getComposingCount()); } void testTypeReplies_WentOffline() { setContactHas85Caps(); notifier_->setUserIsTyping(); CPPUNIT_ASSERT_EQUAL(1, getComposingCount()); notifier_->setContactIsOnline(false); notifier_->userSentMessage(); notifier_->setUserIsTyping(); CPPUNIT_ASSERT_EQUAL(1, getComposingCount()); } private: void setContactHas85Caps() { DiscoInfo::ref caps(new DiscoInfo()); caps->addFeature(DiscoInfo::ChatStatesFeature); entityCapsProvider->caps[JID("foo@bar.com/baz")] = caps; entityCapsProvider->onCapsChanged(JID("foo@bar.com/baz")); } int getComposingCount() const { int result = 0; - foreach(std::shared_ptr<Stanza> stanza, stanzaChannel->sentStanzas) { + for (auto&& stanza : stanzaChannel->sentStanzas) { if (stanza->getPayload<ChatState>() && stanza->getPayload<ChatState>()->getChatState() == ChatState::Composing) { result++; } } return result; } int getActiveCount() const { int result = 0; - foreach(std::shared_ptr<Stanza> stanza, stanzaChannel->sentStanzas) { + for (auto&& stanza : stanzaChannel->sentStanzas) { if (stanza->getPayload<ChatState>() && stanza->getPayload<ChatState>()->getChatState() == ChatState::Active) { result++; } } return result; } private: DummyStanzaChannel* stanzaChannel; DummyEntityCapsProvider* entityCapsProvider; ChatStateNotifier* notifier_; }; CPPUNIT_TEST_SUITE_REGISTRATION(ChatStateNotifierTest); diff --git a/Swiften/Client/BlockListImpl.cpp b/Swiften/Client/BlockListImpl.cpp index ebffff8..54dcdf5 100644 --- a/Swiften/Client/BlockListImpl.cpp +++ b/Swiften/Client/BlockListImpl.cpp @@ -1,74 +1,72 @@ /* - * Copyright (c) 2011-2015 Isode Limited. + * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Client/BlockListImpl.h> #include <algorithm> -#include <Swiften/Base/foreach.h> - using namespace Swift; BlockListImpl::BlockListImpl() : state(Init) { } void BlockListImpl::setItems(const std::vector<JID>& newItems) { // JIDs which are in the current list but not in the new list, are removed. - foreach (const JID& jid, items) { + for (const auto& jid : items) { if (std::find(newItems.begin(), newItems.end(), jid) == newItems.end()) { onItemRemoved(jid); } } // JIDs which are in the new list but not in the current list, are added. - foreach (const JID& jid, newItems) { + for (const auto& jid : newItems) { if (std::find(items.begin(), items.end(), jid) == items.end()) { onItemAdded(jid); } } items = newItems; } void BlockListImpl::addItem(const JID& item) { if (std::find(items.begin(), items.end(), item) == items.end()) { items.push_back(item); onItemAdded(item); } } void BlockListImpl::removeItem(const JID& item) { size_t oldSize = items.size(); items.erase(std::remove(items.begin(), items.end(), item), items.end()); if (items.size() != oldSize) { onItemRemoved(item); } } void BlockListImpl::setState(State state) { if (this->state != state) { this->state = state; onStateChanged(); } } void BlockListImpl::addItems(const std::vector<JID>& items) { - foreach (const JID& item, items) { + for (const auto& item : items) { addItem(item); } } void BlockListImpl::removeItems(const std::vector<JID>& items) { std::vector<JID> itemsToRemove = items; - foreach (const JID& item, itemsToRemove) { + for (const auto& item : itemsToRemove) { removeItem(item); } } void BlockListImpl::removeAllItems() { removeItems(items); } diff --git a/Swiften/Client/CoreClient.cpp b/Swiften/Client/CoreClient.cpp index c2f8fd7..3d75d8b 100644 --- a/Swiften/Client/CoreClient.cpp +++ b/Swiften/Client/CoreClient.cpp @@ -1,47 +1,46 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Client/CoreClient.h> #include <memory> #include <boost/bind.hpp> #include <boost/optional.hpp> #include <Swiften/Base/Algorithm.h> #include <Swiften/Base/IDGenerator.h> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Client/ClientSession.h> #include <Swiften/Client/ClientSessionStanzaChannel.h> #include <Swiften/Network/ChainedConnector.h> #include <Swiften/Network/DomainNameResolveError.h> #include <Swiften/Network/HTTPConnectProxiedConnectionFactory.h> #include <Swiften/Network/NetworkFactories.h> #include <Swiften/Network/ProxyProvider.h> #include <Swiften/Network/SOCKS5ProxiedConnectionFactory.h> #include <Swiften/Queries/IQRouter.h> #include <Swiften/Session/BOSHSessionStream.h> #include <Swiften/Session/BasicSessionStream.h> #include <Swiften/TLS/CertificateVerificationError.h> #include <Swiften/TLS/PKCS12Certificate.h> #include <Swiften/TLS/TLSError.h> namespace Swift { CoreClient::CoreClient(const JID& jid, const SafeByteArray& password, NetworkFactories* networkFactories) : jid_(jid), password_(password), networkFactories(networkFactories), disconnectRequested_(false), certificateTrustChecker(nullptr) { stanzaChannel_ = new ClientSessionStanzaChannel(); stanzaChannel_->onMessageReceived.connect(boost::bind(&CoreClient::handleMessageReceived, this, _1)); stanzaChannel_->onPresenceReceived.connect(boost::bind(&CoreClient::handlePresenceReceived, this, _1)); stanzaChannel_->onStanzaAcked.connect(boost::bind(&CoreClient::handleStanzaAcked, this, _1)); stanzaChannel_->onAvailableChanged.connect(boost::bind(&CoreClient::handleStanzaChannelAvailableChanged, this, _1)); iqRouter_ = new IQRouter(stanzaChannel_); iqRouter_->setJID(jid); } CoreClient::~CoreClient() { forceReset(); @@ -416,61 +415,61 @@ bool CoreClient::isAvailable() const { } bool CoreClient::getStreamManagementEnabled() const { return stanzaChannel_->getStreamManagementEnabled(); } bool CoreClient::isStreamEncrypted() const { return sessionStream_->isTLSEncrypted(); } StanzaChannel* CoreClient::getStanzaChannel() const { return stanzaChannel_; } const JID& CoreClient::getJID() const { if (session_) { return session_->getLocalJID(); } else { return jid_; } } void CoreClient::purgePassword() { safeClear(password_); } void CoreClient::resetConnector() { connector_->onConnectFinished.disconnect(boost::bind(&CoreClient::handleConnectorFinished, this, _1, _2)); connector_.reset(); - foreach(ConnectionFactory* f, proxyConnectionFactories) { + for (auto f : proxyConnectionFactories) { delete f; } proxyConnectionFactories.clear(); } void CoreClient::resetSession() { session_->onFinished.disconnect(boost::bind(&CoreClient::handleSessionFinished, this, _1)); session_->onNeedCredentials.disconnect(boost::bind(&CoreClient::handleNeedCredentials, this)); sessionStream_->onDataRead.disconnect(boost::bind(&CoreClient::handleDataRead, this, _1)); sessionStream_->onDataWritten.disconnect(boost::bind(&CoreClient::handleDataWritten, this, _1)); if (connection_) { connection_->disconnect(); } else if (std::dynamic_pointer_cast<BOSHSessionStream>(sessionStream_)) { sessionStream_->close(); } sessionStream_.reset(); connection_.reset(); } void CoreClient::forceReset() { if (connector_) { SWIFT_LOG(warning) << "Client not disconnected properly: Connector still active" << std::endl; resetConnector(); } if (sessionStream_ || connection_) { SWIFT_LOG(warning) << "Client not disconnected properly: Session still active" << std::endl; resetSession(); diff --git a/Swiften/Client/UnitTest/ClientBlockListManagerTest.cpp b/Swiften/Client/UnitTest/ClientBlockListManagerTest.cpp index aaf99e0..5d22cac 100644 --- a/Swiften/Client/UnitTest/ClientBlockListManagerTest.cpp +++ b/Swiften/Client/UnitTest/ClientBlockListManagerTest.cpp @@ -1,48 +1,47 @@ /* * Copyright (c) 2013 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <algorithm> #include <cppunit/extensions/HelperMacros.h> #include <cppunit/extensions/TestFactoryRegistry.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Client/ClientBlockListManager.h> #include <Swiften/Client/DummyStanzaChannel.h> #include <Swiften/Client/StanzaChannel.h> #include <Swiften/Elements/IQ.h> #include <Swiften/Queries/IQRouter.h> using namespace Swift; class ClientBlockListManagerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(ClientBlockListManagerTest); CPPUNIT_TEST(testFetchBlockList); CPPUNIT_TEST(testBlockCommand); CPPUNIT_TEST(testUnblockCommand); CPPUNIT_TEST(testUnblockAllCommand); CPPUNIT_TEST_SUITE_END(); public: void setUp() { ownJID_ = JID("kev@wonderland.lit"); stanzaChannel_ = new DummyStanzaChannel(); iqRouter_ = new IQRouter(stanzaChannel_); iqRouter_->setJID(ownJID_); clientBlockListManager_ = new ClientBlockListManager(iqRouter_); } void testFetchBlockList() { std::vector<JID> blockJids; blockJids.push_back(JID("romeo@montague.net")); blockJids.push_back(JID("iago@shakespeare.lit")); helperInitialBlockListFetch(blockJids); @@ -144,52 +143,52 @@ class ClientBlockListManagerTest : public CppUnit::TestFixture { std::shared_ptr<UnblockPayload> pushPayload = std::make_shared<UnblockPayload>(); IQ::ref unblockPush = IQ::createRequest(IQ::Set, ownJID_, "push1", pushPayload); stanzaChannel_->sendIQ(unblockPush); stanzaChannel_->onIQReceived(unblockPush); CPPUNIT_ASSERT_EQUAL(true, clientBlockListManager_->getBlockList()->getItems().empty()); } void tearDown() { delete clientBlockListManager_; delete iqRouter_; delete stanzaChannel_; } private: void helperInitialBlockListFetch(const std::vector<JID>& blockedJids) { std::shared_ptr<BlockList> blockList = clientBlockListManager_->requestBlockList(); CPPUNIT_ASSERT(blockList); // check for IQ request IQ::ref request = stanzaChannel_->getStanzaAtIndex<IQ>(0); CPPUNIT_ASSERT(request.get() != nullptr); std::shared_ptr<BlockListPayload> requestPayload = request->getPayload<BlockListPayload>(); CPPUNIT_ASSERT(requestPayload.get() != nullptr); CPPUNIT_ASSERT_EQUAL(BlockList::Requesting, blockList->getState()); CPPUNIT_ASSERT_EQUAL(BlockList::Requesting, clientBlockListManager_->getBlockList()->getState()); // build IQ response std::shared_ptr<BlockListPayload> responsePayload = std::make_shared<BlockListPayload>(); - foreach(const JID& jid, blockedJids) { + for (const auto& jid : blockedJids) { responsePayload->addItem(jid); } IQ::ref response = IQ::createResult(ownJID_, JID(), request->getID(), responsePayload); stanzaChannel_->sendIQ(response); stanzaChannel_->onIQReceived(response); CPPUNIT_ASSERT_EQUAL(BlockList::Available, clientBlockListManager_->getBlockList()->getState()); CPPUNIT_ASSERT(responsePayload->getItems() == clientBlockListManager_->getBlockList()->getItems()); } private: JID ownJID_; IQRouter* iqRouter_; DummyStanzaChannel* stanzaChannel_; ClientBlockListManager* clientBlockListManager_; }; CPPUNIT_TEST_SUITE_REGISTRATION(ClientBlockListManagerTest); diff --git a/Swiften/Client/XMLBeautifier.cpp b/Swiften/Client/XMLBeautifier.cpp index 9e9c4c5..e2cd58e 100644 --- a/Swiften/Client/XMLBeautifier.cpp +++ b/Swiften/Client/XMLBeautifier.cpp @@ -1,49 +1,48 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Client/XMLBeautifier.h> #include <sstream> #include <stack> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Parser/PlatformXMLParserFactory.h> namespace Swift { XMLBeautifier::XMLBeautifier(bool indention, bool coloring) : doIndention(indention), doColoring(coloring), intLevel(0), parser(nullptr), lastWasStepDown(false) { factory = new PlatformXMLParserFactory(); } XMLBeautifier::~XMLBeautifier() { delete factory; } std::string XMLBeautifier::beautify(const std::string &text) { parser = factory->createXMLParser(this); intLevel = 0; buffer.str(std::string()); parser->parse(text); delete parser; return buffer.str(); } void XMLBeautifier::indent() { for (int i = 0; i < intLevel; ++i) { buffer << " "; } } // all bold but reset // static const char colorBlue[] = "\x1b[01;34m"; static const char colorCyan[] = "\x1b[01;36m"; @@ -72,61 +71,61 @@ std::string XMLBeautifier::styleNamespace(const std::string& text) const { } std::string XMLBeautifier::styleAttribute(const std::string& text) const { std::string result; result += colorGreen; result += text; result += colorReset; return result; } std::string XMLBeautifier::styleValue(const std::string& text) const { std::string result; result += colorCyan; result += text; result += colorReset; return result; } void XMLBeautifier::handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes) { if (doIndention) { if (intLevel) buffer << std::endl; } indent(); buffer << "<" << (doColoring ? styleTag(element) : element); if (!ns.empty() && (!parentNSs.empty() && parentNSs.top() != ns)) { buffer << " "; buffer << (doColoring ? styleAttribute("xmlns") : "xmlns"); buffer << "="; buffer << "\"" << (doColoring ? styleNamespace(ns) : ns) << "\""; } if (!attributes.getEntries().empty()) { - foreach(AttributeMap::Entry entry, attributes.getEntries()) { + for (const auto& entry : attributes.getEntries()) { buffer << " "; buffer << (doColoring ? styleAttribute(entry.getAttribute().getName()) : entry.getAttribute().getName()); buffer << "="; buffer << "\"" << (doColoring ? styleValue(entry.getValue()) : entry.getValue()) << "\""; } } buffer << ">"; ++intLevel; lastWasStepDown = false; parentNSs.push(ns); } void XMLBeautifier::handleEndElement(const std::string& element, const std::string& /* ns */) { --intLevel; parentNSs.pop(); if (/*hadCDATA.top() ||*/ lastWasStepDown) { if (doIndention) { buffer << std::endl; } indent(); } buffer << "</" << (doColoring ? styleTag(element) : element) << ">"; lastWasStepDown = true; } void XMLBeautifier::handleCharacterData(const std::string& data) { buffer << data; lastWasStepDown = false; } diff --git a/Swiften/Disco/CapsInfoGenerator.cpp b/Swiften/Disco/CapsInfoGenerator.cpp index b4637c7..961ef43 100644 --- a/Swiften/Disco/CapsInfoGenerator.cpp +++ b/Swiften/Disco/CapsInfoGenerator.cpp @@ -1,64 +1,63 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Disco/CapsInfoGenerator.h> #include <algorithm> -#include <Swiften/Base/foreach.h> #include <Swiften/Crypto/CryptoProvider.h> #include <Swiften/Elements/DiscoInfo.h> #include <Swiften/Elements/FormField.h> #include <Swiften/StringCodecs/Base64.h> namespace { bool compareFields(Swift::FormField::ref f1, Swift::FormField::ref f2) { return f1->getName() < f2->getName(); } } namespace Swift { CapsInfoGenerator::CapsInfoGenerator(const std::string& node, CryptoProvider* crypto) : node_(node), crypto_(crypto) { } CapsInfo CapsInfoGenerator::generateCapsInfo(const DiscoInfo& discoInfo) const { std::string serializedCaps; std::vector<DiscoInfo::Identity> identities(discoInfo.getIdentities()); std::sort(identities.begin(), identities.end()); - foreach (const DiscoInfo::Identity& identity, identities) { + for (const auto& identity : identities) { serializedCaps += identity.getCategory() + "/" + identity.getType() + "/" + identity.getLanguage() + "/" + identity.getName() + "<"; } std::vector<std::string> features(discoInfo.getFeatures()); std::sort(features.begin(), features.end()); - foreach (const std::string& feature, features) { + for (const auto& feature : features) { serializedCaps += feature + "<"; } - foreach(Form::ref extension, discoInfo.getExtensions()) { + for (const auto& extension : discoInfo.getExtensions()) { serializedCaps += extension->getFormType() + "<"; std::vector<FormField::ref> fields(extension->getFields()); std::sort(fields.begin(), fields.end(), &compareFields); - foreach(FormField::ref field, fields) { + for (const auto& field : fields) { if (field->getName() == "FORM_TYPE") { continue; } serializedCaps += field->getName() + "<"; std::vector<std::string> values(field->getValues()); std::sort(values.begin(), values.end()); - foreach(const std::string& value, values) { + for (const auto& value : values) { serializedCaps += value + "<"; } } } std::string version(Base64::encode(crypto_->getSHA1Hash(createByteArray(serializedCaps)))); return CapsInfo(node_, version, "sha-1"); } } diff --git a/Swiften/Disco/DiscoServiceWalker.cpp b/Swiften/Disco/DiscoServiceWalker.cpp index 761e6ab..a3f95d2 100644 --- a/Swiften/Disco/DiscoServiceWalker.cpp +++ b/Swiften/Disco/DiscoServiceWalker.cpp @@ -1,131 +1,130 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Disco/DiscoServiceWalker.h> #include <boost/bind.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> namespace Swift { DiscoServiceWalker::DiscoServiceWalker(const JID& service, IQRouter* iqRouter, size_t maxSteps) : service_(service), iqRouter_(iqRouter), maxSteps_(maxSteps), active_(false) { } void DiscoServiceWalker::beginWalk() { SWIFT_LOG(debug) << "Starting walk to " << service_ << std::endl; assert(!active_); assert(servicesBeingSearched_.empty()); active_ = true; walkNode(service_); } void DiscoServiceWalker::endWalk() { if (active_) { SWIFT_LOG(debug) << "Ending walk to " << service_ << std::endl; - foreach (GetDiscoInfoRequest::ref request, pendingDiscoInfoRequests_) { + for (auto&& request : pendingDiscoInfoRequests_) { request->onResponse.disconnect(boost::bind(&DiscoServiceWalker::handleDiscoInfoResponse, this, _1, _2, request)); } - foreach (GetDiscoItemsRequest::ref request, pendingDiscoItemsRequests_) { + for (auto&& request : pendingDiscoItemsRequests_) { request->onResponse.disconnect(boost::bind(&DiscoServiceWalker::handleDiscoItemsResponse, this, _1, _2, request)); } active_ = false; onWalkAborted(); } } void DiscoServiceWalker::walkNode(const JID& jid) { SWIFT_LOG(debug) << "Walking node " << jid << std::endl; servicesBeingSearched_.insert(jid); searchedServices_.insert(jid); GetDiscoInfoRequest::ref discoInfoRequest = GetDiscoInfoRequest::create(jid, iqRouter_); discoInfoRequest->onResponse.connect(boost::bind(&DiscoServiceWalker::handleDiscoInfoResponse, this, _1, _2, discoInfoRequest)); pendingDiscoInfoRequests_.insert(discoInfoRequest); discoInfoRequest->send(); } void DiscoServiceWalker::handleDiscoInfoResponse(std::shared_ptr<DiscoInfo> info, ErrorPayload::ref error, GetDiscoInfoRequest::ref request) { /* If we got canceled, don't do anything */ if (!active_) { return; } SWIFT_LOG(debug) << "Disco info response from " << request->getReceiver() << std::endl; request->onResponse.disconnect(boost::bind(&DiscoServiceWalker::handleDiscoInfoResponse, this, _1, _2, request)); pendingDiscoInfoRequests_.erase(request); if (error) { handleDiscoError(request->getReceiver(), error); return; } bool couldContainServices = false; - foreach (DiscoInfo::Identity identity, info->getIdentities()) { + for (const auto& identity : info->getIdentities()) { if (identity.getCategory() == "server") { couldContainServices = true; } } bool completed = false; if (couldContainServices) { GetDiscoItemsRequest::ref discoItemsRequest = GetDiscoItemsRequest::create(request->getReceiver(), iqRouter_); discoItemsRequest->onResponse.connect(boost::bind(&DiscoServiceWalker::handleDiscoItemsResponse, this, _1, _2, discoItemsRequest)); pendingDiscoItemsRequests_.insert(discoItemsRequest); discoItemsRequest->send(); } else { completed = true; } onServiceFound(request->getReceiver(), info); if (completed) { markNodeCompleted(request->getReceiver()); } } void DiscoServiceWalker::handleDiscoItemsResponse(std::shared_ptr<DiscoItems> items, ErrorPayload::ref error, GetDiscoItemsRequest::ref request) { /* If we got canceled, don't do anything */ if (!active_) { return; } SWIFT_LOG(debug) << "Received disco items from " << request->getReceiver() << std::endl; request->onResponse.disconnect(boost::bind(&DiscoServiceWalker::handleDiscoItemsResponse, this, _1, _2, request)); pendingDiscoItemsRequests_.erase(request); if (error) { handleDiscoError(request->getReceiver(), error); return; } - foreach (DiscoItems::Item item, items->getItems()) { + for (auto&& item : items->getItems()) { if (item.getNode().empty()) { /* Don't look at noded items. It's possible that this will exclude some services, * but I've never seen one in the wild, and it's an easy fix for not looping. */ if (std::find(searchedServices_.begin(), searchedServices_.end(), item.getJID()) == searchedServices_.end()) { /* Don't recurse infinitely */ SWIFT_LOG(debug) << "Received disco item " << item.getJID() << std::endl; walkNode(item.getJID()); } } } markNodeCompleted(request->getReceiver()); } void DiscoServiceWalker::handleDiscoError(const JID& jid, ErrorPayload::ref /*error*/) { SWIFT_LOG(debug) << "Disco error from " << jid << std::endl; markNodeCompleted(jid); } void DiscoServiceWalker::markNodeCompleted(const JID& jid) { SWIFT_LOG(debug) << "Node completed " << jid << std::endl; servicesBeingSearched_.erase(jid); /* All results are in */ if (servicesBeingSearched_.empty()) { active_ = false; onWalkComplete(); } /* Check if we're on a rampage */ else if (searchedServices_.size() >= maxSteps_) { active_ = false; onWalkComplete(); diff --git a/Swiften/Elements/Form.cpp b/Swiften/Elements/Form.cpp index f8414b2..dc4bd72 100644 --- a/Swiften/Elements/Form.cpp +++ b/Swiften/Elements/Form.cpp @@ -1,66 +1,64 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Elements/Form.h> -#include <Swiften/Base/foreach.h> - namespace Swift { std::string Form::getFormType() const { FormField::ref field = getField("FORM_TYPE"); if (field && field->getType() == FormField::HiddenType) { return field->getValues().empty() ? "" : field->getValues()[0]; } return ""; } FormField::ref Form::getField(const std::string& name) const { - foreach(FormField::ref field, fields_) { + for (const auto& field : fields_) { if (field->getName() == name) { return field; } } return FormField::ref(); } void Form::addReportedField(FormField::ref field) { reportedFields_.push_back(field); } const std::vector<FormField::ref>& Form::getReportedFields() const { return reportedFields_; } void Form::addItem(const Form::FormItem& item) { items_.push_back(item); } const std::vector<Form::FormItem>& Form::getItems() const { return items_; } void Form::clearEmptyTextFields() { std::vector<FormField::ref> populatedFields; - foreach (FormField::ref field, fields_) { + for (const auto& field : fields_) { if (field->getType() == FormField::TextSingleType) { if (!field->getTextSingleValue().empty()) { populatedFields.push_back(field); } } else if (field->getType() == FormField::TextMultiType) { if (!field->getTextMultiValue().empty()) { populatedFields.push_back(field); } } else { populatedFields.push_back(field); } } fields_ = populatedFields; } } diff --git a/Swiften/Elements/RosterItemExchangePayload.cpp b/Swiften/Elements/RosterItemExchangePayload.cpp index 1890811..79d0371 100644 --- a/Swiften/Elements/RosterItemExchangePayload.cpp +++ b/Swiften/Elements/RosterItemExchangePayload.cpp @@ -1,25 +1,23 @@ /* * Copyright (c) 2011 Jan Kaluza * Licensed under the Simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Elements/RosterItemExchangePayload.h> -#include <Swiften/Base/foreach.h> - namespace Swift { RosterItemExchangePayload::Item::Item(Action action) : action(action) { } RosterItemExchangePayload::RosterItemExchangePayload() { } } diff --git a/Swiften/Elements/RosterPayload.cpp b/Swiften/Elements/RosterPayload.cpp index b4be7d1..d745357 100644 --- a/Swiften/Elements/RosterPayload.cpp +++ b/Swiften/Elements/RosterPayload.cpp @@ -1,24 +1,22 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Elements/RosterPayload.h> -#include <Swiften/Base/foreach.h> - namespace Swift { boost::optional<RosterItemPayload> RosterPayload::getItem(const JID& jid) const { - foreach(const RosterItemPayload& item, items_) { + for (const auto& item : items_) { // FIXME: MSVC rejects this. Find out why. //if (item.getJID() == jid) { if (item.getJID().equals(jid, JID::WithResource)) { return boost::optional<RosterItemPayload>(item); } } return boost::optional<RosterItemPayload>(); } } diff --git a/Swiften/Elements/Stanza.cpp b/Swiften/Elements/Stanza.cpp index f5a1b58..0ff6b3c 100644 --- a/Swiften/Elements/Stanza.cpp +++ b/Swiften/Elements/Stanza.cpp @@ -1,70 +1,69 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Elements/Stanza.h> #include <typeinfo> #include <boost/bind.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/Delay.h> namespace Swift { Stanza::Stanza() { } Stanza::~Stanza() { payloads_.clear(); } void Stanza::updatePayload(std::shared_ptr<Payload> payload) { - foreach (std::shared_ptr<Payload>& i, payloads_) { + for (auto&& i : payloads_) { if (typeid(*i.get()) == typeid(*payload.get())) { i = payload; return; } } addPayload(payload); } static bool sameType(std::shared_ptr<Payload> a, std::shared_ptr<Payload> b) { return typeid(*a.get()) == typeid(*b.get()); } void Stanza::removePayloadOfSameType(std::shared_ptr<Payload> payload) { payloads_.erase(std::remove_if(payloads_.begin(), payloads_.end(), boost::bind<bool>(&sameType, payload, _1)), payloads_.end()); } std::shared_ptr<Payload> Stanza::getPayloadOfSameType(std::shared_ptr<Payload> payload) const { - foreach (const std::shared_ptr<Payload>& i, payloads_) { + for (const auto& i : payloads_) { if (typeid(*i.get()) == typeid(*payload.get())) { return i; } } return std::shared_ptr<Payload>(); } boost::optional<boost::posix_time::ptime> Stanza::getTimestamp() const { std::shared_ptr<Delay> delay = getPayload<Delay>(); return delay ? delay->getStamp() : boost::optional<boost::posix_time::ptime>(); } boost::optional<boost::posix_time::ptime> Stanza::getTimestampFrom(const JID& jid) const { std::vector< std::shared_ptr<Delay> > delays = getPayloads<Delay>(); for (auto& delay : delays) { if (delay->getFrom() == jid) { return delay->getStamp(); } } return getTimestamp(); } } diff --git a/Swiften/Elements/VCard.cpp b/Swiften/Elements/VCard.cpp index f541d06..571ead4 100644 --- a/Swiften/Elements/VCard.cpp +++ b/Swiften/Elements/VCard.cpp @@ -1,26 +1,24 @@ /* - * Copyright (c) 2010 Isode Limited. + * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Elements/VCard.h> -#include <Swiften/Base/foreach.h> - namespace Swift { VCard::EMailAddress VCard::getPreferredEMailAddress() const { - foreach(const EMailAddress& address, emailAddresses_) { + for (const auto& address : emailAddresses_) { if (address.isPreferred) { return address; } } if (!emailAddresses_.empty()) { return emailAddresses_[0]; } return EMailAddress(); } } diff --git a/Swiften/EventLoop/EventLoop.cpp b/Swiften/EventLoop/EventLoop.cpp index eefbf65..186616f 100644 --- a/Swiften/EventLoop/EventLoop.cpp +++ b/Swiften/EventLoop/EventLoop.cpp @@ -1,94 +1,93 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/EventLoop/EventLoop.h> #include <algorithm> #include <cassert> #include <vector> #include <boost/bind.hpp> #include <boost/lambda/bind.hpp> #include <boost/lambda/lambda.hpp> #include <boost/optional.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> namespace lambda = boost::lambda; namespace Swift { inline void invokeCallback(const Event& event) { try { assert(!event.callback.empty()); event.callback(); } catch (const std::exception& e) { SWIFT_LOG(error) << "Uncaught exception in event loop: " << e.what() << std::endl; } catch (...) { SWIFT_LOG(error) << "Uncaught non-exception in event loop" << std::endl; } } EventLoop::EventLoop() : nextEventID_(0), handlingEvents_(false) { } EventLoop::~EventLoop() { } void EventLoop::handleNextEvents() { const int eventsBatched = 100; // If handleNextEvents is already in progress, e.g. in case of a recursive call due to // the event loop implementation, then do no handle further events. Instead call // eventPosted() to continue event handling later. bool callEventPosted = handlingEvents_; if (!handlingEvents_) { handlingEvents_ = true; std::unique_lock<std::recursive_mutex> lock(removeEventsMutex_); { std::vector<Event> nextEvents; { std::unique_lock<std::recursive_mutex> lock(eventsMutex_); for (int n = 0; ((n < eventsBatched) && !events_.empty()); n++) { nextEvents.push_back(events_.front()); events_.pop_front(); } callEventPosted = !events_.empty(); } if (!nextEvents.empty()) { - foreach (const Event& event, nextEvents) { + for (const auto& event : nextEvents) { invokeCallback(event); } } } handlingEvents_ = false; } if (callEventPosted) { eventPosted(); } } void EventLoop::postEvent(boost::function<void ()> callback, std::shared_ptr<EventOwner> owner) { Event event(owner, callback); bool callEventPosted = false; { std::unique_lock<std::recursive_mutex> lock(eventsMutex_); callEventPosted = events_.empty(); event.id = nextEventID_; nextEventID_++; events_.push_back(event); } if (callEventPosted) { eventPosted(); } } void EventLoop::removeEventsFromOwner(std::shared_ptr<EventOwner> owner) { diff --git a/Swiften/EventLoop/SimpleEventLoop.cpp b/Swiften/EventLoop/SimpleEventLoop.cpp index 2397016..cac04e4 100644 --- a/Swiften/EventLoop/SimpleEventLoop.cpp +++ b/Swiften/EventLoop/SimpleEventLoop.cpp @@ -1,42 +1,40 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/EventLoop/SimpleEventLoop.h> #include <boost/bind.hpp> -#include <Swiften/Base/foreach.h> - namespace Swift { SimpleEventLoop::SimpleEventLoop() : isRunning_(true), eventAvailable_(false) { } SimpleEventLoop::~SimpleEventLoop() { } void SimpleEventLoop::doRun(bool breakAfterEvents) { while (isRunning_) { { std::unique_lock<std::mutex> lock(eventAvailableMutex_); while (!eventAvailable_) { eventAvailableCondition_.wait(lock); } eventAvailable_ = false; } runOnce(); if (breakAfterEvents) { return; } } } void SimpleEventLoop::runOnce() { handleNextEvents(); } void SimpleEventLoop::stop() { diff --git a/Swiften/EventLoop/SingleThreadedEventLoop.cpp b/Swiften/EventLoop/SingleThreadedEventLoop.cpp index acb6e4d..0542f37 100644 --- a/Swiften/EventLoop/SingleThreadedEventLoop.cpp +++ b/Swiften/EventLoop/SingleThreadedEventLoop.cpp @@ -1,62 +1,61 @@ /* * Copyright (c) 2010 Soren Dreijer * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/EventLoop/SingleThreadedEventLoop.h> #include <iostream> #include <boost/bind.hpp> -#include <Swiften/Base/foreach.h> - namespace Swift { SingleThreadedEventLoop::SingleThreadedEventLoop() : shouldShutDown_(false), eventAvailable_(false) { } SingleThreadedEventLoop::~SingleThreadedEventLoop() { } void SingleThreadedEventLoop::waitForEvents() { std::unique_lock<std::mutex> lock(eventAvailableMutex_); while (!eventAvailable_ && !shouldShutDown_) { eventAvailableCondition_.wait(lock); } - if (shouldShutDown_) + if (shouldShutDown_) { throw EventLoopCanceledException(); + } } void SingleThreadedEventLoop::handleEvents() { { std::lock_guard<std::mutex> lock(eventAvailableMutex_); eventAvailable_ = false; } handleNextEvents(); } void SingleThreadedEventLoop::stop() { std::unique_lock<std::mutex> lock(eventAvailableMutex_); shouldShutDown_ = true; eventAvailableCondition_.notify_one(); } void SingleThreadedEventLoop::eventPosted() { std::lock_guard<std::mutex> lock(eventAvailableMutex_); eventAvailable_ = true; eventAvailableCondition_.notify_one(); } } // namespace Swift diff --git a/Swiften/Examples/MUCListAndJoin/MUCListAndJoin.cpp b/Swiften/Examples/MUCListAndJoin/MUCListAndJoin.cpp index c3983f1..10b0b40 100644 --- a/Swiften/Examples/MUCListAndJoin/MUCListAndJoin.cpp +++ b/Swiften/Examples/MUCListAndJoin/MUCListAndJoin.cpp @@ -1,80 +1,79 @@ /* * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <iostream> #include <memory> #include <boost/optional.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Client/Client.h> #include <Swiften/Client/ClientXMLTracer.h> #include <Swiften/Disco/GetDiscoItemsRequest.h> #include <Swiften/EventLoop/SimpleEventLoop.h> #include <Swiften/JID/JID.h> #include <Swiften/MUC/MUC.h> #include <Swiften/MUC/MUCManager.h> #include <Swiften/Network/BoostNetworkFactories.h> #include <Swiften/Network/Timer.h> #include <Swiften/Network/TimerFactory.h> using namespace Swift; using namespace std; static SimpleEventLoop eventLoop; static BoostNetworkFactories networkFactories(&eventLoop); static std::shared_ptr<Client> client; static MUC::ref muc; static JID mucJID; static JID roomJID; static void joinMUC() { cout << "Joining " << roomJID.toString() << endl; muc = client->getMUCManager()->createMUC(roomJID); muc->joinAs("SwiftExample"); } static void handleRoomsItemsResponse(std::shared_ptr<DiscoItems> items, ErrorPayload::ref error) { if (error) { cout << "Error fetching list of rooms." << endl; return; } int roomCount = 0; cout << "List of rooms at " << mucJID.toString() << endl; - foreach (DiscoItems::Item item, items->getItems()) { + for (auto&& item : items->getItems()) { roomCount++; cout << "\t" << roomCount << ". " << item.getJID().getNode() << " - " << item.getName() << std::endl; if (roomCount == 1) { roomJID = item.getJID(); } } cout << endl; joinMUC(); } static void handleConnected() { cout << "Connected." << endl; // search for MUC rooms GetDiscoItemsRequest::ref discoItemsRequest = GetDiscoItemsRequest::create(mucJID, client->getIQRouter()); discoItemsRequest->onResponse.connect(&handleRoomsItemsResponse); cout << "Request list of rooms." << endl; discoItemsRequest->send(); } static void handleDisconnected(const boost::optional<ClientError>&) { cout << "Disconnected." << endl; } static void handleIncomingMessage(std::shared_ptr<Message> message) { if (message->getFrom().toBare() == roomJID) { cout << "[ " << roomJID << " ] " << message->getFrom().getResource() << ": " << message->getBody().get_value_or("") << endl; } } diff --git a/Swiften/Examples/SendFile/ReceiveFile.cpp b/Swiften/Examples/SendFile/ReceiveFile.cpp index 0b61987..193c1b7 100644 --- a/Swiften/Examples/SendFile/ReceiveFile.cpp +++ b/Swiften/Examples/SendFile/ReceiveFile.cpp @@ -1,89 +1,89 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <iostream> #include <memory> #include <boost/bind.hpp> #include <boost/filesystem.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Client/Client.h> #include <Swiften/Client/ClientXMLTracer.h> #include <Swiften/Disco/ClientDiscoManager.h> #include <Swiften/Elements/DiscoInfo.h> #include <Swiften/Elements/Presence.h> #include <Swiften/EventLoop/SimpleEventLoop.h> #include <Swiften/FileTransfer/FileTransferManager.h> #include <Swiften/FileTransfer/FileWriteBytestream.h> #include <Swiften/FileTransfer/IncomingFileTransferManager.h> #include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h> #include <Swiften/Jingle/JingleSessionManager.h> #include <Swiften/Network/BoostNetworkFactories.h> using namespace Swift; static SimpleEventLoop eventLoop; static BoostNetworkFactories networkFactories(&eventLoop); static int exitCode = 2; static const std::string CLIENT_NAME = "Swiften FT Test"; static const std::string CLIENT_NODE = "http://swift.im"; class FileReceiver { public: FileReceiver(const JID& jid, const std::string& password) : jid(jid), password(password) { client = new Swift::Client(jid, password, &networkFactories); client->onConnected.connect(boost::bind(&FileReceiver::handleConnected, this)); client->onDisconnected.connect(boost::bind(&FileReceiver::handleDisconnected, this, _1)); tracer = new ClientXMLTracer(client); } ~FileReceiver() { delete tracer; client->onDisconnected.disconnect(boost::bind(&FileReceiver::handleDisconnected, this, _1)); client->onConnected.disconnect(boost::bind(&FileReceiver::handleConnected, this)); delete client; } void start() { client->connect(); } void stop() { - foreach(const IncomingFileTransfer::ref transfer, incomingFileTransfers) { + for (const auto& transfer : incomingFileTransfers) { + (void)transfer; //transfer->stop(); } client->disconnect(); } private: void handleConnected() { Log::setLogLevel(Log::debug); client->getFileTransferManager()->onIncomingFileTransfer.connect(boost::bind(&FileReceiver::handleIncomingFileTransfer, this, _1)); DiscoInfo discoInfo; discoInfo.addIdentity(DiscoInfo::Identity(CLIENT_NAME, "client", "pc")); discoInfo.addFeature(DiscoInfo::JingleFeature); discoInfo.addFeature(DiscoInfo::JingleFTFeature); discoInfo.addFeature(DiscoInfo::Bytestream); discoInfo.addFeature(DiscoInfo::JingleTransportsIBBFeature); discoInfo.addFeature(DiscoInfo::JingleTransportsS5BFeature); client->getDiscoManager()->setCapsNode(CLIENT_NODE); client->getDiscoManager()->setDiscoInfo(discoInfo); client->getPresenceSender()->sendPresence(Presence::create()); } void handleIncomingFileTransfer(IncomingFileTransfer::ref transfer) { SWIFT_LOG(debug) << "foo" << std::endl; incomingFileTransfers.push_back(transfer); std::shared_ptr<FileWriteBytestream> out = std::make_shared<FileWriteBytestream>("out"); transfer->onFinished.connect(boost::bind(&FileReceiver::handleFileTransferFinished, this, _1, out)); transfer->accept(out); } diff --git a/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp b/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp index aefafd9..c6987c0 100644 --- a/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp +++ b/Swiften/FileTransfer/DefaultFileTransferTransporter.cpp @@ -1,44 +1,43 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/FileTransfer/DefaultFileTransferTransporter.h> #include <memory> #include <boost/bind.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Crypto/CryptoProvider.h> #include <Swiften/FileTransfer/FailingTransportSession.h> #include <Swiften/FileTransfer/FileTransferOptions.h> #include <Swiften/FileTransfer/IBBReceiveSession.h> #include <Swiften/FileTransfer/IBBReceiveTransportSession.h> #include <Swiften/FileTransfer/IBBSendSession.h> #include <Swiften/FileTransfer/IBBSendTransportSession.h> #include <Swiften/FileTransfer/LocalJingleTransportCandidateGenerator.h> #include <Swiften/FileTransfer/RemoteJingleTransportCandidateSelector.h> #include <Swiften/FileTransfer/S5BTransportSession.h> #include <Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.h> #include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h> #include <Swiften/FileTransfer/SOCKS5BytestreamServer.h> #include <Swiften/FileTransfer/SOCKS5BytestreamServerManager.h> #include <Swiften/FileTransfer/SOCKS5BytestreamServerSession.h> #include <Swiften/FileTransfer/TransportSession.h> #include <Swiften/Queries/GenericRequest.h> #include <Swiften/StringCodecs/Hexify.h> using namespace Swift; DefaultFileTransferTransporter::DefaultFileTransferTransporter( const JID& initiator, const JID& responder, Role role, SOCKS5BytestreamRegistry* s5bRegistry, SOCKS5BytestreamServerManager* s5bServerManager, SOCKS5BytestreamProxiesManager* s5bProxy, IDGenerator* idGenerator, ConnectionFactory* connectionFactory, @@ -268,42 +267,42 @@ std::string DefaultFileTransferTransporter::getSOCKS5DstAddr() const { std::string DefaultFileTransferTransporter::getInitiatorCandidateSOCKS5DstAddr() const { return Hexify::hexify(crypto->getSHA1Hash(createSafeByteArray(s5bSessionID + initiator.toString() + responder.toString()))); } std::string DefaultFileTransferTransporter::getResponderCandidateSOCKS5DstAddr() const { return Hexify::hexify(crypto->getSHA1Hash(createSafeByteArray(s5bSessionID + responder.toString() + initiator.toString()))); } std::string DefaultFileTransferTransporter::getRemoteCandidateSOCKS5DstAddr() const { if (role == Initiator) { return getResponderCandidateSOCKS5DstAddr(); } else { return getInitiatorCandidateSOCKS5DstAddr(); } } std::string DefaultFileTransferTransporter::getLocalCandidateSOCKS5DstAddr() const { if (role == Responder) { return getResponderCandidateSOCKS5DstAddr(); } else { return getInitiatorCandidateSOCKS5DstAddr(); } } void DefaultFileTransferTransporter::closeLocalSession() { s5bRegistry->setHasBytestream(getSOCKS5DstAddr(), false); if (s5bServerManager->getServer()) { std::vector<std::shared_ptr<SOCKS5BytestreamServerSession> > serverSessions = s5bServerManager->getServer()->getSessions(getSOCKS5DstAddr()); - foreach(std::shared_ptr<SOCKS5BytestreamServerSession> session, serverSessions) { + for (auto&& session : serverSessions) { session->stop(); } } } void DefaultFileTransferTransporter::closeRemoteSession() { if (remoteS5BClientSession) { remoteS5BClientSession->stop(); remoteS5BClientSession.reset(); } } diff --git a/Swiften/FileTransfer/IncomingJingleFileTransfer.cpp b/Swiften/FileTransfer/IncomingJingleFileTransfer.cpp index f73cd38..d5de5e4 100644 --- a/Swiften/FileTransfer/IncomingJingleFileTransfer.cpp +++ b/Swiften/FileTransfer/IncomingJingleFileTransfer.cpp @@ -1,45 +1,44 @@ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/FileTransfer/IncomingJingleFileTransfer.h> #include <memory> #include <set> #include <boost/bind.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/JingleFileTransferDescription.h> #include <Swiften/Elements/JingleFileTransferHash.h> #include <Swiften/Elements/JingleIBBTransportPayload.h> #include <Swiften/Elements/JingleS5BTransportPayload.h> #include <Swiften/FileTransfer/FileTransferOptions.h> #include <Swiften/FileTransfer/FileTransferTransporter.h> #include <Swiften/FileTransfer/FileTransferTransporterFactory.h> #include <Swiften/FileTransfer/IncrementalBytestreamHashCalculator.h> #include <Swiften/FileTransfer/TransportSession.h> #include <Swiften/FileTransfer/WriteBytestream.h> #include <Swiften/Jingle/JingleSession.h> #include <Swiften/Network/TimerFactory.h> #include <Swiften/Queries/GenericRequest.h> #include <Swiften/StringCodecs/Base64.h> using namespace Swift; // TODO: ALlow terminate when already terminated. IncomingJingleFileTransfer::IncomingJingleFileTransfer( const JID& toJID, JingleSession::ref session, JingleContentPayload::ref content, FileTransferTransporterFactory* transporterFactory, TimerFactory* timerFactory, CryptoProvider* crypto) : JingleFileTransfer(session, toJID, transporterFactory), initialContent(content), crypto(crypto), state(Initial), @@ -103,61 +102,61 @@ void IncomingJingleFileTransfer::accept( description->getFileInfo().getSize(), stream)); session->sendAccept(getContentID(), initialContent->getDescriptions()[0], ibbTransport); } else { // This might happen on incoming transfer which only list transport methods we are not allowed to use due to file-transfer options. session->sendTerminate(JinglePayload::Reason::UnsupportedTransports); setFinishedState(FileTransfer::State::Failed, FileTransferError(FileTransferError::PeerError)); } } void IncomingJingleFileTransfer::cancel() { SWIFT_LOG(debug) << std::endl; terminate(state == Initial ? JinglePayload::Reason::Decline : JinglePayload::Reason::Cancel); } void IncomingJingleFileTransfer::handleLocalTransportCandidatesGenerated( const std::string& s5bSessionID, const std::vector<JingleS5BTransportPayload::Candidate>& candidates, const std::string& dstAddr) { SWIFT_LOG(debug) << std::endl; if (state != GeneratingInitialLocalCandidates) { SWIFT_LOG(warning) << "Incorrect state" << std::endl; return; } fillCandidateMap(localCandidates, candidates); JingleS5BTransportPayload::ref transport = std::make_shared<JingleS5BTransportPayload>(); transport->setSessionID(s5bSessionID); transport->setMode(JingleS5BTransportPayload::TCPMode); transport->setDstAddr(dstAddr); - foreach(JingleS5BTransportPayload::Candidate candidate, candidates) { + for (auto&& candidate : candidates) { transport->addCandidate(candidate); } session->sendAccept(getContentID(), initialContent->getDescriptions()[0], transport); setState(TryingCandidates); transporter->startTryingRemoteCandidates(); } void IncomingJingleFileTransfer::handleSessionInfoReceived(JinglePayload::ref jinglePayload) { SWIFT_LOG(debug) << std::endl; JingleFileTransferHash::ref transferHash = jinglePayload->getPayload<JingleFileTransferHash>(); if (transferHash) { SWIFT_LOG(debug) << "Received hash information." << std::endl; waitOnHashTimer->stop(); if (transferHash->getFileInfo().getHashes().find("sha-1") != transferHash->getFileInfo().getHashes().end()) { hashes["sha-1"] = transferHash->getFileInfo().getHash("sha-1").get(); } if (transferHash->getFileInfo().getHashes().find("md5") != transferHash->getFileInfo().getHashes().end()) { hashes["md5"] = transferHash->getFileInfo().getHash("md5").get(); } if (state == WaitingForHash) { checkHashAndTerminate(); } } else { SWIFT_LOG(debug) << "Ignoring unknown session info" << std::endl; } } @@ -170,61 +169,61 @@ void IncomingJingleFileTransfer::handleSessionTerminateReceived(boost::optional< SWIFT_LOG(debug) << "Already terminated" << std::endl; return; } stopAll(); if (reason && reason->type == JinglePayload::Reason::Cancel) { setFinishedState(FileTransfer::State::Canceled, FileTransferError(FileTransferError::PeerError)); } else if (reason && reason->type == JinglePayload::Reason::Success) { setFinishedState(FileTransfer::State::Finished, boost::optional<FileTransferError>()); } else { setFinishedState(FileTransfer::State::Failed, FileTransferError(FileTransferError::PeerError)); } } void IncomingJingleFileTransfer::checkHashAndTerminate() { if (verifyData()) { terminate(JinglePayload::Reason::Success); } else { SWIFT_LOG(warning) << "Hash verification failed" << std::endl; terminate(JinglePayload::Reason::MediaError); } } void IncomingJingleFileTransfer::checkIfAllDataReceived() { if (receivedBytes == getFileSizeInBytes()) { SWIFT_LOG(debug) << "All data received." << std::endl; bool hashInfoAvailable = false; - foreach(const JingleFileTransferFileInfo::HashElementMap::value_type& hashElement, hashes) { + for (const auto& hashElement : hashes) { hashInfoAvailable |= !hashElement.second.empty(); } if (!hashInfoAvailable) { SWIFT_LOG(debug) << "No hash information yet. Waiting a while on hash info." << std::endl; setState(WaitingForHash); waitOnHashTimer->start(); } else { checkHashAndTerminate(); } } else if (receivedBytes > getFileSizeInBytes()) { SWIFT_LOG(debug) << "We got more than we could handle!" << std::endl; terminate(JinglePayload::Reason::MediaError); } } void IncomingJingleFileTransfer::handleWriteStreamDataReceived( const std::vector<unsigned char>& data) { hashCalculator->feedData(data); receivedBytes += data.size(); onProcessedBytes(data.size()); checkIfAllDataReceived(); } void IncomingJingleFileTransfer::handleTransportReplaceReceived( const JingleContentID& content, JingleTransportPayload::ref transport) { SWIFT_LOG(debug) << std::endl; if (state != WaitingForFallbackOrTerminate) { diff --git a/Swiften/FileTransfer/JingleFileTransfer.cpp b/Swiften/FileTransfer/JingleFileTransfer.cpp index 36725de..62c3a53 100644 --- a/Swiften/FileTransfer/JingleFileTransfer.cpp +++ b/Swiften/FileTransfer/JingleFileTransfer.cpp @@ -1,72 +1,71 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/FileTransfer/JingleFileTransfer.h> #include <boost/typeof/typeof.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Crypto/CryptoProvider.h> #include <Swiften/FileTransfer/FileTransferTransporter.h> #include <Swiften/JID/JID.h> #include <Swiften/Jingle/JingleSession.h> #include <Swiften/StringCodecs/Hexify.h> using namespace Swift; JingleFileTransfer::JingleFileTransfer( std::shared_ptr<JingleSession> session, const JID& target, FileTransferTransporterFactory* transporterFactory) : session(session), target(target), transporterFactory(transporterFactory), transporter(nullptr), ourCandidateSelectFinished(false), theirCandidateSelectFinished(false) { session->addListener(this); } JingleFileTransfer::~JingleFileTransfer() { session->removeListener(this); } void JingleFileTransfer::fillCandidateMap(CandidateMap& map, const std::vector<JingleS5BTransportPayload::Candidate>& candidates) { map.clear(); - foreach (JingleS5BTransportPayload::Candidate candidate, candidates) { + for (auto&& candidate : candidates) { map[candidate.cid] = candidate; } } /* std::string JingleFileTransfer::getS5BDstAddr(const JID& requester, const JID& target) const { return Hexify::hexify(crypto->getSHA1Hash( createSafeByteArray(s5bSessionID + requester.toString() + target.toString()))); } */ const JID& JingleFileTransfer::getInitiator() const { return session->getInitiator(); } const JID& JingleFileTransfer::getResponder() const { return target; } FileTransfer::State::Type JingleFileTransfer::getExternalFinishedState(JinglePayload::Reason::Type reason) { if (reason == JinglePayload::Reason::Cancel || reason == JinglePayload::Reason::Decline) { return FileTransfer::State::Canceled; } else if (reason == JinglePayload::Reason::Success) { return FileTransfer::State::Finished; } else { return FileTransfer::State::Failed; } } diff --git a/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp b/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp index fcc160a..367fc97 100644 --- a/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp +++ b/Swiften/FileTransfer/OutgoingJingleFileTransfer.cpp @@ -1,57 +1,56 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ // TODO: // - We should handle incoming terminates after we have terminated, so the other // side can warn that he didn't receive all bytes correctly. // - Should the proby stuff also wait for candidate used acknowledgement? #include <Swiften/FileTransfer/OutgoingJingleFileTransfer.h> #include <memory> #include <boost/bind.hpp> #include <boost/typeof/typeof.hpp> #include <Swiften/Base/IDGenerator.h> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Crypto/CryptoProvider.h> #include <Swiften/Elements/JingleFileTransferDescription.h> #include <Swiften/Elements/JingleFileTransferHash.h> #include <Swiften/Elements/JingleIBBTransportPayload.h> #include <Swiften/Elements/JingleS5BTransportPayload.h> #include <Swiften/Elements/JingleTransportPayload.h> #include <Swiften/FileTransfer/FileTransferTransporter.h> #include <Swiften/FileTransfer/FileTransferTransporterFactory.h> #include <Swiften/FileTransfer/IncrementalBytestreamHashCalculator.h> #include <Swiften/FileTransfer/ReadBytestream.h> #include <Swiften/FileTransfer/TransportSession.h> #include <Swiften/Jingle/JingleContentID.h> #include <Swiften/Jingle/JingleSession.h> #include <Swiften/Network/TimerFactory.h> using namespace Swift; static const int DEFAULT_BLOCK_SIZE = 4096; OutgoingJingleFileTransfer::OutgoingJingleFileTransfer( const JID& toJID, JingleSession::ref session, std::shared_ptr<ReadBytestream> stream, FileTransferTransporterFactory* transporterFactory, TimerFactory* timerFactory, IDGenerator* idGenerator, const JingleFileTransferFileInfo& fileInfo, const FileTransferOptions& options, CryptoProvider* crypto) : JingleFileTransfer(session, toJID, transporterFactory), @@ -188,61 +187,61 @@ void OutgoingJingleFileTransfer::sendSessionInfoHash() { hashElement->getFileInfo().addHash(HashElement("sha-1", hashCalculator->getSHA1Hash())); hashElement->getFileInfo().addHash(HashElement("md5", hashCalculator->getMD5Hash())); session->sendInfo(hashElement); } void OutgoingJingleFileTransfer::handleLocalTransportCandidatesGenerated( const std::string& s5bSessionID, const std::vector<JingleS5BTransportPayload::Candidate>& candidates, const std::string& dstAddr) { SWIFT_LOG(debug) << std::endl; if (state != GeneratingInitialLocalCandidates) { SWIFT_LOG(warning) << "Incorrect state: " << state << std::endl; return; } fillCandidateMap(localCandidates, candidates); JingleFileTransferDescription::ref description = std::make_shared<JingleFileTransferDescription>(); fileInfo.addHash(HashElement("sha-1", ByteArray())); fileInfo.addHash(HashElement("md5", ByteArray())); description->setFileInfo(fileInfo); JingleTransportPayload::ref transport; if (candidates.empty()) { SWIFT_LOG(debug) << "no S5B candidates generated. Send IBB transport candidate." << std::endl; JingleIBBTransportPayload::ref ibbTransport = std::make_shared<JingleIBBTransportPayload>(); ibbTransport->setBlockSize(DEFAULT_BLOCK_SIZE); ibbTransport->setSessionID(idGenerator->generateID()); transport = ibbTransport; } else { JingleS5BTransportPayload::ref s5bTransport = std::make_shared<JingleS5BTransportPayload>(); s5bTransport->setSessionID(s5bSessionID); s5bTransport->setMode(JingleS5BTransportPayload::TCPMode); s5bTransport->setDstAddr(dstAddr); - foreach(JingleS5BTransportPayload::Candidate candidate, candidates) { + for (auto&& candidate : candidates) { s5bTransport->addCandidate(candidate); SWIFT_LOG(debug) << "\t" << "S5B candidate: " << candidate.hostPort.toString() << std::endl; } transport = s5bTransport; } setInternalState(WaitingForAccept); session->sendInitiate(contentID, description, transport); } void OutgoingJingleFileTransfer::fallback() { if (options.isInBandAllowed()) { SWIFT_LOG(debug) << "Trying to fallback to IBB transport." << std::endl; JingleIBBTransportPayload::ref ibbTransport = std::make_shared<JingleIBBTransportPayload>(); ibbTransport->setBlockSize(DEFAULT_BLOCK_SIZE); ibbTransport->setSessionID(idGenerator->generateID()); setInternalState(FallbackRequested); session->sendTransportReplace(contentID, ibbTransport); } else { SWIFT_LOG(debug) << "Fallback to IBB transport not allowed." << std::endl; terminate(JinglePayload::Reason::ConnectivityError); } } void OutgoingJingleFileTransfer::handleTransferFinished(boost::optional<FileTransferError> error) { SWIFT_LOG(debug) << std::endl; if (state != Transferring) { SWIFT_LOG(warning) << "Incorrect state: " << state << std::endl; return; } if (error) { terminate(JinglePayload::Reason::ConnectivityError); diff --git a/Swiften/FileTransfer/RemoteJingleTransportCandidateSelector.cpp b/Swiften/FileTransfer/RemoteJingleTransportCandidateSelector.cpp index a0e7a6f..56013ca 100644 --- a/Swiften/FileTransfer/RemoteJingleTransportCandidateSelector.cpp +++ b/Swiften/FileTransfer/RemoteJingleTransportCandidateSelector.cpp @@ -1,72 +1,71 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/FileTransfer/RemoteJingleTransportCandidateSelector.h> #include <memory> #include <boost/bind.hpp> #include <boost/signals2.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/JingleS5BTransportPayload.h> #include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h> #include <Swiften/Network/ConnectionFactory.h> using namespace Swift; RemoteJingleTransportCandidateSelector::RemoteJingleTransportCandidateSelector( ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const FileTransferOptions& options) : connectionFactory(connectionFactory), timerFactory(timerFactory), options(options) { } RemoteJingleTransportCandidateSelector::~RemoteJingleTransportCandidateSelector() { } void RemoteJingleTransportCandidateSelector::addCandidates( const std::vector<JingleS5BTransportPayload::Candidate>& candidates) { - foreach(JingleS5BTransportPayload::Candidate c, candidates) { + for (auto&& c : candidates) { this->candidates.push(c); } } void RemoteJingleTransportCandidateSelector::startSelectingCandidate() { tryNextCandidate(); } void RemoteJingleTransportCandidateSelector::stopSelectingCandidate() { if (s5bSession) { sessionReadyConnection.disconnect(); s5bSession->stop(); } } void RemoteJingleTransportCandidateSelector::tryNextCandidate() { if (candidates.empty()) { SWIFT_LOG(debug) << "No more candidates" << std::endl; onCandidateSelectFinished( boost::optional<JingleS5BTransportPayload::Candidate>(), std::shared_ptr<SOCKS5BytestreamClientSession>()); } else { lastCandidate = candidates.top(); candidates.pop(); SWIFT_LOG(debug) << "Trying candidate " << lastCandidate.cid << std::endl; if ((lastCandidate.type == JingleS5BTransportPayload::Candidate::DirectType && options.isDirectAllowed()) || (lastCandidate.type == JingleS5BTransportPayload::Candidate::AssistedType && options.isAssistedAllowed()) || (lastCandidate.type == JingleS5BTransportPayload::Candidate::ProxyType && options.isProxiedAllowed())) { std::shared_ptr<Connection> connection = connectionFactory->createConnection(); s5bSession = std::make_shared<SOCKS5BytestreamClientSession>( diff --git a/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp b/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp index 9624d4c..90c42dd 100644 --- a/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp +++ b/Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.cpp @@ -1,72 +1,70 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2015-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/FileTransfer/SOCKS5BytestreamProxyFinder.h> #include <memory> #include <boost/bind.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/S5BProxyRequest.h> #include <Swiften/Queries/GenericRequest.h> #include <Swiften/Queries/IQRouter.h> namespace Swift { SOCKS5BytestreamProxyFinder::SOCKS5BytestreamProxyFinder(const JID& service, IQRouter *iqRouter) : service(service), iqRouter(iqRouter) { } SOCKS5BytestreamProxyFinder::~SOCKS5BytestreamProxyFinder() { } void SOCKS5BytestreamProxyFinder::start() { serviceWalker = std::make_shared<DiscoServiceWalker>(service, iqRouter); serviceWalker->onServiceFound.connect(boost::bind(&SOCKS5BytestreamProxyFinder::handleServiceFound, this, _1, _2)); serviceWalker->onWalkComplete.connect(boost::bind(&SOCKS5BytestreamProxyFinder::handleWalkEnded, this)); serviceWalker->beginWalk(); } void SOCKS5BytestreamProxyFinder::stop() { - typedef std::shared_ptr<GenericRequest<S5BProxyRequest> > S5BProxyRequestGenericRequest; - foreach (S5BProxyRequestGenericRequest requester, pendingRequests) { + for (auto&& requester : pendingRequests) { requester->onResponse.disconnect(boost::bind(&SOCKS5BytestreamProxyFinder::handleProxyResponse, this, requester, _1, _2)); } serviceWalker->endWalk(); serviceWalker->onServiceFound.disconnect(boost::bind(&SOCKS5BytestreamProxyFinder::handleServiceFound, this, _1, _2)); serviceWalker->onWalkComplete.disconnect(boost::bind(&SOCKS5BytestreamProxyFinder::handleWalkEnded, this)); serviceWalker.reset(); } void SOCKS5BytestreamProxyFinder::sendBytestreamQuery(const JID& jid) { S5BProxyRequest::ref proxyRequest = std::make_shared<S5BProxyRequest>(); std::shared_ptr<GenericRequest<S5BProxyRequest> > request = std::make_shared<GenericRequest<S5BProxyRequest> >(IQ::Get, jid, proxyRequest, iqRouter); request->onResponse.connect(boost::bind(&SOCKS5BytestreamProxyFinder::handleProxyResponse, this, request, _1, _2)); pendingRequests.insert(request); request->send(); } void SOCKS5BytestreamProxyFinder::handleServiceFound(const JID& jid, std::shared_ptr<DiscoInfo> discoInfo) { if (discoInfo->hasFeature(DiscoInfo::Bytestream)) { sendBytestreamQuery(jid); } } void SOCKS5BytestreamProxyFinder::handleWalkEnded() { if (pendingRequests.empty()) { onProxiesFound(proxyHosts); } } void SOCKS5BytestreamProxyFinder::handleProxyResponse(std::shared_ptr<GenericRequest<S5BProxyRequest> > requester, std::shared_ptr<S5BProxyRequest> request, ErrorPayload::ref error) { diff --git a/Swiften/FileTransfer/SOCKS5BytestreamRegistry.cpp b/Swiften/FileTransfer/SOCKS5BytestreamRegistry.cpp index 1591e24..9e214fc 100644 --- a/Swiften/FileTransfer/SOCKS5BytestreamRegistry.cpp +++ b/Swiften/FileTransfer/SOCKS5BytestreamRegistry.cpp @@ -1,38 +1,37 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h> #include <memory> #include <Swiften/Base/Algorithm.h> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> namespace Swift { SOCKS5BytestreamRegistry::SOCKS5BytestreamRegistry() { } void SOCKS5BytestreamRegistry::setHasBytestream(const std::string& destination, bool b) { if (b) { availableBytestreams.insert(destination); } else { availableBytestreams.erase(destination); } } bool SOCKS5BytestreamRegistry::hasBytestream(const std::string& destination) const { return availableBytestreams.find(destination) != availableBytestreams.end(); } std::string SOCKS5BytestreamRegistry::generateSessionID() { return idGenerator.generateID(); } } diff --git a/Swiften/FileTransfer/SOCKS5BytestreamServer.cpp b/Swiften/FileTransfer/SOCKS5BytestreamServer.cpp index b68bd58..483ea18 100644 --- a/Swiften/FileTransfer/SOCKS5BytestreamServer.cpp +++ b/Swiften/FileTransfer/SOCKS5BytestreamServer.cpp @@ -1,69 +1,68 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/FileTransfer/SOCKS5BytestreamServer.h> #include <boost/bind.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Crypto/CryptoProvider.h> #include <Swiften/FileTransfer/SOCKS5BytestreamRegistry.h> #include <Swiften/FileTransfer/SOCKS5BytestreamServerSession.h> #include <Swiften/StringCodecs/Hexify.h> namespace Swift { SOCKS5BytestreamServer::SOCKS5BytestreamServer( std::shared_ptr<ConnectionServer> connectionServer, SOCKS5BytestreamRegistry* registry) : connectionServer(connectionServer), registry(registry) { } void SOCKS5BytestreamServer::start() { connectionServer->onNewConnection.connect(boost::bind(&SOCKS5BytestreamServer::handleNewConnection, this, _1)); } void SOCKS5BytestreamServer::stop() { connectionServer->onNewConnection.disconnect(boost::bind(&SOCKS5BytestreamServer::handleNewConnection, this, _1)); - foreach (std::shared_ptr<SOCKS5BytestreamServerSession> session, sessions) { + for (auto&& session : sessions) { session->onFinished.disconnect(boost::bind(&SOCKS5BytestreamServer::handleSessionFinished, this, session)); session->stop(); } sessions.clear(); } void SOCKS5BytestreamServer::handleNewConnection(std::shared_ptr<Connection> connection) { std::shared_ptr<SOCKS5BytestreamServerSession> session = std::make_shared<SOCKS5BytestreamServerSession>(connection, registry); session->onFinished.connect(boost::bind(&SOCKS5BytestreamServer::handleSessionFinished, this, session)); sessions.push_back(session); session->start(); } HostAddressPort SOCKS5BytestreamServer::getAddressPort() const { return connectionServer->getAddressPort(); } std::vector< std::shared_ptr<SOCKS5BytestreamServerSession> > SOCKS5BytestreamServer::getSessions( const std::string& streamID) const { std::vector< std::shared_ptr<SOCKS5BytestreamServerSession> > result; - foreach (std::shared_ptr<SOCKS5BytestreamServerSession> session, sessions) { + for (auto&& session : sessions) { if (session->getStreamID() == streamID) { result.push_back(session); } } return result; } void SOCKS5BytestreamServer::handleSessionFinished(std::shared_ptr<SOCKS5BytestreamServerSession> session) { sessions.erase(std::remove(sessions.begin(), sessions.end(), session), sessions.end()); session->onFinished.disconnect(boost::bind(&SOCKS5BytestreamServer::handleSessionFinished, this, session)); } } diff --git a/Swiften/Jingle/JingleSession.cpp b/Swiften/Jingle/JingleSession.cpp index 778ee1d..b5cfbef 100644 --- a/Swiften/Jingle/JingleSession.cpp +++ b/Swiften/Jingle/JingleSession.cpp @@ -1,25 +1,24 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Jingle/JingleSession.h> #include <algorithm> +#include <cassert> #include <memory> #include <boost/function.hpp> -#include <Swiften/Base/foreach.h> - using namespace Swift; JingleSession::JingleSession(const JID& initiator, const std::string& id) : initiator(initiator), id(id) { // initiator must always be a full JID; session lookup based on it wouldn't work otherwise // this is checked on an upper level so that the assert never fails assert(!initiator.isBare()); } JingleSession::~JingleSession() { } diff --git a/Swiften/Jingle/JingleSessionManager.cpp b/Swiften/Jingle/JingleSessionManager.cpp index ca6cebb..f7ed58e 100644 --- a/Swiften/Jingle/JingleSessionManager.cpp +++ b/Swiften/Jingle/JingleSessionManager.cpp @@ -1,56 +1,55 @@ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Jingle/JingleSessionManager.h> #include <Swiften/Base/Algorithm.h> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Jingle/IncomingJingleSessionHandler.h> #include <Swiften/Jingle/JingleResponder.h> namespace Swift { JingleSessionManager::JingleSessionManager(IQRouter* router) : router(router) { responder = new JingleResponder(this, router); responder->start(); } JingleSessionManager::~JingleSessionManager() { responder->stop(); delete responder; } JingleSessionImpl::ref JingleSessionManager::getSession(const JID& jid, const std::string& id) const { SessionMap::const_iterator i = sessions.find(JIDSession(jid, id)); return i != sessions.end() ? i->second : JingleSessionImpl::ref(); } void JingleSessionManager::addIncomingSessionHandler(IncomingJingleSessionHandler* handler) { incomingSessionHandlers.push_back(handler); } void JingleSessionManager::removeIncomingSessionHandler(IncomingJingleSessionHandler* handler) { erase(incomingSessionHandlers, handler); } void JingleSessionManager::registerOutgoingSession(const JID& initiator, JingleSessionImpl::ref session) { sessions.insert(std::make_pair(JIDSession(initiator, session->getID()), session)); SWIFT_LOG(debug) << "Added session " << session->getID() << " for initiator " << initiator.toString() << std::endl; } void JingleSessionManager::handleIncomingSession(const JID& initiator, const JID& recipient, JingleSessionImpl::ref session, const std::vector<JingleContentPayload::ref>& contents) { sessions.insert(std::make_pair(JIDSession(initiator, session->getID()), session)); - foreach (IncomingJingleSessionHandler* handler, incomingSessionHandlers) { + for (auto handler : incomingSessionHandlers) { if (handler->handleIncomingJingleSession(session, contents, recipient)) { return; } } // TODO: Finish session } } diff --git a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp index 9cfe3cd..0906ffc 100644 --- a/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp +++ b/Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.cpp @@ -1,44 +1,43 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/LinkLocal/DNSSD/Bonjour/BonjourQuerier.h> #include <fcntl.h> #include <sys/socket.h> #include <unistd.h> #include <Swiften/Base/Algorithm.h> -#include <Swiften/Base/foreach.h> #include <Swiften/LinkLocal/DNSSD/Bonjour/BonjourBrowseQuery.h> #include <Swiften/LinkLocal/DNSSD/Bonjour/BonjourRegisterQuery.h> #include <Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveHostnameQuery.h> #include <Swiften/LinkLocal/DNSSD/Bonjour/BonjourResolveServiceQuery.h> namespace Swift { BonjourQuerier::BonjourQuerier(EventLoop* eventLoop) : eventLoop(eventLoop), stopRequested(false), thread(nullptr) { int fds[2]; int result = pipe(fds); assert(result == 0); (void) result; interruptSelectReadSocket = fds[0]; fcntl(interruptSelectReadSocket, F_SETFL, fcntl(interruptSelectReadSocket, F_GETFL)|O_NONBLOCK); interruptSelectWriteSocket = fds[1]; } BonjourQuerier::~BonjourQuerier() { assert(!thread); } std::shared_ptr<DNSSDBrowseQuery> BonjourQuerier::createBrowseQuery() { return std::make_shared<BonjourBrowseQuery>(shared_from_this(), eventLoop); } std::shared_ptr<DNSSDRegisterQuery> BonjourQuerier::createRegisterQuery(const std::string& name, int port, const ByteArray& info) { return std::make_shared<BonjourRegisterQuery>(name, port, info, shared_from_this(), eventLoop); } std::shared_ptr<DNSSDResolveServiceQuery> BonjourQuerier::createResolveServiceQuery(const DNSSDServiceID& service) { @@ -79,58 +78,58 @@ void BonjourQuerier::stop() { if (thread) { stopRequested = true; assert(runningQueries.empty()); runningQueriesAvailableEvent.notify_one(); interruptSelect(); thread->join(); delete thread; thread = nullptr; stopRequested = false; } } void BonjourQuerier::run() { while (!stopRequested) { fd_set fdSet; int maxSocket; { std::unique_lock<std::mutex> lock(runningQueriesMutex); if (runningQueries.empty()) { runningQueriesAvailableEvent.wait(lock); if (runningQueries.empty()) { continue; } } // Run all running queries FD_ZERO(&fdSet); maxSocket = interruptSelectReadSocket; FD_SET(interruptSelectReadSocket, &fdSet); - foreach(const std::shared_ptr<BonjourQuery>& query, runningQueries) { + for (const auto& query : runningQueries) { int socketID = query->getSocketID(); maxSocket = std::max(maxSocket, socketID); FD_SET(socketID, &fdSet); } } if (select(maxSocket+1, &fdSet, nullptr, nullptr, nullptr) <= 0) { continue; } if (FD_ISSET(interruptSelectReadSocket, &fdSet)) { char dummy; while (read(interruptSelectReadSocket, &dummy, 1) > 0) {} } { std::lock_guard<std::mutex> lock(runningQueriesMutex); - foreach(std::shared_ptr<BonjourQuery> query, runningQueries) { + for (auto&& query : runningQueries) { if (FD_ISSET(query->getSocketID(), &fdSet)) { query->processResult(); } } } } } } diff --git a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp index 63ad3b8..c17f8b2 100644 --- a/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp +++ b/Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.cpp @@ -1,140 +1,139 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDQuerier.h> #include <iostream> #include <boost/bind.hpp> #include <Swiften/Base/Algorithm.h> -#include <Swiften/Base/foreach.h> #include <Swiften/EventLoop/EventLoop.h> #include <Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDBrowseQuery.h> #include <Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDRegisterQuery.h> #include <Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDResolveHostnameQuery.h> #include <Swiften/LinkLocal/DNSSD/Fake/FakeDNSSDResolveServiceQuery.h> namespace Swift { FakeDNSSDQuerier::FakeDNSSDQuerier(const std::string& domain, EventLoop* eventLoop) : domain(domain), eventLoop(eventLoop) { } FakeDNSSDQuerier::~FakeDNSSDQuerier() { if (!runningQueries.empty()) { std::cerr << "FakeDNSSDQuerier: Running queries not empty at destruction time" << std::endl; } } std::shared_ptr<DNSSDBrowseQuery> FakeDNSSDQuerier::createBrowseQuery() { return std::make_shared<FakeDNSSDBrowseQuery>(shared_from_this()); } std::shared_ptr<DNSSDRegisterQuery> FakeDNSSDQuerier::createRegisterQuery(const std::string& name, int port, const ByteArray& info) { return std::make_shared<FakeDNSSDRegisterQuery>(name, port, info, shared_from_this()); } std::shared_ptr<DNSSDResolveServiceQuery> FakeDNSSDQuerier::createResolveServiceQuery(const DNSSDServiceID& service) { return std::make_shared<FakeDNSSDResolveServiceQuery>(service, shared_from_this()); } std::shared_ptr<DNSSDResolveHostnameQuery> FakeDNSSDQuerier::createResolveHostnameQuery(const std::string& hostname, int interfaceIndex) { return std::make_shared<FakeDNSSDResolveHostnameQuery>(hostname, interfaceIndex, shared_from_this()); } void FakeDNSSDQuerier::addRunningQuery(std::shared_ptr<FakeDNSSDQuery> query) { runningQueries.push_back(query); allQueriesEverRun.push_back(query); if (std::shared_ptr<FakeDNSSDBrowseQuery> browseQuery = std::dynamic_pointer_cast<FakeDNSSDBrowseQuery>(query)) { - foreach(const DNSSDServiceID& service, services) { + for (const auto& service : services) { eventLoop->postEvent(boost::bind(boost::ref(browseQuery->onServiceAdded), service), shared_from_this()); } } else if (std::shared_ptr<FakeDNSSDResolveServiceQuery> resolveQuery = std::dynamic_pointer_cast<FakeDNSSDResolveServiceQuery>(query)) { - for(ServiceInfoMap::const_iterator i = serviceInfo.begin(); i != serviceInfo.end(); ++i) { - if (i->first == resolveQuery->service) { - eventLoop->postEvent(boost::bind(boost::ref(resolveQuery->onServiceResolved), i->second), shared_from_this()); + for (const auto& i : serviceInfo) { + if (i.first == resolveQuery->service) { + eventLoop->postEvent(boost::bind(boost::ref(resolveQuery->onServiceResolved), i.second), shared_from_this()); } } } else if (std::shared_ptr<FakeDNSSDRegisterQuery> registerQuery = std::dynamic_pointer_cast<FakeDNSSDRegisterQuery>(query)) { DNSSDServiceID service(registerQuery->name, domain); eventLoop->postEvent(boost::bind(boost::ref(registerQuery->onRegisterFinished), service), shared_from_this()); } else if (std::shared_ptr<FakeDNSSDResolveHostnameQuery> resolveHostnameQuery = std::dynamic_pointer_cast<FakeDNSSDResolveHostnameQuery>(query)) { std::map<std::string,boost::optional<HostAddress> >::const_iterator i = addresses.find(resolveHostnameQuery->hostname); if (i != addresses.end()) { eventLoop->postEvent( boost::bind( boost::ref(resolveHostnameQuery->onHostnameResolved), i->second), shared_from_this()); } } } void FakeDNSSDQuerier::removeRunningQuery(std::shared_ptr<FakeDNSSDQuery> query) { erase(runningQueries, query); } void FakeDNSSDQuerier::addService(const DNSSDServiceID& id) { services.insert(id); - foreach(const std::shared_ptr<FakeDNSSDBrowseQuery>& query, getQueries<FakeDNSSDBrowseQuery>()) { + for (const auto& query : getQueries<FakeDNSSDBrowseQuery>()) { eventLoop->postEvent(boost::bind(boost::ref(query->onServiceAdded), id), shared_from_this()); } } void FakeDNSSDQuerier::removeService(const DNSSDServiceID& id) { services.erase(id); serviceInfo.erase(id); - foreach(const std::shared_ptr<FakeDNSSDBrowseQuery>& query, getQueries<FakeDNSSDBrowseQuery>()) { + for (const auto& query : getQueries<FakeDNSSDBrowseQuery>()) { eventLoop->postEvent(boost::bind(boost::ref(query->onServiceRemoved), id), shared_from_this()); } } void FakeDNSSDQuerier::setServiceInfo(const DNSSDServiceID& id, const DNSSDResolveServiceQuery::Result& info) { std::pair<ServiceInfoMap::iterator, bool> r = serviceInfo.insert(std::make_pair(id, info)); if (!r.second) { r.first->second = info; } - foreach(const std::shared_ptr<FakeDNSSDResolveServiceQuery>& query, getQueries<FakeDNSSDResolveServiceQuery>()) { + for (const auto& query : getQueries<FakeDNSSDResolveServiceQuery>()) { if (query->service == id) { eventLoop->postEvent(boost::bind(boost::ref(query->onServiceResolved), info), shared_from_this()); } } } bool FakeDNSSDQuerier::isServiceRegistered(const std::string& name, int port, const ByteArray& info) { - foreach(const std::shared_ptr<FakeDNSSDRegisterQuery>& query, getQueries<FakeDNSSDRegisterQuery>()) { + for (const auto& query : getQueries<FakeDNSSDRegisterQuery>()) { if (query->name == name && query->port == port && query->info == info) { return true; } } return false; } void FakeDNSSDQuerier::setBrowseError() { - foreach(const std::shared_ptr<FakeDNSSDBrowseQuery>& query, getQueries<FakeDNSSDBrowseQuery>()) { + for (const auto& query : getQueries<FakeDNSSDBrowseQuery>()) { eventLoop->postEvent(boost::ref(query->onError), shared_from_this()); } } void FakeDNSSDQuerier::setRegisterError() { - foreach(const std::shared_ptr<FakeDNSSDRegisterQuery>& query, getQueries<FakeDNSSDRegisterQuery>()) { + for (const auto& query : getQueries<FakeDNSSDRegisterQuery>()) { eventLoop->postEvent(boost::bind(boost::ref(query->onRegisterFinished), boost::optional<DNSSDServiceID>()), shared_from_this()); } } void FakeDNSSDQuerier::setAddress(const std::string& hostname, boost::optional<HostAddress> address) { addresses[hostname] = address; - foreach(const std::shared_ptr<FakeDNSSDResolveHostnameQuery>& query, getQueries<FakeDNSSDResolveHostnameQuery>()) { + for (const auto& query : getQueries<FakeDNSSDResolveHostnameQuery>()) { if (query->hostname == hostname) { eventLoop->postEvent(boost::bind( boost::ref(query->onHostnameResolved), address), shared_from_this()); } } } } diff --git a/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp b/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp index f97d9a1..a639ec5 100644 --- a/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp +++ b/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp @@ -1,53 +1,52 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/LinkLocal/OutgoingLinkLocalSession.h> #include <boost/bind.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/IQ.h> #include <Swiften/Elements/ProtocolHeader.h> #include <Swiften/Elements/StreamFeatures.h> #include <Swiften/StreamStack/XMPPLayer.h> namespace Swift { OutgoingLinkLocalSession::OutgoingLinkLocalSession( const JID& localJID, const JID& remoteJID, std::shared_ptr<Connection> connection, PayloadParserFactoryCollection* payloadParserFactories, PayloadSerializerCollection* payloadSerializers, XMLParserFactory* xmlParserFactory) : Session(connection, payloadParserFactories, payloadSerializers, xmlParserFactory) { setLocalJID(localJID); setRemoteJID(remoteJID); } void OutgoingLinkLocalSession::handleSessionStarted() { ProtocolHeader header; header.setFrom(getLocalJID()); getXMPPLayer()->writeHeader(header); } void OutgoingLinkLocalSession::handleStreamStart(const ProtocolHeader&) { - foreach(const std::shared_ptr<ToplevelElement>& stanza, queuedElements_) { + for (const auto& stanza : queuedElements_) { sendElement(stanza); } queuedElements_.clear(); } void OutgoingLinkLocalSession::handleElement(std::shared_ptr<ToplevelElement> element) { onElementReceived(element); } void OutgoingLinkLocalSession::queueElement(std::shared_ptr<ToplevelElement> element) { queuedElements_.push_back(element); } } diff --git a/Swiften/MUC/MUCBookmarkManager.cpp b/Swiften/MUC/MUCBookmarkManager.cpp index a06a0a2..9f8ae77 100644 --- a/Swiften/MUC/MUCBookmarkManager.cpp +++ b/Swiften/MUC/MUCBookmarkManager.cpp @@ -1,120 +1,119 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/MUC/MUCBookmarkManager.h> #include <memory> #include <boost/bind.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Queries/IQRouter.h> #include <Swiften/Queries/Requests/GetPrivateStorageRequest.h> #include <Swiften/Queries/Requests/SetPrivateStorageRequest.h> namespace Swift { MUCBookmarkManager::MUCBookmarkManager(IQRouter* iqRouter) { iqRouter_ = iqRouter; ready_ = false; GetPrivateStorageRequest<Storage>::ref request = GetPrivateStorageRequest<Storage>::create(iqRouter_); request->onResponse.connect(boost::bind(&MUCBookmarkManager::handleBookmarksReceived, this, _1, _2)); request->send(); } void MUCBookmarkManager::handleBookmarksReceived(std::shared_ptr<Storage> payload, ErrorPayload::ref error) { if (error) { return; } ready_ = true; onBookmarksReady(); storage = payload; std::vector<MUCBookmark> receivedBookmarks; - foreach (Storage::Room room, payload->getRooms()) { + for (const auto& room : payload->getRooms()) { receivedBookmarks.push_back(MUCBookmark(room)); } std::vector<MUCBookmark> newBookmarks; - foreach (const MUCBookmark& oldBookmark, bookmarks_) { + for (const auto& oldBookmark : bookmarks_) { if (containsEquivalent(receivedBookmarks, oldBookmark)) { newBookmarks.push_back(oldBookmark); } else { onBookmarkRemoved(oldBookmark); } } - foreach (const MUCBookmark& newBookmark, receivedBookmarks) { + for (const auto& newBookmark : receivedBookmarks) { if (!containsEquivalent(bookmarks_, newBookmark)) { newBookmarks.push_back(newBookmark); onBookmarkAdded(newBookmark); } } bookmarks_ = newBookmarks; } bool MUCBookmarkManager::containsEquivalent(const std::vector<MUCBookmark>& list, const MUCBookmark& bookmark) { return std::find(list.begin(), list.end(), bookmark) != list.end(); } void MUCBookmarkManager::replaceBookmark(const MUCBookmark& oldBookmark, const MUCBookmark& newBookmark) { if (!ready_) return; for (auto& bookmark : bookmarks_) { if (bookmark == oldBookmark) { bookmark = newBookmark; flush(); onBookmarkRemoved(oldBookmark); onBookmarkAdded(newBookmark); return; } } } void MUCBookmarkManager::addBookmark(const MUCBookmark& bookmark) { if (!ready_) return; bookmarks_.push_back(bookmark); onBookmarkAdded(bookmark); flush(); } void MUCBookmarkManager::removeBookmark(const MUCBookmark& bookmark) { if (!ready_) return; std::vector<MUCBookmark>::iterator it; for (it = bookmarks_.begin(); it != bookmarks_.end(); ++it) { if ((*it) == bookmark) { bookmarks_.erase(it); onBookmarkRemoved(bookmark); break; } } flush(); } void MUCBookmarkManager::flush() { if (!storage) { storage = std::make_shared<Storage>(); } // Update the storage element storage->clearRooms(); - foreach(const MUCBookmark& bookmark, bookmarks_) { + for (const auto& bookmark : bookmarks_) { storage->addRoom(bookmark.toStorage()); } // Send an iq to save the storage element SetPrivateStorageRequest<Storage>::ref request = SetPrivateStorageRequest<Storage>::create(storage, iqRouter_); // FIXME: We should care about the result //request->onResponse.connect(boost::bind(&MUCBookmarkManager::handleBookmarksSet, this, _1, _2)); request->send(); } const std::vector<MUCBookmark>& MUCBookmarkManager::getBookmarks() const { return bookmarks_; } } diff --git a/Swiften/Network/BOSHConnectionPool.cpp b/Swiften/Network/BOSHConnectionPool.cpp index 9ce40d3..e4ca471 100644 --- a/Swiften/Network/BOSHConnectionPool.cpp +++ b/Swiften/Network/BOSHConnectionPool.cpp @@ -1,79 +1,78 @@ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Network/BOSHConnectionPool.h> #include <climits> #include <boost/bind.hpp> #include <boost/lexical_cast.hpp> #include <Swiften/Base/Log.h> #include <Swiften/Base/SafeString.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Network/CachingDomainNameResolver.h> #include <Swiften/Network/HTTPConnectProxiedConnectionFactory.h> namespace Swift { BOSHConnectionPool::BOSHConnectionPool(const URL& boshURL, DomainNameResolver* realResolver, ConnectionFactory* connectionFactoryParameter, XMLParserFactory* parserFactory, TLSContextFactory* tlsFactory, TimerFactory* timerFactory, EventLoop* eventLoop, const std::string& to, unsigned long long initialRID, const URL& boshHTTPConnectProxyURL, const SafeString& boshHTTPConnectProxyAuthID, const SafeString& boshHTTPConnectProxyAuthPassword, const TLSOptions& tlsOptions, std::shared_ptr<HTTPTrafficFilter> trafficFilter) : boshURL(boshURL), connectionFactory(connectionFactoryParameter), xmlParserFactory(parserFactory), timerFactory(timerFactory), rid(initialRID), pendingTerminate(false), to(to), requestLimit(2), restartCount(0), pendingRestart(false), tlsContextFactory_(tlsFactory), tlsOptions_(tlsOptions) { if (!boshHTTPConnectProxyURL.isEmpty()) { connectionFactory = new HTTPConnectProxiedConnectionFactory(realResolver, connectionFactory, timerFactory, boshHTTPConnectProxyURL.getHost(), URL::getPortOrDefaultPort(boshHTTPConnectProxyURL), boshHTTPConnectProxyAuthID, boshHTTPConnectProxyAuthPassword, trafficFilter); } resolver = new CachingDomainNameResolver(realResolver, eventLoop); } BOSHConnectionPool::~BOSHConnectionPool() { /* Don't do a normal close here. Instead kill things forcibly, as close() or writeFooter() will already have been called */ std::vector<BOSHConnection::ref> connectionCopies = connections; - foreach (BOSHConnection::ref connection, connectionCopies) { + for (auto&& connection : connectionCopies) { if (connection) { destroyConnection(connection); connection->disconnect(); } } - foreach (ConnectionFactory* factory, myConnectionFactories) { + for (auto factory : myConnectionFactories) { delete factory; } delete resolver; } void BOSHConnectionPool::write(const SafeByteArray& data) { dataQueue.push_back(data); tryToSendQueuedData(); } void BOSHConnectionPool::handleDataRead(const SafeByteArray& data) { onXMPPDataRead(data); tryToSendQueuedData(); /* Will rebalance the connections */ } void BOSHConnectionPool::restartStream() { BOSHConnection::ref connection = getSuitableConnection(); if (connection) { pendingRestart = false; rid++; connection->setRID(rid); connection->restartStream(); restartCount++; } else { pendingRestart = true; } } void BOSHConnectionPool::setTLSCertificate(CertificateWithKey::ref certWithKey) { @@ -89,149 +88,149 @@ Certificate::ref BOSHConnectionPool::getPeerCertificate() const { if (!pinnedCertificateChain_.empty()) { peerCertificate = pinnedCertificateChain_[0]; } return peerCertificate; } std::vector<Certificate::ref> BOSHConnectionPool::getPeerCertificateChain() const { return pinnedCertificateChain_; } std::shared_ptr<CertificateVerificationError> BOSHConnectionPool::getPeerCertificateVerificationError() const { return lastVerificationError_; } void BOSHConnectionPool::writeFooter() { pendingTerminate = true; tryToSendQueuedData(); } void BOSHConnectionPool::open() { createConnection(); } void BOSHConnectionPool::close() { if (!sid.empty()) { writeFooter(); } else { pendingTerminate = true; std::vector<BOSHConnection::ref> connectionCopies = connections; - foreach (BOSHConnection::ref connection, connectionCopies) { + for (auto&& connection : connectionCopies) { if (connection) { connection->disconnect(); } } } } void BOSHConnectionPool::handleSessionStarted(const std::string& sessionID, size_t requests) { sid = sessionID; requestLimit = requests; onSessionStarted(); } void BOSHConnectionPool::handleConnectFinished(bool error, BOSHConnection::ref connection) { if (error) { onSessionTerminated(std::make_shared<BOSHError>(BOSHError::UndefinedCondition)); /*TODO: We can probably manage to not terminate the stream here and use the rid/ack retry * logic to just swallow the error and try again (some number of tries). */ } else { if (connection->getPeerCertificate() && pinnedCertificateChain_.empty()) { pinnedCertificateChain_ = connection->getPeerCertificateChain(); } if (!pinnedCertificateChain_.empty()) { lastVerificationError_ = connection->getPeerCertificateVerificationError(); } if (sid.empty()) { connection->startStream(to, rid); } if (pendingRestart) { restartStream(); } tryToSendQueuedData(); } } BOSHConnection::ref BOSHConnectionPool::getSuitableConnection() { BOSHConnection::ref suitableConnection; - foreach (BOSHConnection::ref connection, connections) { + for (auto&& connection : connections) { if (connection->isReadyToSend()) { suitableConnection = connection; break; } } if (!suitableConnection && connections.size() < requestLimit) { /* This is not a suitable connection because it won't have yet connected and added TLS if needed. */ BOSHConnection::ref newConnection = createConnection(); newConnection->setSID(sid); } assert(connections.size() <= requestLimit); assert((!suitableConnection) || suitableConnection->isReadyToSend()); return suitableConnection; } void BOSHConnectionPool::tryToSendQueuedData() { if (sid.empty()) { /* If we've not got as far as stream start yet, pend */ return; } BOSHConnection::ref suitableConnection = getSuitableConnection(); bool toSend = !dataQueue.empty(); if (suitableConnection) { if (toSend) { rid++; suitableConnection->setRID(rid); SafeByteArray data; - foreach (const SafeByteArray& datum, dataQueue) { + for (const auto& datum : dataQueue) { data.insert(data.end(), datum.begin(), datum.end()); } suitableConnection->write(data); dataQueue.clear(); } else if (pendingTerminate) { rid++; suitableConnection->setRID(rid); suitableConnection->terminateStream(); sid = ""; close(); } } if (!pendingTerminate) { /* Ensure there's always a session waiting to read data for us */ bool pending = false; - foreach (BOSHConnection::ref connection, connections) { + for (auto&& connection : connections) { if (connection && !connection->isReadyToSend()) { pending = true; } } if (!pending) { if (restartCount >= 1) { /* Don't open a second connection until we've restarted the stream twice - i.e. we've authed and resource bound.*/ if (suitableConnection) { rid++; suitableConnection->setRID(rid); suitableConnection->write(createSafeByteArray("")); } else { /* My thought process I went through when writing this, to aid anyone else confused why this can happen... * * What to do here? I think this isn't possible. If you didn't have two connections, suitable would have made one. If you have two connections and neither is suitable, pending would be true. If you have a non-pending connection, it's suitable. If I decide to do something here, remove assert above. Ah! Yes, because there's a period between creating the connection and it being connected. */ } } } } } void BOSHConnectionPool::handleHTTPError(const std::string& /*errorCode*/) { diff --git a/Swiften/Network/ChainedConnector.cpp b/Swiften/Network/ChainedConnector.cpp index fbea868..ea55db3 100644 --- a/Swiften/Network/ChainedConnector.cpp +++ b/Swiften/Network/ChainedConnector.cpp @@ -1,44 +1,43 @@ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Network/ChainedConnector.h> #include <typeinfo> #include <boost/bind.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Network/ConnectionFactory.h> #include <Swiften/Network/Connector.h> using namespace Swift; ChainedConnector::ChainedConnector( const std::string& hostname, int port, const boost::optional<std::string>& serviceLookupPrefix, DomainNameResolver* resolver, const std::vector<ConnectionFactory*>& connectionFactories, TimerFactory* timerFactory) : hostname(hostname), port(port), serviceLookupPrefix(serviceLookupPrefix), resolver(resolver), connectionFactories(connectionFactories), timerFactory(timerFactory), timeoutMilliseconds(0) { } ChainedConnector::~ChainedConnector() { if (currentConnector) { currentConnector->onConnectFinished.disconnect(boost::bind(&ChainedConnector::handleConnectorFinished, this, _1, _2)); currentConnector->stop(); currentConnector.reset(); } } void ChainedConnector::setTimeoutMilliseconds(int milliseconds) { diff --git a/Swiften/Network/DummyTimerFactory.cpp b/Swiften/Network/DummyTimerFactory.cpp index cdc776c..0bad7be 100644 --- a/Swiften/Network/DummyTimerFactory.cpp +++ b/Swiften/Network/DummyTimerFactory.cpp @@ -1,60 +1,59 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Network/DummyTimerFactory.h> #include <algorithm> -#include <Swiften/Base/foreach.h> #include <Swiften/Network/Timer.h> namespace Swift { class DummyTimerFactory::DummyTimer : public Timer { public: DummyTimer(int timeout, DummyTimerFactory* factory) : timeout(timeout), factory(factory), isRunning(false), startTime(~0) { } virtual void start() { isRunning = true; startTime = factory->currentTime; } virtual void stop() { isRunning = false; } int getAlarmTime() const { return startTime + timeout; } int timeout; DummyTimerFactory* factory; bool isRunning; int startTime; }; DummyTimerFactory::DummyTimerFactory() : currentTime(0) { } std::shared_ptr<Timer> DummyTimerFactory::createTimer(int milliseconds) { std::shared_ptr<DummyTimer> timer(new DummyTimer(milliseconds, this)); timers.push_back(timer); return timer; } void DummyTimerFactory::setTime(int time) { assert(time > currentTime); - foreach(std::shared_ptr<DummyTimer> timer, timers) { + for (auto&& timer : timers) { if (timer->getAlarmTime() > currentTime && timer->getAlarmTime() <= time && timer->isRunning) { timer->onTick(); } } currentTime = time; } } diff --git a/Swiften/Network/HTTPConnectProxiedConnection.cpp b/Swiften/Network/HTTPConnectProxiedConnection.cpp index b9ab604..b5e521b 100644 --- a/Swiften/Network/HTTPConnectProxiedConnection.cpp +++ b/Swiften/Network/HTTPConnectProxiedConnection.cpp @@ -1,138 +1,135 @@ /* * Copyright (c) 2010-2011 Thilo Cestonaro * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Network/HTTPConnectProxiedConnection.h> #include <iostream> #include <utility> #include <boost/algorithm/string.hpp> #include <boost/bind.hpp> #include <boost/lexical_cast.hpp> #include <Swiften/Base/Algorithm.h> #include <Swiften/Base/ByteArray.h> #include <Swiften/Base/Log.h> #include <Swiften/Base/String.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Network/ConnectionFactory.h> #include <Swiften/Network/HTTPTrafficFilter.h> #include <Swiften/Network/HostAddressPort.h> #include <Swiften/StringCodecs/Base64.h> using namespace Swift; HTTPConnectProxiedConnection::HTTPConnectProxiedConnection( DomainNameResolver* resolver, ConnectionFactory* connectionFactory, TimerFactory* timerFactory, const std::string& proxyHost, int proxyPort, const SafeString& authID, const SafeString& authPassword) : ProxiedConnection(resolver, connectionFactory, timerFactory, proxyHost, proxyPort), authID_(authID), authPassword_(authPassword) { } HTTPConnectProxiedConnection::~HTTPConnectProxiedConnection() { } void HTTPConnectProxiedConnection::setHTTPTrafficFilter(std::shared_ptr<HTTPTrafficFilter> trafficFilter) { trafficFilter_ = trafficFilter; } void HTTPConnectProxiedConnection::initializeProxy() { httpResponseBuffer_.clear(); std::stringstream connect; connect << "CONNECT " << getServer().getAddress().toString() << ":" << getServer().getPort() << " HTTP/1.1\r\n"; SafeByteArray data = createSafeByteArray(connect.str()); if (!authID_.empty() && !authPassword_.empty()) { append(data, createSafeByteArray("Proxy-Authorization: Basic ")); SafeByteArray credentials = authID_; append(credentials, createSafeByteArray(":")); append(credentials, authPassword_); append(data, Base64::encode(credentials)); append(data, createSafeByteArray("\r\n")); } else if (!nextHTTPRequestHeaders_.empty()) { - typedef std::pair<std::string, std::string> StringPair; - foreach(const StringPair& headerField, nextHTTPRequestHeaders_) { + for (const auto& headerField : nextHTTPRequestHeaders_) { append(data, createSafeByteArray(headerField.first)); append(data, createSafeByteArray(": ")); append(data, createSafeByteArray(headerField.second)); append(data, createSafeByteArray("\r\n")); } nextHTTPRequestHeaders_.clear(); } append(data, createSafeByteArray("\r\n")); SWIFT_LOG(debug) << "HTTP Proxy send headers: " << byteArrayToString(ByteArray(data.begin(), data.end())) << std::endl; write(data); } void HTTPConnectProxiedConnection::parseHTTPHeader(const std::string& data, std::string& statusLine, std::vector<std::pair<std::string, std::string> >& headerFields) { std::istringstream dataStream(data); // parse status line std::getline(dataStream, statusLine); // parse fields std::string headerLine; std::string::size_type splitIndex; while (std::getline(dataStream, headerLine) && headerLine != "\r") { splitIndex = headerLine.find(':', 0); if (splitIndex != std::string::npos) { headerFields.push_back(std::pair<std::string, std::string>(headerLine.substr(0, splitIndex), headerLine.substr(splitIndex + 1))); } } } void HTTPConnectProxiedConnection::sendHTTPRequest(const std::string& statusLine, const std::vector<std::pair<std::string, std::string> >& headerFields) { - typedef std::pair<std::string, std::string> HTTPHeaderField; std::stringstream request; request << statusLine << "\r\n"; - foreach (const HTTPHeaderField& field, headerFields) { + for (const auto& field : headerFields) { request << field.first << ":" << field.second << "\r\n"; } request << "\r\n"; write(createSafeByteArray(request.str())); } void HTTPConnectProxiedConnection::handleProxyInitializeData(std::shared_ptr<SafeByteArray> data) { std::string dataString = byteArrayToString(ByteArray(data->begin(), data->end())); SWIFT_LOG(debug) << data << std::endl; httpResponseBuffer_.append(dataString); std::string statusLine; std::vector<std::pair<std::string, std::string> > headerFields; std::string::size_type headerEnd = httpResponseBuffer_.find("\r\n\r\n", 0); if (headerEnd == std::string::npos) { if ((httpResponseBuffer_.size() > 4) && (httpResponseBuffer_.substr(0, 4) != "HTTP")) { setProxyInitializeFinished(false); } return; } parseHTTPHeader(httpResponseBuffer_.substr(0, headerEnd), statusLine, headerFields); if (trafficFilter_) { std::vector<std::pair<std::string, std::string> > newHeaderFields = trafficFilter_->filterHTTPResponseHeader(statusLine, headerFields); if (!newHeaderFields.empty()) { std::stringstream statusLine; reconnect(); nextHTTPRequestHeaders_ = newHeaderFields; diff --git a/Swiften/Network/NetworkEnvironment.cpp b/Swiften/Network/NetworkEnvironment.cpp index 19f727c..87883c1 100644 --- a/Swiften/Network/NetworkEnvironment.cpp +++ b/Swiften/Network/NetworkEnvironment.cpp @@ -1,32 +1,31 @@ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Network/NetworkEnvironment.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Network/HostAddress.h> #include <Swiften/Network/NetworkInterface.h> namespace Swift { NetworkEnvironment::~NetworkEnvironment() { } HostAddress NetworkEnvironment::getLocalAddress() const { std::vector<NetworkInterface> networkInterfaces = getNetworkInterfaces(); - foreach (const NetworkInterface& iface, networkInterfaces) { + for (const auto& iface : networkInterfaces) { if (!iface.isLoopback()) { - foreach (const HostAddress& address, iface.getAddresses()) { + for (const auto& address : iface.getAddresses()) { if (address.getRawAddress().is_v4()) { return address; } } } } return HostAddress(); } } diff --git a/Swiften/Network/PlatformDomainNameServiceQuery.cpp b/Swiften/Network/PlatformDomainNameServiceQuery.cpp index 71611f5..5cffcdb 100644 --- a/Swiften/Network/PlatformDomainNameServiceQuery.cpp +++ b/Swiften/Network/PlatformDomainNameServiceQuery.cpp @@ -1,62 +1,61 @@ /* - * Copyright (c) 2010-2015 Isode Limited. + * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <boost/asio.hpp> #include <Swiften/Network/PlatformDomainNameServiceQuery.h> #pragma GCC diagnostic ignored "-Wold-style-cast" #include <Swiften/Base/Platform.h> #include <stdlib.h> #include <boost/numeric/conversion/cast.hpp> #ifdef SWIFTEN_PLATFORM_WINDOWS #undef UNICODE #include <windows.h> #include <windns.h> #ifndef DNS_TYPE_SRV #define DNS_TYPE_SRV 33 #endif #else #include <arpa/nameser.h> #include <arpa/nameser_compat.h> #include <resolv.h> #endif #include <boost/bind.hpp> #include <Swiften/Base/ByteArray.h> #include <Swiften/EventLoop/EventLoop.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Base/BoostRandomGenerator.h> #include <Swiften/Base/Log.h> #include <Swiften/Network/PlatformDomainNameResolver.h> using namespace Swift; namespace Swift { PlatformDomainNameServiceQuery::PlatformDomainNameServiceQuery(const boost::optional<std::string>& serviceName, EventLoop* eventLoop, PlatformDomainNameResolver* resolver) : PlatformDomainNameQuery(resolver), eventLoop(eventLoop), serviceValid(false) { if (!!serviceName) { service = *serviceName; serviceValid = true; } } PlatformDomainNameServiceQuery::~PlatformDomainNameServiceQuery() { } void PlatformDomainNameServiceQuery::run() { getResolver()->addQueryToQueue(shared_from_this()); } void PlatformDomainNameServiceQuery::runBlocking() { if (!serviceValid) { emitError(); return; } SWIFT_LOG(debug) << "Querying " << service << std::endl; diff --git a/Swiften/Network/UnixProxyProvider.cpp b/Swiften/Network/UnixProxyProvider.cpp index 6c23add..e6afa3d 100644 --- a/Swiften/Network/UnixProxyProvider.cpp +++ b/Swiften/Network/UnixProxyProvider.cpp @@ -1,45 +1,44 @@ /* * Copyright (c) 2010-2011 Thilo Cestonaro * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Network/UnixProxyProvider.h> -#include <Swiften/Base/foreach.h> #if defined(HAVE_GCONF) # include "Swiften/Network/GConfProxyProvider.h" #endif namespace Swift { UnixProxyProvider::UnixProxyProvider() : gconfProxyProvider(nullptr), environmentProxyProvider() { #if defined(HAVE_GCONF) gconfProxyProvider = new GConfProxyProvider(); #endif } UnixProxyProvider::~UnixProxyProvider() { #if defined(HAVE_GCONF) delete gconfProxyProvider; #endif } HostAddressPort UnixProxyProvider::getSOCKS5Proxy() const { HostAddressPort proxy; #if defined(HAVE_GCONF) proxy = gconfProxyProvider->getSOCKS5Proxy(); if(proxy.isValid()) { return proxy; } #endif proxy = environmentProxyProvider.getSOCKS5Proxy(); diff --git a/Swiften/Network/WindowsNetworkEnvironment.cpp b/Swiften/Network/WindowsNetworkEnvironment.cpp index 6ce41de..e90a5c6 100644 --- a/Swiften/Network/WindowsNetworkEnvironment.cpp +++ b/Swiften/Network/WindowsNetworkEnvironment.cpp @@ -1,74 +1,73 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Network/WindowsNetworkEnvironment.h> #include <map> #include <string> #include <vector> #include <boost/optional.hpp> #include <iphlpapi.h> #include <winsock2.h> #include <Swiften/Base/ByteArray.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Network/HostAddress.h> #include <Swiften/Network/NetworkInterface.h> namespace Swift { std::vector<NetworkInterface> WindowsNetworkEnvironment::getNetworkInterfaces() const { std::vector<NetworkInterface> result; ByteArray adapters; ULONG bufferSize = 0; ULONG ret; ULONG flags = GAA_FLAG_INCLUDE_ALL_INTERFACES | GAA_FLAG_INCLUDE_PREFIX | GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_SKIP_DNS_SERVER; while ((ret = GetAdaptersAddresses(AF_UNSPEC, flags, NULL, reinterpret_cast<IP_ADAPTER_ADDRESSES*>(vecptr(adapters)), &bufferSize)) == ERROR_BUFFER_OVERFLOW) { adapters.resize(bufferSize); }; if (ret != ERROR_SUCCESS) { return result; } std::map<std::string,NetworkInterface> interfaces; for (IP_ADAPTER_ADDRESSES* adapter = reinterpret_cast<IP_ADAPTER_ADDRESSES*>(vecptr(adapters)); adapter; adapter = adapter->Next) { std::string name(adapter->AdapterName); if (adapter->OperStatus != IfOperStatusUp) { continue; } for (IP_ADAPTER_UNICAST_ADDRESS* address = adapter->FirstUnicastAddress; address; address = address->Next) { boost::optional<HostAddress> hostAddress; if (address->Address.lpSockaddr->sa_family == PF_INET) { sockaddr_in* sa = reinterpret_cast<sockaddr_in*>(address->Address.lpSockaddr); hostAddress = HostAddress(reinterpret_cast<const unsigned char*>(&(sa->sin_addr)), 4); } else if (address->Address.lpSockaddr->sa_family == PF_INET6) { sockaddr_in6* sa = reinterpret_cast<sockaddr_in6*>(address->Address.lpSockaddr); hostAddress = HostAddress(reinterpret_cast<const unsigned char*>(&(sa->sin6_addr)), 16); } if (hostAddress && !hostAddress->isLocalhost()) { std::map<std::string, NetworkInterface>::iterator i = interfaces.insert(std::make_pair(name, NetworkInterface(name, false))).first; i->second.addAddress(*hostAddress); } } } - for (std::map<std::string,NetworkInterface>::const_iterator i = interfaces.begin(); i != interfaces.end(); ++i) { - result.push_back(i->second); + for (const auto& interface : interfaces) { + result.push_back(interface.second); } return result; } } diff --git a/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp b/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp index 8a0ecd2..405c593 100644 --- a/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp +++ b/Swiften/Parser/PayloadParsers/BytestreamsParser.cpp @@ -1,42 +1,40 @@ /* - * Copyright (c) 2010 Isode Limited. + * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Parser/PayloadParsers/BytestreamsParser.h> #include <boost/lexical_cast.hpp> -#include <Swiften/Base/foreach.h> - namespace Swift { BytestreamsParser::BytestreamsParser() : level(TopLevel) { } BytestreamsParser::~BytestreamsParser() { } void BytestreamsParser::handleStartElement(const std::string& element, const std::string&, const AttributeMap& attributes) { if (level == TopLevel) { getPayloadInternal()->setStreamID(attributes.getAttribute("sid")); } else if (level == PayloadLevel) { if (element == "streamhost") { try { getPayloadInternal()->addStreamHost(Bytestreams::StreamHost(attributes.getAttribute("host"), JID(attributes.getAttribute("jid")), boost::lexical_cast<int>(attributes.getAttribute("port")))); } catch (boost::bad_lexical_cast&) { } } else if (element == "streamhost-used") { getPayloadInternal()->setUsedStreamHost(JID(attributes.getAttribute("jid"))); } } ++level; } void BytestreamsParser::handleEndElement(const std::string&, const std::string&) { --level; } diff --git a/Swiften/Parser/PayloadParsers/FormParser.cpp b/Swiften/Parser/PayloadParsers/FormParser.cpp index 5ea75c5..dff45df 100644 --- a/Swiften/Parser/PayloadParsers/FormParser.cpp +++ b/Swiften/Parser/PayloadParsers/FormParser.cpp @@ -1,41 +1,39 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Parser/PayloadParsers/FormParser.h> #include <map> -#include <Swiften/Base/foreach.h> - namespace Swift { FormParser::FormParser() : level_(TopLevel), parsingItem_(false), parsingReported_(false), parsingOption_(false), hasReportedRef_(false){ } void FormParser::handleStartElement(const std::string& element, const std::string&, const AttributeMap& attributes) { if (level_ == TopLevel) { std::string type = attributes.getAttribute("type"); if (type == "form") { getPayloadInternal()->setType(Form::FormType); } else if (type == "submit") { getPayloadInternal()->setType(Form::SubmitType); } else if (type == "cancel") { getPayloadInternal()->setType(Form::CancelType); } else if (type == "result") { getPayloadInternal()->setType(Form::ResultType); } } else if (level_ == PayloadLevel) { if (element == "title") { currentText_.clear(); } else if (element == "instructions") { currentText_.clear(); } else if (element == "reported") { parsingReported_ = true; @@ -163,69 +161,69 @@ void FormParser::handleEndElement(const std::string& element, const std::string& else if (currentField_) { if (element == "required") { currentField_->setRequired(true); } else if (element == "desc") { currentField_->setDescription(currentText_); } else if (element == "option") { currentField_->addOption(FormField::Option(currentOptionLabel_, currentOptionValue_)); parsingOption_ = false; } else if (element == "value") { if (parsingOption_) { currentOptionValue_ = currentText_; } else { currentField_->addValue(currentText_); } } } if (level_ >= PayloadLevel && currentField_) { if (element == "field") { if (parsingReported_) { getPayloadInternal()->addReportedField(currentField_); } else if (parsingItem_) { currentFields_.push_back(currentField_); } else { if (currentPages_.size() > 0) { - foreach (std::shared_ptr<FormPage> page, currentPages_) { - foreach (std::string pageRef, page->getFieldRefs()) { + for (const auto& page : currentPages_) { + for (const auto& pageRef : page->getFieldRefs()) { if (pageRef == currentField_->getName()) { page->addField(currentField_); } } } - foreach (std::shared_ptr<FormSection> section, currentSections_) { - foreach (std::string sectionRef, section->getFieldRefs()) { + for (const auto& section : currentSections_) { + for (const auto& sectionRef : section->getFieldRefs()) { if (sectionRef == currentField_->getName()) { section->addField(currentField_); } } } } else { getPayloadInternal()->addField(currentField_); } } currentField_.reset(); } } if (level_ > PayloadLevel) { if (element == "section") { if (sectionStack_.size() > 1) { // Add the section at the top of the stack to the level below sectionStack_.at(sectionStack_.size()-2)->addChildSection(sectionStack_.at(sectionStack_.size()-1)); sectionStack_.pop_back(); } else if (sectionStack_.size() == 1) { // Add the remaining section on the stack to its parent page currentPage_->addChildSection(sectionStack_.at(sectionStack_.size()-1)); sectionStack_.pop_back(); } } if (currentReportedRef_ && !hasReportedRef_) { if (sectionStack_.size() > 0) { sectionStack_.at(sectionStack_.size()-1)->addReportedRef(currentReportedRef_); } else if (currentPage_) { currentPage_->addReportedRef(currentReportedRef_); diff --git a/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp b/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp index a231397..b67556e 100644 --- a/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp +++ b/Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.cpp @@ -1,39 +1,38 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/BlockListPayload.h> #include <Swiften/Elements/BlockPayload.h> #include <Swiften/Elements/UnblockPayload.h> #include <Swiften/Parser/GenericPayloadParser.h> #include <Swiften/Parser/GenericPayloadParserFactory.h> #include <Swiften/Parser/GenericPayloadParserFactory2.h> #include <Swiften/Parser/PayloadParserFactory.h> #include <Swiften/Parser/PayloadParsers/BlockParser.h> #include <Swiften/Parser/PayloadParsers/BodyParser.h> #include <Swiften/Parser/PayloadParsers/BytestreamsParser.h> #include <Swiften/Parser/PayloadParsers/CapsInfoParser.h> #include <Swiften/Parser/PayloadParsers/CarbonsDisableParser.h> #include <Swiften/Parser/PayloadParsers/CarbonsEnableParser.h> #include <Swiften/Parser/PayloadParsers/CarbonsPrivateParser.h> #include <Swiften/Parser/PayloadParsers/CarbonsReceivedParser.h> #include <Swiften/Parser/PayloadParsers/CarbonsSentParser.h> #include <Swiften/Parser/PayloadParsers/ChatStateParserFactory.h> #include <Swiften/Parser/PayloadParsers/CommandParser.h> #include <Swiften/Parser/PayloadParsers/DelayParser.h> #include <Swiften/Parser/PayloadParsers/DeliveryReceiptParserFactory.h> #include <Swiften/Parser/PayloadParsers/DeliveryReceiptRequestParserFactory.h> #include <Swiften/Parser/PayloadParsers/DiscoInfoParser.h> #include <Swiften/Parser/PayloadParsers/DiscoItemsParser.h> #include <Swiften/Parser/PayloadParsers/ErrorParser.h> #include <Swiften/Parser/PayloadParsers/ErrorParserFactory.h> #include <Swiften/Parser/PayloadParsers/FormParserFactory.h> #include <Swiften/Parser/PayloadParsers/ForwardedParser.h> #include <Swiften/Parser/PayloadParsers/IBBParser.h> #include <Swiften/Parser/PayloadParsers/IdleParser.h> #include <Swiften/Parser/PayloadParsers/InBandRegistrationPayloadParser.h> @@ -140,46 +139,46 @@ FullPayloadParserFactoryCollection::FullPayloadParserFactoryCollection() { factories_.push_back(std::make_shared<JingleContentPayloadParserFactory>(this)); factories_.push_back(std::make_shared<GenericPayloadParserFactory<JingleIBBTransportMethodPayloadParser> >("transport", "urn:xmpp:jingle:transports:ibb:1")); factories_.push_back(std::make_shared<GenericPayloadParserFactory<JingleS5BTransportMethodPayloadParser> >("transport", "urn:xmpp:jingle:transports:s5b:1")); factories_.push_back(std::make_shared<JingleFileTransferDescriptionParserFactory>(this)); factories_.push_back(std::make_shared<GenericPayloadParserFactory<StreamInitiationFileInfoParser> >("file", "http://jabber.org/protocol/si/profile/file-transfer")); factories_.push_back(std::make_shared<GenericPayloadParserFactory<JingleFileTransferFileInfoParser> >("file", "urn:xmpp:jingle:apps:file-transfer:4")); factories_.push_back(std::make_shared<GenericPayloadParserFactory<JingleFileTransferHashParser> >("checksum")); factories_.push_back(std::make_shared<GenericPayloadParserFactory<S5BProxyRequestParser> >("query", "http://jabber.org/protocol/bytestreams")); factories_.push_back(std::make_shared<GenericPayloadParserFactory<WhiteboardParser> >("wb", "http://swift.im/whiteboard")); factories_.push_back(std::make_shared<GenericPayloadParserFactory<UserLocationParser> >("geoloc", "http://jabber.org/protocol/geoloc")); factories_.push_back(std::make_shared<GenericPayloadParserFactory<UserTuneParser> >("tune", "http://jabber.org/protocol/tune")); factories_.push_back(std::make_shared<DeliveryReceiptParserFactory>()); factories_.push_back(std::make_shared<DeliveryReceiptRequestParserFactory>()); factories_.push_back(std::make_shared<GenericPayloadParserFactory<IdleParser> >("idle", "urn:xmpp:idle:1")); factories_.push_back(std::make_shared<GenericPayloadParserFactory2<PubSubParser> >("pubsub", "http://jabber.org/protocol/pubsub", this)); factories_.push_back(std::make_shared<GenericPayloadParserFactory2<PubSubOwnerPubSubParser> >("pubsub", "http://jabber.org/protocol/pubsub#owner", this)); factories_.push_back(std::make_shared<GenericPayloadParserFactory2<PubSubEventParser> >("event", "http://jabber.org/protocol/pubsub#event", this)); factories_.push_back(std::make_shared<PubSubErrorParserFactory>()); factories_.push_back(std::make_shared<GenericPayloadParserFactory<ResultSetParser> >("set", "http://jabber.org/protocol/rsm")); factories_.push_back(std::make_shared<GenericPayloadParserFactory2<ForwardedParser> >("forwarded", "urn:xmpp:forward:0", this)); factories_.push_back(std::make_shared<GenericPayloadParserFactory2<MAMResultParser> >("result", "urn:xmpp:mam:0", this)); factories_.push_back(std::make_shared<GenericPayloadParserFactory<MAMQueryParser> >("query", "urn:xmpp:mam:0")); factories_.push_back(std::make_shared<GenericPayloadParserFactory<MAMFinParser> >("fin", "urn:xmpp:mam:0")); factories_.push_back(std::make_shared<GenericPayloadParserFactory2<IsodeIQDelegationParser> >("delegate", "http://isode.com/iq_delegation", this)); factories_.push_back(std::make_shared<GenericPayloadParserFactory<CarbonsEnableParser> >("enable", "urn:xmpp:carbons:2")); factories_.push_back(std::make_shared<GenericPayloadParserFactory<CarbonsDisableParser> >("disable", "urn:xmpp:carbons:2")); factories_.push_back(std::make_shared<GenericPayloadParserFactory2<CarbonsReceivedParser> >("received", "urn:xmpp:carbons:2", this)); factories_.push_back(std::make_shared<GenericPayloadParserFactory2<CarbonsSentParser> >("sent", "urn:xmpp:carbons:2", this)); factories_.push_back(std::make_shared<GenericPayloadParserFactory<CarbonsPrivateParser> >("private", "urn:xmpp:carbons:2")); - foreach(std::shared_ptr<PayloadParserFactory> factory, factories_) { + for (auto& factory : factories_) { addFactory(factory.get()); } defaultFactory_ = new RawXMLPayloadParserFactory(); setDefaultFactory(defaultFactory_); } FullPayloadParserFactoryCollection::~FullPayloadParserFactoryCollection() { setDefaultFactory(nullptr); delete defaultFactory_; - foreach(std::shared_ptr<PayloadParserFactory> factory, factories_) { + for (auto& factory : factories_) { removeFactory(factory.get()); } } } diff --git a/Swiften/Parser/PayloadParsers/IBBParser.cpp b/Swiften/Parser/PayloadParsers/IBBParser.cpp index 4a6b841..9b6babc 100644 --- a/Swiften/Parser/PayloadParsers/IBBParser.cpp +++ b/Swiften/Parser/PayloadParsers/IBBParser.cpp @@ -1,41 +1,40 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Parser/PayloadParsers/IBBParser.h> #include <boost/lexical_cast.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/StringCodecs/Base64.h> namespace Swift { IBBParser::IBBParser() : level(TopLevel) { } IBBParser::~IBBParser() { } void IBBParser::handleStartElement(const std::string& element, const std::string&, const AttributeMap& attributes) { if (level == TopLevel) { if (element == "data") { getPayloadInternal()->setAction(IBB::Data); getPayloadInternal()->setStreamID(attributes.getAttribute("sid")); try { getPayloadInternal()->setSequenceNumber(boost::lexical_cast<int>(attributes.getAttribute("seq"))); } catch (boost::bad_lexical_cast&) { } } else if (element == "open") { getPayloadInternal()->setAction(IBB::Open); getPayloadInternal()->setStreamID(attributes.getAttribute("sid")); if (attributes.getAttribute("stanza") == "message") { getPayloadInternal()->setStanzaType(IBB::MessageStanza); } else { getPayloadInternal()->setStanzaType(IBB::IQStanza); } diff --git a/Swiften/Parser/PayloadParsers/MUCAdminPayloadParser.cpp b/Swiften/Parser/PayloadParsers/MUCAdminPayloadParser.cpp index 1fbff1c..bac2a78 100644 --- a/Swiften/Parser/PayloadParsers/MUCAdminPayloadParser.cpp +++ b/Swiften/Parser/PayloadParsers/MUCAdminPayloadParser.cpp @@ -1,23 +1,22 @@ /* - * Copyright (c) 2011 Isode Limited. + * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Parser/PayloadParsers/MUCAdminPayloadParser.h> #include <boost/lexical_cast.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/MUCOccupant.h> namespace Swift { void MUCAdminPayloadParser::handleTree(ParserElement::ref root) { - foreach (ParserElement::ref itemElement, root->getChildren("item", "http://jabber.org/protocol/muc#admin")) { + for (const auto& itemElement : root->getChildren("item", "http://jabber.org/protocol/muc#admin")) { MUCItem item = MUCItemParser::itemFromTree(itemElement); getPayloadInternal()->addItem(item); } } } diff --git a/Swiften/Parser/PayloadParsers/MUCDestroyPayloadParser.cpp b/Swiften/Parser/PayloadParsers/MUCDestroyPayloadParser.cpp index 95ff8c5..46bc9c5 100644 --- a/Swiften/Parser/PayloadParsers/MUCDestroyPayloadParser.cpp +++ b/Swiften/Parser/PayloadParsers/MUCDestroyPayloadParser.cpp @@ -1,22 +1,20 @@ /* - * Copyright (c) 2011 Isode Limited. + * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Parser/PayloadParsers/MUCDestroyPayloadParser.h> -#include <Swiften/Base/foreach.h> - namespace Swift { void MUCDestroyPayloadParser::handleTree(ParserElement::ref root) { std::string ns = root->getNamespace(); std::string jid = root->getAttributes().getAttribute("jid"); if (!jid.empty()) { getPayloadInternal()->setNewVenue(JID(jid)); } getPayloadInternal()->setReason(root->getChild("reason", ns)->getText()); } } diff --git a/Swiften/Parser/PayloadParsers/MUCUserPayloadParser.cpp b/Swiften/Parser/PayloadParsers/MUCUserPayloadParser.cpp index 00a5d4f..b1bf78e 100644 --- a/Swiften/Parser/PayloadParsers/MUCUserPayloadParser.cpp +++ b/Swiften/Parser/PayloadParsers/MUCUserPayloadParser.cpp @@ -1,50 +1,49 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Parser/PayloadParsers/MUCUserPayloadParser.h> #include <boost/lexical_cast.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/MUCOccupant.h> #include <Swiften/Parser/PayloadParserFactory.h> #include <Swiften/Parser/PayloadParserFactoryCollection.h> #include <Swiften/Parser/Tree/TreeReparser.h> namespace Swift { void MUCUserPayloadParser::handleTree(ParserElement::ref root) { - foreach (ParserElement::ref child, root->getAllChildren()) { + for (const auto& child : root->getAllChildren()) { if (child->getName() == "item" && child->getNamespace() == root->getNamespace()) { MUCItem item = MUCItemParser::itemFromTree(child); getPayloadInternal()->addItem(item); } else if (child->getName() == "password" && child->getNamespace() == root->getNamespace()) { getPayloadInternal()->setPassword(child->getText()); } else if (child->getName() == "invite" && child->getNamespace() == root->getNamespace()) { MUCUserPayload::Invite invite; std::string to = child->getAttributes().getAttribute("to"); if (!to.empty()) { invite.to = to; } std::string from = child->getAttributes().getAttribute("from"); if (!from.empty()) { invite.from = from; } ParserElement::ref reason = child->getChild("reason", root->getNamespace()); if (reason) { invite.reason = reason->getText(); } getPayloadInternal()->setInvite(invite); } else if (child->getName() == "status" && child->getNamespace() == root->getNamespace()) { MUCUserPayload::StatusCode status; try { status.code = boost::lexical_cast<int>(child->getAttributes().getAttribute("code").c_str()); getPayloadInternal()->addStatusCode(status); } catch (boost::bad_lexical_cast&) { } diff --git a/Swiften/Parser/PayloadParsers/StreamInitiationParser.cpp b/Swiften/Parser/PayloadParsers/StreamInitiationParser.cpp index 1b0c95d..ad66b3f 100644 --- a/Swiften/Parser/PayloadParsers/StreamInitiationParser.cpp +++ b/Swiften/Parser/PayloadParsers/StreamInitiationParser.cpp @@ -1,47 +1,45 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Parser/PayloadParsers/StreamInitiationParser.h> #include <boost/lexical_cast.hpp> #include <boost/cast.hpp> #include <cassert> #include <Swiften/Parser/PayloadParsers/FormParserFactory.h> #include <Swiften/Parser/PayloadParsers/FormParser.h> -#include <Swiften/Base/foreach.h> - #define FILE_TRANSFER_NS "http://jabber.org/protocol/si/profile/file-transfer" #define FEATURE_NEG_NS "http://jabber.org/protocol/feature-neg" namespace Swift { StreamInitiationParser::StreamInitiationParser() : level(TopLevel), formParser(nullptr), inFile(false), inFeature(false) { formParserFactory = new FormParserFactory(); } StreamInitiationParser::~StreamInitiationParser() { delete formParserFactory; } void StreamInitiationParser::handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes) { if (level == TopLevel) { getPayloadInternal()->setID(attributes.getAttribute("id")); if (!attributes.getAttribute("profile").empty()) { getPayloadInternal()->setIsFileTransfer(attributes.getAttribute("profile") == FILE_TRANSFER_NS); } } else if (level == PayloadLevel) { if (element == "file") { inFile = true; currentFile = StreamInitiationFileInfo(); currentFile.setName(attributes.getAttribute("name")); try { currentFile.setSize(boost::lexical_cast<unsigned long long>(attributes.getAttribute("size"))); } catch (boost::bad_lexical_cast&) { @@ -66,58 +64,58 @@ void StreamInitiationParser::handleStartElement(const std::string& element, cons } ++level; } void StreamInitiationParser::handleEndElement(const std::string& element, const std::string& ns) { --level; if (formParser) { formParser->handleEndElement(element, ns); } if (level == TopLevel) { } else if (level == PayloadLevel) { if (element == "file") { getPayloadInternal()->setFileInfo(currentFile); inFile = false; } else if (element == "feature" && ns == FEATURE_NEG_NS) { inFeature = false; } } else if (level == FileOrFeatureLevel) { if (inFile && element == "desc") { currentFile.setDescription(currentText); } else if (formParser) { Form::ref form = formParser->getPayloadInternal(); if (form) { FormField::ref field = std::dynamic_pointer_cast<FormField>(form->getField("stream-method")); if (field) { if (form->getType() == Form::FormType) { - foreach (const FormField::Option& option, field->getOptions()) { + for (const auto& option : field->getOptions()) { getPayloadInternal()->addProvidedMethod(option.value); } } else if (form->getType() == Form::SubmitType) { if (!field->getValues().empty()) { getPayloadInternal()->setRequestedMethod(field->getValues()[0]); } } } } delete formParser; formParser = nullptr; } } } void StreamInitiationParser::handleCharacterData(const std::string& data) { if (formParser) { formParser->handleCharacterData(data); } else { currentText += data; } } } diff --git a/Swiften/Parser/PayloadParsers/UnitTest/MUCUserPayloadParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/MUCUserPayloadParserTest.cpp index 18597bd..f0cf68d 100644 --- a/Swiften/Parser/PayloadParsers/UnitTest/MUCUserPayloadParserTest.cpp +++ b/Swiften/Parser/PayloadParsers/UnitTest/MUCUserPayloadParserTest.cpp @@ -1,69 +1,68 @@ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <cppunit/extensions/HelperMacros.h> #include <cppunit/extensions/TestFactoryRegistry.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/MUCDestroyPayload.h> #include <Swiften/Parser/PayloadParsers/MUCUserPayloadParser.h> #include <Swiften/Parser/PayloadParsers/UnitTest/PayloadsParserTester.h> using namespace Swift; class MUCUserPayloadParserTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(MUCUserPayloadParserTest); CPPUNIT_TEST(testParseEmpty); CPPUNIT_TEST(testParse); CPPUNIT_TEST(testParseDestroy); CPPUNIT_TEST(testParseInvite); CPPUNIT_TEST_SUITE_END(); public: MUCUserPayloadParserTest() {} void testParse() { PayloadsParserTester parser; CPPUNIT_ASSERT(parser.parse("<x xmlns=\"http://jabber.org/protocol/muc#user\"><status code='110'/><item affiliation=\"owner\" role=\"visitor\"><actor jid=\"kev@tester.lit\"/><reason>malice</reason></item><status code='210'/></x>")); bool found110 = false; bool found210 = false; MUCUserPayload::ref payload = std::dynamic_pointer_cast<MUCUserPayload>(parser.getPayload()); - foreach (MUCUserPayload::StatusCode status, payload->getStatusCodes()) { + for (const auto& status : payload->getStatusCodes()) { if (status.code == 110) found110 = true; if (status.code == 210) found210 = true; } MUCItem item = payload->getItems()[0]; CPPUNIT_ASSERT_EQUAL(MUCOccupant::Owner, item.affiliation.get()); CPPUNIT_ASSERT_EQUAL(MUCOccupant::Visitor, item.role.get()); CPPUNIT_ASSERT_EQUAL(JID("kev@tester.lit"), item.actor.get()); CPPUNIT_ASSERT_EQUAL(std::string("malice"), item.reason.get()); CPPUNIT_ASSERT(found110); CPPUNIT_ASSERT(found210); } void testParseEmpty() { PayloadsParserTester parser; CPPUNIT_ASSERT(parser.parse("<x xmlns=\"http://jabber.org/protocol/muc#user\"/>")); MUCUserPayload::ref payload = std::dynamic_pointer_cast<MUCUserPayload>(parser.getPayload()); CPPUNIT_ASSERT(payload); CPPUNIT_ASSERT(payload->getItems().empty()); } void testParseDestroy() { PayloadsParserTester parser; CPPUNIT_ASSERT(parser.parse("<x xmlns=\"http://jabber.org/protocol/muc#user\"><destroy jid='alice@wonderland.lit'><reason>bert</reason></destroy></x>")); MUCUserPayload::ref payload = std::dynamic_pointer_cast<MUCUserPayload>(parser.getPayload()); CPPUNIT_ASSERT(payload); diff --git a/Swiften/Parser/PayloadParsers/VCardParser.cpp b/Swiften/Parser/PayloadParsers/VCardParser.cpp index 7867b2c..f8779d1 100644 --- a/Swiften/Parser/PayloadParsers/VCardParser.cpp +++ b/Swiften/Parser/PayloadParsers/VCardParser.cpp @@ -1,42 +1,41 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Parser/PayloadParsers/VCardParser.h> #include <cassert> #include <Swiften/Base/DateTime.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Parser/SerializingParser.h> #include <Swiften/StringCodecs/Base64.h> namespace Swift { VCardParser::VCardParser() : unknownContentParser_(nullptr) { } void VCardParser::handleStartElement(const std::string& element, const std::string& ns, const AttributeMap& attributes) { elementStack_.push_back(element); std::string elementHierarchy = getElementHierarchy(); if (elementHierarchy == "/vCard/EMAIL") { currentEMailAddress_ = VCard::EMailAddress(); } if (elementHierarchy == "/vCard/TEL") { currentTelephone_ = VCard::Telephone(); } if (elementHierarchy == "/vCard/ADR") { currentAddress_ = VCard::Address(); } if (elementHierarchy == "/vCard/LABEL") { currentAddressLabel_ = VCard::AddressLabel(); } if (elementHierarchy == "/vCard/ORG") { currentOrganization_ = VCard::Organization(); } if (elementStack_.size() == 2) { assert(!unknownContentParser_); unknownContentParser_ = new SerializingParser(); unknownContentParser_->handleStartElement(element, ns, attributes); @@ -255,37 +254,37 @@ void VCardParser::handleEndElement(const std::string& element, const std::string } else if (elementHierarchy == "/vCard/TITLE" && !currentText_.empty()) { getPayloadInternal()->addTitle(currentText_); } else if (elementHierarchy == "/vCard/ROLE" && !currentText_.empty()) { getPayloadInternal()->addRole(currentText_); } else if (elementHierarchy == "/vCard/URL" && !currentText_.empty()) { getPayloadInternal()->addURL(currentText_); } else if (elementStack_.size() == 2 && unknownContentParser_) { getPayloadInternal()->addUnknownContent(unknownContentParser_->getResult()); } if (elementStack_.size() == 2 && unknownContentParser_) { delete unknownContentParser_; unknownContentParser_ = nullptr; } elementStack_.pop_back(); } void VCardParser::handleCharacterData(const std::string& text) { if (unknownContentParser_) { unknownContentParser_->handleCharacterData(text); } currentText_ += text; } std::string VCardParser::getElementHierarchy() const { std::string result; - foreach(const std::string& element, elementStack_) { + for (const auto& element : elementStack_) { result += "/" + element; } return result; } } diff --git a/Swiften/Parser/SerializingParser.cpp b/Swiften/Parser/SerializingParser.cpp index ad794aa..85b0dd4 100644 --- a/Swiften/Parser/SerializingParser.cpp +++ b/Swiften/Parser/SerializingParser.cpp @@ -1,51 +1,50 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Parser/SerializingParser.h> #include <cassert> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { SerializingParser::SerializingParser() { } void SerializingParser::handleStartElement(const std::string& tag, const std::string& ns, const AttributeMap& attributes) { std::shared_ptr<XMLElement> element = std::make_shared<XMLElement>(tag, ns); // FIXME: Ignoring attribute namespace - foreach (const AttributeMap::Entry& e, attributes.getEntries()) { + for (const auto& e : attributes.getEntries()) { element->setAttribute(e.getAttribute().getName(), e.getValue()); } if (elementStack_.empty()) { rootElement_ = element; } else { (*(elementStack_.end() - 1))->addNode(element); } elementStack_.push_back(element); } void SerializingParser::handleEndElement(const std::string&, const std::string&) { assert(!elementStack_.empty()); elementStack_.pop_back(); } void SerializingParser::handleCharacterData(const std::string& data) { if (!elementStack_.empty()) { (*(elementStack_.end()-1))->addNode(std::make_shared<XMLTextNode>(data)); } } std::string SerializingParser::getResult() const { return (rootElement_ ? rootElement_->serialize() : ""); } } diff --git a/Swiften/Parser/Tree/TreeReparser.cpp b/Swiften/Parser/Tree/TreeReparser.cpp index 7fc74cf..6993d73 100644 --- a/Swiften/Parser/Tree/TreeReparser.cpp +++ b/Swiften/Parser/Tree/TreeReparser.cpp @@ -1,49 +1,48 @@ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Parser/Tree/TreeReparser.h> #include <deque> #include <utility> #include <boost/lexical_cast.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/MUCOccupant.h> #include <Swiften/Parser/PayloadParser.h> #include <Swiften/Parser/PayloadParserFactory.h> #include <Swiften/Parser/PayloadParserFactoryCollection.h> namespace Swift { typedef std::pair<ParserElement::ref, bool> ElementState; std::shared_ptr<Payload> TreeReparser::parseTree(ParserElement::ref root, PayloadParserFactoryCollection* collection) { PayloadParser* parser = collection->getPayloadParserFactory(root->getName(), root->getNamespace(), root->getAttributes())->createPayloadParser(); std::deque<ElementState > stack; stack.push_back(ElementState(root, true)); while (!stack.empty()) { ElementState current = stack.back(); stack.pop_back(); if (current.second) { stack.push_back(ElementState(current.first, false)); parser->handleStartElement(current.first->getName(), current.first->getNamespace(), current.first->getAttributes()); - foreach(ParserElement::ref child, current.first->getAllChildren()) { + for (const auto& child : current.first->getAllChildren()) { stack.push_back(ElementState(child, true)); } } else { parser->handleCharacterData(current.first->getText()); parser->handleEndElement(current.first->getName(), current.first->getNamespace()); } } std::shared_ptr<Payload> payload = parser->getPayload(); delete parser; return payload; } } diff --git a/Swiften/Presence/DirectedPresenceSender.cpp b/Swiften/Presence/DirectedPresenceSender.cpp index c1ce3a0..c1134c7 100644 --- a/Swiften/Presence/DirectedPresenceSender.cpp +++ b/Swiften/Presence/DirectedPresenceSender.cpp @@ -1,55 +1,53 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Presence/DirectedPresenceSender.h> -#include <Swiften/Base/foreach.h> - namespace Swift { DirectedPresenceSender::DirectedPresenceSender(PresenceSender* sender) : sender(sender) { } void DirectedPresenceSender::sendPresence(std::shared_ptr<Presence> presence) { if (!sender->isAvailable()) { return; } sender->sendPresence(presence); if (!presence->getTo().isValid()) { std::shared_ptr<Presence> presenceCopy(new Presence(*presence)); - foreach(const JID& jid, directedPresenceReceivers) { + for (const auto& jid : directedPresenceReceivers) { presenceCopy->setTo(jid); sender->sendPresence(presenceCopy); } lastSentUndirectedPresence = presence; } } /** * Gets the last broadcast presence, if none has been send the returned optional is not set. */ boost::optional<Presence::ref> DirectedPresenceSender::getLastSentUndirectedPresence() const { boost::optional<Presence::ref> presenceCopy = lastSentUndirectedPresence ? boost::optional<Presence::ref>((*lastSentUndirectedPresence)->clone()) : boost::optional<Presence::ref>(); return presenceCopy; } /** * Send future broadcast presence also to this JID. * @param jid Non-roster JID to receive global presence updates. * @param sendPresence Also send the current global presence immediately. */ void DirectedPresenceSender::addDirectedPresenceReceiver(const JID& jid, SendPresence sendPresence) { directedPresenceReceivers.insert(jid); if (sendPresence == AndSendPresence && sender->isAvailable()) { if (lastSentUndirectedPresence && (*lastSentUndirectedPresence)->getType() == Presence::Available) { std::shared_ptr<Presence> presenceCopy((*lastSentUndirectedPresence)->clone()); presenceCopy->setTo(jid); sender->sendPresence(presenceCopy); } } diff --git a/Swiften/Presence/SubscriptionManager.cpp b/Swiften/Presence/SubscriptionManager.cpp index 8de152c..83009e9 100644 --- a/Swiften/Presence/SubscriptionManager.cpp +++ b/Swiften/Presence/SubscriptionManager.cpp @@ -1,41 +1,40 @@ /* - * Copyright (c) 2010 Isode Limited. + * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Presence/SubscriptionManager.h> #include <boost/bind.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Client/StanzaChannel.h> namespace Swift { SubscriptionManager::SubscriptionManager(StanzaChannel* channel) : stanzaChannel(channel) { stanzaChannel->onPresenceReceived.connect(boost::bind(&SubscriptionManager::handleIncomingPresence, this, _1)); } SubscriptionManager::~SubscriptionManager() { stanzaChannel->onPresenceReceived.disconnect(boost::bind(&SubscriptionManager::handleIncomingPresence, this, _1)); } void SubscriptionManager::cancelSubscription(const JID& jid) { Presence::ref stanza(new Presence()); stanza->setType(Presence::Unsubscribed); stanza->setTo(jid); stanzaChannel->sendPresence(stanza); } void SubscriptionManager::confirmSubscription(const JID& jid) { Presence::ref stanza(new Presence()); stanza->setType(Presence::Subscribed); stanza->setTo(jid); stanzaChannel->sendPresence(stanza); } void SubscriptionManager::requestSubscription(const JID& jid) { Presence::ref stanza(new Presence()); stanza->setType(Presence::Subscribe); diff --git a/Swiften/QA/ConcurrentFileTransferTest/ConcurrentFileTransferTest.cpp b/Swiften/QA/ConcurrentFileTransferTest/ConcurrentFileTransferTest.cpp index 8122c63..664a87b 100644 --- a/Swiften/QA/ConcurrentFileTransferTest/ConcurrentFileTransferTest.cpp +++ b/Swiften/QA/ConcurrentFileTransferTest/ConcurrentFileTransferTest.cpp @@ -1,47 +1,46 @@ /* * Copyright (c) 2015-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <fstream> #include <map> #include <string> #include <boost/filesystem.hpp> #include <boost/numeric/conversion/cast.hpp> #include <Swiften/Base/BoostRandomGenerator.h> #include <Swiften/Base/Debug.h> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Base/sleep.h> #include <Swiften/Client/Client.h> #include <Swiften/Client/ClientXMLTracer.h> #include <Swiften/Disco/ClientDiscoManager.h> #include <Swiften/Disco/EntityCapsProvider.h> #include <Swiften/Elements/Presence.h> #include <Swiften/EventLoop/SimpleEventLoop.h> #include <Swiften/FileTransfer/FileReadBytestream.h> #include <Swiften/FileTransfer/FileTransferManager.h> #include <Swiften/FileTransfer/FileWriteBytestream.h> #include <Swiften/FileTransfer/OutgoingFileTransfer.h> #include <Swiften/FileTransfer/ReadBytestream.h> #include <Swiften/Network/BoostNetworkFactories.h> #include <Swiften/Network/Timer.h> #include <Swiften/Network/TimerFactory.h> using namespace Swift; static const std::string CLIENT_NAME = "Swiften FT Test"; static const std::string CLIENT_NODE = "http://swift.im"; static std::shared_ptr<SimpleEventLoop> eventLoop; static std::shared_ptr<BoostNetworkFactories> networkFactories; BoostRandomGenerator randGen; enum Candidate { InBandBytestream = 1, S5B_Direct = 2, S5B_Proxied = 4, diff --git a/Swiften/QA/FileTransferTest/FileTransferTest.cpp b/Swiften/QA/FileTransferTest/FileTransferTest.cpp index 4cf4048..b627b30 100644 --- a/Swiften/QA/FileTransferTest/FileTransferTest.cpp +++ b/Swiften/QA/FileTransferTest/FileTransferTest.cpp @@ -1,46 +1,45 @@ /* * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <fstream> #include <boost/algorithm/string.hpp> #include <boost/filesystem.hpp> #include <boost/numeric/conversion/cast.hpp> #include <Swiften/Base/BoostRandomGenerator.h> #include <Swiften/Base/Debug.h> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Base/sleep.h> #include <Swiften/Client/Client.h> #include <Swiften/Client/ClientXMLTracer.h> #include <Swiften/Disco/ClientDiscoManager.h> #include <Swiften/Disco/EntityCapsProvider.h> #include <Swiften/Elements/Presence.h> #include <Swiften/EventLoop/SimpleEventLoop.h> #include <Swiften/FileTransfer/FileReadBytestream.h> #include <Swiften/FileTransfer/FileTransferManager.h> #include <Swiften/FileTransfer/FileWriteBytestream.h> #include <Swiften/FileTransfer/OutgoingFileTransfer.h> #include <Swiften/FileTransfer/ReadBytestream.h> #include <Swiften/Network/BoostNetworkFactories.h> #include <Swiften/Network/Timer.h> #include <Swiften/Network/TimerFactory.h> using namespace Swift; static const std::string CLIENT_NAME = "Swiften FT Test"; static const std::string CLIENT_NODE = "http://swift.im"; static std::shared_ptr<SimpleEventLoop> eventLoop; static std::shared_ptr<BoostNetworkFactories> networkFactories; BoostRandomGenerator randGen; enum Candidate { InBandBytestream = 1, S5B_Direct = 2, S5B_Proxied = 4, @@ -319,82 +318,80 @@ static bool runTest(int senderCandidates, int receiverCandidates) { } } std::cout << "expected success: " << expectSuccess << ", wasSuccessful: " << wasSuccessful << std::endl; testRun.reset(); networkFactories.reset(); eventLoop->runUntilEvents(); eventLoop->stop(); eventLoop.reset(); return success; } /** * This program test file-transfer interop between Swift and itself with various connection candidates. * The all combinations of the candidates, IBB, S5B (direct) and S5B (proxied), on sender and receiver side are tested. */ int main(int argc, char** argv) { int failedTests = 0; std::vector<std::pair<int, int> > failedTestPairs; std::cout << "Swiften File-Transfer Connectivity Test Suite" << std::endl; if (argc == 1) { if (getenv("SWIFT_FILETRANSFERTEST_CONFIG")) { // test configuration described in SWIFT_FILETRANSFERTEST_CONFIG environment variable, e.g. "1:1|2:2" std::vector<std::string> configurations; std::string configs_env = std::string(getenv("SWIFT_FILETRANSFERTEST_CONFIG")); boost::split(configurations, configs_env, boost::is_any_of("|")); - foreach(const std::string& config, configurations) { + for (const auto& config : configurations) { std::vector<std::string> split_config; boost::split(split_config, config, boost::is_any_of(":")); assert(split_config.size() == 2); int senderCandidates = atoi(split_config[0].c_str()); int receiverCandidates = atoi(split_config[1].c_str()); if (!runTest(senderCandidates, receiverCandidates)) { failedTests++; failedTestPairs.push_back(std::pair<int, int>(senderCandidates, receiverCandidates)); } } - typedef std::pair<int, int> IntPair; - foreach(IntPair failedTest, failedTestPairs) { + for (auto&& failedTest : failedTestPairs) { std::cout << "Failed test: " << "( " << failedTest.first << ", " << failedTest.second << ") " << std::endl; } } else { // test all configurations for (int n = 0; n < (1 << 7); n++) { int senderCandidates = n & 0xF; int receiverCandidates = (n >> 4) & 0xF; std::cout << "Run test " << n + 1 << " of " << (1 << 7) << ", (" << senderCandidates << ", " << receiverCandidates << ")" << std::endl; if (!runTest(senderCandidates, receiverCandidates)) { failedTests++; failedTestPairs.push_back(std::pair<int, int>(senderCandidates, receiverCandidates)); } } - typedef std::pair<int, int> IntPair; - foreach(IntPair failedTest, failedTestPairs) { + for (auto&& failedTest : failedTestPairs) { std::cout << "Failed test: " << "( " << failedTest.first << ", " << failedTest.second << ") " << std::endl; } } } else if (argc == 3) { Log::setLogLevel(Log::debug); int senderCandidates = atoi(argv[1]); int receiverCandidates = atoi(argv[2]); if (!runTest(senderCandidates, receiverCandidates)) { failedTests++; } } else { std::cout << "Usage:" << std::endl; std::cout << "\t- to test all combinations pass no arguments" << std::endl; std::cout << "\t- to test a specific combination pass two integers describing sender and receiver candidates" << std::endl; } return failedTests; } diff --git a/Swiften/QA/ProxyProviderTest/ProxyProviderTest.cpp b/Swiften/QA/ProxyProviderTest/ProxyProviderTest.cpp index 2b6bfa8..53f9e60 100644 --- a/Swiften/QA/ProxyProviderTest/ProxyProviderTest.cpp +++ b/Swiften/QA/ProxyProviderTest/ProxyProviderTest.cpp @@ -1,41 +1,40 @@ /* * Copyright (c) 2010 Thilo Cestonaro * Licensed under the BSD License. * See Documentation/Licenses/BSD.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <iostream> -#include <Swiften/Base/foreach.h> #include <Swiften/Network/PlatformProxyProvider.h> using namespace Swift; int main(void) { int ret = 0; HostAddressPort hap; std::cout << "constructing PlatfromProxyProvider instance ..." << std::endl; PlatformProxyProvider ppp; hap = ppp.getSOCKS5Proxy(); std::cout << "SOCKS5 Proxy configured: " << hap.isValid() << std::endl; if(hap.isValid()) { std::cout << "SOCKS5 Proxy: " << hap.getAddress().toString() << ":" << hap.getPort() << std::endl; } hap = ppp.getHTTPConnectProxy(); std::cout << "HTTPConnect Proxy configured: " << hap.isValid() << std::endl; if(hap.isValid()) { std::cout << "HTTPConnect Proxy: " << hap.getAddress().toString() << ":" << hap.getPort() << std::endl; } return ret; } diff --git a/Swiften/Queries/IQRouter.cpp b/Swiften/Queries/IQRouter.cpp index e28c2f4..286b65f 100644 --- a/Swiften/Queries/IQRouter.cpp +++ b/Swiften/Queries/IQRouter.cpp @@ -1,86 +1,85 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Queries/IQRouter.h> #include <boost/bind.hpp> #include <Swiften/Base/Algorithm.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/ErrorPayload.h> #include <Swiften/Queries/IQChannel.h> #include <Swiften/Queries/IQHandler.h> namespace Swift { static void noop(IQHandler*) {} IQRouter::IQRouter(IQChannel* channel) : channel_(channel), queueRemoves_(false) { channel->onIQReceived.connect(boost::bind(&IQRouter::handleIQ, this, _1)); } IQRouter::~IQRouter() { channel_->onIQReceived.disconnect(boost::bind(&IQRouter::handleIQ, this, _1)); } bool IQRouter::isAvailable() { return channel_->isAvailable(); } void IQRouter::handleIQ(std::shared_ptr<IQ> iq) { queueRemoves_ = true; bool handled = false; // Go through the handlers in reverse order, to give precedence to the last added handler std::vector<std::shared_ptr<IQHandler> >::const_reverse_iterator i = handlers_.rbegin(); std::vector<std::shared_ptr<IQHandler> >::const_reverse_iterator rend = handlers_.rend(); for (; i != rend; ++i) { handled |= (*i)->handleIQ(iq); if (handled) { break; } } if (!handled && (iq->getType() == IQ::Get || iq->getType() == IQ::Set) ) { sendIQ(IQ::createError(iq->getFrom(), iq->getID(), ErrorPayload::FeatureNotImplemented, ErrorPayload::Cancel)); } processPendingRemoves(); queueRemoves_ = false; } void IQRouter::processPendingRemoves() { - foreach(std::shared_ptr<IQHandler> handler, queuedRemoves_) { + for (auto&& handler : queuedRemoves_) { erase(handlers_, handler); } queuedRemoves_.clear(); } void IQRouter::addHandler(IQHandler* handler) { addHandler(std::shared_ptr<IQHandler>(handler, noop)); } void IQRouter::removeHandler(IQHandler* handler) { removeHandler(std::shared_ptr<IQHandler>(handler, noop)); } void IQRouter::addHandler(std::shared_ptr<IQHandler> handler) { handlers_.push_back(handler); } void IQRouter::removeHandler(std::shared_ptr<IQHandler> handler) { if (queueRemoves_) { queuedRemoves_.push_back(handler); } else { erase(handlers_, handler); } } void IQRouter::sendIQ(std::shared_ptr<IQ> iq) { if (from_.isValid() && !iq->getFrom().isValid()) { iq->setFrom(from_); } diff --git a/Swiften/Roster/XMPPRosterController.cpp b/Swiften/Roster/XMPPRosterController.cpp index 57b0645..8ee9755 100644 --- a/Swiften/Roster/XMPPRosterController.cpp +++ b/Swiften/Roster/XMPPRosterController.cpp @@ -1,92 +1,91 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Roster/XMPPRosterController.h> #include <boost/bind.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/RosterItemPayload.h> #include <Swiften/Queries/IQRouter.h> #include <Swiften/Roster/GetRosterRequest.h> #include <Swiften/Roster/RosterStorage.h> #include <Swiften/Roster/XMPPRosterImpl.h> namespace Swift { /** * The controller does not gain ownership of these parameters. */ XMPPRosterController::XMPPRosterController(IQRouter* iqRouter, XMPPRosterImpl* xmppRoster, RosterStorage* rosterStorage) : iqRouter_(iqRouter), rosterPushResponder_(iqRouter), xmppRoster_(xmppRoster), rosterStorage_(rosterStorage), useVersioning(false) { rosterPushResponder_.onRosterReceived.connect(boost::bind(&XMPPRosterController::handleRosterReceived, this, _1, false, std::shared_ptr<RosterPayload>())); rosterPushResponder_.start(); } XMPPRosterController::~XMPPRosterController() { rosterPushResponder_.stop(); } void XMPPRosterController::requestRoster() { xmppRoster_->clear(); std::shared_ptr<RosterPayload> storedRoster = rosterStorage_->getRoster(); GetRosterRequest::ref rosterRequest; if (useVersioning) { std::string version = ""; if (storedRoster && storedRoster->getVersion()) { version = *storedRoster->getVersion(); } rosterRequest = GetRosterRequest::create(iqRouter_, version); } else { rosterRequest = GetRosterRequest::create(iqRouter_); } rosterRequest->onResponse.connect(boost::bind(&XMPPRosterController::handleRosterReceived, this, _1, true, storedRoster)); rosterRequest->send(); } void XMPPRosterController::handleRosterReceived(std::shared_ptr<RosterPayload> rosterPayload, bool initial, std::shared_ptr<RosterPayload> previousRoster) { if (rosterPayload) { - foreach(const RosterItemPayload& item, rosterPayload->getItems()) { + for (const auto& item : rosterPayload->getItems()) { //Don't worry about the updated case, the XMPPRoster sorts that out. if (item.getSubscription() == RosterItemPayload::Remove) { xmppRoster_->removeContact(item.getJID()); } else { xmppRoster_->addContact(item.getJID(), item.getName(), item.getGroups(), item.getSubscription()); } } } else if (previousRoster) { // The cached version hasn't changed; emit all items - foreach(const RosterItemPayload& item, previousRoster->getItems()) { + for (const auto& item : previousRoster->getItems()) { if (item.getSubscription() != RosterItemPayload::Remove) { xmppRoster_->addContact(item.getJID(), item.getName(), item.getGroups(), item.getSubscription()); } else { SWIFT_LOG(error) << "Stored invalid roster item" << std::endl; } } } if (initial) { xmppRoster_->onInitialRosterPopulated(); } if (rosterPayload && rosterPayload->getVersion() && useVersioning) { saveRoster(*rosterPayload->getVersion()); } } void XMPPRosterController::saveRoster(const std::string& version) { std::vector<XMPPRosterItem> items = xmppRoster_->getItems(); std::shared_ptr<RosterPayload> roster(new RosterPayload()); roster->setVersion(version); - foreach(const XMPPRosterItem& item, items) { + for (const auto& item : items) { roster->addItem(RosterItemPayload(item.getJID(), item.getName(), item.getSubscription(), item.getGroups())); } rosterStorage_->setRoster(roster); } } diff --git a/Swiften/Roster/XMPPRosterImpl.cpp b/Swiften/Roster/XMPPRosterImpl.cpp index 9a2ea7a..74f634f 100644 --- a/Swiften/Roster/XMPPRosterImpl.cpp +++ b/Swiften/Roster/XMPPRosterImpl.cpp @@ -1,40 +1,38 @@ /* - * Copyright (c) 2010-2015 Isode Limited. + * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Roster/XMPPRosterImpl.h> -#include <Swiften/Base/foreach.h> - namespace Swift { XMPPRosterImpl::XMPPRosterImpl() { } XMPPRosterImpl::~XMPPRosterImpl() { } void XMPPRosterImpl::addContact(const JID& jid, const std::string& name, const std::vector<std::string>& groups, RosterItemPayload::Subscription subscription) { JID bareJID(jid.toBare()); std::map<JID, XMPPRosterItem>::iterator i = entries_.find(bareJID); if (i != entries_.end()) { std::string oldName = i->second.getName(); std::vector<std::string> oldGroups = i->second.getGroups(); i->second = XMPPRosterItem(jid, name, groups, subscription); onJIDUpdated(bareJID, oldName, oldGroups); } else { entries_.insert(std::make_pair(bareJID, XMPPRosterItem(jid, name, groups, subscription))); onJIDAdded(bareJID); } } void XMPPRosterImpl::removeContact(const JID& jid) { entries_.erase(JID(jid.toBare())); onJIDRemoved(jid); } void XMPPRosterImpl::clear() { @@ -51,57 +49,57 @@ std::string XMPPRosterImpl::getNameForJID(const JID& jid) const { if (i != entries_.end()) { return i->second.getName(); } else { return ""; } } std::vector<std::string> XMPPRosterImpl::getGroupsForJID(const JID& jid) { std::map<JID, XMPPRosterItem>::iterator i = entries_.find(jid.toBare()); if (i != entries_.end()) { return i->second.getGroups(); } else { return std::vector<std::string>(); } } RosterItemPayload::Subscription XMPPRosterImpl::getSubscriptionStateForJID(const JID& jid) { std::map<JID, XMPPRosterItem>::iterator i = entries_.find(jid.toBare()); if (i != entries_.end()) { return i->second.getSubscription(); } else { return RosterItemPayload::None; } } std::vector<XMPPRosterItem> XMPPRosterImpl::getItems() const { std::vector<XMPPRosterItem> result; - foreach(const RosterMap::value_type& entry, entries_) { + for (const auto& entry : entries_) { result.push_back(entry.second); } return result; } boost::optional<XMPPRosterItem> XMPPRosterImpl::getItem(const JID& jid) const { std::map<JID, XMPPRosterItem>::const_iterator i = entries_.find(jid.toBare()); if (i != entries_.end()) { return i->second; } else { return boost::optional<XMPPRosterItem>(); } } std::set<std::string> XMPPRosterImpl::getGroups() const { std::set<std::string> result; - foreach(const RosterMap::value_type& entry, entries_) { + for (const auto& entry : entries_) { std::vector<std::string> groups = entry.second.getGroups(); result.insert(groups.begin(), groups.end()); } return result; } } diff --git a/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp index 93eab75..78bb0eb 100644 --- a/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.cpp @@ -1,41 +1,40 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.h> #include <memory> #include <boost/lexical_cast.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/XML/XMLElement.h> namespace Swift { BytestreamsSerializer::BytestreamsSerializer() { } std::string BytestreamsSerializer::serializePayload(std::shared_ptr<Bytestreams> bytestreams) const { XMLElement queryElement("query", "http://jabber.org/protocol/bytestreams"); queryElement.setAttribute("sid", bytestreams->getStreamID()); - foreach(const Bytestreams::StreamHost& streamHost, bytestreams->getStreamHosts()) { + for (const auto& streamHost : bytestreams->getStreamHosts()) { std::shared_ptr<XMLElement> streamHostElement(new XMLElement("streamhost")); streamHostElement->setAttribute("host", streamHost.host); streamHostElement->setAttribute("jid", streamHost.jid.toString()); streamHostElement->setAttribute("port", boost::lexical_cast<std::string>(streamHost.port)); queryElement.addNode(streamHostElement); } if (bytestreams->getUsedStreamHost()) { std::shared_ptr<XMLElement> streamHostElement(new XMLElement("streamhost-used")); streamHostElement->setAttribute("jid", *bytestreams->getUsedStreamHost()); queryElement.addNode(streamHostElement); } return queryElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/CommandSerializer.cpp b/Swiften/Serializer/PayloadSerializers/CommandSerializer.cpp index e1dd6ed..25a70f6 100644 --- a/Swiften/Serializer/PayloadSerializers/CommandSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/CommandSerializer.cpp @@ -1,90 +1,89 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/CommandSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/FormSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { CommandSerializer::CommandSerializer() { } std::string CommandSerializer::serializePayload(std::shared_ptr<Command> command) const { XMLElement commandElement("command", "http://jabber.org/protocol/commands"); commandElement.setAttribute("node", command->getNode()); if (!command->getSessionID().empty()) { commandElement.setAttribute("sessionid", command->getSessionID()); } std::string action = actionToString(command->getAction()); if (!action.empty()) { commandElement.setAttribute("action", action); } std::string status; switch (command->getStatus()) { case Command::Executing: status = "executing";break; case Command::Completed: status = "completed";break; case Command::Canceled: status = "canceled";break; case Command::NoStatus: break; } if (!status.empty()) { commandElement.setAttribute("status", status); } if (command->getAvailableActions().size() > 0) { std::string actions = "<actions"; std::string executeAction = actionToString(command->getExecuteAction()); if (!executeAction.empty()) { actions += " execute='" + executeAction + "'"; } actions += ">"; - foreach (Command::Action action, command->getAvailableActions()) { + for (const auto& action : command->getAvailableActions()) { actions += "<" + actionToString(action) + "/>"; } actions += "</actions>"; commandElement.addNode(std::make_shared<XMLRawTextNode>(actions)); } - foreach (Command::Note note, command->getNotes()) { + for (const auto& note : command->getNotes()) { std::shared_ptr<XMLElement> noteElement(new XMLElement("note")); std::string type; switch (note.type) { case Command::Note::Info: type = "info"; break; case Command::Note::Warn: type = "warn"; break; case Command::Note::Error: type = "error"; break; } if (!type.empty()) { noteElement->setAttribute("type", type); } noteElement->addNode(std::make_shared<XMLTextNode>(note.note)); commandElement.addNode(noteElement); } Form::ref form = command->getForm(); if (form) { commandElement.addNode(std::make_shared<XMLRawTextNode>(FormSerializer().serialize(form))); } return commandElement.serialize(); } std::string CommandSerializer::actionToString(Command::Action action) const { std::string string; switch (action) { case Command::Cancel: string = "cancel"; break; case Command::Execute: string = "execute"; break; case Command::Complete: string = "complete"; break; case Command::Prev: string = "prev"; break; case Command::Next: string = "next"; break; case Command::NoAction: break; diff --git a/Swiften/Serializer/PayloadSerializers/DiscoInfoSerializer.cpp b/Swiften/Serializer/PayloadSerializers/DiscoInfoSerializer.cpp index 73e2585..06cad2b 100644 --- a/Swiften/Serializer/PayloadSerializers/DiscoInfoSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/DiscoInfoSerializer.cpp @@ -1,47 +1,46 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/DiscoInfoSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/FormSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> namespace Swift { DiscoInfoSerializer::DiscoInfoSerializer() : GenericPayloadSerializer<DiscoInfo>() { } std::string DiscoInfoSerializer::serializePayload(std::shared_ptr<DiscoInfo> discoInfo) const { XMLElement queryElement("query", "http://jabber.org/protocol/disco#info"); if (!discoInfo->getNode().empty()) { queryElement.setAttribute("node", discoInfo->getNode()); } - foreach(const DiscoInfo::Identity& identity, discoInfo->getIdentities()) { + for (const auto& identity : discoInfo->getIdentities()) { std::shared_ptr<XMLElement> identityElement(new XMLElement("identity")); if (!identity.getLanguage().empty()) { identityElement->setAttribute("xml:lang", identity.getLanguage()); } identityElement->setAttribute("category", identity.getCategory()); identityElement->setAttribute("name", identity.getName()); identityElement->setAttribute("type", identity.getType()); queryElement.addNode(identityElement); } - foreach(const std::string& feature, discoInfo->getFeatures()) { + for (const auto& feature : discoInfo->getFeatures()) { std::shared_ptr<XMLElement> featureElement(new XMLElement("feature")); featureElement->setAttribute("var", feature); queryElement.addNode(featureElement); } - foreach(const Form::ref extension, discoInfo->getExtensions()) { + for (const auto& extension : discoInfo->getExtensions()) { queryElement.addNode(std::make_shared<XMLRawTextNode>(FormSerializer().serialize(extension))); } return queryElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/DiscoItemsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/DiscoItemsSerializer.cpp index 1b734dc..a8eafef 100644 --- a/Swiften/Serializer/PayloadSerializers/DiscoItemsSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/DiscoItemsSerializer.cpp @@ -1,36 +1,35 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/DiscoItemsSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> namespace Swift { DiscoItemsSerializer::DiscoItemsSerializer() : GenericPayloadSerializer<DiscoItems>() { } std::string DiscoItemsSerializer::serializePayload(std::shared_ptr<DiscoItems> discoItems) const { XMLElement queryElement("query", "http://jabber.org/protocol/disco#items"); if (!discoItems->getNode().empty()) { queryElement.setAttribute("node", discoItems->getNode()); } - foreach(const DiscoItems::Item& item, discoItems->getItems()) { + for (const auto& item : discoItems->getItems()) { std::shared_ptr<XMLElement> itemElement(new XMLElement("item")); itemElement->setAttribute("name", item.getName()); itemElement->setAttribute("jid", item.getJID()); if (!item.getNode().empty()) { itemElement->setAttribute("node", item.getNode()); } queryElement.addNode(itemElement); } return queryElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp b/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp index ed010b4..f723ead 100644 --- a/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/FormSerializer.cpp @@ -1,208 +1,209 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/FormSerializer.h> #include <memory> #include <string> #include <Swiften/Base/Algorithm.h> #include <Swiften/Base/String.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/Serializer/XML/XMLTextNode.h> using namespace Swift; namespace { template<typename T> void serializeValueAsString(std::shared_ptr<FormField> field, std::shared_ptr<XMLElement> parent) { std::string value = std::dynamic_pointer_cast<T>(field)->getValue(); if (!value.empty()) { std::shared_ptr<XMLElement> valueElement(new XMLElement("value")); valueElement->addNode(XMLTextNode::create(value)); parent->addNode(valueElement); } } } namespace Swift { FormSerializer::FormSerializer() : GenericPayloadSerializer<Form>() {} std::string FormSerializer::serializePayload(std::shared_ptr<Form> form) const { if (!form) { return ""; } std::shared_ptr<XMLElement> formElement(new XMLElement("x", "jabber:x:data")); std::string type; switch (form->getType()) { case Form::FormType: type = "form"; break; case Form::SubmitType: type = "submit"; break; case Form::CancelType: type = "cancel"; break; case Form::ResultType: type = "result"; break; } formElement->setAttribute("type", type); if (!form->getTitle().empty()) { multiLineify(form->getTitle(), "title", formElement); } if (!form->getInstructions().empty()) { multiLineify(form->getInstructions(), "instructions", formElement); } - foreach(std::shared_ptr<FormPage> page, form->getPages()) { + for (const auto& page : form->getPages()) { formElement->addNode(pageToXML(page)); } - foreach(std::shared_ptr<FormField> field, form->getFields()) { + for (const auto& field : form->getFields()) { formElement->addNode(fieldToXML(field, true)); } if (!form->getReportedFields().empty()) { std::shared_ptr<XMLElement> reportedElement(new XMLElement("reported")); - foreach(FormField::ref field, form->getReportedFields()) { + for (const auto& field : form->getReportedFields()) { reportedElement->addNode(fieldToXML(field, true)); } formElement->addNode(reportedElement); } - foreach(Form::FormItem item, form->getItems()) { + for (const auto& item : form->getItems()) { std::shared_ptr<XMLElement> itemElement(new XMLElement("item")); - foreach(FormField::ref field, item) { + for (const auto& field : item) { itemElement->addNode(fieldToXML(field, false)); } formElement->addNode(itemElement); } - foreach(const FormText::text text, form->getTextElements()) { + for (const auto& text : form->getTextElements()) { formElement->addNode(textToXML(text)); } - foreach (std::shared_ptr<FormField> field, fields_) { + for (const auto& field : fields_) { formElement->addNode(fieldToXML(field,true)); } return formElement->serialize(); } std::shared_ptr<XMLElement> FormSerializer::textToXML(std::shared_ptr<FormText> text) const { std::shared_ptr<XMLElement> textElement (new XMLElement("text")); textElement->addNode(std::make_shared<XMLTextNode>(text->getTextString())); return textElement; } std::shared_ptr<XMLElement> FormSerializer::fieldRefToXML(const std::string& ref) const { std::shared_ptr<XMLElement> fieldRefElement(new XMLElement("fieldref")); fieldRefElement->setAttribute("var", ref); return fieldRefElement; } std::shared_ptr<XMLElement> FormSerializer::pageToXML(std::shared_ptr<FormPage> page) const { std::shared_ptr<XMLElement> pageElement(new XMLElement("page")); pageElement->setAttribute("xmlns", "http://jabber.org/protocol/xdata-layout"); if (!page->getLabel().empty()) { pageElement->setAttribute("label", page->getLabel()); } - foreach(const FormText::text text, page->getTextElements()) { + for (const auto& text : page->getTextElements()) { pageElement->addNode(textToXML(text)); } - foreach (const std::shared_ptr<FormField> field, page->getFields()) { + for (const auto& field : page->getFields()) { pageElement->addNode(fieldRefToXML(field->getName())); fields_.push_back(field); } - foreach(const FormReportedRef::ref reportedRef, page->getReportedRefs()) { + for (const auto& reportedRef: page->getReportedRefs()) { + (void)reportedRef; pageElement->addNode(std::make_shared<XMLElement>("reportedref")); } - foreach(const FormSection::section section, page->getChildSections()) { + for (const auto& section : page->getChildSections()) { pageElement->addNode(sectionToXML(section)); } return pageElement; } std::shared_ptr<XMLElement> FormSerializer::sectionToXML(std::shared_ptr<FormSection> section) const { std::shared_ptr<XMLElement> sectionElement(new XMLElement("section")); if (!section->getLabel().empty()) { sectionElement->setAttribute("label", section->getLabel()); } - foreach(const FormText::text text, section->getTextElements()) { + for (const auto& text : section->getTextElements()) { sectionElement->addNode(textToXML(text)); } - foreach(const std::shared_ptr<FormField> field, section->getFields()) { + for (const auto& field : section->getFields()) { sectionElement->addNode(fieldRefToXML(field->getName())); fields_.push_back(field); } - foreach(const FormReportedRef::ref reportedRef, section->getReportedRefs()) { + for (const auto& reportedRef : section->getReportedRefs()) { + (void)reportedRef; sectionElement->addNode(std::make_shared<XMLElement>("reportedref")); } - foreach(const FormSection::section childSection, section->getChildSections()) { + for (const auto& childSection : section->getChildSections()) { sectionElement->addNode(sectionToXML(childSection)); } return sectionElement; } std::shared_ptr<XMLElement> FormSerializer::fieldToXML(std::shared_ptr<FormField> field, bool withTypeAttribute) const { std::shared_ptr<XMLElement> fieldElement(new XMLElement("field")); if (!field->getName().empty()) { fieldElement->setAttribute("var", field->getName()); } if (!field->getLabel().empty()) { fieldElement->setAttribute("label", field->getLabel()); } if (field->getRequired()) { fieldElement->addNode(std::make_shared<XMLElement>("required")); } if (!field->getDescription().empty()) { std::shared_ptr<XMLElement> descriptionElement(new XMLElement("desc")); descriptionElement->addNode(std::make_shared<XMLTextNode>(field->getDescription())); fieldElement->addNode(descriptionElement); } // Set the value and type std::string fieldType; switch (field->getType()) { case FormField::UnknownType: fieldType = ""; break; case FormField::BooleanType: fieldType = "boolean"; break; case FormField::FixedType: fieldType = "fixed"; break; case FormField::HiddenType: fieldType = "hidden"; break; case FormField::ListSingleType: fieldType = "list-single"; break; case FormField::TextMultiType: fieldType = "text-multi"; break; case FormField::TextPrivateType: fieldType = "text-private"; break; case FormField::TextSingleType: fieldType = "text-single"; break; case FormField::JIDSingleType: fieldType = "jid-single"; break; case FormField::JIDMultiType: fieldType = "jid-multi"; break; case FormField::ListMultiType: fieldType = "list-multi"; break; } if (!fieldType.empty() && withTypeAttribute) { fieldElement->setAttribute("type", fieldType); } - foreach (const std::string& value, field->getValues()) { + for (const auto& value : field->getValues()) { std::shared_ptr<XMLElement> valueElement = std::make_shared<XMLElement>("value"); valueElement->addNode(std::make_shared<XMLTextNode>(value)); fieldElement->addNode(valueElement); } - foreach (const FormField::Option& option, field->getOptions()) { + for (const auto& option : field->getOptions()) { std::shared_ptr<XMLElement> optionElement(new XMLElement("option")); if (!option.label.empty()) { optionElement->setAttribute("label", option.label); } std::shared_ptr<XMLElement> valueElement(new XMLElement("value")); valueElement->addNode(XMLTextNode::create(option.value)); optionElement->addNode(valueElement); fieldElement->addNode(optionElement); } return fieldElement; } void FormSerializer::multiLineify(const std::string& text, const std::string& elementName, std::shared_ptr<XMLElement> element) const { std::string unRdText(text); erase(unRdText, '\r'); std::vector<std::string> lines = String::split(unRdText, '\n'); - foreach (std::string line, lines) { + for (const auto& line : lines) { std::shared_ptr<XMLElement> lineElement(new XMLElement(elementName)); lineElement->addNode(std::make_shared<XMLTextNode>(line)); element->addNode(lineElement); } } } diff --git a/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp b/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp index 175de1e..cf0b54c 100644 --- a/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp +++ b/Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.cpp @@ -1,39 +1,38 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/BlockListPayload.h> #include <Swiften/Elements/BlockPayload.h> #include <Swiften/Elements/UnblockPayload.h> #include <Swiften/Serializer/PayloadSerializer.h> #include <Swiften/Serializer/PayloadSerializers/BlockSerializer.h> #include <Swiften/Serializer/PayloadSerializers/BodySerializer.h> #include <Swiften/Serializer/PayloadSerializers/BytestreamsSerializer.h> #include <Swiften/Serializer/PayloadSerializers/CapsInfoSerializer.h> #include <Swiften/Serializer/PayloadSerializers/CarbonsDisableSerializer.h> #include <Swiften/Serializer/PayloadSerializers/CarbonsEnableSerializer.h> #include <Swiften/Serializer/PayloadSerializers/CarbonsPrivateSerializer.h> #include <Swiften/Serializer/PayloadSerializers/CarbonsReceivedSerializer.h> #include <Swiften/Serializer/PayloadSerializers/CarbonsSentSerializer.h> #include <Swiften/Serializer/PayloadSerializers/ChatStateSerializer.h> #include <Swiften/Serializer/PayloadSerializers/CommandSerializer.h> #include <Swiften/Serializer/PayloadSerializers/DelaySerializer.h> #include <Swiften/Serializer/PayloadSerializers/DeliveryReceiptRequestSerializer.h> #include <Swiften/Serializer/PayloadSerializers/DeliveryReceiptSerializer.h> #include <Swiften/Serializer/PayloadSerializers/DiscoInfoSerializer.h> #include <Swiften/Serializer/PayloadSerializers/DiscoItemsSerializer.h> #include <Swiften/Serializer/PayloadSerializers/ErrorSerializer.h> #include <Swiften/Serializer/PayloadSerializers/FormSerializer.h> #include <Swiften/Serializer/PayloadSerializers/ForwardedSerializer.h> #include <Swiften/Serializer/PayloadSerializers/IBBSerializer.h> #include <Swiften/Serializer/PayloadSerializers/IdleSerializer.h> #include <Swiften/Serializer/PayloadSerializers/InBandRegistrationPayloadSerializer.h> #include <Swiften/Serializer/PayloadSerializers/IsodeIQDelegationSerializer.h> #include <Swiften/Serializer/PayloadSerializers/JingleContentPayloadSerializer.h> #include <Swiften/Serializer/PayloadSerializers/JingleFileTransferDescriptionSerializer.h> #include <Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.h> @@ -138,44 +137,44 @@ FullPayloadSerializerCollection::FullPayloadSerializerCollection() { serializers_.push_back(new JingleFileTransferFileInfoSerializer()); serializers_.push_back(new JingleContentPayloadSerializer()); serializers_.push_back(new JingleFileTransferDescriptionSerializer()); serializers_.push_back(new JingleFileTransferHashSerializer()); serializers_.push_back(new JingleIBBTransportPayloadSerializer()); serializers_.push_back(new JingleS5BTransportPayloadSerializer()); serializers_.push_back(new JinglePayloadSerializer(this)); serializers_.push_back(new S5BProxyRequestSerializer()); serializers_.push_back(new DeliveryReceiptSerializer()); serializers_.push_back(new DeliveryReceiptRequestSerializer()); serializers_.push_back(new PubSubSerializer(this)); serializers_.push_back(new PubSubEventSerializer(this)); serializers_.push_back(new PubSubOwnerPubSubSerializer(this)); serializers_.push_back(new PubSubErrorSerializer()); serializers_.push_back(new ResultSetSerializer()); serializers_.push_back(new ForwardedSerializer(this)); serializers_.push_back(new MAMResultSerializer(this)); serializers_.push_back(new MAMQuerySerializer()); serializers_.push_back(new MAMFinSerializer()); serializers_.push_back(new CarbonsDisableSerializer()); serializers_.push_back(new CarbonsEnableSerializer()); serializers_.push_back(new CarbonsPrivateSerializer()); serializers_.push_back(new CarbonsReceivedSerializer(this)); serializers_.push_back(new CarbonsSentSerializer(this)); serializers_.push_back(new IsodeIQDelegationSerializer(this)); - foreach(PayloadSerializer* serializer, serializers_) { + for (auto serializer : serializers_) { addSerializer(serializer); } } FullPayloadSerializerCollection::~FullPayloadSerializerCollection() { - foreach(PayloadSerializer* serializer, serializers_) { + for (auto serializer : serializers_) { removeSerializer(serializer); delete serializer; } serializers_.clear(); } } diff --git a/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp b/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp index 36d82a2..e41ff8c 100644 --- a/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/IBBSerializer.cpp @@ -1,44 +1,43 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/IBBSerializer.h> #include <cassert> #include <memory> #include <boost/lexical_cast.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLTextNode.h> #include <Swiften/StringCodecs/Base64.h> namespace Swift { IBBSerializer::IBBSerializer() { } std::string IBBSerializer::serializePayload(std::shared_ptr<IBB> ibb) const { switch(ibb->getAction()) { case IBB::Data: { XMLElement ibbElement("data", "http://jabber.org/protocol/ibb"); ibbElement.setAttribute("sid", ibb->getStreamID()); if (ibb->getSequenceNumber() >= 0) { ibbElement.setAttribute("seq", boost::lexical_cast<std::string>(ibb->getSequenceNumber())); } ibbElement.addNode(std::make_shared<XMLTextNode>(Base64::encode(ibb->getData()))); return ibbElement.serialize(); } case IBB::Open: { XMLElement ibbElement("open", "http://jabber.org/protocol/ibb"); ibbElement.setAttribute("sid", ibb->getStreamID()); switch (ibb->getStanzaType()) { case IBB::IQStanza: ibbElement.setAttribute("stanza", "iq"); break; case IBB::MessageStanza: ibbElement.setAttribute("stanza", "message"); break; } assert(ibb->getBlockSize() > 0); ibbElement.setAttribute("block-size", boost::lexical_cast<std::string>(ibb->getBlockSize())); return ibbElement.serialize(); diff --git a/Swiften/Serializer/PayloadSerializers/InBandRegistrationPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/InBandRegistrationPayloadSerializer.cpp index 31b023f..04b7c56 100644 --- a/Swiften/Serializer/PayloadSerializers/InBandRegistrationPayloadSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/InBandRegistrationPayloadSerializer.cpp @@ -1,41 +1,40 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/InBandRegistrationPayloadSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/FormSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> namespace Swift { InBandRegistrationPayloadSerializer::InBandRegistrationPayloadSerializer() { } std::string InBandRegistrationPayloadSerializer::serializePayload(std::shared_ptr<InBandRegistrationPayload> registration) const { XMLElement registerElement("query", "jabber:iq:register"); if (registration->isRegistered()) { registerElement.addNode(XMLElement::ref(new XMLElement("registered"))); } if (registration->isRemove()) { registerElement.addNode(XMLElement::ref(new XMLElement("remove"))); } if (registration->getInstructions()) { registerElement.addNode(XMLElement::ref(new XMLElement("instructions", "", *registration->getInstructions()))); } if (registration->getUsername()) { registerElement.addNode(XMLElement::ref(new XMLElement("username", "", *registration->getUsername()))); } if (registration->getNick()) { diff --git a/Swiften/Serializer/PayloadSerializers/JingleContentPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleContentPayloadSerializer.cpp index 02e0f2a..39eb149 100644 --- a/Swiften/Serializer/PayloadSerializers/JingleContentPayloadSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/JingleContentPayloadSerializer.cpp @@ -1,81 +1,80 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/JingleContentPayloadSerializer.h> #include <memory> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/JingleFileTransferDescriptionSerializer.h> #include <Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.h> #include <Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLNode.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> namespace Swift { JingleContentPayloadSerializer::JingleContentPayloadSerializer() { } std::string JingleContentPayloadSerializer::serializePayload(std::shared_ptr<JingleContentPayload> payload) const { XMLElement payloadXML("content"); payloadXML.setAttribute("creator", creatorToString(payload->getCreator())); payloadXML.setAttribute("name", payload->getName()); if (!payload->getDescriptions().empty()) { // JingleFileTransferDescription JingleFileTransferDescriptionSerializer ftSerializer; JingleFileTransferDescription::ref filetransfer; - foreach(JingleDescription::ref desc, payload->getDescriptions()) { + for (auto&& desc : payload->getDescriptions()) { if ((filetransfer = std::dynamic_pointer_cast<JingleFileTransferDescription>(desc))) { payloadXML.addNode(std::make_shared<XMLRawTextNode>(ftSerializer.serializePayload(filetransfer))); } } } if (!payload->getTransports().empty()) { // JingleIBBTransportPayload JingleIBBTransportPayloadSerializer ibbSerializer; JingleIBBTransportPayload::ref ibb; // JingleS5BTransportPayload JingleS5BTransportPayloadSerializer s5bSerializer; JingleS5BTransportPayload::ref s5b; - foreach(JingleTransportPayload::ref transport, payload->getTransports()) { + for (auto&& transport : payload->getTransports()) { if ((ibb = std::dynamic_pointer_cast<JingleIBBTransportPayload>(transport))) { payloadXML.addNode(std::make_shared<XMLRawTextNode>(ibbSerializer.serializePayload(ibb))); } else if ((s5b = std::dynamic_pointer_cast<JingleS5BTransportPayload>(transport))) { payloadXML.addNode(std::make_shared<XMLRawTextNode>(s5bSerializer.serializePayload(s5b))); } } } return payloadXML.serialize(); } std::string JingleContentPayloadSerializer::creatorToString(JingleContentPayload::Creator creator) const { switch(creator) { case JingleContentPayload::InitiatorCreator: return "initiator"; case JingleContentPayload::ResponderCreator: return "responder"; case JingleContentPayload::UnknownCreator: SWIFT_LOG(error) << "Serializing unknown creator value."; return "ERROR ERROR ERROR"; } assert(false); return ""; } } diff --git a/Swiften/Serializer/PayloadSerializers/JingleFileTransferDescriptionSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleFileTransferDescriptionSerializer.cpp index b002482..27e3b33 100644 --- a/Swiften/Serializer/PayloadSerializers/JingleFileTransferDescriptionSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/JingleFileTransferDescriptionSerializer.cpp @@ -1,41 +1,40 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2015-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/JingleFileTransferDescriptionSerializer.h> #include <memory> #include <boost/lexical_cast.hpp> #include <Swiften/Base/DateTime.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLNode.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/StringCodecs/Base64.h> namespace Swift { JingleFileTransferDescriptionSerializer::JingleFileTransferDescriptionSerializer() { } std::string JingleFileTransferDescriptionSerializer::serializePayload(std::shared_ptr<JingleFileTransferDescription> payload) const { XMLElement description("description", "urn:xmpp:jingle:apps:file-transfer:4"); JingleFileTransferFileInfoSerializer fileInfoSerializer; std::shared_ptr<XMLRawTextNode> fileInfoXML = std::make_shared<XMLRawTextNode>(fileInfoSerializer.serialize(std::make_shared<JingleFileTransferFileInfo>(payload->getFileInfo()))); description.addNode(fileInfoXML); return description.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp index d78d7df..35a0a6e 100644 --- a/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.cpp @@ -1,66 +1,65 @@ /* * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.h> #include <memory> #include <boost/lexical_cast.hpp> #include <Swiften/Base/DateTime.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/Serializer/XML/XMLTextNode.h> #include <Swiften/StringCodecs/Base64.h> namespace Swift { JingleFileTransferFileInfoSerializer::JingleFileTransferFileInfoSerializer() { } std::string JingleFileTransferFileInfoSerializer::serializePayload(std::shared_ptr<JingleFileTransferFileInfo> fileInfo) const { XMLElement fileElement("file", ""); if (fileInfo->getDate() != stringToDateTime("")) { fileElement.addNode(std::make_shared<XMLElement>("date", "", dateTimeToString(fileInfo->getDate()))); } if (!fileInfo->getDescription().empty()) { fileElement.addNode(std::make_shared<XMLElement>("desc", "", fileInfo->getDescription())); } if (!fileInfo->getMediaType().empty()) { fileElement.addNode(std::make_shared<XMLElement>("media-type", "", fileInfo->getMediaType())); } if (!fileInfo->getName().empty()) { fileElement.addNode(std::make_shared<XMLElement>("name", "", fileInfo->getName())); } if (fileInfo->getSupportsRangeRequests()) { std::shared_ptr<XMLElement> range = std::make_shared<XMLElement>("range"); if (fileInfo->getRangeOffset() != 0) { range->setAttribute("offset", boost::lexical_cast<std::string>(fileInfo->getRangeOffset())); } fileElement.addNode(range); } if (fileInfo->getSize() > 0) { fileElement.addNode(std::make_shared<XMLElement>("size", "", boost::lexical_cast<std::string>(fileInfo->getSize()))); } - foreach (JingleFileTransferFileInfo::HashElementMap::value_type hashElement, fileInfo->getHashes()) { + for (const auto& hashElement : fileInfo->getHashes()) { std::shared_ptr<XMLElement> hash = std::make_shared<XMLElement>("hash", "urn:xmpp:hashes:1", Base64::encode(hashElement.second)); hash->setAttribute("algo", hashElement.first); fileElement.addNode(hash); } return fileElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/JingleFileTransferHashSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleFileTransferHashSerializer.cpp index 1f6ead7..7629721 100644 --- a/Swiften/Serializer/PayloadSerializers/JingleFileTransferHashSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/JingleFileTransferHashSerializer.cpp @@ -1,46 +1,45 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2015-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/JingleFileTransferHashSerializer.h> #include <map> #include <memory> #include <string> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/JingleFileTransferFileInfoSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLNode.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> namespace Swift { JingleFileTransferHashSerializer::JingleFileTransferHashSerializer() { } std::string JingleFileTransferHashSerializer::serializePayload(std::shared_ptr<JingleFileTransferHash> payload) const { // code for version urn:xmpp:jingle:apps:file-transfer:2 //XMLElement hash("hash", "urn:xmpp:jingle:apps:file-transfer:info:2", payload->getHash()); // code for version urn:xmpp:jingle:apps:file-transfer:4 XMLElement checksum("checksum", "urn:xmpp:jingle:apps:file-transfer:4"); JingleFileTransferFileInfoSerializer fileSerializer; std::shared_ptr<XMLRawTextNode> file = std::make_shared<XMLRawTextNode>(fileSerializer.serialize(std::make_shared<JingleFileTransferFileInfo>(payload->getFileInfo()))); checksum.addNode(file); return checksum.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp index 52e6c16..9930e44 100644 --- a/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.cpp @@ -1,39 +1,38 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/JingleIBBTransportPayloadSerializer.h> #include <memory> #include <boost/lexical_cast.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLNode.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> namespace Swift { JingleIBBTransportPayloadSerializer::JingleIBBTransportPayloadSerializer() { } std::string JingleIBBTransportPayloadSerializer::serializePayload(std::shared_ptr<JingleIBBTransportPayload> payload) const { XMLElement payloadXML("transport", "urn:xmpp:jingle:transports:ibb:1"); if (payload->getBlockSize()) { payloadXML.setAttribute("block-size", boost::lexical_cast<std::string>(*payload->getBlockSize())); } payloadXML.setAttribute("sid", payload->getSessionID()); return payloadXML.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp index 8b37929..aaac757 100644 --- a/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.cpp @@ -1,74 +1,73 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2015-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/JinglePayloadSerializer.h> #include <memory> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/JingleContentPayload.h> #include <Swiften/Elements/JingleFileTransferDescription.h> #include <Swiften/Elements/JingleFileTransferHash.h> #include <Swiften/Elements/JingleIBBTransportPayload.h> #include <Swiften/Elements/JinglePayload.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializers/JingleContentPayloadSerializer.h> #include <Swiften/Serializer/PayloadSerializers/JingleFileTransferHashSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLNode.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> namespace Swift { JinglePayloadSerializer::JinglePayloadSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } std::string JinglePayloadSerializer::serializePayload(std::shared_ptr<JinglePayload> payload) const { XMLElement jinglePayload("jingle", "urn:xmpp:jingle:1"); jinglePayload.setAttribute("action", actionToString(payload->getAction())); jinglePayload.setAttribute("initiator", payload->getInitiator()); jinglePayload.setAttribute("sid", payload->getSessionID()); std::vector<std::shared_ptr<Payload> > payloads = payload->getPayloads(); if (!payloads.empty()) { - foreach(std::shared_ptr<Payload> subPayload, payloads) { + for (auto&& subPayload : payloads) { PayloadSerializer* serializer = serializers->getPayloadSerializer(subPayload); if (serializer) { jinglePayload.addNode(std::make_shared<XMLRawTextNode>(serializer->serialize(subPayload))); } } } if (payload->getReason().is_initialized()) { std::shared_ptr<XMLElement> reason = std::make_shared<XMLElement>("reason"); reason->addNode(std::make_shared<XMLElement>(reasonTypeToString(payload->getReason()->type))); if (!payload->getReason()->text.empty()) { reason->addNode(std::make_shared<XMLElement>("desc", "", payload->getReason()->text)); } jinglePayload.addNode(reason); } return jinglePayload.serialize(); } std::string JinglePayloadSerializer::actionToString(JinglePayload::Action action) const { switch(action) { case JinglePayload::ContentAccept: return "content-accept"; case JinglePayload::ContentAdd: return "content-add"; case JinglePayload::ContentModify: return "content-modify"; case JinglePayload::ContentReject: return "content-reject"; case JinglePayload::ContentRemove: diff --git a/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp index 61447cd..5e74d8e 100644 --- a/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.cpp @@ -1,68 +1,67 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2015-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/JingleS5BTransportPayloadSerializer.h> #include <memory> #include <boost/lexical_cast.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLNode.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> namespace Swift { JingleS5BTransportPayloadSerializer::JingleS5BTransportPayloadSerializer() { } std::string JingleS5BTransportPayloadSerializer::serializePayload(std::shared_ptr<JingleS5BTransportPayload> payload) const { XMLElement payloadXML("transport", "urn:xmpp:jingle:transports:s5b:1"); payloadXML.setAttribute("sid", payload->getSessionID()); payloadXML.setAttribute("mode", modeToString(payload->getMode())); if (!payload->getDstAddr().empty()) { payloadXML.setAttribute("dstaddr", payload->getDstAddr()); } - foreach(JingleS5BTransportPayload::Candidate candidate, payload->getCandidates()) { + for (const auto& candidate : payload->getCandidates()) { std::shared_ptr<XMLElement> candidateXML = std::make_shared<XMLElement>("candidate"); candidateXML->setAttribute("cid", candidate.cid); candidateXML->setAttribute("host", candidate.hostPort.getAddress().toString()); candidateXML->setAttribute("jid", candidate.jid.toString()); candidateXML->setAttribute("port", boost::lexical_cast<std::string>(candidate.hostPort.getPort())); candidateXML->setAttribute("priority", boost::lexical_cast<std::string>(candidate.priority)); candidateXML->setAttribute("type", typeToString(candidate.type)); payloadXML.addNode(candidateXML); } if (payload->hasCandidateError()) { payloadXML.addNode(std::make_shared<XMLElement>("candidate-error")); } if (payload->hasProxyError()) { payloadXML.addNode(std::make_shared<XMLElement>("proxy-error")); } if (!payload->getActivated().empty()) { std::shared_ptr<XMLElement> activatedXML = std::make_shared<XMLElement>("activated"); activatedXML->setAttribute("cid", payload->getActivated()); payloadXML.addNode(activatedXML); } if (!payload->getCandidateUsed().empty()) { std::shared_ptr<XMLElement> candusedXML = std::make_shared<XMLElement>("candidate-used"); candusedXML->setAttribute("cid", payload->getCandidateUsed()); payloadXML.addNode(candusedXML); } return payloadXML.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/MUCAdminPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/MUCAdminPayloadSerializer.cpp index 385c181..157c99e 100644 --- a/Swiften/Serializer/PayloadSerializers/MUCAdminPayloadSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/MUCAdminPayloadSerializer.cpp @@ -1,31 +1,30 @@ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/MUCAdminPayloadSerializer.h> #include <memory> #include <sstream> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/MUCItemSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { MUCAdminPayloadSerializer::MUCAdminPayloadSerializer() : GenericPayloadSerializer<MUCAdminPayload>() { } std::string MUCAdminPayloadSerializer::serializePayload(std::shared_ptr<MUCAdminPayload> payload) const { XMLElement mucElement("query", "http://jabber.org/protocol/muc#admin"); - foreach (const MUCItem& item, payload->getItems()) { + for (const auto& item : payload->getItems()) { mucElement.addNode(MUCItemSerializer::itemToElement(item)); } return mucElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/MUCDestroyPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/MUCDestroyPayloadSerializer.cpp index 3d807be..96116c7 100644 --- a/Swiften/Serializer/PayloadSerializers/MUCDestroyPayloadSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/MUCDestroyPayloadSerializer.cpp @@ -1,36 +1,35 @@ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/MUCDestroyPayloadSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { MUCDestroyPayloadSerializer::MUCDestroyPayloadSerializer() : GenericPayloadSerializer<MUCDestroyPayload>() { } std::string MUCDestroyPayloadSerializer::serializePayload(std::shared_ptr<MUCDestroyPayload> payload) const { XMLElement mucElement("destroy", ""); if (!payload->getReason().empty()) { XMLElement::ref reason = std::make_shared<XMLElement>("reason", ""); reason->addNode(std::make_shared<XMLTextNode>(payload->getReason())); mucElement.addNode(reason); } if (payload->getNewVenue().isValid()) { mucElement.setAttribute("jid", payload->getNewVenue().toString()); } return mucElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/MUCInvitationPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/MUCInvitationPayloadSerializer.cpp index 4b978af..2004f4c 100644 --- a/Swiften/Serializer/PayloadSerializers/MUCInvitationPayloadSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/MUCInvitationPayloadSerializer.cpp @@ -1,41 +1,40 @@ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/MUCInvitationPayloadSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/MUCItemSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { MUCInvitationPayloadSerializer::MUCInvitationPayloadSerializer() : GenericPayloadSerializer<MUCInvitationPayload>() { } std::string MUCInvitationPayloadSerializer::serializePayload(std::shared_ptr<MUCInvitationPayload> payload) const { XMLElement mucElement("x", "jabber:x:conference"); if (payload->getIsContinuation()) { mucElement.setAttribute("continue", "true"); } if (payload->getJID().isValid()) { mucElement.setAttribute("jid", payload->getJID().toString()); } if (!payload->getPassword().empty()) { mucElement.setAttribute("password", payload->getPassword()); } if (!payload->getReason().empty()) { mucElement.setAttribute("reason", payload->getReason()); } if (!payload->getThread().empty()) { mucElement.setAttribute("thread", payload->getThread()); } if (payload->getIsImpromptu()) { mucElement.addNode(std::make_shared<XMLElement>("impromptu", "http://swift.im/impromptu")); } return mucElement.serialize(); diff --git a/Swiften/Serializer/PayloadSerializers/MUCUserPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/MUCUserPayloadSerializer.cpp index 52ab489..f0f3cfa 100644 --- a/Swiften/Serializer/PayloadSerializers/MUCUserPayloadSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/MUCUserPayloadSerializer.cpp @@ -1,63 +1,62 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/MUCUserPayloadSerializer.h> #include <memory> #include <sstream> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializers/MUCItemSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { MUCUserPayloadSerializer::MUCUserPayloadSerializer(PayloadSerializerCollection* serializers) : GenericPayloadSerializer<MUCUserPayload>(), serializers(serializers) { } std::string MUCUserPayloadSerializer::serializePayload(std::shared_ptr<MUCUserPayload> payload) const { XMLElement mucElement("x", "http://jabber.org/protocol/muc#user"); - foreach (const MUCUserPayload::StatusCode statusCode, payload->getStatusCodes()) { + for (const auto& statusCode : payload->getStatusCodes()) { std::shared_ptr<XMLElement> statusElement(new XMLElement("status")); std::ostringstream code; code << statusCode.code; statusElement->setAttribute("code", code.str()); mucElement.addNode(statusElement); } - foreach (const MUCItem& item, payload->getItems()) { + for (const auto& item : payload->getItems()) { mucElement.addNode(MUCItemSerializer::itemToElement(item)); } if (payload->getPassword()) { std::shared_ptr<XMLElement> passwordElement = std::make_shared<XMLElement>("password"); passwordElement->addNode(std::make_shared<XMLTextNode>(*payload->getPassword())); } if (payload->getInvite()) { MUCUserPayload::Invite invite = *payload->getInvite(); std::shared_ptr<XMLElement> inviteElement = std::make_shared<XMLElement>("invite"); if (invite.to.isValid()) { inviteElement->setAttribute("to", invite.to.toString()); } if (invite.from.isValid()) { inviteElement->setAttribute("from", invite.from.toString()); } if (!invite.reason.empty()) { std::shared_ptr<XMLElement> reasonElement = std::make_shared<XMLElement>("reason"); reasonElement->addNode(std::make_shared<XMLTextNode>(invite.reason)); } mucElement.addNode(inviteElement); } std::shared_ptr<Payload> childPayload = payload->getPayload(); if (childPayload) { PayloadSerializer* serializer = serializers->getPayloadSerializer(childPayload); if (serializer) { mucElement.addNode(std::make_shared<XMLRawTextNode>(serializer->serialize(childPayload))); } diff --git a/Swiften/Serializer/PayloadSerializers/PrivateStorageSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PrivateStorageSerializer.cpp index 87a2eeb..fc410fb 100644 --- a/Swiften/Serializer/PayloadSerializers/PrivateStorageSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PrivateStorageSerializer.cpp @@ -1,34 +1,33 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/PrivateStorageSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { PrivateStorageSerializer::PrivateStorageSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } std::string PrivateStorageSerializer::serializePayload(std::shared_ptr<PrivateStorage> storage) const { XMLElement storageElement("query", "jabber:iq:private"); std::shared_ptr<Payload> payload = storage->getPayload(); if (payload) { PayloadSerializer* serializer = serializers->getPayloadSerializer(payload); if (serializer) { storageElement.addNode(std::make_shared<XMLRawTextNode>(serializer->serialize(payload))); } } return storageElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubAffiliationsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubAffiliationsSerializer.cpp index 07b427c..9c810da 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubAffiliationsSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubAffiliationsSerializer.cpp @@ -1,41 +1,38 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ - - #include <Swiften/Serializer/PayloadSerializers/PubSubAffiliationsSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializers/PubSubAffiliationSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubAffiliationsSerializer::PubSubAffiliationsSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } PubSubAffiliationsSerializer::~PubSubAffiliationsSerializer() { } std::string PubSubAffiliationsSerializer::serializePayload(std::shared_ptr<PubSubAffiliations> payload) const { if (!payload) { return ""; } XMLElement element("affiliations", "http://jabber.org/protocol/pubsub"); if (payload->getNode()) { element.setAttribute("node", *payload->getNode()); } - foreach(std::shared_ptr<PubSubAffiliation> item, payload->getAffiliations()) { + for (const auto& item : payload->getAffiliations()) { element.addNode(std::make_shared<XMLRawTextNode>(PubSubAffiliationSerializer(serializers).serialize(item))); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubEventItemSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubEventItemSerializer.cpp index 61b6cb5..2743ff6 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubEventItemSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubEventItemSerializer.cpp @@ -1,46 +1,43 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ - - #include <Swiften/Serializer/PayloadSerializers/PubSubEventItemSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubEventItemSerializer::PubSubEventItemSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } PubSubEventItemSerializer::~PubSubEventItemSerializer() { } std::string PubSubEventItemSerializer::serializePayload(std::shared_ptr<PubSubEventItem> payload) const { if (!payload) { return ""; } XMLElement element("item", "http://jabber.org/protocol/pubsub#event"); if (payload->getNode()) { element.setAttribute("node", *payload->getNode()); } if (payload->getPublisher()) { element.setAttribute("publisher", *payload->getPublisher()); } - foreach(std::shared_ptr<Payload> item, payload->getData()) { + for (const auto& item : payload->getData()) { element.addNode(std::make_shared<XMLRawTextNode>(serializers->getPayloadSerializer(item)->serialize(item))); } if (payload->getID()) { element.setAttribute("id", *payload->getID()); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubEventItemsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubEventItemsSerializer.cpp index c8704ea..67d611b 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubEventItemsSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubEventItemsSerializer.cpp @@ -1,43 +1,40 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ - - #include <Swiften/Serializer/PayloadSerializers/PubSubEventItemsSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializers/PubSubEventItemSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubEventRetractSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubEventItemsSerializer::PubSubEventItemsSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } PubSubEventItemsSerializer::~PubSubEventItemsSerializer() { } std::string PubSubEventItemsSerializer::serializePayload(std::shared_ptr<PubSubEventItems> payload) const { if (!payload) { return ""; } XMLElement element("items", "http://jabber.org/protocol/pubsub#event"); element.setAttribute("node", payload->getNode()); - foreach(std::shared_ptr<PubSubEventItem> item, payload->getItems()) { + for (const auto& item : payload->getItems()) { element.addNode(std::make_shared<XMLRawTextNode>(PubSubEventItemSerializer(serializers).serialize(item))); } - foreach(std::shared_ptr<PubSubEventRetract> item, payload->getRetracts()) { + for (const auto& item : payload->getRetracts()) { element.addNode(std::make_shared<XMLRawTextNode>(PubSubEventRetractSerializer(serializers).serialize(item))); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubEventSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubEventSerializer.cpp index d0b14ae..51b8b46 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubEventSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubEventSerializer.cpp @@ -1,49 +1,48 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/PubSubEventSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/PubSubEventCollectionSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubEventConfigurationSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubEventDeleteSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubEventItemsSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubEventPurgeSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubEventSubscriptionSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubEventSerializer::PubSubEventSerializer(PayloadSerializerCollection* serializers) { pubsubSerializers.push_back(std::make_shared<PubSubEventSubscriptionSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubEventPurgeSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubEventCollectionSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubEventDeleteSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubEventItemsSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubEventConfigurationSerializer>(serializers)); } PubSubEventSerializer::~PubSubEventSerializer() { } std::string PubSubEventSerializer::serializePayload(std::shared_ptr<PubSubEvent> payload) const { if (!payload) { return ""; } XMLElement element("event", "http://jabber.org/protocol/pubsub#event"); std::shared_ptr<PubSubEventPayload> p = payload->getPayload(); - foreach(std::shared_ptr<PayloadSerializer> serializer, pubsubSerializers) { + for (const auto& serializer : pubsubSerializers) { if (serializer->canSerialize(p)) { element.addNode(std::make_shared<XMLRawTextNode>(serializer->serialize(p))); } } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp index d2e5977..a202c88 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.cpp @@ -1,40 +1,37 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ - - #include <Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubItemSerializer::PubSubItemSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } PubSubItemSerializer::~PubSubItemSerializer() { } std::string PubSubItemSerializer::serializePayload(std::shared_ptr<PubSubItem> payload) const { if (!payload) { return ""; } XMLElement element("item", "http://jabber.org/protocol/pubsub"); - foreach(std::shared_ptr<Payload> item, payload->getData()) { + for (const auto& item : payload->getData()) { element.addNode(std::make_shared<XMLRawTextNode>(serializers->getPayloadSerializer(item)->serialize(item))); } if (!payload->getID().empty()) { element.setAttribute("id", payload->getID()); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp index ae6433a..9786f51 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.cpp @@ -1,51 +1,48 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ - - #include <Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.h> #include <memory> #include <boost/lexical_cast.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubItemsSerializer::PubSubItemsSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } PubSubItemsSerializer::~PubSubItemsSerializer() { } std::string PubSubItemsSerializer::serializePayload(std::shared_ptr<PubSubItems> payload) const { if (!payload) { return ""; } XMLElement element("items", "http://jabber.org/protocol/pubsub"); if (payload->getNode().empty()) { SWIFT_LOG(warning) << "Serializing PubSubItems with empty node attribute"; } element.setAttribute("node", payload->getNode()); - foreach(std::shared_ptr<PubSubItem> item, payload->getItems()) { + for (const auto& item : payload->getItems()) { element.addNode(std::make_shared<XMLRawTextNode>(PubSubItemSerializer(serializers).serialize(item))); } if (payload->getMaximumItems()) { element.setAttribute("max_items", boost::lexical_cast<std::string>(*payload->getMaximumItems())); } if (payload->getSubscriptionID()) { element.setAttribute("subid", *payload->getSubscriptionID()); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubOwnerAffiliationsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubOwnerAffiliationsSerializer.cpp index 7810e2f..b9f6bcc 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubOwnerAffiliationsSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubOwnerAffiliationsSerializer.cpp @@ -1,38 +1,36 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/PubSubOwnerAffiliationsSerializer.h> -#include <cassert> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializers/PubSubOwnerAffiliationSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubOwnerAffiliationsSerializer::PubSubOwnerAffiliationsSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } PubSubOwnerAffiliationsSerializer::~PubSubOwnerAffiliationsSerializer() { } std::string PubSubOwnerAffiliationsSerializer::serializePayload(std::shared_ptr<PubSubOwnerAffiliations> payload) const { if (!payload) { return ""; } XMLElement element("affiliations", "http://jabber.org/protocol/pubsub#owner"); element.setAttribute("node", payload->getNode()); - foreach(std::shared_ptr<PubSubOwnerAffiliation> item, payload->getAffiliations()) { + for (const auto& item : payload->getAffiliations()) { element.addNode(std::make_shared<XMLRawTextNode>(PubSubOwnerAffiliationSerializer(serializers).serialize(item))); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubOwnerPubSubSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubOwnerPubSubSerializer.cpp index cacd8d9..b2dfd21 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubOwnerPubSubSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubOwnerPubSubSerializer.cpp @@ -1,49 +1,48 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/PubSubOwnerPubSubSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/PubSubOwnerAffiliationsSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubOwnerConfigureSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubOwnerDefaultSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubOwnerDeleteSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubOwnerPurgeSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubOwnerSubscriptionsSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubOwnerPubSubSerializer::PubSubOwnerPubSubSerializer(PayloadSerializerCollection* serializers) { pubsubSerializers.push_back(std::make_shared<PubSubOwnerConfigureSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubOwnerSubscriptionsSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubOwnerDefaultSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubOwnerPurgeSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubOwnerAffiliationsSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubOwnerDeleteSerializer>(serializers)); } PubSubOwnerPubSubSerializer::~PubSubOwnerPubSubSerializer() { } std::string PubSubOwnerPubSubSerializer::serializePayload(std::shared_ptr<PubSubOwnerPubSub> payload) const { if (!payload) { return ""; } XMLElement element("pubsub", "http://jabber.org/protocol/pubsub#owner"); std::shared_ptr<PubSubOwnerPayload> p = payload->getPayload(); - foreach(std::shared_ptr<PayloadSerializer> serializer, pubsubSerializers) { + for (const auto& serializer : pubsubSerializers) { if (serializer->canSerialize(p)) { element.addNode(std::make_shared<XMLRawTextNode>(serializer->serialize(p))); } } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubOwnerSubscriptionsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubOwnerSubscriptionsSerializer.cpp index 9a6ca32..a5940f6 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubOwnerSubscriptionsSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubOwnerSubscriptionsSerializer.cpp @@ -1,38 +1,36 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/PubSubOwnerSubscriptionsSerializer.h> -#include <cassert> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializers/PubSubOwnerSubscriptionSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubOwnerSubscriptionsSerializer::PubSubOwnerSubscriptionsSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } PubSubOwnerSubscriptionsSerializer::~PubSubOwnerSubscriptionsSerializer() { } std::string PubSubOwnerSubscriptionsSerializer::serializePayload(std::shared_ptr<PubSubOwnerSubscriptions> payload) const { if (!payload) { return ""; } XMLElement element("subscriptions", "http://jabber.org/protocol/pubsub#owner"); element.setAttribute("node", payload->getNode()); - foreach(std::shared_ptr<PubSubOwnerSubscription> item, payload->getSubscriptions()) { + for (const auto& item : payload->getSubscriptions()) { element.addNode(std::make_shared<XMLRawTextNode>(PubSubOwnerSubscriptionSerializer(serializers).serialize(item))); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubPublishSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubPublishSerializer.cpp index 871845f..ce8706d 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubPublishSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubPublishSerializer.cpp @@ -1,39 +1,36 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ - - #include <Swiften/Serializer/PayloadSerializers/PubSubPublishSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubPublishSerializer::PubSubPublishSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } PubSubPublishSerializer::~PubSubPublishSerializer() { } std::string PubSubPublishSerializer::serializePayload(std::shared_ptr<PubSubPublish> payload) const { if (!payload) { return ""; } XMLElement element("publish", "http://jabber.org/protocol/pubsub"); element.setAttribute("node", payload->getNode()); - foreach(std::shared_ptr<PubSubItem> item, payload->getItems()) { + for (const auto& item : payload->getItems()) { element.addNode(std::make_shared<XMLRawTextNode>(PubSubItemSerializer(serializers).serialize(item))); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubRetractSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubRetractSerializer.cpp index 99b425e..c82089a 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubRetractSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubRetractSerializer.cpp @@ -1,40 +1,39 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/PubSubRetractSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializers/PubSubItemSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubRetractSerializer::PubSubRetractSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } PubSubRetractSerializer::~PubSubRetractSerializer() { } std::string PubSubRetractSerializer::serializePayload(std::shared_ptr<PubSubRetract> payload) const { if (!payload) { return ""; } XMLElement element("retract", "http://jabber.org/protocol/pubsub"); element.setAttribute("node", payload->getNode()); - foreach(std::shared_ptr<PubSubItem> item, payload->getItems()) { + for (const auto& item : payload->getItems()) { element.addNode(std::make_shared<XMLRawTextNode>(PubSubItemSerializer(serializers).serialize(item))); } if (payload->isNotify().is_initialized()) { element.setAttribute("notify", payload->isNotify().get() ? "true" : "false"); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubSerializer.cpp index dbef36e..648c5a3 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubSerializer.cpp @@ -1,69 +1,66 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ - - #include <Swiften/Serializer/PayloadSerializers/PubSubSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializers/PubSubAffiliationsSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubConfigureSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubCreateSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubDefaultSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubItemsSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubOptionsSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubPublishSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubRetractSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubSubscribeSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubSubscriptionSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubSubscriptionsSerializer.h> #include <Swiften/Serializer/PayloadSerializers/PubSubUnsubscribeSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubSerializer::PubSubSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { pubsubSerializers.push_back(std::make_shared<PubSubItemsSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubCreateSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubPublishSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubOptionsSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubAffiliationsSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubRetractSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubDefaultSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubSubscriptionsSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubSubscribeSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubUnsubscribeSerializer>(serializers)); pubsubSerializers.push_back(std::make_shared<PubSubSubscriptionSerializer>(serializers)); } PubSubSerializer::~PubSubSerializer() { } std::string PubSubSerializer::serializePayload(std::shared_ptr<PubSub> payload) const { if (!payload) { return ""; } XMLElement element("pubsub", "http://jabber.org/protocol/pubsub"); std::shared_ptr<PubSubPayload> p = payload->getPayload(); - foreach(std::shared_ptr<PayloadSerializer> serializer, pubsubSerializers) { + for (const auto& serializer : pubsubSerializers) { if (serializer->canSerialize(p)) { element.addNode(std::make_shared<XMLRawTextNode>(serializer->serialize(p))); if (std::shared_ptr<PubSubCreate> create = std::dynamic_pointer_cast<PubSubCreate>(p)) { element.addNode(std::make_shared<XMLRawTextNode>(std::make_shared<PubSubConfigureSerializer>(serializers)->serialize(create->getConfigure()))); } if (std::shared_ptr<PubSubSubscribe> subscribe = std::dynamic_pointer_cast<PubSubSubscribe>(p)) { element.addNode(std::make_shared<XMLRawTextNode>(std::make_shared<PubSubConfigureSerializer>(serializers)->serialize(subscribe->getOptions()))); } } } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionsSerializer.cpp b/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionsSerializer.cpp index e154109..6e01881 100644 --- a/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionsSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/PubSubSubscriptionsSerializer.cpp @@ -1,39 +1,38 @@ /* * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/PubSubSubscriptionsSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializers/PubSubSubscriptionSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> using namespace Swift; PubSubSubscriptionsSerializer::PubSubSubscriptionsSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { } PubSubSubscriptionsSerializer::~PubSubSubscriptionsSerializer() { } std::string PubSubSubscriptionsSerializer::serializePayload(std::shared_ptr<PubSubSubscriptions> payload) const { if (!payload) { return ""; } XMLElement element("subscriptions", "http://jabber.org/protocol/pubsub"); if (payload->getNode()) { element.setAttribute("node", *payload->getNode()); } - foreach(std::shared_ptr<PubSubSubscription> item, payload->getSubscriptions()) { + for (const auto& item : payload->getSubscriptions()) { element.addNode(std::make_shared<XMLRawTextNode>(PubSubSubscriptionSerializer(serializers).serialize(item))); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/RosterItemExchangeSerializer.cpp b/Swiften/Serializer/PayloadSerializers/RosterItemExchangeSerializer.cpp index 24cc301..c7fdc5b 100644 --- a/Swiften/Serializer/PayloadSerializers/RosterItemExchangeSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/RosterItemExchangeSerializer.cpp @@ -1,52 +1,51 @@ /* * Copyright (c) 2011 Jan Kaluza * Licensed under the Simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/RosterItemExchangeSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { RosterItemExchangeSerializer::RosterItemExchangeSerializer() : GenericPayloadSerializer<RosterItemExchangePayload>() { } std::string RosterItemExchangeSerializer::serializePayload(std::shared_ptr<RosterItemExchangePayload> roster) const { XMLElement queryElement("x", "http://jabber.org/protocol/rosterx"); - foreach(const RosterItemExchangePayload::Item& item, roster->getItems()) { + for (const auto& item : roster->getItems()) { std::shared_ptr<XMLElement> itemElement(new XMLElement("item")); itemElement->setAttribute("jid", item.getJID()); itemElement->setAttribute("name", item.getName()); switch (item.getAction()) { case RosterItemExchangePayload::Item::Add: itemElement->setAttribute("action", "add"); break; case RosterItemExchangePayload::Item::Modify: itemElement->setAttribute("action", "modify"); break; case RosterItemExchangePayload::Item::Delete: itemElement->setAttribute("action", "delete"); break; } - foreach(const std::string& group, item.getGroups()) { + for (const auto& group : item.getGroups()) { std::shared_ptr<XMLElement> groupElement(new XMLElement("group")); groupElement->addNode(std::make_shared<XMLTextNode>(group)); itemElement->addNode(groupElement); } queryElement.addNode(itemElement); } return queryElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/RosterSerializer.cpp b/Swiften/Serializer/PayloadSerializers/RosterSerializer.cpp index 8c857ab..e706542 100644 --- a/Swiften/Serializer/PayloadSerializers/RosterSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/RosterSerializer.cpp @@ -1,60 +1,59 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/RosterSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { RosterSerializer::RosterSerializer() : GenericPayloadSerializer<RosterPayload>() { } std::string RosterSerializer::serializePayload(std::shared_ptr<RosterPayload> roster) const { XMLElement queryElement("query", "jabber:iq:roster"); if (roster->getVersion()) { queryElement.setAttribute("ver", *roster->getVersion()); } - foreach(const RosterItemPayload& item, roster->getItems()) { + for (const auto& item : roster->getItems()) { std::shared_ptr<XMLElement> itemElement(new XMLElement("item")); itemElement->setAttribute("jid", item.getJID()); itemElement->setAttribute("name", item.getName()); switch (item.getSubscription()) { case RosterItemPayload::To: itemElement->setAttribute("subscription", "to"); break; case RosterItemPayload::From: itemElement->setAttribute("subscription", "from"); break; case RosterItemPayload::Both: itemElement->setAttribute("subscription", "both"); break; case RosterItemPayload::Remove: itemElement->setAttribute("subscription", "remove"); break; case RosterItemPayload::None: itemElement->setAttribute("subscription", "none"); break; } if (item.getSubscriptionRequested()) { itemElement->setAttribute("ask", "subscribe"); } - foreach(const std::string& group, item.getGroups()) { + for (const auto& group : item.getGroups()) { std::shared_ptr<XMLElement> groupElement(new XMLElement("group")); groupElement->addNode(std::make_shared<XMLTextNode>(group)); itemElement->addNode(groupElement); } if (!item.getUnknownContent().empty()) { itemElement->addNode(std::make_shared<XMLRawTextNode>(item.getUnknownContent())); } queryElement.addNode(itemElement); } return queryElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/SearchPayloadSerializer.cpp b/Swiften/Serializer/PayloadSerializers/SearchPayloadSerializer.cpp index 6e55f46..befd76d 100644 --- a/Swiften/Serializer/PayloadSerializers/SearchPayloadSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/SearchPayloadSerializer.cpp @@ -1,62 +1,61 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/SearchPayloadSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/FormSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> namespace Swift { SearchPayloadSerializer::SearchPayloadSerializer() { } std::string SearchPayloadSerializer::serializePayload(std::shared_ptr<SearchPayload> searchPayload) const { XMLElement searchElement("query", "jabber:iq:search"); if (searchPayload->getInstructions()) { searchElement.addNode(XMLElement::ref(new XMLElement("instructions", "", *searchPayload->getInstructions()))); } if (searchPayload->getNick()) { searchElement.addNode(XMLElement::ref(new XMLElement("nick", "", *searchPayload->getNick()))); } if (searchPayload->getFirst()) { searchElement.addNode(XMLElement::ref(new XMLElement("first", "", *searchPayload->getFirst()))); } if (searchPayload->getLast()) { searchElement.addNode(XMLElement::ref(new XMLElement("last", "", *searchPayload->getLast()))); } if (searchPayload->getEMail()) { searchElement.addNode(XMLElement::ref(new XMLElement("email", "", *searchPayload->getEMail()))); } - foreach(const SearchPayload::Item& item, searchPayload->getItems()) { + for (const auto& item : searchPayload->getItems()) { XMLElement::ref itemElement(new XMLElement("item")); itemElement->setAttribute("jid", item.jid); itemElement->addNode(XMLElement::ref(new XMLElement("first", "", item.first))); itemElement->addNode(XMLElement::ref(new XMLElement("last", "", item.last))); itemElement->addNode(XMLElement::ref(new XMLElement("nick", "", item.nick))); itemElement->addNode(XMLElement::ref(new XMLElement("email", "", item.email))); searchElement.addNode(itemElement); } if (Form::ref form = searchPayload->getForm()) { searchElement.addNode(std::make_shared<XMLRawTextNode>(FormSerializer().serialize(form))); } return searchElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/SecurityLabelSerializer.cpp b/Swiften/Serializer/PayloadSerializers/SecurityLabelSerializer.cpp index 97c5411..b8faf73 100644 --- a/Swiften/Serializer/PayloadSerializers/SecurityLabelSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/SecurityLabelSerializer.cpp @@ -1,47 +1,46 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/SecurityLabelSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { SecurityLabelSerializer::SecurityLabelSerializer() : GenericPayloadSerializer<SecurityLabel>() { } std::string SecurityLabelSerializer::serializePayload(std::shared_ptr<SecurityLabel> label) const { XMLElement element("securitylabel", "urn:xmpp:sec-label:0"); if (!label->getDisplayMarking().empty()) { std::shared_ptr<XMLElement> displayMarking(new XMLElement("displaymarking")); if (!label->getForegroundColor().empty()) { displayMarking->setAttribute("fgcolor", label->getForegroundColor()); } if (!label->getBackgroundColor().empty()) { displayMarking->setAttribute("bgcolor", label->getBackgroundColor()); } displayMarking->addNode(std::make_shared<XMLTextNode>(label->getDisplayMarking())); element.addNode(displayMarking); } std::shared_ptr<XMLElement> labelElement(new XMLElement("label")); labelElement->addNode(std::make_shared<XMLRawTextNode>(label->getLabel())); element.addNode(labelElement); - foreach(const std::string& equivalentLabel, label->getEquivalentLabels()) { + for (const auto& equivalentLabel : label->getEquivalentLabels()) { std::shared_ptr<XMLElement> equivalentLabelElement(new XMLElement("equivalentlabel")); equivalentLabelElement->addNode(std::make_shared<XMLRawTextNode>(equivalentLabel)); element.addNode(equivalentLabelElement); } return element.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/SecurityLabelsCatalogSerializer.cpp b/Swiften/Serializer/PayloadSerializers/SecurityLabelsCatalogSerializer.cpp index e8d2a1b..36401a6 100644 --- a/Swiften/Serializer/PayloadSerializers/SecurityLabelsCatalogSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/SecurityLabelsCatalogSerializer.cpp @@ -1,47 +1,46 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/SecurityLabelsCatalogSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/PayloadSerializers/SecurityLabelSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> namespace Swift { SecurityLabelsCatalogSerializer::SecurityLabelsCatalogSerializer() : GenericPayloadSerializer<SecurityLabelsCatalog>() { } std::string SecurityLabelsCatalogSerializer::serializePayload(std::shared_ptr<SecurityLabelsCatalog> catalog) const { XMLElement element("catalog", "urn:xmpp:sec-label:catalog:2"); if (!catalog->getName().empty()) { element.setAttribute("name", catalog->getName()); } if (catalog->getTo().isValid()) { element.setAttribute("to", catalog->getTo()); } if (!catalog->getDescription().empty()) { element.setAttribute("desc", catalog->getDescription()); } - foreach (const SecurityLabelsCatalog::Item& item, catalog->getItems()) { + for (const auto& item : catalog->getItems()) { std::shared_ptr<XMLElement> itemElement(new XMLElement("item")); itemElement->setAttribute("selector", item.getSelector()); if (item.getIsDefault()) { itemElement->setAttribute("default", "true"); } if (item.getLabel()) { std::string serializedLabel = SecurityLabelSerializer().serialize(item.getLabel()); itemElement->addNode(std::make_shared<XMLRawTextNode>(serializedLabel)); } element.addNode(itemElement); } return element.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/StorageSerializer.cpp b/Swiften/Serializer/PayloadSerializers/StorageSerializer.cpp index 31720f7..ffebcf4 100644 --- a/Swiften/Serializer/PayloadSerializers/StorageSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/StorageSerializer.cpp @@ -1,51 +1,50 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/StorageSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { StorageSerializer::StorageSerializer() : GenericPayloadSerializer<Storage>() { } std::string StorageSerializer::serializePayload(std::shared_ptr<Storage> storage) const { XMLElement storageElement("storage", "storage:bookmarks"); - foreach(const Storage::Room& room, storage->getRooms()) { + for (const auto& room : storage->getRooms()) { std::shared_ptr<XMLElement> conferenceElement(new XMLElement("conference")); conferenceElement->setAttribute("name", room.name); conferenceElement->setAttribute("jid", room.jid); conferenceElement->setAttribute("autojoin", room.autoJoin ? "1" : "0"); if (!room.nick.empty()) { std::shared_ptr<XMLElement> nickElement(new XMLElement("nick")); nickElement->addNode(std::make_shared<XMLTextNode>(room.nick)); conferenceElement->addNode(nickElement); } if (room.password) { std::shared_ptr<XMLElement> passwordElement(new XMLElement("password")); passwordElement->addNode(std::make_shared<XMLTextNode>(*room.password)); conferenceElement->addNode(passwordElement); } storageElement.addNode(conferenceElement); } - foreach(const Storage::URL& url, storage->getURLs()) { + for (const auto& url : storage->getURLs()) { std::shared_ptr<XMLElement> urlElement(new XMLElement("url")); urlElement->setAttribute("name", url.name); urlElement->setAttribute("url", url.url); storageElement.addNode(urlElement); } return storageElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp b/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp index e15ab77..ba296f9 100644 --- a/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.cpp @@ -1,50 +1,49 @@ /* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/StreamInitiationFileInfoSerializer.h> #include <memory> #include <boost/lexical_cast.hpp> #include <Swiften/Base/DateTime.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { StreamInitiationFileInfoSerializer::StreamInitiationFileInfoSerializer() { } std::string StreamInitiationFileInfoSerializer::serializePayload(std::shared_ptr<StreamInitiationFileInfo> fileInfo) const { XMLElement fileElement("file", "http://jabber.org/protocol/si/profile/file-transfer"); if (fileInfo->getDate() != stringToDateTime("")) { fileElement.setAttribute("date", dateTimeToString(fileInfo->getDate())); } fileElement.setAttribute("hash", fileInfo->getHash()); if (fileInfo->getAlgo() != "md5") { fileElement.setAttribute("algo", fileInfo->getAlgo()); } if (!fileInfo->getName().empty()) { fileElement.setAttribute("name", fileInfo->getName()); } if (fileInfo->getSize() != 0) { fileElement.setAttribute("size", boost::lexical_cast<std::string>(fileInfo->getSize())); } if (!fileInfo->getDescription().empty()) { std::shared_ptr<XMLElement> desc = std::make_shared<XMLElement>("desc", "", fileInfo->getDescription()); fileElement.addNode(desc); } if (fileInfo->getSupportsRangeRequests()) { diff --git a/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp b/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp index fcfb063..3faa5b7 100644 --- a/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.cpp @@ -1,75 +1,74 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/StreamInitiationSerializer.h> #include <memory> #include <memory> #include <boost/lexical_cast.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLTextNode.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/Serializer/PayloadSerializers/FormSerializer.h> #define FILE_TRANSFER_NS "http://jabber.org/protocol/si/profile/file-transfer" #define FEATURE_NEG_NS "http://jabber.org/protocol/feature-neg" namespace Swift { StreamInitiationSerializer::StreamInitiationSerializer() { } std::string StreamInitiationSerializer::serializePayload(std::shared_ptr<StreamInitiation> streamInitiation) const { assert(streamInitiation->getIsFileTransfer()); XMLElement siElement("si", "http://jabber.org/protocol/si"); if (!streamInitiation->getID().empty()) { siElement.setAttribute("id", streamInitiation->getID()); } siElement.setAttribute("profile", FILE_TRANSFER_NS); if (streamInitiation->getFileInfo()) { StreamInitiationFileInfo file = *streamInitiation->getFileInfo(); std::shared_ptr<XMLElement> fileElement(new XMLElement("file", "http://jabber.org/protocol/si/profile/file-transfer")); fileElement->setAttribute("name", file.getName()); if (file.getSize() != 0) { fileElement->setAttribute("size", boost::lexical_cast<std::string>(file.getSize())); } if (!file.getDescription().empty()) { std::shared_ptr<XMLElement> descElement(new XMLElement("desc")); descElement->addNode(std::make_shared<XMLTextNode>(file.getDescription())); fileElement->addNode(descElement); } siElement.addNode(fileElement); } std::shared_ptr<XMLElement> featureElement(new XMLElement("feature", FEATURE_NEG_NS)); if (streamInitiation->getProvidedMethods().size() > 0) { Form::ref form(new Form(Form::FormType)); FormField::ref field = std::make_shared<FormField>(FormField::ListSingleType); field->setName("stream-method"); - foreach(const std::string& method, streamInitiation->getProvidedMethods()) { + for (const auto& method : streamInitiation->getProvidedMethods()) { field->addOption(FormField::Option("", method)); } form->addField(field); featureElement->addNode(std::make_shared<XMLRawTextNode>(FormSerializer().serialize(form))); } else if (!streamInitiation->getRequestedMethod().empty()) { Form::ref form(new Form(Form::SubmitType)); FormField::ref field = std::make_shared<FormField>(FormField::ListSingleType); field->addValue(streamInitiation->getRequestedMethod()); field->setName("stream-method"); form->addField(field); featureElement->addNode(std::make_shared<XMLRawTextNode>(FormSerializer().serialize(form))); } siElement.addNode(featureElement); return siElement.serialize(); } } diff --git a/Swiften/Serializer/PayloadSerializers/VCardSerializer.cpp b/Swiften/Serializer/PayloadSerializers/VCardSerializer.cpp index a1393cb..725d125 100644 --- a/Swiften/Serializer/PayloadSerializers/VCardSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/VCardSerializer.cpp @@ -1,250 +1,249 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/PayloadSerializers/VCardSerializer.h> #include <memory> #include <Swiften/Base/DateTime.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> #include <Swiften/Serializer/XML/XMLTextNode.h> #include <Swiften/StringCodecs/Base64.h> namespace Swift { VCardSerializer::VCardSerializer() : GenericPayloadSerializer<VCard>() { } std::string VCardSerializer::serializePayload(std::shared_ptr<VCard> vcard) const { XMLElement queryElement("vCard", "vcard-temp"); if (!vcard->getVersion().empty()) { queryElement.addNode(std::make_shared<XMLElement>("VERSION", "", vcard->getVersion())); } if (!vcard->getFullName().empty()) { queryElement.addNode(std::make_shared<XMLElement>("FN", "", vcard->getFullName())); } if (!vcard->getGivenName().empty() || !vcard->getFamilyName().empty() || !vcard->getMiddleName().empty() || !vcard->getPrefix().empty() || !vcard->getSuffix().empty()) { std::shared_ptr<XMLElement> nameElement(new XMLElement("N")); if (!vcard->getFamilyName().empty()) { nameElement->addNode(std::make_shared<XMLElement>("FAMILY", "", vcard->getFamilyName())); } if (!vcard->getGivenName().empty()) { nameElement->addNode(std::make_shared<XMLElement>("GIVEN", "", vcard->getGivenName())); } if (!vcard->getMiddleName().empty()) { nameElement->addNode(std::make_shared<XMLElement>("MIDDLE", "", vcard->getMiddleName())); } if (!vcard->getPrefix().empty()) { nameElement->addNode(std::make_shared<XMLElement>("PREFIX", "", vcard->getPrefix())); } if (!vcard->getSuffix().empty()) { nameElement->addNode(std::make_shared<XMLElement>("SUFFIX", "", vcard->getSuffix())); } queryElement.addNode(nameElement); } - foreach(const VCard::EMailAddress& emailAddress, vcard->getEMailAddresses()) { + for (const auto& emailAddress : vcard->getEMailAddresses()) { std::shared_ptr<XMLElement> emailElement(new XMLElement("EMAIL")); emailElement->addNode(std::make_shared<XMLElement>("USERID", "", emailAddress.address)); if (emailAddress.isHome) { emailElement->addNode(std::make_shared<XMLElement>("HOME")); } if (emailAddress.isWork) { emailElement->addNode(std::make_shared<XMLElement>("WORK")); } if (emailAddress.isInternet) { emailElement->addNode(std::make_shared<XMLElement>("INTERNET")); } if (emailAddress.isPreferred) { emailElement->addNode(std::make_shared<XMLElement>("PREF")); } if (emailAddress.isX400) { emailElement->addNode(std::make_shared<XMLElement>("X400")); } queryElement.addNode(emailElement); } if (!vcard->getNickname().empty()) { queryElement.addNode(std::make_shared<XMLElement>("NICKNAME", "", vcard->getNickname())); } if (!vcard->getPhoto().empty() || !vcard->getPhotoType().empty()) { XMLElement::ref photoElement(new XMLElement("PHOTO")); if (!vcard->getPhotoType().empty()) { photoElement->addNode(std::make_shared<XMLElement>("TYPE", "", vcard->getPhotoType())); } if (!vcard->getPhoto().empty()) { photoElement->addNode(std::make_shared<XMLElement>("BINVAL", "", Base64::encode(vcard->getPhoto()))); } queryElement.addNode(photoElement); } if (!vcard->getBirthday().is_not_a_date_time()) { queryElement.addNode(std::make_shared<XMLElement>("BDAY", "", dateTimeToString(vcard->getBirthday()))); } - foreach(const VCard::Telephone& telephone, vcard->getTelephones()) { + for (const auto& telephone : vcard->getTelephones()) { std::shared_ptr<XMLElement> telElement(new XMLElement("TEL")); telElement->addNode(std::make_shared<XMLElement>("NUMBER", "", telephone.number)); if (telephone.isHome) { telElement->addNode(std::make_shared<XMLElement>("HOME")); } if (telephone.isWork) { telElement->addNode(std::make_shared<XMLElement>("WORK")); } if (telephone.isVoice) { telElement->addNode(std::make_shared<XMLElement>("VOICE")); } if (telephone.isFax) { telElement->addNode(std::make_shared<XMLElement>("FAX")); } if (telephone.isPager) { telElement->addNode(std::make_shared<XMLElement>("PAGER")); } if (telephone.isMSG) { telElement->addNode(std::make_shared<XMLElement>("MSG")); } if (telephone.isCell) { telElement->addNode(std::make_shared<XMLElement>("CELL")); } if (telephone.isVideo) { telElement->addNode(std::make_shared<XMLElement>("VIDEO")); } if (telephone.isBBS) { telElement->addNode(std::make_shared<XMLElement>("BBS")); } if (telephone.isModem) { telElement->addNode(std::make_shared<XMLElement>("MODEM")); } if (telephone.isISDN) { telElement->addNode(std::make_shared<XMLElement>("ISDN")); } if (telephone.isPCS) { telElement->addNode(std::make_shared<XMLElement>("PCS")); } if (telephone.isPreferred) { telElement->addNode(std::make_shared<XMLElement>("PREF")); } queryElement.addNode(telElement); } - foreach(const VCard::Address& address, vcard->getAddresses()) { + for (const auto& address : vcard->getAddresses()) { std::shared_ptr<XMLElement> adrElement = std::make_shared<XMLElement>("ADR"); if (!address.poBox.empty()) { adrElement->addNode(std::make_shared<XMLElement>("POBOX", "", address.poBox)); } if (!address.addressExtension.empty()) { adrElement->addNode(std::make_shared<XMLElement>("EXTADD", "", address.addressExtension)); } if (!address.street.empty()) { adrElement->addNode(std::make_shared<XMLElement>("STREET", "", address.street)); } if (!address.locality.empty()) { adrElement->addNode(std::make_shared<XMLElement>("LOCALITY", "", address.locality)); } if (!address.region.empty()) { adrElement->addNode(std::make_shared<XMLElement>("REGION", "", address.region)); } if (!address.postalCode.empty()) { adrElement->addNode(std::make_shared<XMLElement>("PCODE", "", address.postalCode)); } if (!address.country.empty()) { adrElement->addNode(std::make_shared<XMLElement>("CTRY", "", address.country)); } if (address.isHome) { adrElement->addNode(std::make_shared<XMLElement>("HOME")); } if (address.isWork) { adrElement->addNode(std::make_shared<XMLElement>("WORK")); } if (address.isPostal) { adrElement->addNode(std::make_shared<XMLElement>("POSTAL")); } if (address.isParcel) { adrElement->addNode(std::make_shared<XMLElement>("PARCEL")); } if (address.deliveryType == VCard::DomesticDelivery) { adrElement->addNode(std::make_shared<XMLElement>("DOM")); } if (address.deliveryType == VCard::InternationalDelivery) { adrElement->addNode(std::make_shared<XMLElement>("INTL")); } if (address.isPreferred) { adrElement->addNode(std::make_shared<XMLElement>("PREF")); } queryElement.addNode(adrElement); } - foreach(const VCard::AddressLabel& addressLabel, vcard->getAddressLabels()) { + for (const auto& addressLabel : vcard->getAddressLabels()) { std::shared_ptr<XMLElement> labelElement = std::make_shared<XMLElement>("LABEL"); - foreach(const std::string& line, addressLabel.lines) { + for (const auto& line : addressLabel.lines) { labelElement->addNode(std::make_shared<XMLElement>("LINE", "", line)); } if (addressLabel.isHome) { labelElement->addNode(std::make_shared<XMLElement>("HOME")); } if (addressLabel.isWork) { labelElement->addNode(std::make_shared<XMLElement>("WORK")); } if (addressLabel.isPostal) { labelElement->addNode(std::make_shared<XMLElement>("POSTAL")); } if (addressLabel.isParcel) { labelElement->addNode(std::make_shared<XMLElement>("PARCEL")); } if (addressLabel.deliveryType == VCard::DomesticDelivery) { labelElement->addNode(std::make_shared<XMLElement>("DOM")); } if (addressLabel.deliveryType == VCard::InternationalDelivery) { labelElement->addNode(std::make_shared<XMLElement>("INTL")); } if (addressLabel.isPreferred) { labelElement->addNode(std::make_shared<XMLElement>("PREF")); } queryElement.addNode(labelElement); } - foreach(const JID& jid, vcard->getJIDs()) { + for (const auto& jid : vcard->getJIDs()) { queryElement.addNode(std::make_shared<XMLElement>("JID", "", jid.toString())); } if (!vcard->getDescription().empty()) { queryElement.addNode(std::make_shared<XMLElement>("DESC", "", vcard->getDescription())); } - foreach(const VCard::Organization& org, vcard->getOrganizations()) { + for (const auto& org : vcard->getOrganizations()) { std::shared_ptr<XMLElement> orgElement = std::make_shared<XMLElement>("ORG"); if (!org.name.empty()) { orgElement->addNode(std::make_shared<XMLElement>("ORGNAME", "", org.name)); } if (!org.units.empty()) { - foreach(const std::string& unit, org.units) { + for (const auto& unit : org.units) { orgElement->addNode(std::make_shared<XMLElement>("ORGUNIT", "", unit)); } } queryElement.addNode(orgElement); } - foreach(const std::string& title, vcard->getTitles()) { + for (const auto& title : vcard->getTitles()) { queryElement.addNode(std::make_shared<XMLElement>("TITLE", "", title)); } - foreach(const std::string& role, vcard->getRoles()) { + for (const auto& role : vcard->getRoles()) { queryElement.addNode(std::make_shared<XMLElement>("ROLE", "", role)); } - foreach(const std::string& url, vcard->getURLs()) { + for (const auto& url : vcard->getURLs()) { queryElement.addNode(std::make_shared<XMLElement>("URL", "", url)); } if (!vcard->getUnknownContent().empty()) { queryElement.addNode(std::make_shared<XMLRawTextNode>(vcard->getUnknownContent())); } return queryElement.serialize(); } } diff --git a/Swiften/Serializer/StanzaSerializer.cpp b/Swiften/Serializer/StanzaSerializer.cpp index 6440fbb..f2f5529 100644 --- a/Swiften/Serializer/StanzaSerializer.cpp +++ b/Swiften/Serializer/StanzaSerializer.cpp @@ -1,66 +1,65 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/StanzaSerializer.h> #include <sstream> #include <typeinfo> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/Stanza.h> #include <Swiften/Serializer/PayloadSerializer.h> #include <Swiften/Serializer/PayloadSerializerCollection.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> namespace Swift { StanzaSerializer::StanzaSerializer(const std::string& tag, PayloadSerializerCollection* payloadSerializers, const boost::optional<std::string>& explicitNS) : tag_(tag), payloadSerializers_(payloadSerializers), explicitDefaultNS_(explicitNS) { } SafeByteArray StanzaSerializer::serialize(std::shared_ptr<ToplevelElement> element) const { if (explicitDefaultNS_) { return serialize(element, explicitDefaultNS_.get()); } else { return serialize(element, ""); } } SafeByteArray StanzaSerializer::serialize(std::shared_ptr<ToplevelElement> element, const std::string& xmlns) const { std::shared_ptr<Stanza> stanza(std::dynamic_pointer_cast<Stanza>(element)); XMLElement stanzaElement(tag_, explicitDefaultNS_ ? explicitDefaultNS_.get() : xmlns); if (stanza->getFrom().isValid()) { stanzaElement.setAttribute("from", stanza->getFrom()); } if (stanza->getTo().isValid()) { stanzaElement.setAttribute("to", stanza->getTo()); } if (!stanza->getID().empty()) { stanzaElement.setAttribute("id", stanza->getID()); } setStanzaSpecificAttributes(stanza, stanzaElement); std::string serializedPayloads; - foreach (const std::shared_ptr<Payload>& payload, stanza->getPayloads()) { + for (const auto& payload : stanza->getPayloads()) { PayloadSerializer* serializer = payloadSerializers_->getPayloadSerializer(payload); if (serializer) { serializedPayloads += serializer->serialize(payload); } else { SWIFT_LOG(warning) << "Could not find serializer for " << typeid(*(payload.get())).name() << std::endl; } } if (!serializedPayloads.empty()) { stanzaElement.addNode(std::make_shared<XMLRawTextNode>(serializedPayloads)); } return createSafeByteArray(stanzaElement.serialize()); } } diff --git a/Swiften/Serializer/StreamFeaturesSerializer.cpp b/Swiften/Serializer/StreamFeaturesSerializer.cpp index 820b96c..2534db0 100644 --- a/Swiften/Serializer/StreamFeaturesSerializer.cpp +++ b/Swiften/Serializer/StreamFeaturesSerializer.cpp @@ -1,60 +1,59 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/StreamFeaturesSerializer.h> #include <memory> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLElement.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { StreamFeaturesSerializer::StreamFeaturesSerializer() { } SafeByteArray StreamFeaturesSerializer::serialize(std::shared_ptr<ToplevelElement> element) const { std::shared_ptr<StreamFeatures> streamFeatures(std::dynamic_pointer_cast<StreamFeatures>(element)); XMLElement streamFeaturesElement("stream:features"); if (streamFeatures->hasStartTLS()) { streamFeaturesElement.addNode(std::make_shared<XMLElement>("starttls", "urn:ietf:params:xml:ns:xmpp-tls")); } if (!streamFeatures->getCompressionMethods().empty()) { std::shared_ptr<XMLElement> compressionElement(new XMLElement("compression", "http://jabber.org/features/compress")); - foreach(const std::string& method, streamFeatures->getCompressionMethods()) { + for (const auto& method : streamFeatures->getCompressionMethods()) { std::shared_ptr<XMLElement> methodElement(new XMLElement("method")); methodElement->addNode(std::make_shared<XMLTextNode>(method)); compressionElement->addNode(methodElement); } streamFeaturesElement.addNode(compressionElement); } if (!streamFeatures->getAuthenticationMechanisms().empty()) { std::shared_ptr<XMLElement> mechanismsElement(new XMLElement("mechanisms", "urn:ietf:params:xml:ns:xmpp-sasl")); - foreach(const std::string& mechanism, streamFeatures->getAuthenticationMechanisms()) { + for (const auto& mechanism : streamFeatures->getAuthenticationMechanisms()) { std::shared_ptr<XMLElement> mechanismElement(new XMLElement("mechanism")); mechanismElement->addNode(std::make_shared<XMLTextNode>(mechanism)); mechanismsElement->addNode(mechanismElement); } streamFeaturesElement.addNode(mechanismsElement); } if (streamFeatures->hasResourceBind()) { streamFeaturesElement.addNode(std::make_shared<XMLElement>("bind", "urn:ietf:params:xml:ns:xmpp-bind")); } if (streamFeatures->hasSession()) { streamFeaturesElement.addNode(std::make_shared<XMLElement>("session", "urn:ietf:params:xml:ns:xmpp-session")); } if (streamFeatures->hasStreamManagement()) { streamFeaturesElement.addNode(std::make_shared<XMLElement>("sm", "urn:xmpp:sm:2")); } if (streamFeatures->hasRosterVersioning()) { streamFeaturesElement.addNode(std::make_shared<XMLElement>("ver", "urn:xmpp:features:rosterver")); } return createSafeByteArray(streamFeaturesElement.serialize()); } } diff --git a/Swiften/Serializer/XML/XMLElement.cpp b/Swiften/Serializer/XML/XMLElement.cpp index 4a874ab..f2397ca 100644 --- a/Swiften/Serializer/XML/XMLElement.cpp +++ b/Swiften/Serializer/XML/XMLElement.cpp @@ -1,60 +1,58 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/XML/XMLElement.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Serializer/XML/XMLTextNode.h> namespace Swift { XMLElement::XMLElement(const std::string& tag, const std::string& xmlns, const std::string& text) : tag_(tag) { if (!xmlns.empty()) { setAttribute("xmlns", xmlns); } if (!text.empty()) { addNode(XMLTextNode::ref(new XMLTextNode(text))); } } std::string XMLElement::serialize() { std::string result; result += "<" + tag_; - typedef std::pair<std::string,std::string> Pair; - foreach(const Pair& p, attributes_) { + for (const auto& p : attributes_) { result += " " + p.first + "=\"" + p.second + "\""; } if (!childNodes_.empty()) { result += ">"; - foreach (std::shared_ptr<XMLNode> node, childNodes_) { + for (auto& node : childNodes_) { result += node->serialize(); } result += "</" + tag_ + ">"; } else { result += "/>"; } return result; } void XMLElement::setAttribute(const std::string& attribute, const std::string& value) { std::string escapedValue(value); String::replaceAll(escapedValue, '&', "&"); String::replaceAll(escapedValue, '<', "<"); String::replaceAll(escapedValue, '>', ">"); String::replaceAll(escapedValue, '\'', "'"); String::replaceAll(escapedValue, '"', """); attributes_[attribute] = escapedValue; } void XMLElement::addNode(std::shared_ptr<XMLNode> node) { if (node) { childNodes_.push_back(node); } } } diff --git a/Swiften/Serializer/XMPPSerializer.cpp b/Swiften/Serializer/XMPPSerializer.cpp index 08b5485..9cde777 100644 --- a/Swiften/Serializer/XMPPSerializer.cpp +++ b/Swiften/Serializer/XMPPSerializer.cpp @@ -1,45 +1,44 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Serializer/XMPPSerializer.h> #include <cassert> #include <memory> #include <boost/bind.hpp> #include <Swiften/Base/Log.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/ProtocolHeader.h> #include <Swiften/Serializer/AuthChallengeSerializer.h> #include <Swiften/Serializer/AuthFailureSerializer.h> #include <Swiften/Serializer/AuthRequestSerializer.h> #include <Swiften/Serializer/AuthResponseSerializer.h> #include <Swiften/Serializer/AuthSuccessSerializer.h> #include <Swiften/Serializer/ComponentHandshakeSerializer.h> #include <Swiften/Serializer/CompressFailureSerializer.h> #include <Swiften/Serializer/CompressRequestSerializer.h> #include <Swiften/Serializer/EnableStreamManagementSerializer.h> #include <Swiften/Serializer/IQSerializer.h> #include <Swiften/Serializer/MessageSerializer.h> #include <Swiften/Serializer/PresenceSerializer.h> #include <Swiften/Serializer/StanzaAckRequestSerializer.h> #include <Swiften/Serializer/StanzaAckSerializer.h> #include <Swiften/Serializer/StartTLSFailureSerializer.h> #include <Swiften/Serializer/StartTLSRequestSerializer.h> #include <Swiften/Serializer/StreamErrorSerializer.h> #include <Swiften/Serializer/StreamFeaturesSerializer.h> #include <Swiften/Serializer/StreamManagementEnabledSerializer.h> #include <Swiften/Serializer/StreamManagementFailedSerializer.h> #include <Swiften/Serializer/StreamResumeSerializer.h> #include <Swiften/Serializer/StreamResumedSerializer.h> #include <Swiften/Serializer/TLSProceedSerializer.h> namespace Swift { XMPPSerializer::XMPPSerializer(PayloadSerializerCollection* payloadSerializers, StreamType type, bool setExplictNSonTopLevelElements) : type_(type) { serializers_.push_back(std::make_shared<PresenceSerializer>(payloadSerializers, setExplictNSonTopLevelElements ? getDefaultNamespace() : boost::optional<std::string>())); serializers_.push_back(std::make_shared<IQSerializer>(payloadSerializers, setExplictNSonTopLevelElements ? getDefaultNamespace() : boost::optional<std::string>())); diff --git a/Swiften/Session/BOSHSessionStream.cpp b/Swiften/Session/BOSHSessionStream.cpp index 635fd69..4c7bdee 100644 --- a/Swiften/Session/BOSHSessionStream.cpp +++ b/Swiften/Session/BOSHSessionStream.cpp @@ -1,45 +1,44 @@ /* * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Session/BOSHSessionStream.h> #include <boost/bind.hpp> #include <boost/random/mersenne_twister.hpp> #include <boost/random/uniform_int.hpp> #include <boost/random/variate_generator.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/StreamType.h> #include <Swiften/EventLoop/EventLoop.h> #include <Swiften/StreamStack/CompressionLayer.h> #include <Swiften/StreamStack/ConnectionLayer.h> #include <Swiften/StreamStack/StreamStack.h> #include <Swiften/StreamStack/TLSLayer.h> #include <Swiften/StreamStack/WhitespacePingLayer.h> #include <Swiften/StreamStack/XMPPLayer.h> #include <Swiften/TLS/TLSContext.h> #include <Swiften/TLS/TLSContextFactory.h> namespace Swift { BOSHSessionStream::BOSHSessionStream(const URL& boshURL, PayloadParserFactoryCollection* payloadParserFactories, PayloadSerializerCollection* payloadSerializers, ConnectionFactory* connectionFactory, TLSContextFactory* tlsContextFactory, TimerFactory* timerFactory, XMLParserFactory* xmlParserFactory, EventLoop* eventLoop, DomainNameResolver* resolver, const std::string& to, const URL& boshHTTPConnectProxyURL, const SafeString& boshHTTPConnectProxyAuthID, const SafeString& boshHTTPConnectProxyAuthPassword, const TLSOptions& tlsOptions, std::shared_ptr<HTTPTrafficFilter> trafficFilter) : available(false), eventLoop(eventLoop), diff --git a/Swiften/StreamStack/StreamStack.cpp b/Swiften/StreamStack/StreamStack.cpp index 0bcd1b3..44a018d 100644 --- a/Swiften/StreamStack/StreamStack.cpp +++ b/Swiften/StreamStack/StreamStack.cpp @@ -1,38 +1,37 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/StreamStack/StreamStack.h> #include <boost/bind.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/StreamStack/LowLayer.h> #include <Swiften/StreamStack/StreamLayer.h> #include <Swiften/StreamStack/XMPPLayer.h> namespace Swift { StreamStack::StreamStack(XMPPLayer* xmppLayer, LowLayer* physicalLayer) : xmppLayer_(xmppLayer), physicalLayer_(physicalLayer) { physicalLayer_->setParentLayer(xmppLayer_); xmppLayer_->setChildLayer(physicalLayer_); } StreamStack::~StreamStack() { } void StreamStack::addLayer(StreamLayer* newLayer) { LowLayer* lowLayer = layers_.empty() ? physicalLayer_ : *layers_.rbegin(); xmppLayer_->setChildLayer(newLayer); newLayer->setParentLayer(xmppLayer_); lowLayer->setParentLayer(newLayer); newLayer->setChildLayer(lowLayer); layers_.push_back(newLayer); } } diff --git a/Swiften/TLS/ServerIdentityVerifier.cpp b/Swiften/TLS/ServerIdentityVerifier.cpp index 872717b..226e94b 100644 --- a/Swiften/TLS/ServerIdentityVerifier.cpp +++ b/Swiften/TLS/ServerIdentityVerifier.cpp @@ -1,93 +1,92 @@ /* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/TLS/ServerIdentityVerifier.h> #include <boost/algorithm/string.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/IDN/IDNConverter.h> namespace Swift { ServerIdentityVerifier::ServerIdentityVerifier(const JID& jid, IDNConverter* idnConverter) : domainValid(false) { domain = jid.getDomain(); boost::optional<std::string> domainResult = idnConverter->getIDNAEncoded(domain); if (!!domainResult) { encodedDomain = *domainResult; domainValid = true; } } bool ServerIdentityVerifier::certificateVerifies(Certificate::ref certificate) { bool hasSAN = false; if (certificate == nullptr) { return false; } // DNS names std::vector<std::string> dnsNames = certificate->getDNSNames(); - foreach (const std::string& dnsName, dnsNames) { + for (const auto& dnsName : dnsNames) { if (matchesDomain(dnsName)) { return true; } } hasSAN |= !dnsNames.empty(); // SRV names std::vector<std::string> srvNames = certificate->getSRVNames(); - foreach (const std::string& srvName, srvNames) { + for (const auto& srvName : srvNames) { // Only match SRV names that begin with the service; this isn't required per // spec, but we're being purist about this. if (boost::starts_with(srvName, "_xmpp-client.") && matchesDomain(srvName.substr(std::string("_xmpp-client.").size(), srvName.npos))) { return true; } } hasSAN |= !srvNames.empty(); // XmppAddr std::vector<std::string> xmppAddresses = certificate->getXMPPAddresses(); - foreach (const std::string& xmppAddress, xmppAddresses) { + for (const auto& xmppAddress : xmppAddresses) { if (matchesAddress(xmppAddress)) { return true; } } hasSAN |= !xmppAddresses.empty(); // CommonNames. Only check this if there was no SAN (according to spec). if (!hasSAN) { std::vector<std::string> commonNames = certificate->getCommonNames(); - foreach (const std::string& commonName, commonNames) { + for (const auto& commonName : commonNames) { if (matchesDomain(commonName)) { return true; } } } return false; } bool ServerIdentityVerifier::matchesDomain(const std::string& s) const { if (!domainValid) { return false; } if (boost::starts_with(s, "*.")) { std::string matchString(s.substr(2, s.npos)); std::string matchDomain = encodedDomain; size_t dotIndex = matchDomain.find('.'); if (dotIndex != matchDomain.npos) { matchDomain = matchDomain.substr(dotIndex + 1, matchDomain.npos); } return matchString == matchDomain; } else { return s == encodedDomain; } } bool ServerIdentityVerifier::matchesAddress(const std::string& s) const { return s == domain; } diff --git a/Swiften/Whiteboard/WhiteboardSessionManager.cpp b/Swiften/Whiteboard/WhiteboardSessionManager.cpp index 66b5ef8..59f6c47 100644 --- a/Swiften/Whiteboard/WhiteboardSessionManager.cpp +++ b/Swiften/Whiteboard/WhiteboardSessionManager.cpp @@ -1,50 +1,49 @@ /* * Copyright (c) 2012 Mateusz Piękos * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ /* * Copyright (c) 2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Swiften/Whiteboard/WhiteboardSessionManager.h> #include <memory> #include <boost/bind.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Disco/EntityCapsProvider.h> #include <Swiften/Presence/PresenceOracle.h> #include <Swiften/Queries/IQRouter.h> #include <Swiften/Whiteboard/WhiteboardResponder.h> namespace Swift { WhiteboardSessionManager::WhiteboardSessionManager(IQRouter* router, StanzaChannel* stanzaChannel, PresenceOracle* presenceOracle, EntityCapsProvider* capsProvider) : router_(router), stanzaChannel_(stanzaChannel), presenceOracle_(presenceOracle), capsProvider_(capsProvider) { responder = new WhiteboardResponder(this, router); responder->start(); stanzaChannel_->onPresenceReceived.connect(boost::bind(&WhiteboardSessionManager::handlePresenceReceived, this, _1)); stanzaChannel_->onAvailableChanged.connect(boost::bind(&WhiteboardSessionManager::handleAvailableChanged, this, _1)); } WhiteboardSessionManager::~WhiteboardSessionManager() { responder->stop(); delete responder; } WhiteboardSession::ref WhiteboardSessionManager::getSession(const JID& to) { if (sessions_.find(to) == sessions_.end()) { return std::shared_ptr<WhiteboardSession>(); } return sessions_[to]; } OutgoingWhiteboardSession::ref WhiteboardSessionManager::createOutgoingSession(const JID& to) { JID fullJID = to; if (fullJID.isBare()) { fullJID = getFullJID(fullJID); } @@ -53,61 +52,61 @@ namespace Swift { session->onSessionTerminated.connect(boost::bind(&WhiteboardSessionManager::deleteSessionEntry, this, _1)); session->onRequestRejected.connect(boost::bind(&WhiteboardSessionManager::deleteSessionEntry, this, _1)); return session; } WhiteboardSession::ref WhiteboardSessionManager::requestSession(const JID& to) { WhiteboardSession::ref session = getSession(to); if (!session) { OutgoingWhiteboardSession::ref outgoingSession = createOutgoingSession(to); outgoingSession->startSession(); return outgoingSession; } else { return session; } } void WhiteboardSessionManager::handleIncomingSession(IncomingWhiteboardSession::ref session) { sessions_[session->getTo()] = session; session->onSessionTerminated.connect(boost::bind(&WhiteboardSessionManager::deleteSessionEntry, this, _1)); onSessionRequest(session); } JID WhiteboardSessionManager::getFullJID(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 - foreach(Presence::ref pres, presences) { + for (const auto& pres : presences) { if (pres->getPriority() > priority) { // look up caps from the jid DiscoInfo::ref info = capsProvider_->getCaps(pres->getFrom()); if (info && info->hasFeature(DiscoInfo::WhiteboardFeature)) { priority = pres->getPriority(); fullReceipientJID = pres->getFrom(); } } } return fullReceipientJID; } void WhiteboardSessionManager::deleteSessionEntry(const JID& contact) { sessions_.erase(contact); } void WhiteboardSessionManager::handlePresenceReceived(Presence::ref presence) { if (!presence->isAvailable()) { WhiteboardSession::ref session = getSession(presence->getFrom()); if (session) { session->cancel(); } } } void WhiteboardSessionManager::handleAvailableChanged(bool available) { if (!available) { std::map<JID, WhiteboardSession::ref> sessionsCopy = sessions_; std::map<JID, WhiteboardSession::ref>::iterator it; |