Changeset - c8006a0ebab6
[Not reviewed]
0 11 1
HanzZ - 14 years ago 2011-04-02 21:51:51
hanzz.k@gmail.com
Working message forwarding in both sides :)
12 files changed with 102 insertions and 6 deletions:
0 comments (0 inline, 0 general)
examples/usermanager/main.cpp
Show inline comments
 
@@ -17,7 +17,7 @@ int main(void)
 
	}
 
 
	Swift::SimpleEventLoop eventLoop;
 
	Component transport(&eventLoop, &config);
 
	Component transport(&eventLoop, &config, NULL);
 
	Logger logger(&transport);
 
 
	SQLite3Backend sql(&config);
include/transport/conversationmanager.h
Show inline comments
 
@@ -52,10 +52,13 @@ class ConversationManager {
 
		void unsetConversation(AbstractConversation *conv);
 

	
 
	private:
 
		void handleMessageReceived(Swift::Message::ref message);
 

	
 
		Component *m_component;
 
		User *m_user;
 

	
 
		std::map<std::string, AbstractConversation *> m_convs;
 
		friend class UserManager;
 
};
 

	
 
}
include/transport/factory.h
Show inline comments
 
new file 100644
 
/**
 
 * XMPP - libpurple transport
 
 *
 
 * Copyright (C) 2009, Jan Kaluza <hanzz@soc.pidgin.im>
 
 *
 
 * This program is free software; you can redistribute it and/or modify
 
 * it under the terms of the GNU General Public License as published by
 
 * the Free Software Foundation; either version 2 of the License, or
 
 * (at your option) any later version.
 
 *
 
 * This program is distributed in the hope that it will be useful,
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
 * GNU General Public License for more details.
 
 *
 
 * You should have received a copy of the GNU General Public License
 
 * along with this program; if not, write to the Free Software
 
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
 
 */
 

	
 
#pragma once
 

	
 
#include <string>
 
#include <algorithm>
 
#include "transport/transport.h"
 

	
 
#include "Swiften/Swiften.h"
 
#include "Swiften/Elements/Message.h"
 
#include "transport/abstractconversation.h"
 

	
 
namespace Transport {
 

	
 
class AbstractConversation;
 
class ConversationManager;
 

	
 
class Factory {
 
	public:
 
		
 
		virtual AbstractConversation *createConversation(ConversationManager *conversationManager, const std::string &legacyName) = 0;
 
};
 

	
 
}
include/transport/transport.h
Show inline comments
 
@@ -33,6 +33,7 @@
 
#include "Swiften/Server/UserRegistry.h"
 
#include <boost/bind.hpp>
 
#include "transport/config.h"
 
#include "transport/factory.h"
 

	
 
#define tr(lang,STRING)    (STRING)
 
#define _(STRING)    (STRING)
 
@@ -48,6 +49,7 @@ namespace Transport {
 
	class DiscoInfoResponder;
 
	class DiscoItemsResponder;
 
	class RosterResponder;
 
	class Factory;
 

	
 
	/// Represents one transport instance.
 

	
 
@@ -63,7 +65,7 @@ namespace Transport {
 
			/// 	- service.password
 
			/// 	- service.server
 
			/// 	- service.port
 
			Component(Swift::EventLoop *loop, Config *config);
 
			Component(Swift::EventLoop *loop, Config *config, Factory *factory);
 

	
 
			/// Component destructor.
 
			~Component();
 
@@ -103,6 +105,8 @@ namespace Transport {
 

	
 
			Swift::BoostNetworkFactories *getFactories() { return m_factories; }
 

	
 
			Factory *getFactory() { return m_factory; }
 

	
 
			/// This signal is emitted when server disconnects the transport because of some error.
 
			/// \param error disconnection error
 
			boost::signal<void (const Swift::ComponentError &error)> onConnectionError;
 
@@ -160,6 +164,7 @@ namespace Transport {
 
			Config* m_config;
 
			std::string m_protocol;
 
			Swift::JID m_jid;
 
			Factory *m_factory;
 

	
 
		friend class User;
 
		friend class UserRegistration;
include/transport/usermanager.h
Show inline comments
 
@@ -68,6 +68,7 @@ class UserManager {
 

	
 
	private:
 
		void handlePresence(Swift::Presence::ref presence);
 
		void handleMessageReceived(Swift::Message::ref message);
 
// 		void handleDiscoInfoResponse(boost::shared_ptr<Swift::DiscoInfo> info, Swift::ErrorPayload::ref error, const Swift::JID& jid);
 
		void addUser(User *user);
 

	
spectrum/src/main.cpp
Show inline comments
 
@@ -11,6 +11,7 @@
 
#include "transport/user.h"
 
#include "transport/storagebackend.h"
 
#include "transport/rostermanager.h"
 
#include "transport/abstractconversation.h"
 
#include "spectrumeventloop.h"
 
#include "spectrumbuddy.h"
 
#include "spectrumconversation.h"
 
@@ -164,6 +165,9 @@ static void conv_destroy(PurpleConversation *conv) {
 
}
 

	
 
static void conv_write_im(PurpleConversation *conv, const char *who, const char *message, PurpleMessageFlags flags, time_t mtime) {
 
	// Don't forwards our own messages.
 
	if (flags & PURPLE_MESSAGE_SEND || flags & PURPLE_MESSAGE_SYSTEM)
 
		return;
 
	SpectrumConversation *s_conv = (SpectrumConversation *) conv->ui_data;
 
	if (!s_conv)
 
		return;
 
@@ -423,6 +427,14 @@ static void handleUserDestroyed(User *user, UserManager *userManager, Config *co
 
	}
 
}
 

	
 
class SpectrumFactory : public Factory {
 
	public:
 
		AbstractConversation *createConversation(ConversationManager *conversationManager, const std::string &legacyName) {
 
			PurpleConversation *conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, (PurpleAccount *) conversationManager->getUser()->getData() , legacyName.c_str());
 
			return (AbstractConversation *) conv->ui_data;
 
		}
 
};
 

	
 
int main(int argc, char **argv) {
 
	GError *error = NULL;
 
	GOptionContext *context;
 
@@ -494,7 +506,8 @@ int main(int argc, char **argv) {
 
		initPurple(config);
 

	
 
		SpectrumEventLoop eventLoop;
 
		Component transport(&eventLoop, &config);
 
		SpectrumFactory factory;
 
		Component transport(&eventLoop, &config, &factory);
 
		Logger logger(&transport);
 
		_logger = &logger;
 

	
spectrum/src/spectrumconversation.cpp
Show inline comments
 
@@ -30,7 +30,12 @@ SpectrumConversation::~SpectrumConversation() {
 
}
 

	
 
void SpectrumConversation::sendMessage(boost::shared_ptr<Swift::Message> &message) {
 
	
 
	// escape and send
 
	gchar *_markup = purple_markup_escape_text(message->getBody().c_str(), -1);
 
	if (purple_conversation_get_type(m_conv) == PURPLE_CONV_TYPE_IM) {
 
		purple_conv_im_send(PURPLE_CONV_IM(m_conv), _markup);
 
	}
 
	g_free(_markup);
 
}
 

	
 

	
spectrum/src/spectrumconversation.h
Show inline comments
 
@@ -27,6 +27,7 @@
 
#include <algorithm>
 
#include "transport/abstractconversation.h"
 
#include "transport/conversationmanager.h"
 
#include "transport/user.h"
 

	
 
using namespace Transport;
 

	
src/abstractconversation.cpp
Show inline comments
 
@@ -29,8 +29,8 @@
 
namespace Transport {
 

	
 
AbstractConversation::AbstractConversation(ConversationManager *conversationManager, const std::string &legacyName) : m_conversationManager(conversationManager) {
 
	m_conversationManager->setConversation(this);
 
	m_legacyName = legacyName;
 
	m_conversationManager->setConversation(this);
 
}
 

	
 
AbstractConversation::~AbstractConversation() {
src/conversationmanager.cpp
Show inline comments
 
@@ -22,6 +22,7 @@
 
#include "transport/abstractconversation.h"
 
#include "transport/usermanager.h"
 
#include "transport/abstractbuddy.h"
 
#include "transport/factory.h"
 
#include "transport/user.h"
 
#include "Swiften/Roster/SetRosterRequest.h"
 
#include "Swiften/Elements/RosterPayload.h"
 
@@ -45,4 +46,16 @@ void ConversationManager::unsetConversation(AbstractConversation *conv) {
 
	m_convs.erase(conv->getLegacyName());
 
}
 

	
 
void ConversationManager::handleMessageReceived(Swift::Message::ref message) {
 
	std::string name = message->getTo().getUnescapedNode();
 
	if (name.find_last_of("%") != std::string::npos) {
 
		name.replace(name.find_last_of("%"), 1, "@");
 
	}
 

	
 
	if (!m_convs[name]) {
 
		m_convs[name] = m_component->getFactory()->createConversation(this, name);
 
	}
 
	m_convs[name]->sendMessage(message);
 
}
 

	
 
}
 
\ No newline at end of file
src/transport.cpp
Show inline comments
 
@@ -21,6 +21,7 @@
 
#include "transport/transport.h"
 
#include <boost/bind.hpp>
 
#include "transport/storagebackend.h"
 
#include "transport/factory.h"
 
#include "discoinforesponder.h"
 
#include "discoitemsresponder.h"
 
#include "rosterresponder.h"
 
@@ -42,12 +43,13 @@ class MyUserRegistry : public Swift::UserRegistry {
 
		mutable std::map<std::string, std::string> users;
 
};
 

	
 
Component::Component(Swift::EventLoop *loop, Config *config) {
 
Component::Component(Swift::EventLoop *loop, Config *config, Factory *factory) {
 
	m_component = NULL;
 
	m_userRegistry = NULL;
 
	m_server = NULL;
 
	m_reconnectCount = 0;
 
	m_config = config;
 
	m_factory = factory;
 

	
 
	m_jid = Swift::JID(CONFIG_STRING(m_config, "service.jid"));
 

	
src/usermanager.cpp
Show inline comments
 
@@ -22,6 +22,7 @@
 
#include "transport/user.h"
 
#include "transport/transport.h"
 
#include "transport/storagebackend.h"
 
#include "transport/conversationmanager.h"
 

	
 
namespace Transport {
 

	
 
@@ -32,6 +33,7 @@ UserManager::UserManager(Component *component, StorageBackend *storageBackend) {
 
	m_storageBackend = storageBackend;
 

	
 
	component->onUserPresenceReceived.connect(bind(&UserManager::handlePresence, this, _1));
 
	m_component->getStanzaChannel()->onMessageReceived.connect(bind(&UserManager::handleMessageReceived, this, _1));
 
// 	component->onDiscoInfoResponse.connect(bind(&UserManager::handleDiscoInfoResponse, this, _1, _2, _3));
 
}
 

	
 
@@ -144,4 +146,13 @@ void UserManager::handlePresence(Swift::Presence::ref presence) {
 
	}
 
}
 

	
 
void UserManager::handleMessageReceived(Swift::Message::ref message) {
 
	User *user = getUser(message->getFrom().toBare().toString());
 
	if (!user ){
 
		return;
 
	}
 

	
 
	user->getConversationManager()->handleMessageReceived(message);
 
}
 

	
 
}
0 comments (0 inline, 0 general)