Changeset - 39c8618da638
backends/libpurple/main.cpp
Show inline comments
 
@@ -1596,13 +1596,23 @@ static void RoomlistProgress(PurpleRoomlist *list, gboolean in_progress)
 
		std::list<std::string> m_rooms;
 
		for (rooms = list->rooms; rooms != NULL; rooms = rooms->next)
 
		{
 
			PurpleRoomlistRoom *room = (PurpleRoomlistRoom *)rooms->data;	
 
			m_rooms.push_back(room->name);
 
		}
 
		np->handleRoomList("", m_rooms, m_rooms);
 

	
 
		std::string user = "";
 
		if (list->account) {
 
			user = np->m_accounts[list->account];
 
		}
 

	
 
		LOG4CXX_INFO(logger, "RoomList is fetched for user " << user);
 
		np->handleRoomList(user, m_rooms, m_rooms);
 
	}
 
	else {
 
		LOG4CXX_INFO(logger, "RoomList is still in progress");
 
	}
 
}
 

	
 
static PurpleRoomlistUiOps roomlist_ui_ops =
 
{
 
	NULL,
include/transport/User.h
Show inline comments
 
@@ -73,12 +73,14 @@ class User {
 

	
 
		Component *getComponent() { return m_component; }
 

	
 
		UserManager *getUserManager() { return m_userManager; }
 
		
 
		virtual void disconnectUser(const std::string &error, Swift::SpectrumErrorPayload::Error e) = 0;
 
		virtual void clearRoomList() {}
 
		virtual void addRoomToRoomList(const std::string &handle, const std::string &name) {}
 
		virtual void requestVCard() {}
 

	
 
		void setData(void *data) { m_data = data; }
 
		void *getData() { return m_data; }
 

	
 
		/// Handles presence from XMPP JID associated with this user.
include/transport/protocol.proto
Show inline comments
 
@@ -86,12 +86,13 @@ message Room {
 
	optional string password = 4;
 
}
 

	
 
message RoomList {
 
	repeated string room = 1;
 
	repeated string name = 2;
 
	optional string user = 3;
 
}
 

	
 
enum ParticipantFlag {
 
	PARTICIPANT_FLAG_NONE = 0;
 
	PARTICIPANT_FLAG_MODERATOR = 1;
 
	PARTICIPANT_FLAG_CONFLICT = 2;
libtransport/NetworkPluginServer.cpp
Show inline comments
 
@@ -991,15 +991,29 @@ void NetworkPluginServer::handleRoomListPayload(const std::string &data) {
 
	pbnetwork::RoomList payload;
 
	if (payload.ParseFromString(data) == false) {
 
		// TODO: ERROR
 
		return;
 
	}
 

	
 
	m_component->getFrontend()->clearRoomList();
 
	for (int i = 0; i < payload.room_size() && i < payload.name_size(); i++) {
 
		m_component->getFrontend()->addRoomToRoomList(Swift::JID::getEscapedNode(payload.room(i)) + "@" + m_component->getJID().toString(), payload.name(i));
 
	if (!payload.user().empty()) {
 
		User *user = m_userManager->getUser(payload.user());
 
		if (!user) {
 
			LOG4CXX_ERROR(logger, "Room list payload received for unknown user " << payload.user());
 
			return;
 
		}
 

	
 
		user->clearRoomList();
 
		for (int i = 0; i < payload.room_size() && i < payload.name_size(); i++) {
 
			user->addRoomToRoomList(Swift::JID::getEscapedNode(payload.room(i)) + "@" + m_component->getJID().toString(), payload.name(i));
 
		}
 
	}
 
	else {
 
		m_component->getFrontend()->clearRoomList();
 
		for (int i = 0; i < payload.room_size() && i < payload.name_size(); i++) {
 
			m_component->getFrontend()->addRoomToRoomList(Swift::JID::getEscapedNode(payload.room(i)) + "@" + m_component->getJID().toString(), payload.name(i));
 
		}
 
	}
 
}
 
#if HAVE_SWIFTEN_3
 
void NetworkPluginServer::handleElement(boost::shared_ptr<Swift::ToplevelElement> element) {
 
#else
 
void NetworkPluginServer::handleElement(boost::shared_ptr<Swift::Element> element) {
plugin/cpp/networkplugin.cpp
Show inline comments
 
@@ -373,12 +373,14 @@ void NetworkPlugin::handleRoomList(const std::string &user, const std::list<std:
 
	}
 

	
 
	for (std::list<std::string>::const_iterator it = names.begin(); it != names.end(); it++) {
 
		d.add_name(*it);
 
	}
 

	
 
	d.set_user(user);
 

	
 
	std::string message;
 
	d.SerializeToString(&message);
 

	
 
	WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_ROOM_LIST);
 
 
 
	send(message);
spectrum/src/frontends/xmpp/XMPPFrontend.cpp
Show inline comments
 
@@ -28,13 +28,12 @@
 
#include "transport/StorageBackend.h"
 
#include "transport/Factory.h"
 
#include "transport/UserRegistry.h"
 
#include "transport/Logging.h"
 
#include "transport/Config.h"
 
#include "transport/Transport.h"
 
#include "discoitemsresponder.h"
 
#include "storageparser.h"
 
#ifdef _WIN32
 
#include <Swiften/TLS/CAPICertificate.h>
 
#include "Swiften/TLS/Schannel/SchannelServerContext.h"
 
#include "Swiften/TLS/Schannel/SchannelServerContextFactory.h"
 
#elif defined(__APPLE__) && HAVE_SWIFTEN_3
 
@@ -60,12 +59,13 @@
 
#include "BlockSerializer.h"
 
#include "Swiften/Parser/PayloadParsers/InvisibleParser.h"
 
#include "Swiften/Serializer/PayloadSerializers/InvisibleSerializer.h"
 
#include "Swiften/Parser/GenericPayloadParserFactory.h"
 
#include "Swiften/Queries/IQRouter.h"
 
#include "Swiften/Elements/RosterPayload.h"
 
#include "discoitemsresponder.h"
 
#include "Swiften/Elements/InBandRegistrationPayload.h"
 

	
 
using namespace Swift;
 
using namespace boost;
 

	
 
namespace Transport {
 
@@ -78,12 +78,13 @@ XMPPFrontend::XMPPFrontend() {
 
void XMPPFrontend::init(Component *transport, Swift::EventLoop *loop, Swift::NetworkFactories *factories, Config *config, Transport::UserRegistry *userRegistry) {
 
	m_transport = transport;
 
	m_component = NULL;
 
	m_server = NULL;
 
	m_rawXML = false;
 
	m_config = transport->getConfig();
 
	m_userManager = NULL;
 
	m_jid = Swift::JID(CONFIG_STRING(m_config, "service.jid"));
 

	
 
	m_config->onBackendConfigUpdated.connect(boost::bind(&XMPPFrontend::handleBackendConfigChanged, this));
 

	
 
	if (CONFIG_BOOL(m_config, "service.server_mode")) {
 
		LOG4CXX_INFO(logger, "Creating component in server mode on port " << CONFIG_INT(m_config, "service.port"));
 
@@ -170,15 +171,12 @@ void XMPPFrontend::init(Component *transport, Swift::EventLoop *loop, Swift::Net
 
#endif
 
	m_entityCapsManager = new EntityCapsManager(m_capsManager, m_stanzaChannel);
 
	m_entityCapsManager->onCapsChanged.connect(boost::bind(&XMPPFrontend::handleCapsChanged, this, _1));
 

	
 
	m_stanzaChannel->onPresenceReceived.connect(bind(&XMPPFrontend::handleGeneralPresence, this, _1));
 
	m_stanzaChannel->onMessageReceived.connect(bind(&XMPPFrontend::handleMessage, this, _1));
 

	
 
	m_discoItemsResponder = new DiscoItemsResponder(transport);
 
	m_discoItemsResponder->start();
 
}
 

	
 
XMPPFrontend::~XMPPFrontend() {
 
	delete m_entityCapsManager;
 
	delete m_capsManager;
 
	delete m_capsMemoryStorage;
 
@@ -197,22 +195,22 @@ void XMPPFrontend::handleGeneralPresence(Swift::Presence::ref presence) {
 
void XMPPFrontend::handleMessage(boost::shared_ptr<Swift::Message> message) {
 
	onMessageReceived(message);
 
}
 

	
 

	
 
void XMPPFrontend::clearRoomList() {
 
	m_discoItemsResponder->clearRooms();
 
	static_cast<XMPPUserManager *>(m_userManager)->getDiscoItemsResponder()->clearRooms();
 
}
 

	
 
void XMPPFrontend::addRoomToRoomList(const std::string &handle, const std::string &name) {
 
	m_discoItemsResponder->addRoom(handle, name);
 
	static_cast<XMPPUserManager *>(m_userManager)->getDiscoItemsResponder()->addRoom(handle, name);
 
}
 

	
 
void XMPPFrontend::sendPresence(Swift::Presence::ref presence) {
 
	if (!presence->getFrom().getNode().empty()) {
 
		presence->addPayload(boost::shared_ptr<Swift::Payload>(new Swift::CapsInfo(m_discoItemsResponder->getBuddyCapsInfo())));
 
		presence->addPayload(boost::shared_ptr<Swift::Payload>(new Swift::CapsInfo(static_cast<XMPPUserManager *>(m_userManager)->getDiscoItemsResponder()->getBuddyCapsInfo())));
 
	}
 

	
 
	m_stanzaChannel->sendPresence(presence);
 
}
 

	
 
void XMPPFrontend::sendVCard(Swift::VCard::ref vcard, Swift::JID to) {
 
@@ -274,13 +272,14 @@ RosterManager *XMPPFrontend::createRosterManager(User *user, Component *componen
 

	
 
User *XMPPFrontend::createUser(const Swift::JID &jid, UserInfo &userInfo, Component *component, UserManager *userManager) {
 
	return new XMPPUser(jid, userInfo, component, userManager);
 
}
 

	
 
UserManager *XMPPFrontend::createUserManager(Component *component, UserRegistry *userRegistry, StorageBackend *storageBackend) {
 
	return new XMPPUserManager(component, userRegistry, storageBackend);
 
	m_userManager = new XMPPUserManager(component, userRegistry, storageBackend);
 
	return m_userManager;
 
}
 

	
 
bool XMPPFrontend::handleIQ(boost::shared_ptr<Swift::IQ> iq) {
 
	if (!m_rawXML) {
 
		return false;
 
	}
spectrum/src/frontends/xmpp/XMPPFrontend.h
Show inline comments
 
@@ -44,13 +44,12 @@
 
#include <Swiften/Network/BoostConnectionServer.h>
 

	
 
namespace Transport {
 
	class UserRegistry;
 
	class Frontend;
 
	class Config;
 
	class DiscoItemsResponder;
 
	class VCardResponder;
 

	
 
	class XMPPFrontend : public Frontend, Swift::IQHandler {
 
		public:
 
			XMPPFrontend();
 

	
 
@@ -92,16 +91,12 @@ namespace Transport {
 
			bool inServerMode() { return m_server != NULL; }
 

	
 
			bool isRawXMLEnabled() {
 
				return m_rawXML;
 
			}
 

	
 
			DiscoItemsResponder *getDiscoItemsResponder() {
 
				return m_discoItemsResponder;
 
			}
 

	
 
		private:
 
			void handleConnected();
 
			void handleConnectionError(const Swift::ComponentError &error);
 
			void handleServerStopped(boost::optional<Swift::BoostConnectionServer::Error> e);
 
			void handleGeneralPresence(Swift::Presence::ref presence);
 
			void handleDataRead(const Swift::SafeByteArray &data);
 
@@ -118,19 +113,19 @@ namespace Transport {
 
			Swift::Server *m_server;
 
			Swift::EntityCapsManager *m_entityCapsManager;
 
			Swift::CapsManager *m_capsManager;
 
			Swift::CapsMemoryStorage *m_capsMemoryStorage;
 
			Swift::StanzaChannel *m_stanzaChannel;
 
			Swift::IQRouter *m_iqRouter;
 
			DiscoItemsResponder *m_discoItemsResponder;
 
			VCardResponder *m_vcardResponder;
 
			
 
			Config* m_config;
 
			Swift::JID m_jid;
 
			bool m_rawXML;
 
			Component *m_transport;
 
			UserManager *m_userManager;
 

	
 
		friend class XMPPUser;
 
		friend class UserRegistration;
 
		friend class NetworkPluginServer;
 
	};
 
}
spectrum/src/frontends/xmpp/XMPPUser.cpp
Show inline comments
 
@@ -42,12 +42,13 @@ DEFINE_LOGGER(logger, "XMPPUser");
 
XMPPUser::XMPPUser(const Swift::JID &jid, UserInfo &userInfo, Component *component, UserManager *userManager) : User(jid, userInfo, component, userManager) {
 
	m_jid = jid.toBare();
 

	
 
	m_component = component;
 
	m_userManager = userManager;
 
	m_userInfo = userInfo;
 
	m_rooms = boost::shared_ptr<Swift::DiscoItems>(new Swift::DiscoItems());
 
}
 

	
 
XMPPUser::~XMPPUser(){
 
	if (m_component->inServerMode()) {
 
#if HAVE_SWIFTEN_3
 
		dynamic_cast<Swift::ServerStanzaChannel *>(static_cast<XMPPFrontend*>(m_component->getFrontend())->getStanzaChannel())->finishSession(m_jid, boost::shared_ptr<Swift::ToplevelElement>());
 
@@ -95,8 +96,16 @@ void XMPPUser::requestVCard() {
 
	Swift::GetVCardRequest::ref request = Swift::GetVCardRequest::create(m_jid, static_cast<XMPPFrontend *>(m_component->getFrontend())->getIQRouter());
 
	request->onResponse.connect(boost::bind(&XMPPUser::handleVCardReceived, this, _1, _2, request));
 
	request->send();
 
	m_vcardRequests.push_back(request);
 
}
 

	
 
void XMPPUser::clearRoomList() {
 
	m_rooms = boost::shared_ptr<Swift::DiscoItems>(new Swift::DiscoItems());
 
}
 

	
 
void XMPPUser::addRoomToRoomList(const std::string &handle, const std::string &name) {
 
	m_rooms->addItem(Swift::DiscoItems::Item(name, handle));
 
}
 

	
 

	
 
}
spectrum/src/frontends/xmpp/XMPPUser.h
Show inline comments
 
@@ -27,12 +27,13 @@
 
#include "Swiften/Disco/EntityCapsProvider.h"
 
#include <Swiften/FileTransfer/OutgoingFileTransfer.h>
 
#include "Swiften/Elements/SpectrumErrorPayload.h"
 
#include "Swiften/Network/Timer.h"
 
#include "Swiften/Network/Connection.h"
 
#include "Swiften/VCards/GetVCardRequest.h"
 
#include "Swiften/Elements/DiscoItems.h"
 

	
 
namespace Transport {
 

	
 
class Component;
 
class RosterManager;
 
class ConversationManager;
 
@@ -54,18 +55,27 @@ class XMPPUser : public User {
 
		virtual ~XMPPUser();
 

	
 
		void disconnectUser(const std::string &error, Swift::SpectrumErrorPayload::Error e);
 

	
 
		void requestVCard();
 

	
 
		void clearRoomList();
 

	
 
		void addRoomToRoomList(const std::string &handle, const std::string &name);
 

	
 
		boost::shared_ptr<Swift::DiscoItems> getRoomList() {
 
			return m_rooms;
 
		}
 

	
 
	private:
 
		void onConnectingTimeout();
 
		void handleVCardReceived(boost::shared_ptr<Swift::VCard> vcard, Swift::ErrorPayload::ref error, Swift::GetVCardRequest::ref request);
 

	
 
		Swift::JID m_jid;
 
		Component *m_component;
 
		UserManager *m_userManager;
 
		UserInfo m_userInfo;
 
		std::list <Swift::GetVCardRequest::ref> m_vcardRequests;
 
		boost::shared_ptr<Swift::DiscoItems> m_rooms;
 
};
 

	
 
}
spectrum/src/frontends/xmpp/XMPPUserManager.cpp
Show inline comments
 
@@ -29,12 +29,13 @@
 
#include "vcardresponder.h"
 
#include "XMPPFrontend.h"
 
#include "gatewayresponder.h"
 
#include "adhocmanager.h"
 
#include "settingsadhoccommand.h"
 
#include "RosterResponder.h"
 
#include "discoitemsresponder.h"
 

	
 
#include "Swiften/Server/ServerStanzaChannel.h"
 
#include "Swiften/Elements/StreamError.h"
 
#include "Swiften/Elements/MUCPayload.h"
 
#include "Swiften/Elements/ChatState.h"
 
#ifndef __FreeBSD__ 
 
@@ -79,13 +80,16 @@ XMPPUserManager::XMPPUserManager(Component *component, UserRegistry *userRegistr
 
	m_gatewayResponder = new GatewayResponder(frontend->getIQRouter(), this);
 
	m_gatewayResponder->start();
 

	
 
	m_rosterResponder = new RosterResponder(frontend->getIQRouter(), this);
 
	m_rosterResponder->start();
 

	
 
	m_adHocManager = new AdHocManager(component, frontend->getDiscoItemsResponder(), this, storageBackend);
 
	m_discoItemsResponder = new DiscoItemsResponder(component, this);
 
	m_discoItemsResponder->start();
 

	
 
	m_adHocManager = new AdHocManager(component, m_discoItemsResponder, this, storageBackend);
 
	m_adHocManager->start();
 

	
 
	SettingsAdHocCommandFactory *m_settings = new SettingsAdHocCommandFactory();
 
	m_adHocManager->addAdHocCommand(m_settings);
 
}
 

	
 
@@ -108,12 +112,15 @@ XMPPUserManager::~XMPPUserManager() {
 

	
 
	m_vcardResponder->stop();
 
	delete m_vcardResponder;
 

	
 
	m_rosterResponder->stop();
 
	delete m_rosterResponder;
 

	
 
	m_discoItemsResponder->stop();
 
	delete m_discoItemsResponder;
 
}
 

	
 
void XMPPUserManager::sendVCard(unsigned int id, Swift::VCard::ref vcard) {
 
	m_vcardResponder->sendVCard(id, vcard);
 
}
 

	
spectrum/src/frontends/xmpp/XMPPUserManager.h
Show inline comments
 
@@ -37,32 +37,38 @@ class StorageResponder;
 
class VCardResponder;
 
class XMPPUserRegistration;
 
class GatewayResponder;
 
class AdHocManager;
 
class SettingsAdHocCommandFactory;
 
class RosterResponder;
 
class DiscoItemsResponder;
 

	
 
class XMPPUserManager : public UserManager {
 
	public:
 
		XMPPUserManager(Component *component, UserRegistry *userRegistry, StorageBackend *storageBackend = NULL);
 

	
 
		virtual ~XMPPUserManager();
 

	
 
		virtual void sendVCard(unsigned int id, Swift::VCard::ref vcard);
 

	
 
		UserRegistration *getUserRegistration();
 

	
 
		DiscoItemsResponder *getDiscoItemsResponder() {
 
			return m_discoItemsResponder;
 
		}
 

	
 
	private:
 
		void handleVCardRequired(User *, const std::string &name, unsigned int id);
 
		void handleVCardUpdated(User *, boost::shared_ptr<Swift::VCard> vcard);
 

	
 
		StorageResponder *m_storageResponder;
 
		VCardResponder *m_vcardResponder;
 
		Component *m_component;
 
		XMPPUserRegistration *m_userRegistration;
 
		GatewayResponder *m_gatewayResponder;
 
		AdHocManager *m_adHocManager;
 
		SettingsAdHocCommandFactory *m_settings;
 
		RosterResponder *m_rosterResponder;
 
		DiscoItemsResponder *m_discoItemsResponder;
 
};
 

	
 
}
spectrum/src/frontends/xmpp/discoinforesponder.cpp
Show inline comments
 
@@ -27,32 +27,35 @@
 
#include "Swiften/Queries/IQRouter.h"
 
#include "Swiften/Elements/DiscoInfo.h"
 
#include "transport/Config.h"
 
#include "transport/Logging.h"
 
#include "Swiften/Disco/CapsInfoGenerator.h"
 
#include "XMPPFrontend.h"
 
#include "transport/UserManager.h"
 
#include "XMPPUser.h"
 

	
 
using namespace Swift;
 
using namespace boost;
 

	
 
DEFINE_LOGGER(logger, "DiscoInfoResponder");
 

	
 
namespace Transport {
 

	
 
DiscoInfoResponder::DiscoInfoResponder(Swift::IQRouter *router, Config *config) : Swift::GetResponder<DiscoInfo>(router) {
 
DiscoInfoResponder::DiscoInfoResponder(Swift::IQRouter *router, Config *config, UserManager *userManager) : Swift::GetResponder<DiscoInfo>(router) {
 
	m_config = config;
 
	m_config->onBackendConfigUpdated.connect(boost::bind(&DiscoInfoResponder::updateFeatures, this));
 
	m_buddyInfo = NULL;
 
	m_transportInfo.addIdentity(DiscoInfo::Identity(CONFIG_STRING(m_config, "identity.name"),
 
													CONFIG_STRING(m_config, "identity.category"),
 
													CONFIG_STRING(m_config, "identity.type")));
 
#if HAVE_SWIFTEN_3
 
	crypto = boost::shared_ptr<CryptoProvider>(PlatformCryptoProvider::create());
 
#endif
 

	
 
	updateFeatures();
 
	m_userManager = userManager;
 
}
 

	
 
DiscoInfoResponder::~DiscoInfoResponder() {
 
	delete m_buddyInfo;
 
}
 

	
 
@@ -145,25 +148,43 @@ bool DiscoInfoResponder::handleGetRequest(const Swift::JID& from, const Swift::J
 
			}
 

	
 
			boost::shared_ptr<DiscoInfo> res(new DiscoInfo(m_transportInfo));
 
			res->setNode(info->getNode());
 
			sendResponse(from, id, res);
 
		}
 
		return true;
 
	}
 

	
 
	// disco#info for room
 
	else if (m_rooms.find(to.toBare().toString()) != m_rooms.end()) {
 
	if (m_rooms.find(to.toBare().toString()) != m_rooms.end()) {
 
		boost::shared_ptr<DiscoInfo> res(new DiscoInfo());
 
		res->addIdentity(DiscoInfo::Identity(m_rooms[to.toBare().toString()], "conference", "text"));
 
		res->addFeature("http://jabber.org/protocol/muc");
 
		res->setNode(info->getNode());
 
		sendResponse(from, to, id, res);
 
		return true;
 
	}
 
	// disco#info for buddy
 
	else {
 
		boost::shared_ptr<DiscoInfo> res(new DiscoInfo(*m_buddyInfo));
 
		res->setNode(info->getNode());
 
		sendResponse(from, to, id, res);
 

	
 
	// disco#info for per-user rooms (like Skype/Facebook groupchats)
 
	XMPPUser *user = static_cast<XMPPUser *>(m_userManager->getUser(from.toBare().toString()));
 
	if (user) {
 
		BOOST_FOREACH(const DiscoItems::Item &item, user->getRoomList()->getItems()) {
 
			LOG4CXX_INFO(logger, "XXX " << item.getNode() << " " << to.toBare().toString());
 
			if (item.getJID().toString() == to.toBare().toString()) {
 
				boost::shared_ptr<DiscoInfo> res(new DiscoInfo());
 
				res->addIdentity(DiscoInfo::Identity(item.getName(), "conference", "text"));
 
				res->addFeature("http://jabber.org/protocol/muc");
 
				res->setNode(info->getNode());
 
				sendResponse(from, to, id, res);
 
				return true;
 
			}
 
		}
 
	}
 

	
 
	// disco#info for buddy
 
	boost::shared_ptr<DiscoInfo> res(new DiscoInfo(*m_buddyInfo));
 
	res->setNode(info->getNode());
 
	sendResponse(from, to, id, res);
 
	return true;
 
}
 

	
 
}
spectrum/src/frontends/xmpp/discoinforesponder.h
Show inline comments
 
@@ -34,16 +34,17 @@
 
#endif
 

	
 

	
 
namespace Transport {
 

	
 
class Config;
 
class UserManager;
 

	
 
class DiscoInfoResponder : public Swift::GetResponder<Swift::DiscoInfo> {
 
	public:
 
		DiscoInfoResponder(Swift::IQRouter *router, Config *config);
 
		DiscoInfoResponder(Swift::IQRouter *router, Config *config, UserManager *userManager);
 
		~DiscoInfoResponder();
 

	
 
		void setTransportFeatures(std::list<std::string> &features);
 
		void setBuddyFeatures(std::list<std::string> &features);
 

	
 
		void addRoom(const std::string &jid, const std::string &name);
 
@@ -67,9 +68,10 @@ class DiscoInfoResponder : public Swift::GetResponder<Swift::DiscoInfo> {
 
		Swift::CapsInfo m_capsInfo;
 
		std::map<std::string, std::string> m_rooms;
 
		std::map<std::string, std::string> m_commands;
 
#if HAVE_SWIFTEN_3
 
		boost::shared_ptr<Swift::CryptoProvider> crypto;
 
#endif
 
		UserManager *m_userManager;
 
};
 

	
 
}
spectrum/src/frontends/xmpp/discoitemsresponder.cpp
Show inline comments
 
@@ -26,28 +26,32 @@
 
#include "transport/Transport.h"
 
#include "transport/Logging.h"
 
#include "transport/Config.h"
 
#include "discoinforesponder.h"
 
#include "XMPPFrontend.h"
 
#include "transport/Frontend.h"
 
#include "transport/UserManager.h"
 
#include "XMPPUser.h"
 

	
 
using namespace Swift;
 
using namespace boost;
 

	
 
namespace Transport {
 

	
 
DEFINE_LOGGER(logger, "DiscoItemsResponder");
 

	
 
DiscoItemsResponder::DiscoItemsResponder(Component *component) : Swift::GetResponder<DiscoItems>(static_cast<XMPPFrontend *>(component->getFrontend())->getIQRouter()) {
 
DiscoItemsResponder::DiscoItemsResponder(Component *component, UserManager *userManager) : Swift::GetResponder<DiscoItems>(static_cast<XMPPFrontend *>(component->getFrontend())->getIQRouter()) {
 
	m_component = component;
 
	m_commands = boost::shared_ptr<DiscoItems>(new DiscoItems());
 
	m_commands->setNode("http://jabber.org/protocol/commands");
 

	
 
	m_rooms = boost::shared_ptr<DiscoItems>(new DiscoItems());
 
	m_discoInfoResponder = new DiscoInfoResponder(static_cast<XMPPFrontend *>(component->getFrontend())->getIQRouter(), component->getConfig());
 
	m_discoInfoResponder = new DiscoInfoResponder(static_cast<XMPPFrontend *>(component->getFrontend())->getIQRouter(), component->getConfig(), userManager);
 
	m_discoInfoResponder->start();
 

	
 
	m_userManager = userManager;
 
}
 

	
 
DiscoItemsResponder::~DiscoItemsResponder() {
 
	delete m_discoInfoResponder;
 
}
 

	
 
@@ -77,13 +81,27 @@ Swift::CapsInfo &DiscoItemsResponder::getBuddyCapsInfo() {
 
bool DiscoItemsResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr<Swift::DiscoItems> info) {
 
	LOG4CXX_INFO(logger, "get request received with node " << info->getNode());
 
	if (info->getNode() == "http://jabber.org/protocol/commands") {
 
		sendResponse(from, id, m_commands);
 
	}
 
	else if (to.getNode().empty()) {
 
		sendResponse(from, id, m_rooms);
 
		XMPPUser *user = static_cast<XMPPUser *>(m_userManager->getUser(from.toBare().toString()));
 
		if (!user) {
 
			sendResponse(from, id, m_rooms);
 
			return true;
 
		}
 

	
 
		boost::shared_ptr<DiscoItems> rooms = boost::shared_ptr<DiscoItems>(new DiscoItems());
 
		BOOST_FOREACH(const DiscoItems::Item &item, m_rooms->getItems()) {
 
			rooms->addItem(item);
 
		}
 
		BOOST_FOREACH(const DiscoItems::Item &item, user->getRoomList()->getItems()) {
 
			rooms->addItem(item);
 
		}
 

	
 
		sendResponse(from, id, rooms);
 
	}
 
	else {
 
		sendResponse(from, id, boost::shared_ptr<DiscoItems>(new DiscoItems()));
 
	}
 
	return true;
 
}
spectrum/src/frontends/xmpp/discoitemsresponder.h
Show inline comments
 
@@ -26,16 +26,17 @@
 
#include "Swiften/Elements/CapsInfo.h"
 

	
 
namespace Transport {
 

	
 
class Component;
 
class DiscoInfoResponder;
 
class UserManager;
 

	
 
class DiscoItemsResponder : public Swift::GetResponder<Swift::DiscoItems> {
 
	public:
 
		DiscoItemsResponder(Component *component);
 
		DiscoItemsResponder(Component *component, UserManager *userManager);
 
		~DiscoItemsResponder();
 

	
 
		Swift::CapsInfo &getBuddyCapsInfo();
 

	
 
		void addAdHocCommand(const std::string &node, const std::string &name);
 
// 		void removeAdHocCommand(const std::string &node);
 
@@ -49,9 +50,10 @@ class DiscoItemsResponder : public Swift::GetResponder<Swift::DiscoItems> {
 

	
 
	private:
 
		Component *m_component;
 
		boost::shared_ptr<Swift::DiscoItems> m_commands;
 
		boost::shared_ptr<Swift::DiscoItems> m_rooms;
 
		DiscoInfoResponder *m_discoInfoResponder;
 
		UserManager *m_userManager;
 
};
 

	
 
}
tests/libtransport/basictest.cpp
Show inline comments
 
@@ -52,13 +52,13 @@ void BasicTest::setMeUp (void) {
 

	
 
	component = new Component(frontend, loop, factories, cfg, factory, userRegistry);
 
	component->start();
 

	
 
	userManager = frontend->createUserManager(component, userRegistry, storage);
 

	
 
	itemsResponder = frontend->getDiscoItemsResponder();
 
	itemsResponder = static_cast<XMPPUserManager *>(userManager)->getDiscoItemsResponder();
 

	
 
	payloadSerializers = new Swift::FullPayloadSerializerCollection();
 
	payloadParserFactories = new Swift::FullPayloadParserFactoryCollection();
 

	
 
	payloadParserFactories->addFactory(new Swift::GenericPayloadParserFactory<StorageParser>("private", "jabber:iq:private"));
 
	payloadParserFactories->addFactory(new Swift::GenericPayloadParserFactory<Swift::AttentionParser>("attention", "urn:xmpp:attention:0"));
tests/libtransport/discoitemsresponder.cpp
Show inline comments
 
@@ -12,13 +12,15 @@
 

	
 
using namespace Transport;
 

	
 
class DiscoItemsResponderTest : public CPPUNIT_NS :: TestFixture, public BasicTest {
 
	CPPUNIT_TEST_SUITE(DiscoItemsResponderTest);
 
	CPPUNIT_TEST(roomList);
 
	CPPUNIT_TEST(roomListUser);
 
	CPPUNIT_TEST(roomInfo);
 
	CPPUNIT_TEST(roomInfoUser);
 
	CPPUNIT_TEST(roomListEscaping);
 
	CPPUNIT_TEST(roomInfoEscaping);
 
	CPPUNIT_TEST(clearRooms);
 
	CPPUNIT_TEST(receipts);
 
	CPPUNIT_TEST_SUITE_END();
 

	
 
@@ -47,12 +49,56 @@ class DiscoItemsResponderTest : public CPPUNIT_NS :: TestFixture, public BasicTe
 
		CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast<Swift::IQ *>(getStanza(received[0]))->getType());
 
		CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoItems>());
 
		CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost"), getStanza(received[0])->getPayload<Swift::DiscoItems>()->getItems()[0].getJID().toString());
 
		CPPUNIT_ASSERT_EQUAL(std::string("#room"), getStanza(received[0])->getPayload<Swift::DiscoItems>()->getItems()[0].getName());
 
	}
 

	
 
	void roomListUser() {
 
		connectUser();
 
		User *user = userManager->getUser("user@localhost");
 
		user->addRoomToRoomList("#room2@localhost", "#room2");
 
		itemsResponder->addRoom("#room@localhost", "#room");
 

	
 
		boost::shared_ptr<Swift::DiscoItems> payload(new Swift::DiscoItems());
 
		boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Get, Swift::JID("localhost"), "id", payload);
 
		iq->setFrom("user@localhost");
 
		injectIQ(iq);
 
		loop->processEvents();
 

	
 
		CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
 
		CPPUNIT_ASSERT(dynamic_cast<Swift::IQ *>(getStanza(received[0])));
 
		CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast<Swift::IQ *>(getStanza(received[0]))->getType());
 
		CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoItems>());
 
		CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost"), getStanza(received[0])->getPayload<Swift::DiscoItems>()->getItems()[0].getJID().toString());
 
		CPPUNIT_ASSERT_EQUAL(std::string("#room"), getStanza(received[0])->getPayload<Swift::DiscoItems>()->getItems()[0].getName());
 
		CPPUNIT_ASSERT_EQUAL(std::string("#room2@localhost"), getStanza(received[0])->getPayload<Swift::DiscoItems>()->getItems()[1].getJID().toString());
 
		CPPUNIT_ASSERT_EQUAL(std::string("#room2"), getStanza(received[0])->getPayload<Swift::DiscoItems>()->getItems()[1].getName());
 
	}
 

	
 
	void roomInfoUser() {
 
		connectUser();
 
		User *user = userManager->getUser("user@localhost");
 
		user->addRoomToRoomList("#room2@localhost", "#room2");
 
		itemsResponder->addRoom("#room@localhost", "#room");
 

	
 
		boost::shared_ptr<Swift::DiscoInfo> payload(new Swift::DiscoInfo());
 
		boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Get, Swift::JID("localhost"), "id", payload);
 
		iq->setFrom("user@localhost");
 
		iq->setTo("#room2@localhost");
 
		injectIQ(iq);
 
		loop->processEvents();
 

	
 
		CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
 
		CPPUNIT_ASSERT(dynamic_cast<Swift::IQ *>(getStanza(received[0])));
 
		CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast<Swift::IQ *>(getStanza(received[0]))->getType());
 
		CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoInfo>());
 
		CPPUNIT_ASSERT_EQUAL(std::string("#room2"), getStanza(received[0])->getPayload<Swift::DiscoInfo>()->getIdentities()[0].getName());
 
		CPPUNIT_ASSERT_EQUAL(std::string("conference"), getStanza(received[0])->getPayload<Swift::DiscoInfo>()->getIdentities()[0].getCategory());
 
		CPPUNIT_ASSERT_EQUAL(std::string("text"), getStanza(received[0])->getPayload<Swift::DiscoInfo>()->getIdentities()[0].getType());
 
	}
 

	
 
	void roomInfo() {
 
		itemsResponder->addRoom("#room@localhost", "#room");
 

	
 
		boost::shared_ptr<Swift::DiscoInfo> payload(new Swift::DiscoInfo());
 
		boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Get, Swift::JID("localhost"), "id", payload);
 
		iq->setFrom("user@localhost");
0 comments (0 inline, 0 general)