Working message forwarding in both sides :)

This commit is contained in:
HanzZ 2011-04-02 21:51:51 +02:00
parent 76c678dd6f
commit c8006a0eba
12 changed files with 102 additions and 6 deletions

View file

@ -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);

View file

@ -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;
};
}

View file

@ -0,0 +1,42 @@
/**
* 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;
};
}

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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);
}

View file

@ -27,6 +27,7 @@
#include <algorithm>
#include "transport/abstractconversation.h"
#include "transport/conversationmanager.h"
#include "transport/user.h"
using namespace Transport;

View file

@ -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() {

View file

@ -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);
}
}

View file

@ -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"));

View file

@ -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);
}
}