Working message forwarding in both sides :)
This commit is contained in:
parent
76c678dd6f
commit
c8006a0eba
12 changed files with 102 additions and 6 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
42
include/transport/factory.h
Normal file
42
include/transport/factory.h
Normal 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;
|
||||
};
|
||||
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include <algorithm>
|
||||
#include "transport/abstractconversation.h"
|
||||
#include "transport/conversationmanager.h"
|
||||
#include "transport/user.h"
|
||||
|
||||
using namespace Transport;
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
|
@ -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"));
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue